Skip to content

Commit 8dfdecb

Browse files
committed
microsoft#100346 prepare for manual sync
1 parent 5cb5e32 commit 8dfdecb

8 files changed

Lines changed: 82 additions & 87 deletions

File tree

src/vs/platform/userDataSync/common/userDataAutoSyncService.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { Delayer, disposableTimeout, CancelablePromise, createCancelablePromise, timeout } from 'vs/base/common/async';
77
import { Event, Emitter } from 'vs/base/common/event';
88
import { Disposable, toDisposable, MutableDisposable, IDisposable } from 'vs/base/common/lifecycle';
9-
import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, UserDataAutoSyncError } from 'vs/platform/userDataSync/common/userDataSync';
9+
import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, UserDataAutoSyncError, ISyncTask } from 'vs/platform/userDataSync/common/userDataSync';
1010
import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount';
1111
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1212
import { isPromiseCanceledError } from 'vs/base/common/errors';
@@ -154,7 +154,7 @@ export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService i
154154
if (pullFirst) {
155155
await this.userDataSyncService.pull();
156156
} else {
157-
await this.userDataSyncService.sync();
157+
await (await this.userDataSyncService.createSyncTask()).run();
158158
}
159159

160160
this.setEnablement(true);
@@ -316,6 +316,7 @@ class AutoSync extends Disposable {
316316
private readonly _onDidFinishSync = this._register(new Emitter<Error | undefined>());
317317
readonly onDidFinishSync = this._onDidFinishSync.event;
318318

319+
private syncTask: ISyncTask | undefined;
319320
private syncPromise: CancelablePromise<void> | undefined;
320321

321322
constructor(
@@ -337,7 +338,9 @@ class AutoSync extends Disposable {
337338
this.logService.info('Auto sync: Canelled sync that is in progress');
338339
this.syncPromise = undefined;
339340
}
340-
this.userDataSyncService.stop();
341+
if (this.syncTask) {
342+
this.syncTask.stop();
343+
}
341344
this.logService.info('Auto Sync: Stopped');
342345
}));
343346
this.logService.info('Auto Sync: Started');
@@ -374,8 +377,11 @@ class AutoSync extends Disposable {
374377
this._onDidStartSync.fire();
375378
let error: Error | undefined;
376379
try {
377-
const syncTask = await this.userDataSyncService.createSyncTask();
378-
let manifest = syncTask.manifest;
380+
this.syncTask = await this.userDataSyncService.createSyncTask();
381+
if (token.isCancellationRequested) {
382+
return;
383+
}
384+
let manifest = this.syncTask.manifest;
379385

380386
// Server has no data but this machine was synced before
381387
if (manifest === null && await this.userDataSyncService.hasPreviouslySynced()) {
@@ -402,7 +408,7 @@ class AutoSync extends Disposable {
402408
throw new UserDataAutoSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff);
403409
}
404410

405-
await syncTask.run(token);
411+
await this.syncTask.run();
406412

407413
// After syncing, get the manifest if it was not available before
408414
if (manifest === null) {

src/vs/platform/userDataSync/common/userDataSync.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { IProductService, ConfigurationSyncStore } from 'vs/platform/product/com
2323
import { distinct } from 'vs/base/common/arrays';
2424
import { isArray, isString, isObject } from 'vs/base/common/types';
2525
import { IHeaders } from 'vs/base/parts/request/common/request';
26-
import { CancellationToken } from 'vs/base/common/cancellation';
2726

2827
export const CONFIGURATION_SYNC_STORE_KEY = 'configurationSync.store';
2928

@@ -360,7 +359,8 @@ export type SyncResourceConflicts = { syncResource: SyncResource, conflicts: IRe
360359

361360
export interface ISyncTask {
362361
manifest: IUserDataManifest | null;
363-
run(token: CancellationToken): Promise<void>;
362+
run(): Promise<void>;
363+
stop(): Promise<void>;
364364
}
365365

366366
export const IUserDataSyncService = createDecorator<IUserDataSyncService>('IUserDataSyncService');
@@ -380,15 +380,13 @@ export interface IUserDataSyncService {
380380
readonly lastSyncTime: number | undefined;
381381
readonly onDidChangeLastSyncTime: Event<number>;
382382

383+
createSyncTask(): Promise<ISyncTask>;
384+
383385
pull(): Promise<void>;
384-
sync(): Promise<void>;
385-
stop(): Promise<void>;
386386
replace(uri: URI): Promise<void>;
387387
reset(): Promise<void>;
388388
resetLocal(): Promise<void>;
389389

390-
createSyncTask(): Promise<ISyncTask>
391-
392390
isFirstTimeSyncingWithAnotherMachine(): Promise<boolean>;
393391
hasPreviouslySynced(): Promise<boolean>;
394392
resolveContent(resource: URI): Promise<string | null>;

src/vs/platform/userDataSync/common/userDataSyncIpc.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ export class UserDataSyncChannel implements IServerChannel {
4545
switch (command) {
4646
case '_getInitialData': return Promise.resolve([this.service.status, this.service.conflicts, this.service.lastSyncTime]);
4747
case 'pull': return this.service.pull();
48-
case 'sync': return this.service.sync();
49-
case 'stop': this.service.stop(); return Promise.resolve();
5048
case 'replace': return this.service.replace(URI.revive(args[0]));
5149
case 'reset': return this.service.reset();
5250
case 'resetLocal': return this.service.resetLocal();

src/vs/platform/userDataSync/common/userDataSyncService.ts

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSy
2121
import { CancellationToken } from 'vs/base/common/cancellation';
2222
import { IHeaders } from 'vs/base/parts/request/common/request';
2323
import { generateUuid } from 'vs/base/common/uuid';
24+
import { createCancelablePromise, CancelablePromise } from 'vs/base/common/async';
2425

2526
type SyncErrorClassification = {
2627
resource?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
@@ -129,12 +130,6 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
129130
}
130131
}
131132

132-
private recoveredSettings: boolean = false;
133-
async sync(): Promise<void> {
134-
const syncTask = await this.createSyncTask();
135-
return syncTask.run(CancellationToken.None);
136-
}
137-
138133
async createSyncTask(): Promise<ISyncTask> {
139134
this.telemetryService.publicLog2('sync/getmanifest');
140135
const executionId = generateUuid();
@@ -150,18 +145,27 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
150145

151146
let executed = false;
152147
const that = this;
148+
let cancellablePromise: CancelablePromise<void> | undefined;
153149
return {
154150
manifest,
155-
run(token: CancellationToken): Promise<void> {
151+
run(): Promise<void> {
156152
if (executed) {
157153
throw new Error('Can run a task only once');
158154
}
159-
return that.doSync(manifest, executionId, token);
155+
cancellablePromise = createCancelablePromise(token => that.sync(manifest, executionId, token));
156+
return cancellablePromise.finally(() => cancellablePromise = undefined);
157+
},
158+
async stop(): Promise<void> {
159+
if (cancellablePromise) {
160+
cancellablePromise.cancel();
161+
return that.stop();
162+
}
160163
}
161164
};
162165
}
163166

164-
private async doSync(manifest: IUserDataManifest | null, executionId: string, token: CancellationToken): Promise<void> {
167+
private recoveredSettings: boolean = false;
168+
private async sync(manifest: IUserDataManifest | null, executionId: string, token: CancellationToken): Promise<void> {
165169
await this.checkEnablement();
166170

167171
if (!this.recoveredSettings) {
@@ -211,18 +215,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
211215
}
212216
}
213217

214-
async replace(uri: URI): Promise<void> {
215-
await this.checkEnablement();
216-
for (const synchroniser of this.synchronisers) {
217-
if (await synchroniser.replace(uri)) {
218-
return;
219-
}
220-
}
221-
}
222-
223-
async stop(): Promise<void> {
224-
await this.checkEnablement();
225-
218+
private async stop(): Promise<void> {
226219
if (this.status === SyncStatus.Idle) {
227220
return;
228221
}
@@ -239,6 +232,15 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
239232

240233
}
241234

235+
async replace(uri: URI): Promise<void> {
236+
await this.checkEnablement();
237+
for (const synchroniser of this.synchronisers) {
238+
if (await synchroniser.replace(uri)) {
239+
return;
240+
}
241+
}
242+
}
243+
242244
async acceptPreviewContent(resource: URI, content: string): Promise<void> {
243245
await this.checkEnablement();
244246
const synchroniser = this.synchronisers.find(synchroniser => synchroniser.resourcePreviews.some(({ localResource, previewResource, remoteResource }) =>

src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ suite('UserDataAutoSyncService', () => {
3737
await client.setUp();
3838

3939
// Sync once and reset requests
40-
await client.instantiationService.get(IUserDataSyncService).sync();
40+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
4141
target.reset();
4242

4343
const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService);
@@ -59,7 +59,7 @@ suite('UserDataAutoSyncService', () => {
5959
await client.setUp();
6060

6161
// Sync once and reset requests
62-
await client.instantiationService.get(IUserDataSyncService).sync();
62+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
6363
target.reset();
6464

6565
const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService);
@@ -85,7 +85,7 @@ suite('UserDataAutoSyncService', () => {
8585
await client.setUp();
8686

8787
// Sync once and reset requests
88-
await client.instantiationService.get(IUserDataSyncService).sync();
88+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
8989
target.reset();
9090

9191
const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService);
@@ -107,7 +107,7 @@ suite('UserDataAutoSyncService', () => {
107107
await client.setUp();
108108

109109
// Sync once and reset requests
110-
await client.instantiationService.get(IUserDataSyncService).sync();
110+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
111111
target.reset();
112112

113113
const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService);
@@ -245,7 +245,7 @@ suite('UserDataAutoSyncService', () => {
245245
// Set up and sync from the client
246246
const client = disposableStore.add(new UserDataSyncClient(target));
247247
await client.setUp();
248-
await client.instantiationService.get(IUserDataSyncService).sync();
248+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
249249

250250
// Set up and sync from the test client
251251
const testClient = disposableStore.add(new UserDataSyncClient(target));
@@ -334,7 +334,7 @@ suite('UserDataAutoSyncService', () => {
334334
// Set up and sync from the client
335335
const client = disposableStore.add(new UserDataSyncClient(target));
336336
await client.setUp();
337-
await client.instantiationService.get(IUserDataSyncService).sync();
337+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
338338

339339
// Set up and sync from the test client
340340
const testClient = disposableStore.add(new UserDataSyncClient(target));
@@ -346,7 +346,7 @@ suite('UserDataAutoSyncService', () => {
346346
await client.instantiationService.get(IUserDataSyncService).reset();
347347

348348
// Sync again from the first client to create new session
349-
await client.instantiationService.get(IUserDataSyncService).sync();
349+
await (await client.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
350350

351351
// Sync from the test client
352352
target.reset();
@@ -383,5 +383,4 @@ suite('UserDataAutoSyncService', () => {
383383
assert.deepEqual((<UserDataSyncStoreError>e).code, UserDataSyncErrorCode.TooManyRequests);
384384
});
385385

386-
387386
});

src/vs/platform/userDataSync/test/common/userDataSyncClient.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ export class UserDataSyncClient extends Disposable {
120120
await configurationService.reloadConfiguration();
121121
}
122122

123-
sync(): Promise<void> {
124-
return this.instantiationService.get(IUserDataSyncService).sync();
123+
async sync(): Promise<void> {
124+
await (await this.instantiationService.get(IUserDataSyncService).createSyncTask()).run();
125125
}
126126

127127
read(resource: SyncResource): Promise<IUserData> {

0 commit comments

Comments
 (0)