Notebooks: Potential Fix for "Notebook Provider does not Exist" Error (#4848)

* Fallback to SQL

* Fix providers not found issue

* await whenInstalledExtensionsRegistered

* PR comments
This commit is contained in:
Chris LaFreniere
2019-04-10 11:34:46 -07:00
committed by GitHub
parent 5dc37f7557
commit d6df20b0e8

View File

@@ -11,7 +11,7 @@ import { URI } from 'vs/base/common/uri';
import { Registry } from 'vs/platform/registry/common/platform';
import {
INotebookService, INotebookManager, INotebookProvider, DEFAULT_NOTEBOOK_PROVIDER,
INotebookService, INotebookManager, INotebookProvider,
DEFAULT_NOTEBOOK_FILETYPE, INotebookEditor, SQL_NOTEBOOK_PROVIDER, OVERRIDE_EDITOR_THEMING_SETTING
} from 'sql/workbench/services/notebook/common/notebookService';
import { RenderMimeRegistry } from 'sql/workbench/parts/notebook/outputs/registry';
@@ -97,7 +97,7 @@ export class NotebookService extends Disposable implements INotebookService {
constructor(
@ILifecycleService lifecycleService: ILifecycleService,
@IStorageService private _storageService: IStorageService,
@IExtensionService extensionService: IExtensionService,
@IExtensionService private _extensionService: IExtensionService,
@IExtensionManagementService extensionManagementService: IExtensionManagementService,
@IInstantiationService private _instantiationService: IInstantiationService,
@IContextKeyService private _contextKeyService: IContextKeyService,
@@ -121,8 +121,8 @@ export class NotebookService extends Disposable implements INotebookService {
});
}
if (extensionService) {
extensionService.whenInstalledExtensionsRegistered().then(() => {
if (this._extensionService) {
this._extensionService.whenInstalledExtensionsRegistered().then(() => {
this.cleanupProviders();
// If providers have already registered by this point, add them now (since onHandlerAdded will never fire)
@@ -136,7 +136,7 @@ export class NotebookService extends Disposable implements INotebookService {
});
}
if (extensionManagementService) {
this._register(extensionManagementService.onDidUninstallExtension(({ identifier }) => this.removeContributedProvidersFromCache(identifier, extensionService)));
this._register(extensionManagementService.onDidUninstallExtension(({ identifier }) => this.removeContributedProvidersFromCache(identifier, this._extensionService)));
}
lifecycleService.onWillShutdown(() => this.shutdown());
@@ -404,15 +404,21 @@ export class NotebookService extends Disposable implements INotebookService {
// Try get from actual provider, waiting on its registration
if (providerDescriptor) {
if (!providerDescriptor.instance) {
// Await extension registration before awaiting provider registration
try {
await this._extensionService.whenInstalledExtensionsRegistered;
} catch (error) {
console.error(error);
}
instance = await this.waitOnProviderAvailability(providerDescriptor);
} else {
instance = providerDescriptor.instance;
}
}
// Fall back to default if this failed
// Fall back to default (SQL) if this failed
if (!instance) {
providerDescriptor = this._providers.get(DEFAULT_NOTEBOOK_PROVIDER);
providerDescriptor = this._providers.get(SQL_NOTEBOOK_PROVIDER);
instance = providerDescriptor ? providerDescriptor.instance : undefined;
}
@@ -424,8 +430,8 @@ export class NotebookService extends Disposable implements INotebookService {
}
private waitOnProviderAvailability(providerDescriptor: ProviderDescriptor, timeout?: number): Promise<INotebookProvider> {
// Wait up to 10 seconds for the provider to be registered
timeout = timeout || 10000;
// Wait up to 30 seconds for the provider to be registered
timeout = timeout || 30000;
let promises: Promise<INotebookProvider>[] = [
providerDescriptor.instanceReady,
new Promise<INotebookProvider>((resolve, reject) => setTimeout(() => resolve(), timeout))