mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-04 17:23:45 -05:00
* Fix initial build breaks from 1.67 merge (#2514) * Update yarn lock files * Update build scripts * Fix tsconfig * Build breaks * WIP * Update yarn lock files * Misc breaks * Updates to package.json * Breaks * Update yarn * Fix breaks * Breaks * Build breaks * Breaks * Breaks * Breaks * Breaks * Breaks * Missing file * Breaks * Breaks * Breaks * Breaks * Breaks * Fix several runtime breaks (#2515) * Missing files * Runtime breaks * Fix proxy ordering issue * Remove commented code * Fix breaks with opening query editor * Fix post merge break * Updates related to setup build and other breaks (#2516) * Fix bundle build issues * Update distro * Fix distro merge and update build JS files * Disable pipeline steps * Remove stats call * Update license name * Make new RPM dependencies a warning * Fix extension manager version checks * Update JS file * Fix a few runtime breaks * Fixes * Fix runtime issues * Fix build breaks * Update notebook tests (part 1) * Fix broken tests * Linting errors * Fix hygiene * Disable lint rules * Bump distro * Turn off smoke tests * Disable integration tests * Remove failing "activate" test * Remove failed test assertion * Disable other broken test * Disable query history tests * Disable extension unit tests * Disable failing tasks
68 lines
3.0 KiB
TypeScript
68 lines
3.0 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { RunOnceScheduler } from 'vs/base/common/async';
|
|
import { onUnexpectedError } from 'vs/base/common/errors';
|
|
import { Disposable } from 'vs/base/common/lifecycle';
|
|
import { join } from 'vs/base/common/path';
|
|
import { Promises } from 'vs/base/node/pfs';
|
|
import { IBackupWorkspacesFormat } from 'vs/platform/backup/node/backup';
|
|
import { INativeEnvironmentService } from 'vs/platform/environment/common/environment';
|
|
import { ILogService } from 'vs/platform/log/common/log';
|
|
|
|
export class StorageDataCleaner extends Disposable {
|
|
|
|
// Workspace/Folder storage names are MD5 hashes (128bits / 4 due to hex presentation)
|
|
private static readonly NON_EMPTY_WORKSPACE_ID_LENGTH = 128 / 4;
|
|
|
|
// Reserved empty window workspace storage name when in extension development
|
|
private static readonly EXTENSION_DEV_EMPTY_WINDOW_ID = 'ext-dev';
|
|
|
|
constructor(
|
|
private readonly backupWorkspacesPath: string,
|
|
@INativeEnvironmentService private readonly environmentService: INativeEnvironmentService,
|
|
@ILogService private readonly logService: ILogService
|
|
) {
|
|
super();
|
|
|
|
const scheduler = this._register(new RunOnceScheduler(() => {
|
|
this.cleanUpStorage();
|
|
}, 30 * 1000 /* after 30s */));
|
|
scheduler.schedule();
|
|
}
|
|
|
|
private async cleanUpStorage(): Promise<void> {
|
|
this.logService.trace('[storage cleanup]: Starting to clean up storage folders.');
|
|
|
|
try {
|
|
|
|
// Leverage the backup workspace file to find out which empty workspace is currently in use to
|
|
// determine which empty workspace storage can safely be deleted
|
|
const contents = await Promises.readFile(this.backupWorkspacesPath, 'utf8');
|
|
|
|
const workspaces = JSON.parse(contents) as IBackupWorkspacesFormat;
|
|
const emptyWorkspaces = workspaces.emptyWorkspaceInfos.map(emptyWorkspace => emptyWorkspace.backupFolder);
|
|
|
|
// Read all workspace storage folders that exist & cleanup unused
|
|
const workspaceStorageFolders = await Promises.readdir(this.environmentService.workspaceStorageHome.fsPath);
|
|
await Promise.all(workspaceStorageFolders.map(async workspaceStorageFolder => {
|
|
if (
|
|
workspaceStorageFolder.length === StorageDataCleaner.NON_EMPTY_WORKSPACE_ID_LENGTH || // keep non-empty workspaces
|
|
workspaceStorageFolder === StorageDataCleaner.EXTENSION_DEV_EMPTY_WINDOW_ID || // keep empty extension dev workspaces
|
|
emptyWorkspaces.indexOf(workspaceStorageFolder) >= 0 // keep empty workspaces that are in use
|
|
) {
|
|
return;
|
|
}
|
|
|
|
this.logService.trace(`[storage cleanup]: Deleting workspace storage folder ${workspaceStorageFolder}.`);
|
|
|
|
await Promises.rm(join(this.environmentService.workspaceStorageHome.fsPath, workspaceStorageFolder));
|
|
}));
|
|
} catch (error) {
|
|
onUnexpectedError(error);
|
|
}
|
|
}
|
|
}
|