Skip to content

Commit 836bde4

Browse files
committed
push to branch
1 parent f14fa4d commit 836bde4

3 files changed

Lines changed: 69 additions & 2 deletions

File tree

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import { IUserDataSyncMachine, IUserDataSyncMachinesService } from 'vs/platform/
1717
import { PlatformToString, isWeb, Platform, platform } from 'vs/base/common/platform';
1818
import { escapeRegExpCharacters } from 'vs/base/common/strings';
1919
import { IProductService } from 'vs/platform/product/common/productService';
20+
import { IHeaders } from 'vs/base/parts/request/common/request';
21+
import { generateUuid } from 'vs/base/common/uuid';
22+
import { localize } from 'vs/nls';
2023

2124
type AutoSyncClassification = {
2225
sources: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
@@ -28,6 +31,7 @@ type AutoSyncEnablementClassification = {
2831

2932
const enablementKey = 'sync.enable';
3033
const disableMachineEventuallyKey = 'sync.disableMachineEventually';
34+
const SESSION_ID_KEY = 'sync.sessionId';
3135

3236
export class UserDataAutoSyncEnablementService extends Disposable {
3337

@@ -322,6 +326,10 @@ class AutoSync extends Disposable {
322326
private readonly interval: number /* in milliseconds */,
323327
private readonly userDataSyncService: IUserDataSyncService,
324328
private readonly logService: IUserDataSyncLogService,
329+
private readonly userDataSyncStoreService: IUserDataSyncStoreService,
330+
private readonly telemetryService: ITelemetryService,
331+
private readonly storageService: IStorageService,
332+
private readonly userDataSyncMachinesService: IUserDataSyncMachinesService,
325333
) {
326334
super();
327335
}
@@ -379,6 +387,65 @@ class AutoSync extends Disposable {
379387
this._onDidFinishSync.fire(error);
380388
}
381389

390+
private async doSync(reason: string, token: CancellationToken): Promise<void> {
391+
try {
392+
this.telemetryService.publicLog2('sync/getmanifest');
393+
const syncHeaders: IHeaders = { 'X-Execution-Id': generateUuid() };
394+
let manifest = await this.userDataSyncStoreService.manifest(syncHeaders);
395+
396+
// Server has no data but this machine was synced before
397+
if (manifest === null && await this.userDataSyncService.hasPreviouslySynced()) {
398+
// Sync was turned off in the cloud
399+
throw new UserDataSyncError(localize('turned off', "Cannot sync because syncing is turned off in the cloud"), UserDataSyncErrorCode.TurnedOff);
400+
}
401+
402+
const sessionId = this.storageService.get(SESSION_ID_KEY, StorageScope.GLOBAL);
403+
// Server session is different from client session
404+
if (sessionId && manifest && sessionId !== manifest.session) {
405+
throw new UserDataSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired);
406+
}
407+
408+
const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined);
409+
// Return if cancellation is requested
410+
if (token.isCancellationRequested) {
411+
return;
412+
}
413+
414+
const currentMachine = machines.find(machine => machine.isCurrent);
415+
// Check if sync was turned off from other machine
416+
if (currentMachine?.disabled) {
417+
// Throw TurnedOff error
418+
throw new UserDataSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff);
419+
}
420+
421+
await this.userDataSyncService.sync(manifest, headers, token);
422+
423+
// After syncing, get the manifest if it was not available before
424+
if (manifest === null) {
425+
manifest = await this.userDataSyncStoreService.manifest(syncHeaders);
426+
}
427+
428+
// Return if cancellation is requested
429+
if (token.isCancellationRequested) {
430+
return;
431+
}
432+
433+
// Update local session id
434+
if (manifest && manifest.session !== sessionId) {
435+
this.storageService.store(SESSION_ID_KEY, manifest.session, StorageScope.GLOBAL);
436+
}
437+
438+
} catch (error) {
439+
if (error instanceof UserDataSyncError) {
440+
this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource });
441+
}
442+
throw error;
443+
} finally {
444+
this.updateStatus();
445+
this._onSyncErrors.fire(this._syncErrors);
446+
}
447+
}
448+
382449
register<T extends IDisposable>(t: T): T {
383450
return super._register(t);
384451
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ export interface IUserDataSyncService {
364364
resetLocal(): Promise<void>;
365365

366366
isFirstTimeSyncingWithAnotherMachine(): Promise<boolean>;
367+
hasPreviouslySynced(): Promise<boolean>;
367368
resolveContent(resource: URI): Promise<string | null>;
368369
acceptConflict(conflictResource: URI, content: string): Promise<void>;
369370

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ type SyncClassification = {
2828
resource?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
2929
};
3030

31-
const SESSION_ID_KEY = 'sync.sessionId';
3231
const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime';
3332

3433
export class UserDataSyncService extends Disposable implements IUserDataSyncService {
@@ -351,7 +350,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
351350
this.logService.info('Did reset the local sync state.');
352351
}
353352

354-
private async hasPreviouslySynced(): Promise<boolean> {
353+
async hasPreviouslySynced(): Promise<boolean> {
355354
for (const synchroniser of this.synchronisers) {
356355
if (await synchroniser.hasPreviouslySynced()) {
357356
return true;

0 commit comments

Comments
 (0)