diff --git a/src/vs/platform/configuration/common/userConfigurationFileService.ts b/src/vs/platform/configuration/common/userConfigurationFileService.ts index 12245ff5e55..2507cb3e1f4 100644 --- a/src/vs/platform/configuration/common/userConfigurationFileService.ts +++ b/src/vs/platform/configuration/common/userConfigurationFileService.ts @@ -66,7 +66,7 @@ export class UserConfigurationFileService implements IUserConfigurationFileServi if (edit) { content = content.substring(0, edit.offset) + edit.content + content.substring(edit.offset + edit.length); try { - await this.write(VSBuffer.fromString(content), { etag, mtime }); + await this.fileService.writeFile(this.environmentService.settingsResource, VSBuffer.fromString(content), { etag, mtime }); } catch (error) { if ((error).fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) { throw new Error(UserConfigurationErrorCode.ERROR_FILE_MODIFIED_SINCE); @@ -76,7 +76,10 @@ export class UserConfigurationFileService implements IUserConfigurationFileServi } async write(content: VSBuffer, options?: IWriteFileOptions): Promise { - await this.fileService.writeFile(this.environmentService.settingsResource, content, options); + // queue up writes to prevent race conditions + return this.queue.queue(async () => { + await this.fileService.writeFile(this.environmentService.settingsResource, content, options); + }); } private getEdits({ value, path }: IJSONValue, modelContent: string, formattingOptions: FormattingOptions): Edit[] { diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index 99fb6c02c0c..cf3e6333d88 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -16,6 +16,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; +import { IUserConfigurationFileService, UserConfigurationFileService } from 'vs/platform/configuration/common/userConfigurationFileService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { DidUninstallExtensionEvent, IExtensionGalleryService, IExtensionManagementService, IGlobalExtensionEnablementService, InstallExtensionResult } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -88,6 +89,7 @@ export class UserDataSyncClient extends Disposable { const configurationService = this._register(new ConfigurationService(environmentService.settingsResource, fileService)); await configurationService.initialize(); this.instantiationService.stub(IConfigurationService, configurationService); + this.instantiationService.stub(IUserConfigurationFileService, this.instantiationService.createInstance(UserConfigurationFileService)); this.instantiationService.stub(IRequestService, this.testServer);