Skip to content

Commit 6b972bb

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

File tree

3 files changed

+54
-16
lines changed

3 files changed

+54
-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: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,25 @@
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.26"
7+
resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-gpl-5862-snapshot.26.tgz#476846288468549adc3be2964684034335247e7e"
8+
integrity sha512-gELiBQNFDz0bQ+Ztt5tykLTU6DUnTsD9M1Zv97jurA1KK0/TL5Zpz8hTNlDQxZpCESuYIvxrscGs44vT4KVmUw==
99
dependencies:
1010
ajv "^6.5.4"
1111
analytics-node "^4.0.1"
12+
cookie "^0.4.1"
1213
inversify "^5.0.1"
1314
jaeger-client "3.17.2"
1415
js-yaml "^3.10.0"
1516
opentracing "^0.14.4"
16-
prom-client "^10.2.0"
17+
prom-client "^13.2.0"
1718
random-number-csprng "^1.0.2"
1819
reconnecting-websocket "^4.4.0"
1920
reflect-metadata "^0.1.10"
2021
uuid "^3.3.3"
22+
vscode-jsonrpc "^5.0.1"
23+
vscode-languageserver-protocol "3.15.3"
2124
vscode-uri "^1.0.1"
2225
vscode-ws-jsonrpc "^0.2.0"
2326
ws "^7.4.6"
@@ -242,6 +245,11 @@ [email protected]:
242245
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
243246
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
244247

248+
cookie@^0.4.1:
249+
version "0.4.1"
250+
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
251+
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
252+
245253
create-error@^0.3.1:
246254
version "0.3.1"
247255
resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23"
@@ -499,10 +507,10 @@ process@^0.10.0:
499507
resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725"
500508
integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=
501509

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==
510+
prom-client@^13.2.0:
511+
version "13.2.0"
512+
resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.2.0.tgz#99d13357912dd400f8911b77df19f7b328a93e92"
513+
integrity sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ==
506514
dependencies:
507515
tdigest "^0.1.1"
508516

@@ -621,6 +629,19 @@ vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1:
621629
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794"
622630
integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
623631

632+
633+
version "3.15.3"
634+
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb"
635+
integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==
636+
dependencies:
637+
vscode-jsonrpc "^5.0.1"
638+
vscode-languageserver-types "3.15.1"
639+
640+
641+
version "3.15.1"
642+
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"
643+
integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
644+
624645
vscode-nls@^5.0.0:
625646
version "5.0.0"
626647
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"

0 commit comments

Comments
 (0)