From 36bb6a6848574d883e0310885ebf2cf3269c48b9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 15 Dec 2021 17:59:49 +0100 Subject: [PATCH] files - make `localFilesystem` channel reusable --- .../sharedProcess/sharedProcessMain.ts | 14 +++++++++++--- src/vs/code/electron-main/app.ts | 5 +++-- .../files/common/diskFileSystemProviderClient.ts | 2 ++ src/vs/server/remoteExtensionHostAgentServer.ts | 2 +- src/vs/workbench/browser/web.main.ts | 4 ++-- src/vs/workbench/electron-sandbox/desktop.main.ts | 4 ++-- .../electron-sandbox/diskFileSystemProvider.ts | 4 ++-- ...hannel.ts => remoteFileSystemProviderClient.ts} | 4 ++-- 8 files changed, 25 insertions(+), 14 deletions(-) rename src/vs/workbench/services/remote/common/{remoteAgentFileSystemChannel.ts => remoteFileSystemProviderClient.ts} (94%) diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 7b96b75a0ad..3aa576113d5 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -96,7 +96,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; import { isLinux } from 'vs/base/common/platform'; import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider'; -import { DiskFileSystemProviderClient } from 'vs/platform/files/common/diskFileSystemProviderClient'; +import { DiskFileSystemProviderClient, LOCAL_FILE_SYSTEM_CHANNEL_NAME } from 'vs/platform/files/common/diskFileSystemProviderClient'; class SharedProcessMain extends Disposable { @@ -206,8 +206,16 @@ class SharedProcessMain extends Disposable { const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService)); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - const localFileSystemProviderFromMain = this._register(new DiskFileSystemProviderClient(mainProcessService.getChannel('localFilesystem'), { pathCaseSensitive: isLinux })); - const userDataFileSystemProvider = this._register(new FileUserDataProvider(Schemas.file, localFileSystemProviderFromMain, Schemas.userData, logService)); + const userDataFileSystemProvider = this._register(new FileUserDataProvider( + Schemas.file, + // Specifically for user data, use the disk file system provider + // from the main process to enable atomic read/write operations. + // Since user data can change very frequently across multiple + // processes, we want a single process handling these operations. + this._register(new DiskFileSystemProviderClient(mainProcessService.getChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME), { pathCaseSensitive: isLinux })), + Schemas.userData, + logService + )); fileService.registerProvider(Schemas.userData, userDataFileSystemProvider); // Configuration diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index dc37be376ef..8982da34914 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -47,6 +47,7 @@ import { IExtensionHostStarter, ipcExtensionHostStarterChannelName } from 'vs/pl import { WorkerMainProcessExtensionHostStarter } from 'vs/platform/extensions/electron-main/workerMainProcessExtensionHostStarter'; import { IExternalTerminalMainService } from 'vs/platform/externalTerminal/common/externalTerminal'; import { LinuxExternalTerminalService, MacExternalTerminalService, WindowsExternalTerminalService } from 'vs/platform/externalTerminal/node/externalTerminalService'; +import { LOCAL_FILE_SYSTEM_CHANNEL_NAME } from 'vs/platform/files/common/diskFileSystemProviderClient'; import { IFileService } from 'vs/platform/files/common/files'; import { DiskFileSystemProviderChannel } from 'vs/platform/files/electron-main/diskFileSystemProviderServer'; import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; @@ -569,8 +570,8 @@ export class CodeApplication extends Disposable { const diskFileSystemProvider = this.fileService.getProvider(Schemas.file); assertType(diskFileSystemProvider instanceof DiskFileSystemProvider); const fileSystemProviderChannel = new DiskFileSystemProviderChannel(diskFileSystemProvider, this.logService); - mainProcessElectronServer.registerChannel('localFilesystem', fileSystemProviderChannel); - sharedProcessClient.then(client => client.registerChannel('localFilesystem', fileSystemProviderChannel)); + mainProcessElectronServer.registerChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME, fileSystemProviderChannel); + sharedProcessClient.then(client => client.registerChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME, fileSystemProviderChannel)); // Update const updateChannel = new UpdateChannel(accessor.get(IUpdateService)); diff --git a/src/vs/platform/files/common/diskFileSystemProviderClient.ts b/src/vs/platform/files/common/diskFileSystemProviderClient.ts index 1484d62316e..cf6479d8d4a 100644 --- a/src/vs/platform/files/common/diskFileSystemProviderClient.ts +++ b/src/vs/platform/files/common/diskFileSystemProviderClient.ts @@ -15,6 +15,8 @@ import { generateUuid } from 'vs/base/common/uuid'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { createFileSystemProviderError, FileAtomicReadOptions, FileChangeType, FileDeleteOptions, FileOpenOptions, FileOverwriteOptions, FileReadStreamOptions, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, FileWriteOptions, IFileChange, IFileSystemProviderWithFileAtomicReadCapability, IFileSystemProviderWithFileFolderCopyCapability, IFileSystemProviderWithFileReadStreamCapability, IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +export const LOCAL_FILE_SYSTEM_CHANNEL_NAME = 'localFilesystem'; + /** * An implementation of a local disk file system provider * that is backed by a `IChannel` and thus implemented via diff --git a/src/vs/server/remoteExtensionHostAgentServer.ts b/src/vs/server/remoteExtensionHostAgentServer.ts index 53b3a91d4bb..84a63c2c461 100644 --- a/src/vs/server/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/remoteExtensionHostAgentServer.ts @@ -56,7 +56,7 @@ import { IPCServer, ClientConnectionEvent, IMessagePassingProtocol, StaticRouter import { Emitter, Event } from 'vs/base/common/event'; import { RemoteAgentEnvironmentChannel } from 'vs/server/remoteAgentEnvironmentImpl'; import { RemoteAgentFileSystemProviderChannel } from 'vs/server/remoteFileSystemProviderServer'; -import { REMOTE_FILE_SYSTEM_CHANNEL_NAME } from 'vs/workbench/services/remote/common/remoteAgentFileSystemChannel'; +import { REMOTE_FILE_SYSTEM_CHANNEL_NAME } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; import { RequestChannel } from 'vs/platform/request/common/requestIpc'; import { ExtensionManagementChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import ErrorTelemetry from 'vs/platform/telemetry/node/errorTelemetry'; diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index d47236a9f42..810d7ad404e 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -11,7 +11,7 @@ import { ConsoleLogInAutomationLogger } from 'vs/platform/log/browser/log'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { Workbench } from 'vs/workbench/browser/workbench'; -import { RemoteFileSystemProvider } from 'vs/workbench/services/remote/common/remoteAgentFileSystemChannel'; +import { RemoteFileSystemProviderClient } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IProductService } from 'vs/platform/product/common/productService'; import product from 'vs/platform/product/common/product'; @@ -288,7 +288,7 @@ class BrowserMain extends Disposable { fileService.registerProvider(Schemas.userData, userDataProvider); // Remote file system - this._register(RemoteFileSystemProvider.register(remoteAgentService, fileService, logService)); + this._register(RemoteFileSystemProviderClient.register(remoteAgentService, fileService, logService)); // Local file access (if supported by browser) if (WebFileSystemAccess.supported(window)) { diff --git a/src/vs/workbench/electron-sandbox/desktop.main.ts b/src/vs/workbench/electron-sandbox/desktop.main.ts index 83df80aeb75..2111a1de155 100644 --- a/src/vs/workbench/electron-sandbox/desktop.main.ts +++ b/src/vs/workbench/electron-sandbox/desktop.main.ts @@ -29,7 +29,7 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/electron-sandbo import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { FileService } from 'vs/platform/files/common/fileService'; import { IFileService } from 'vs/platform/files/common/files'; -import { RemoteFileSystemProvider } from 'vs/workbench/services/remote/common/remoteAgentFileSystemChannel'; +import { RemoteFileSystemProviderClient } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; import { ConfigurationCache } from 'vs/workbench/services/configuration/common/configurationCache'; import { ISignService } from 'vs/platform/sign/common/sign'; import { basename } from 'vs/base/common/path'; @@ -250,7 +250,7 @@ export class DesktopMain extends Disposable { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Remote file system - this._register(RemoteFileSystemProvider.register(remoteAgentService, fileService, logService)); + this._register(RemoteFileSystemProviderClient.register(remoteAgentService, fileService, logService)); const payload = this.resolveWorkspaceInitializationPayload(environmentService); diff --git a/src/vs/workbench/services/files/electron-sandbox/diskFileSystemProvider.ts b/src/vs/workbench/services/files/electron-sandbox/diskFileSystemProvider.ts index 3a9a8da683e..f3ff8b0eab0 100644 --- a/src/vs/workbench/services/files/electron-sandbox/diskFileSystemProvider.ts +++ b/src/vs/workbench/services/files/electron-sandbox/diskFileSystemProvider.ts @@ -11,7 +11,7 @@ import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/services'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ReadableStreamEvents } from 'vs/base/common/stream'; import { URI } from 'vs/base/common/uri'; -import { DiskFileSystemProviderClient } from 'vs/platform/files/common/diskFileSystemProviderClient'; +import { DiskFileSystemProviderClient, LOCAL_FILE_SYSTEM_CHANNEL_NAME } from 'vs/platform/files/common/diskFileSystemProviderClient'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IDiskFileChange, ILogMessage, AbstractRecursiveWatcherClient } from 'vs/platform/files/common/watcher'; import { ParcelWatcherClient } from 'vs/workbench/services/files/electron-sandbox/parcelWatcherClient'; @@ -30,7 +30,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple IFileSystemProviderWithFileFolderCopyCapability, IFileSystemProviderWithFileAtomicReadCapability { - private readonly provider = this._register(new DiskFileSystemProviderClient(this.mainProcessService.getChannel('localFilesystem'), { pathCaseSensitive: isLinux, trash: true })); + private readonly provider = this._register(new DiskFileSystemProviderClient(this.mainProcessService.getChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME), { pathCaseSensitive: isLinux, trash: true })); constructor( private readonly mainProcessService: IMainProcessService, diff --git a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts b/src/vs/workbench/services/remote/common/remoteFileSystemProviderClient.ts similarity index 94% rename from src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts rename to src/vs/workbench/services/remote/common/remoteFileSystemProviderClient.ts index 5b794bf9637..5a3211e6a4a 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts +++ b/src/vs/workbench/services/remote/common/remoteFileSystemProviderClient.ts @@ -15,7 +15,7 @@ import { IRemoteAgentConnection, IRemoteAgentService } from 'vs/workbench/servic export const REMOTE_FILE_SYSTEM_CHANNEL_NAME = 'remoteFilesystem'; -export class RemoteFileSystemProvider extends DiskFileSystemProviderClient { +export class RemoteFileSystemProviderClient extends DiskFileSystemProviderClient { static register(remoteAgentService: IRemoteAgentService, fileService: IFileService, logService: ILogService): IDisposable { const connection = remoteAgentService.getConnection(); @@ -32,7 +32,7 @@ export class RemoteFileSystemProvider extends DiskFileSystemProviderClient { // Register remote fsp even before it is asked to activate // because, some features (configuration) wait for its // registration before making fs calls. - fileService.registerProvider(Schemas.vscodeRemote, disposables.add(new RemoteFileSystemProvider(environment, connection))); + fileService.registerProvider(Schemas.vscodeRemote, disposables.add(new RemoteFileSystemProviderClient(environment, connection))); } else { logService.error('Cannot register remote filesystem provider. Remote environment doesnot exist.'); }