Skip to content

Commit e31ddea

Browse files
committed
[gitpod-shared] Use "waitForSnapshot" to avoid disconnects
1 parent c18201b commit e31ddea

File tree

3 files changed

+48
-16
lines changed

3 files changed

+48
-16
lines changed

extensions/gitpod-shared/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@types/ws": "^7.2.6"
1818
},
1919
"dependencies": {
20-
"@gitpod/gitpod-protocol": "akosyakov-code-new-gitpod-protocol-5717",
20+
"@gitpod/gitpod-protocol": "gpl-5862-snapshot",
2121
"@gitpod/supervisor-api-grpc": "ak-no-code-desktop-in-stable",
2222
"bufferutil": "^4.0.1",
2323
"reconnecting-websocket": "^4.4.0",

extensions/gitpod-shared/src/features.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require('reflect-metadata');
88
import { GitpodClient, GitpodServer, GitpodServiceImpl, WorkspaceInstanceUpdateListener } from '@gitpod/gitpod-protocol/lib/gitpod-service';
99
import { JsonRpcProxyFactory } from '@gitpod/gitpod-protocol/lib/messaging/proxy-factory';
1010
import { NavigatorContext, PullRequestContext, User } from '@gitpod/gitpod-protocol/lib/protocol';
11+
import { ErrorCodes } from '@gitpod/gitpod-protocol/lib/messaging/error';
1112
import { GitpodHostUrl } from '@gitpod/gitpod-protocol/lib/util/gitpod-host-url';
1213
import { ControlServiceClient } from '@gitpod/supervisor-api-grpc/lib/control_grpc_pb';
1314
import { InfoServiceClient } from '@gitpod/supervisor-api-grpc/lib/info_grpc_pb';
@@ -29,7 +30,7 @@ import ReconnectingWebSocket from 'reconnecting-websocket';
2930
import { URL } from 'url';
3031
import * as util from 'util';
3132
import * as vscode from 'vscode';
32-
import { ConsoleLogger, listen as doListen } from 'vscode-ws-jsonrpc';
33+
import { CancellationToken, ConsoleLogger, listen as doListen } from 'vscode-ws-jsonrpc';
3334
import WebSocket = require('ws');
3435

3536
export class SupervisorConnection {
@@ -65,7 +66,7 @@ export class SupervisorConnection {
6566
}
6667
}
6768

68-
type UsedGitpodFunction = ['getWorkspace', 'openPort', 'stopWorkspace', 'setWorkspaceTimeout', 'getWorkspaceTimeout', 'getLoggedInUser', 'takeSnapshot', 'controlAdmission', 'sendHeartBeat', 'trackEvent'];
69+
type UsedGitpodFunction = ['getWorkspace', 'openPort', 'stopWorkspace', 'setWorkspaceTimeout', 'getWorkspaceTimeout', 'getLoggedInUser', 'takeSnapshot', 'waitForSnapshot', 'controlAdmission', 'sendHeartBeat', 'trackEvent'];
6970
type Union<Tuple extends any[], Union = never> = Tuple[number] | Union;
7071
export type GitpodConnection = Omit<GitpodServiceImpl<GitpodClient, GitpodServer>, 'server'> & {
7172
server: Pick<GitpodServer, Union<UsedGitpodFunction>>
@@ -203,7 +204,7 @@ export async function createGitpodExtensionContext(context: vscode.ExtensionCont
203204
const gitpodApi = workspaceInfo.getGitpodApi()!;
204205

205206
const factory = new JsonRpcProxyFactory<GitpodServer>();
206-
const gitpodFunctions: UsedGitpodFunction = ['getWorkspace', 'openPort', 'stopWorkspace', 'setWorkspaceTimeout', 'getWorkspaceTimeout', 'getLoggedInUser', 'takeSnapshot', 'controlAdmission', 'sendHeartBeat', 'trackEvent'];
207+
const gitpodFunctions: UsedGitpodFunction = ['getWorkspace', 'openPort', 'stopWorkspace', 'setWorkspaceTimeout', 'getWorkspaceTimeout', 'getLoggedInUser', 'takeSnapshot', 'waitForSnapshot', 'controlAdmission', 'sendHeartBeat', 'trackEvent'];
207208
const gitpodService: GitpodConnection = new GitpodServiceImpl<GitpodClient, GitpodServer>(factory.createProxy()) as any;
208209
const gitpodScopes = new Set<string>([
209210
'resource:workspace::' + workspaceId + '::get/update',
@@ -365,12 +366,28 @@ export async function registerWorkspaceCommands(context: GitpodExtensionContext)
365366
));
366367
context.subscriptions.push(vscode.commands.registerCommand('gitpod.takeSnapshot', async () => {
367368
try {
368-
const snapshotId = await vscode.window.withProgress({
369+
let snapshotId = '';
370+
await vscode.window.withProgress({
369371
location: vscode.ProgressLocation.Notification,
370372
cancellable: true,
371373
title: 'Capturing workspace snapshot'
372-
}, _ => {
373-
return context.gitpod.server.takeSnapshot({ workspaceId: context.info.getWorkspaceId() /*, layoutData?*/ });
374+
}, async (_, cancelToken: CancellationToken) => {
375+
snapshotId = await context.gitpod.server.takeSnapshot({ workspaceId: context.info.getWorkspaceId() /*, layoutData?*/ });
376+
377+
while (!cancelToken.isCancellationRequested) {
378+
try {
379+
await context.gitpod.server.waitForSnapshot(snapshotId);
380+
return;
381+
} catch (err) {
382+
if (err.code === ErrorCodes.SNAPSHOT_ERROR || err.code === ErrorCodes.NOT_FOUND) {
383+
// this is indeed an error with snapshot creation itself, break here!
384+
throw err;
385+
}
386+
387+
// other errors (like connection errors): retry
388+
await new Promise((resolve) => setTimeout(resolve, 3000));
389+
}
390+
}
374391
});
375392
const hostname = context.info.getGitpodApi()!.getHost();
376393
const uri = `https://${hostname}#snapshot/${snapshotId}`;

extensions/yarn.lock

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@
22
# yarn lockfile v1
33

44

5-
"@gitpod/gitpod-protocol@akosyakov-code-new-gitpod-protocol-5717":
6-
version "0.1.5-akosyakov-code-new-gitpod-protocol-5717.0"
7-
resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-akosyakov-code-new-gitpod-protocol-5717.0.tgz#2ba3dbf8977a918617c43e057a632cf491a63a17"
8-
integrity sha512-/A4NU1YVa9ACnmQMxZTHoiSzbJvhl4yubFUot3HcptUnzSND4DUj3Se4m7hIRCT2GNtpbQyeTDJhdXwVxgrOrg==
5+
"@gitpod/gitpod-protocol@gpl-5862-snapshot":
6+
version "0.1.5-gpl-5862-snapshot.16"
7+
resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-gpl-5862-snapshot.16.tgz#efe1d196abf67712353bc41462013a21a33d8ed3"
8+
integrity sha512-guziQpfIJ2cZQ6yPZACyx6UWa5/d/8NubfxtnA0D6w2E0ZaVumPrE12adC9OkNosqCDnUl1oeYXWvA+L1h3SVQ==
99
dependencies:
1010
ajv "^6.5.4"
1111
analytics-node "^4.0.1"
1212
inversify "^5.0.1"
1313
jaeger-client "3.17.2"
1414
js-yaml "^3.10.0"
1515
opentracing "^0.14.4"
16-
prom-client "^10.2.0"
16+
prom-client "^13.2.0"
1717
random-number-csprng "^1.0.2"
1818
reconnecting-websocket "^4.4.0"
1919
reflect-metadata "^0.1.10"
2020
uuid "^3.3.3"
21+
vscode-jsonrpc "^5.0.1"
22+
vscode-languageserver-protocol "3.15.3"
2123
vscode-uri "^1.0.1"
2224
vscode-ws-jsonrpc "^0.2.0"
2325
ws "^7.4.6"
@@ -499,10 +501,10 @@ process@^0.10.0:
499501
resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725"
500502
integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=
501503

502-
prom-client@^10.2.0:
503-
version "10.2.3"
504-
resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-10.2.3.tgz#a51bf21c239c954a6c5be4b1361fdd380218bb41"
505-
integrity sha512-Xboq5+TdUwuQtSSDRZRNnb5NprINlgQN999VqUjZxnLKydUNLeIPx6Eiahg6oJua3XBg2TGnh5Cth1s4I6+r7g==
504+
prom-client@^13.2.0:
505+
version "13.2.0"
506+
resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.2.0.tgz#99d13357912dd400f8911b77df19f7b328a93e92"
507+
integrity sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ==
506508
dependencies:
507509
tdigest "^0.1.1"
508510

@@ -621,6 +623,19 @@ vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1:
621623
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794"
622624
integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
623625

626+
627+
version "3.15.3"
628+
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb"
629+
integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==
630+
dependencies:
631+
vscode-jsonrpc "^5.0.1"
632+
vscode-languageserver-types "3.15.1"
633+
634+
635+
version "3.15.1"
636+
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"
637+
integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
638+
624639
vscode-nls@^5.0.0:
625640
version "5.0.0"
626641
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"

0 commit comments

Comments
 (0)