Fix issues with notebook providers not appearing, or being waited on for too long during startup. (#17288)

This commit is contained in:
Cory Rivera
2021-10-06 21:58:24 -07:00
committed by GitHub
parent 671c062e59
commit 56e961c972

View File

@@ -50,7 +50,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor
import { IEditorInput, IEditorPane } from 'vs/workbench/common/editor'; import { IEditorInput, IEditorPane } from 'vs/workbench/common/editor';
import { isINotebookInput } from 'sql/workbench/services/notebook/browser/interface'; import { isINotebookInput } from 'sql/workbench/services/notebook/browser/interface';
import { INotebookShowOptions } from 'sql/workbench/api/common/sqlExtHost.protocol'; import { INotebookShowOptions } from 'sql/workbench/api/common/sqlExtHost.protocol';
import { JUPYTER_PROVIDER_ID, NotebookLanguage } from 'sql/workbench/common/constants'; import { NotebookLanguage } from 'sql/workbench/common/constants';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { SqlSerializationProvider } from 'sql/workbench/services/notebook/browser/sql/sqlSerializationProvider'; import { SqlSerializationProvider } from 'sql/workbench/services/notebook/browser/sql/sqlSerializationProvider';
@@ -305,25 +305,31 @@ export class NotebookService extends Disposable implements INotebookService {
} }
private handleNewProviderDescriptions(p: { id: string; registration: ProviderDescriptionRegistration }) { private handleNewProviderDescriptions(p: { id: string; registration: ProviderDescriptionRegistration }) {
// Skip adding a Serialization descriptor for Jupyter, since we use the default notebook Serialization provider for jupyter
if (!this._serializationProviders.has(p.id) && p.id !== JUPYTER_PROVIDER_ID) {
this._serializationProviders.set(p.id, new SerializationProviderDescriptor(p.id));
}
if (!this._executeProviders.has(p.id)) {
this._executeProviders.set(p.id, new ExecuteProviderDescriptor(p.id));
}
let registration = p.registration; let registration = p.registration;
if (registration.fileExtensions) { if (registration.fileExtensions) {
if (Array.isArray(registration.fileExtensions)) { let extensions = registration.fileExtensions;
for (let fileType of registration.fileExtensions) { if (!this._serializationProviders.has(p.id)) {
// Only add a new provider descriptor if the provider
// supports file extensions beyond the default ipynb
let isNewFileType = (fileExt: string) => fileExt?.length > 0 && fileExt.toUpperCase() !== DEFAULT_NOTEBOOK_FILETYPE;
let addNewProvider = Array.isArray(extensions) ? extensions.some(ext => isNewFileType(ext)) : isNewFileType(extensions);
if (addNewProvider) {
this._serializationProviders.set(p.id, new SerializationProviderDescriptor(p.id));
}
}
if (Array.isArray(extensions)) {
for (let fileType of extensions) {
this.addFileProvider(fileType, registration); this.addFileProvider(fileType, registration);
} }
} }
else { else {
this.addFileProvider(registration.fileExtensions, registration); this.addFileProvider(extensions, registration);
} }
} }
if (registration.standardKernels) { if (registration.standardKernels) {
if (!this._executeProviders.has(p.id)) {
this._executeProviders.set(p.id, new ExecuteProviderDescriptor(p.id));
}
this.addStandardKernels(registration); this.addStandardKernels(registration);
} }
} }
@@ -625,27 +631,21 @@ export class NotebookService extends Disposable implements INotebookService {
} }
private waitOnSerializationProviderAvailability(providerDescriptor: SerializationProviderDescriptor, timeout?: number): Promise<ISerializationProvider | undefined> { private waitOnSerializationProviderAvailability(providerDescriptor: SerializationProviderDescriptor, timeout?: number): Promise<ISerializationProvider | undefined> {
// Wait up to 10 seconds for the provider to be registered // Wait up to 30 seconds for the provider to be registered
timeout = timeout ?? 10000; timeout = timeout ?? 30000;
let promises: Promise<ISerializationProvider>[] = [ let promises: Promise<ISerializationProvider>[] = [
providerDescriptor.instanceReady, providerDescriptor.instanceReady,
new Promise<ISerializationProvider>((resolve, reject) => setTimeout(() => { new Promise<ISerializationProvider>((resolve, reject) => setTimeout(() => resolve(undefined), timeout))
this._serializationProviders.delete(providerDescriptor.providerId);
return resolve(undefined);
}, timeout))
]; ];
return Promise.race(promises); return Promise.race(promises);
} }
private waitOnExecuteProviderAvailability(providerDescriptor: ExecuteProviderDescriptor, timeout?: number): Promise<IExecuteProvider | undefined> { private waitOnExecuteProviderAvailability(providerDescriptor: ExecuteProviderDescriptor, timeout?: number): Promise<IExecuteProvider | undefined> {
// Wait up to 10 seconds for the provider to be registered // Wait up to 30 seconds for the provider to be registered
timeout = timeout ?? 10000; timeout = timeout ?? 30000;
let promises: Promise<IExecuteProvider>[] = [ let promises: Promise<IExecuteProvider>[] = [
providerDescriptor.instanceReady, providerDescriptor.instanceReady,
new Promise<IExecuteProvider>((resolve, reject) => setTimeout(() => { new Promise<IExecuteProvider>((resolve, reject) => setTimeout(() => resolve(undefined), timeout))
this._executeProviders.delete(providerDescriptor.providerId);
return resolve(undefined);
}, timeout))
]; ];
return Promise.race(promises); return Promise.race(promises);
} }