Archived
1
0

Handle disconnects (#363)

* Make proxies decide how to handle disconnects

* Connect to a new terminal instance on disconnect

* Use our retry for the watcher

* Specify method when proxy doesn't exist

* Don't error when closing/killing disconnected proxy

* Specify proxy ID when a method doesn't exist

* Use our retry for the searcher

Also dispose some things for the watcher because it doesn't seem that
was done properly.

The searcher also now starts immediately so there won't be lag when you
perform your first search.

* Use our retry for the extension host

* Emit error in parent proxy class

Reduces duplicate code. Not all items are "supposed" to have an error
event according to the original implementation we are filling, but there
is no reason why we can't emit our own events (and are already doing so
for the "disconnected" event anyway).

* Reconnect spdlog

* Add error message when shared process disconnects

* Pass method resolve to parse

* Don't pass method to getProxy

It doesn't tell you anything that trace logging wouldn't and has
no relation to what the function actually does.

* Fix infinite recursion when disposing protocol client in tests
This commit is contained in:
Asher
2019-03-28 17:59:49 -05:00
committed by Kyle Carberry
parent a4cca6b759
commit 03ad2a17b2
11 changed files with 219 additions and 30 deletions

View File

@ -883,7 +883,7 @@ index acb68c8..bee143a 100644
- !isMacintosh || // macOS only
+ !browser.isMacintosh || // macOS only
diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts
index 7445d7b..0291dee 100644
index 7445d7b..ba6bf4b 100644
--- a/src/vs/workbench/electron-browser/workbench.ts
+++ b/src/vs/workbench/electron-browser/workbench.ts
@@ -19 +19,2 @@ import { Registry } from 'vs/platform/registry/common/platform';
@ -899,13 +899,15 @@ index 7445d7b..0291dee 100644
@@ -458 +462 @@ export class Workbench extends Disposable implements IPartService {
- addClasses(document.body, platformClass); // used by our fonts
+ addClasses(document.body, platformClass, isWeb ? 'web' : 'native'); // used by our fonts
@@ -633 +637 @@ export class Workbench extends Disposable implements IPartService {
@@ -491,0 +496 @@ export class Workbench extends Disposable implements IPartService {
+ client.onClose(() => this.notificationService.error("Disconnected from shared process. Searching, installing, enabling, and disabling extensions will not work until the page is refreshed."));
@@ -633 +638 @@ export class Workbench extends Disposable implements IPartService {
- if (!isMacintosh && this.useCustomTitleBarStyle()) {
+ if (isWeb || (!isMacintosh && this.useCustomTitleBarStyle())) {
@@ -1241 +1245 @@ export class Workbench extends Disposable implements IPartService {
@@ -1241 +1246 @@ export class Workbench extends Disposable implements IPartService {
- if ((isWindows || isLinux) && this.useCustomTitleBarStyle()) {
+ if ((isWeb || isWindows || isLinux) && this.useCustomTitleBarStyle()) {
@@ -1397 +1401 @@ export class Workbench extends Disposable implements IPartService {
@@ -1397 +1402 @@ export class Workbench extends Disposable implements IPartService {
- } else if (isMacintosh) {
+ } else if (isNative && isMacintosh) {
diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
@ -914,6 +916,18 @@ index 0592910..0ce7e35 100644
+++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
@@ -33,0 +34 @@ function getSystemExtensionsRoot(): string {
+ return (require('vs/../../../../packages/vscode/src/fill/paths') as typeof import ('vs/../../../../packages/vscode/src/fill/paths')).getBuiltInExtensionsDirectory();
diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
index 2c2f9c7..69fa321 100644
--- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
+++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
@@ -34,0 +35 @@ import { Schemas } from 'vs/base/common/network';
+const retry = (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.retry;
@@ -117,0 +119 @@ export class ExtensionService extends Disposable implements IExtensionService {
+ retry.register('Extension Host', () => this.startExtensionHost());
@@ -435,0 +438 @@ export class ExtensionService extends Disposable implements IExtensionService {
+ extHostProcessWorker.start().then(() => retry.recover('Extension Host'));
@@ -458,0 +462 @@ export class ExtensionService extends Disposable implements IExtensionService {
+ return retry.run('Extension Host');
diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts
index 484cef9..f728fc8 100644
--- a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts
@ -921,6 +935,46 @@ index 484cef9..f728fc8 100644
@@ -137 +137 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise<IRenderer
- process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
+ // process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
index ca03fc9..e3dcd08 100644
--- a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
+++ b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
@@ -18,0 +19 @@ import { getPathFromAmdModule } from 'vs/base/common/amd';
+const retry = (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.retry;
@@ -35,0 +37 @@ export class FileWatcher {
+ retry.register('Watcher', () => this.startWatching());
@@ -56,0 +59,2 @@ export class FileWatcher {
+ this.toDispose = dispose(this.toDispose);
+ return retry.run('Watcher');
@@ -113 +117 @@ export class FileWatcher {
- }));
+ })).then(() => retry.recover('Watcher'));
diff --git a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts
index 7e3a324..b9ccd63 100644
--- a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts
+++ b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts
@@ -18,0 +19 @@ import { getPathFromAmdModule } from 'vs/base/common/amd';
+const retry = (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.retry;
@@ -36,0 +38 @@ export class FileWatcher {
+ retry.register('Watcher', () => this.startWatching());
@@ -59,0 +62,2 @@ export class FileWatcher {
+ this.toDispose = dispose(this.toDispose);
+ return retry.run('Watcher');
@@ -116 +120 @@ export class FileWatcher {
- }));
+ })).then(() => retry.recover('Watcher'));
diff --git a/src/vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts b/src/vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts
index 74dad64..34cd83b 100644
--- a/src/vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts
+++ b/src/vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts
@@ -14,0 +15 @@ import { getPathFromAmdModule } from 'vs/base/common/amd';
+const retry = (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.retry;
@@ -40,0 +42 @@ export class OutOfProcessWin32FolderWatcher {
+ retry.register('Watcher', () => this.startWatcher());
@@ -52,0 +55 @@ export class OutOfProcessWin32FolderWatcher {
+ this.handle.stdout.once('data', () => retry.recover('Watcher'));
@@ -110,0 +114 @@ export class OutOfProcessWin32FolderWatcher {
+ return retry.run('Watcher');
diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts
index 3c78990..545d91a 100644
--- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts
@ -931,6 +985,40 @@ index 3c78990..545d91a 100644
@@ -130 +130 @@ export class KeyboardMapperFactory {
- if (OS === OperatingSystem.Windows) {
+ if (isNative && OS === OperatingSystem.Windows) {
diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts
index 3eaafa4..0345bad 100644
--- a/src/vs/workbench/services/search/node/searchService.ts
+++ b/src/vs/workbench/services/search/node/searchService.ts
@@ -11 +11 @@ import { Event } from 'vs/base/common/event';
-import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
+import { Disposable, IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle';
@@ -32,0 +33 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
+const retry = (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.retry;
@@ -433,0 +435 @@ export class DiskSearch implements ISearchResultProvider {
+ private toDispose: IDisposable[] = [];
@@ -470,6 +472,16 @@ export class DiskSearch implements ISearchResultProvider {
- const client = new Client(
- getPathFromAmdModule(require, 'bootstrap-fork'),
- opts);
-
- const channel = getNextTickChannel(client.getChannel('search'));
- this.raw = new SearchChannelClient(channel);
+ const connect = (): void => {
+ const client = new Client(
+ getPathFromAmdModule(require, 'bootstrap-fork'),
+ opts);
+ client.onDidProcessExit(() => {
+ this.toDispose = dispose(this.toDispose);
+ retry.run('Searcher');
+ }, null, this.toDispose);
+ this.toDispose.push(client);
+
+ const channel = getNextTickChannel(client.getChannel('search'));
+ this.raw = new SearchChannelClient(channel);
+ this.raw.clearCache('test-connectivity').then(() => retry.recover('Searcher'));
+ };
+ retry.register('Searcher', connect);
+ connect();
diff --git a/src/vs/workbench/services/timer/electron-browser/timerService.ts b/src/vs/workbench/services/timer/electron-browser/timerService.ts
index 6e6fbcc..645bd72 100644
--- a/src/vs/workbench/services/timer/electron-browser/timerService.ts