diff --git a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts index 1cbe1bd091..544615fb89 100644 --- a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts +++ b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts @@ -353,8 +353,10 @@ export class NotebookService extends Disposable implements INotebookService { this.addStandardKernels(registration); } else { // Standard kernels might get registered later for VSCode notebooks, so add a descriptor to wait on - let descriptor = new StandardKernelsDescriptor(p.id); - this._providerToStandardKernels.set(p.id.toUpperCase(), descriptor); + if (!this._providerToStandardKernels.has(p.id)) { + let descriptor = new StandardKernelsDescriptor(p.id); + this._providerToStandardKernels.set(p.id.toUpperCase(), descriptor); + } } // Emit activation event if the provider is not one of the default options @@ -460,10 +462,15 @@ export class NotebookService extends Disposable implements INotebookService { public async getStandardKernelsForProvider(provider: string): Promise { let descriptor = this._providerToStandardKernels.get(provider.toUpperCase()); + let kernels: nb.IStandardKernel[] = undefined; if (descriptor) { - return this.waitOnStandardKernelsAvailability(descriptor); + if (descriptor.instance) { + kernels = descriptor.instance; + } else { + kernels = await this.waitOnStandardKernelsAvailability(descriptor); + } } - return undefined; + return kernels; } private shutdown(): void { @@ -647,8 +654,15 @@ export class NotebookService extends Disposable implements INotebookService { } catch (error) { this._logService.error(error); } - instance = await this.waitOnExecuteProviderAvailability(providerDescriptor, timeout); - if (instance) { + + if (providerDescriptor.instance) { + instance = providerDescriptor.instance; + } else { + instance = await this.waitOnExecuteProviderAvailability(providerDescriptor, timeout); + } + + // Even if we have an execute provider, we still need standard kernels to be able to use it + if (instance && !kernelDescriptor.instance) { let kernels = await this.waitOnStandardKernelsAvailability(kernelDescriptor, timeout); if (!kernels) { instance = undefined; @@ -678,7 +692,9 @@ export class NotebookService extends Disposable implements INotebookService { let promises: Promise[] = [ providerDescriptor.instanceReady, new Promise((resolve, reject) => setTimeout(() => { - onUnexpectedError(localize('serializationProviderTimeout', 'Waiting for Serialization Provider availability timed out for notebook provider \'{0}\'', providerDescriptor.providerId)); + if (!providerDescriptor.instance) { + onUnexpectedError(localize('serializationProviderTimeout', 'Waiting for Serialization Provider availability timed out for notebook provider \'{0}\'', providerDescriptor.providerId)); + } resolve(undefined); }, timeout)) ]; @@ -691,7 +707,9 @@ export class NotebookService extends Disposable implements INotebookService { let promises: Promise[] = [ providerDescriptor.instanceReady, new Promise((resolve, reject) => setTimeout(() => { - onUnexpectedError(localize('executeProviderTimeout', 'Waiting for Execute Provider availability timed out for notebook provider \'{0}\'', providerDescriptor.providerId)); + if (!providerDescriptor.instance) { + onUnexpectedError(localize('executeProviderTimeout', 'Waiting for Execute Provider availability timed out for notebook provider \'{0}\'', providerDescriptor.providerId)); + } resolve(undefined); }, timeout)) ]; @@ -704,7 +722,9 @@ export class NotebookService extends Disposable implements INotebookService { let promises: Promise[] = [ kernelsDescriptor.instanceReady, new Promise((resolve, reject) => setTimeout(() => { - onUnexpectedError(localize('standardKernelsTimeout', 'Waiting for Standard Kernels availability timed out for notebook provider \'{0}\'', kernelsDescriptor.providerId)); + if (!kernelsDescriptor.instance) { + onUnexpectedError(localize('standardKernelsTimeout', 'Waiting for Standard Kernels availability timed out for notebook provider \'{0}\'', kernelsDescriptor.providerId)); + } resolve(undefined); }, timeout)) ];