From 50e9b54e126593247e3a61510bac6bbca635af15 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 09:44:52 -0700 Subject: [PATCH 01/30] Fix stack trace issues --- src/test/common/asyncDump.ts | 33 +++++++++++++++++++++--- src/test/datascience/mockDebugService.ts | 9 +++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/test/common/asyncDump.ts b/src/test/common/asyncDump.ts index 7236c16e4258..2c593dfb727c 100644 --- a/src/test/common/asyncDump.ts +++ b/src/test/common/asyncDump.ts @@ -1,9 +1,36 @@ 'use strict'; -//tslint:disable:no-require-imports no-var-requires -const log = require('why-is-node-running'); +// Got this from here: +// https://gist.github.com/boneskull/7fe75b63d613fa940db7ec990a5f5843 +// from a discussion about debugging mocha hangs. + +//tslint:disable:no-require-imports no-var-requires no-any + +const { createHook } = require('async_hooks'); +const { stackTraceFilter } = require('mocha/lib/utils'); +const allResources = new Map(); + +// this will pull Mocha internals out of the stacks +const filterStack = stackTraceFilter(); + +const hook = createHook({ + init(asyncId: any, type: any, triggerAsyncId: any) { + allResources.set(asyncId, { type, triggerAsyncId, stack: (new Error()).stack }); + }, + destroy(asyncId: any) { + allResources.delete(asyncId); + } +}).enable(); // Call this function to debug async hangs. It should print out stack traces of still running promises. export function asyncDump() { - log(); + hook.disable(); + // tslint:disable-next-line: no-multiline-string + console.error(` + STUFF STILL IN THE EVENT LOOP:`); + allResources.forEach(value => { + console.error(`Type: ${value.type}`); + console.error(filterStack(value.stack)); + console.error('\n'); + }); } diff --git a/src/test/datascience/mockDebugService.ts b/src/test/datascience/mockDebugService.ts index 3036d82a3747..39e1771cc8f3 100644 --- a/src/test/datascience/mockDebugService.ts +++ b/src/test/datascience/mockDebugService.ts @@ -73,6 +73,7 @@ export class MockDebuggerService implements IDebugService, IDisposable { private sessionCustomEvent: EventEmitter = new EventEmitter(); private breakpointsChangedEvent: EventEmitter = new EventEmitter(); private _breakpoints: Breakpoint[] = []; + private _stoppedThreadId: number | undefined; constructor( @inject(IProtocolParser) private protocolParser: IProtocolParser ) { @@ -155,7 +156,7 @@ export class MockDebuggerService implements IDebugService, IDisposable { deferred.resolve(args as DebugProtocol.StackTraceResponse); }); await this.emitMessage('stackTrace', { - threadId: 1, + threadId: this._stoppedThreadId ? this._stoppedThreadId : 1, startFrame: 0, levels: 1 }); @@ -266,7 +267,11 @@ export class MockDebuggerService implements IDebugService, IDisposable { }); } - private onBreakpoint(_args: any): void { + private onBreakpoint(args: DebugProtocol.StoppedEvent): void { + // Save the current thread id. We use this in our stack trace request + this._stoppedThreadId = args.body.threadId; + + // Indicate we stopped at a breakpoint this.breakpointEmitter.fire(); } From 3d7b8d597060391f7635d04a546ef4451eeb723b Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 10:09:45 -0700 Subject: [PATCH 02/30] Attempt to fix restart issues with restart kernel. --- .../datascience/jupyter/jupyterSession.ts | 78 +++++++++++++------ 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 7f44a6d60617..e3e15197c903 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -39,7 +39,7 @@ export class JupyterSession implements IJupyterSession { private kernelSpec: IJupyterKernelSpec | undefined; private sessionManager: SessionManager | undefined; private session: Session.ISession | undefined; - private restartSessionPromise: Promise | undefined; + private restartSessionPromise: Promise | undefined; private contentsManager: ContentsManager | undefined; private notebookFiles: Contents.IModel[] = []; private onRestartedEvent: EventEmitter | undefined; @@ -87,25 +87,8 @@ export class JupyterSession implements IJupyterSession { return this.onRestartedEvent.event; } - public async waitForIdle(timeout: number): Promise { - if (this.session && this.session.kernel) { - // This function seems to cause CI builds to timeout randomly on - // different tests. Waiting for status to go idle doesn't seem to work and - // in the past, waiting on the ready promise doesn't work either. Check status with a maximum of 5 seconds - const startTime = Date.now(); - while (this.session && - this.session.kernel && - this.session.kernel.status !== 'idle' && - (Date.now() - startTime < timeout)) { - traceInfo(`Waiting for idle: ${this.session.kernel.status}`); - await sleep(100); - } - - // If we didn't make it out in ten seconds, indicate an error - if (!this.session || !this.session.kernel || this.session.kernel.status !== 'idle') { - throw new JupyterWaitForIdleError(localize.DataScience.jupyterLaunchTimedOut()); - } - } + public waitForIdle(timeout: number): Promise { + return this.waitForIdleOnSession(this.session, timeout); } public async restart(_timeout: number): Promise { @@ -115,15 +98,18 @@ export class JupyterSession implements IJupyterSession { const oldSession = this.session; const oldStatusHandler = this.statusHandler; - // Just switch to the other session. + // Just switch to the other session. It should already be ready this.session = await this.restartSessionPromise; + if (!this.session) { + throw new Error(localize.DataScience.sessionDisposed()); + } // Rewire our status changed event. this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); this.session.statusChanged.connect(this.statusHandler); // After switching, start another in case we restart again. - this.restartSessionPromise = this.createSession(oldSession.serverSettings, this.contentsManager); + this.restartSessionPromise = this.createReadySession(oldSession.serverSettings, this.contentsManager); this.shutdownSession(oldSession, oldStatusHandler).ignoreErrors(); } else { throw new Error(localize.DataScience.sessionDisposed()); @@ -157,7 +143,7 @@ export class JupyterSession implements IJupyterSession { this.session = await this.createSession(serverSettings, this.contentsManager, cancelToken); // Start another session to handle restarts - this.restartSessionPromise = this.createSession(serverSettings, this.contentsManager, cancelToken); + this.restartSessionPromise = this.createReadySession(serverSettings, this.contentsManager, cancelToken); // Listen for session status changes this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); @@ -171,6 +157,52 @@ export class JupyterSession implements IJupyterSession { return this.connected; } + private async waitForIdleOnSession(session: Session.ISession | undefined, timeout: number): Promise { + if (session && session.kernel) { + // This function seems to cause CI builds to timeout randomly on + // different tests. Waiting for status to go idle doesn't seem to work and + // in the past, waiting on the ready promise doesn't work either. Check status with a maximum of 5 seconds + const startTime = Date.now(); + while (session && + session.kernel && + session.kernel.status !== 'idle' && + (Date.now() - startTime < timeout)) { + traceInfo(`Waiting for idle: ${session.kernel.status}`); + await sleep(100); + } + + // If we didn't make it out in ten seconds, indicate an error + if (!session || !session.kernel || session.kernel.status !== 'idle') { + throw new JupyterWaitForIdleError(localize.DataScience.jupyterLaunchTimedOut()); + } + } + } + + private async createReadySession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { + // This is the same as a regular session, but it should already be in the idle state when this function returns. This allows the restart session to just be used. + + // Try connecting a bunch of times. This can fail occassionally. + let session: Session.ISession | undefined; + let tryCount = 0; + const maxTries = 3; + while (tryCount < maxTries) { + try { + session = await this.createSession(serverSettings, contentsManager, cancelToken); + await this.waitForIdleOnSession(session, 10000); + } catch (exc) { + if (session) { + await this.shutdownSession(session, undefined); + session = undefined; + } + // Try 3 times + if (exc instanceof JupyterWaitForIdleError && tryCount < maxTries) { + tryCount += 1; + } + } + } + return session; + } + private async createSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { // Create a temporary notebook for this session. From ceddc34cf9a26acc8e0e15ad78580aada160b489 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 10:20:48 -0700 Subject: [PATCH 03/30] Add async dump for long running test --- src/test/datascience/liveshare.functional.test.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/test/datascience/liveshare.functional.test.tsx b/src/test/datascience/liveshare.functional.test.tsx index 7dbda32e380b..85ea8d6970cd 100644 --- a/src/test/datascience/liveshare.functional.test.tsx +++ b/src/test/datascience/liveshare.functional.test.tsx @@ -17,8 +17,15 @@ import { } from '../../client/common/application/types'; import { IFileSystem } from '../../client/common/platform/types'; import { Commands } from '../../client/datascience/constants'; -import { ICodeWatcher, IDataScienceCommandListener, IInteractiveWindow, IInteractiveWindowProvider, IJupyterExecution } from '../../client/datascience/types'; +import { + ICodeWatcher, + IDataScienceCommandListener, + IInteractiveWindow, + IInteractiveWindowProvider, + IJupyterExecution +} from '../../client/datascience/types'; import { MainPanel } from '../../datascience-ui/history-react/MainPanel'; +import { asyncDump } from '../common/asyncDump'; import { DataScienceIocContainer } from './dataScienceIocContainer'; import { createDocument } from './editor-integration/helpers'; import { addMockData, CellPosition, verifyHtmlOnCell } from './interactiveWindowTestHelpers'; @@ -54,6 +61,10 @@ suite('DataScience LiveShare tests', () => { lastErrorMessage = undefined; }); + suiteTeardown(() => { + asyncDump(); + }); + function createContainer(role: vsls.Role): DataScienceIocContainer { const result = new DataScienceIocContainer(); result.registerDataScienceTypes(); From 5a0c405316f4619b6dc0357802b51014b9be6b30 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 12:22:41 -0700 Subject: [PATCH 04/30] Fix loop for session --- src/client/datascience/jupyter/jupyterSession.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index e3e15197c903..193823853d56 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -189,6 +189,7 @@ export class JupyterSession implements IJupyterSession { try { session = await this.createSession(serverSettings, contentsManager, cancelToken); await this.waitForIdleOnSession(session, 10000); + return session; } catch (exc) { if (session) { await this.shutdownSession(session, undefined); @@ -200,7 +201,7 @@ export class JupyterSession implements IJupyterSession { } } } - return session; + return undefined; } private async createSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { From 1f179e5129512d9f594f6832c4ad9ff84ed8e086 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 13:48:30 -0700 Subject: [PATCH 05/30] Try waiting longer for shutdown --- src/client/datascience/jupyter/jupyterSession.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 193823853d56..c716f4daffbb 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -334,10 +334,11 @@ export class JupyterSession implements IJupyterSession { } } } + await waitForPromise(session.shutdown(), 20000); + } else { + // Shutdown may fail if the process has been killed + await waitForPromise(session.shutdown(), 1000); } - - // Shutdown may fail if the process has been killed - await waitForPromise(session.shutdown(), 1000); } catch { noop(); } From f1c7eac75a66c247665c1b637bd22cee32b61c17 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 13:57:36 -0700 Subject: [PATCH 06/30] Put async dump back the way it was before. --- src/test/common/asyncDump.ts | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/src/test/common/asyncDump.ts b/src/test/common/asyncDump.ts index 2c593dfb727c..a974c5846a55 100644 --- a/src/test/common/asyncDump.ts +++ b/src/test/common/asyncDump.ts @@ -1,36 +1,9 @@ 'use strict'; -// Got this from here: -// https://gist.github.com/boneskull/7fe75b63d613fa940db7ec990a5f5843 -// from a discussion about debugging mocha hangs. - -//tslint:disable:no-require-imports no-var-requires no-any - -const { createHook } = require('async_hooks'); -const { stackTraceFilter } = require('mocha/lib/utils'); -const allResources = new Map(); - -// this will pull Mocha internals out of the stacks -const filterStack = stackTraceFilter(); - -const hook = createHook({ - init(asyncId: any, type: any, triggerAsyncId: any) { - allResources.set(asyncId, { type, triggerAsyncId, stack: (new Error()).stack }); - }, - destroy(asyncId: any) { - allResources.delete(asyncId); - } -}).enable(); +//tslint:disable:no-require-imports no-var-requires +const log = require('why-is-node-running'); // Call this function to debug async hangs. It should print out stack traces of still running promises. export function asyncDump() { - hook.disable(); - // tslint:disable-next-line: no-multiline-string - console.error(` - STUFF STILL IN THE EVENT LOOP:`); - allResources.forEach(value => { - console.error(`Type: ${value.type}`); - console.error(filterStack(value.stack)); - console.error('\n'); - }); + log(); } From 0beab006caf56fd927dccb7f4fc803316f482d63 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 14:40:17 -0700 Subject: [PATCH 07/30] Use pypi to install ptvsd --- build/functional-test-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/functional-test-requirements.txt b/build/functional-test-requirements.txt index 94cb17be3ac4..25c657ec9645 100644 --- a/build/functional-test-requirements.txt +++ b/build/functional-test-requirements.txt @@ -6,4 +6,4 @@ matplotlib pandas livelossplot # This is temporary until these bits are ready -git+https://s3h4llbub6kmnxk53k53ricbg4n7s6tif3ls6qsywersiroezaea@ptvsd.visualstudio.com/ptvsd-pr/_git/ptvsd-pr@ptvsd_jupyter_cells +--pre ptvsd From 5835c9d4e3d4848aaa3f9a00691ba07f8682e812 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Wed, 10 Jul 2019 15:33:22 -0700 Subject: [PATCH 08/30] Add more logging --- src/client/datascience/jupyter/jupyterSession.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index c716f4daffbb..9122614f2df6 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -46,6 +46,7 @@ export class JupyterSession implements IJupyterSession { private statusHandler: Slot | undefined; private connected: boolean = false; private jupyterPasswordConnect: IJupyterPasswordConnect; + private shuttingDownSessions: Promise[] = []; constructor( connInfo: IConnection, @@ -94,6 +95,8 @@ export class JupyterSession implements IJupyterSession { public async restart(_timeout: number): Promise { // Just kill the current session and switch to the other if (this.restartSessionPromise && this.session && this.sessionManager && this.contentsManager) { + traceInfo(`Restarting ${this.session.kernel.id}`); + // Save old state for shutdown const oldSession = this.session; const oldStatusHandler = this.statusHandler; @@ -103,6 +106,7 @@ export class JupyterSession implements IJupyterSession { if (!this.session) { throw new Error(localize.DataScience.sessionDisposed()); } + traceInfo(`Got new session ${this.session.kernel.id}`); // Rewire our status changed event. this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); @@ -110,7 +114,9 @@ export class JupyterSession implements IJupyterSession { // After switching, start another in case we restart again. this.restartSessionPromise = this.createReadySession(oldSession.serverSettings, this.contentsManager); - this.shutdownSession(oldSession, oldStatusHandler).ignoreErrors(); + traceInfo('Started new restart session'); + this.shuttingDownSessions.push(this.shutdownSession(oldSession, oldStatusHandler)); + traceInfo('Started shutdown of old session'); } else { throw new Error(localize.DataScience.sessionDisposed()); } @@ -360,6 +366,7 @@ export class JupyterSession implements IJupyterSession { } if (this.session || this.sessionManager) { try { + await Promise.all(this.shuttingDownSessions); await this.shutdownSession(this.session, this.statusHandler); const restartSession = await this.restartSessionPromise; await this.shutdownSession(restartSession, undefined); From 391cc983d4aee31624e5f35407416551c6046836 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 09:09:35 -0700 Subject: [PATCH 09/30] More logging --- .../datascience/jupyter/jupyterSession.ts | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 9122614f2df6..dac43888fce4 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -316,10 +316,14 @@ export class JupyterSession implements IJupyterSession { } private async shutdownSession(session: Session.ISession | undefined, statusHandler: Slot | undefined): Promise { - if (session) { + if (session && session.kernel) { + const kernelId = session.kernel.id; + traceInfo(`shutdownSession ${kernelId} - start`); try { if (statusHandler) { + traceInfo(`shutdownSession ${kernelId} - disconnect`); session.statusChanged.disconnect(statusHandler); + traceInfo(`shutdownSession ${kernelId} - disconnect complete`); } try { // When running under a test, mark all futures as done so we @@ -327,29 +331,34 @@ export class JupyterSession implements IJupyterSession { // https://github.com/jupyterlab/jupyterlab/issues/4252 // tslint:disable:no-any if (isTestExecution()) { - if (session && session.kernel) { - const defaultKernel = session.kernel as any; - if (defaultKernel && defaultKernel._futures) { - const futures = defaultKernel._futures as Map; - if (futures) { - futures.forEach(f => { - if (f._status !== undefined) { - f._status |= 4; - } - }); - } + const defaultKernel = session.kernel as any; + if (defaultKernel && defaultKernel._futures) { + traceInfo(`shutdownSession ${kernelId} - fixing futures`); + const futures = defaultKernel._futures as Map; + if (futures) { + futures.forEach(f => { + if (f._status !== undefined) { + f._status |= 4; + } + }); } } + traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); await waitForPromise(session.shutdown(), 20000); + traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } else { + traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); // Shutdown may fail if the process has been killed await waitForPromise(session.shutdown(), 1000); + traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } } catch { noop(); } if (session && !session.isDisposed) { + traceInfo(`shutdownSession ${kernelId} - session dispose`); session.dispose(); + traceInfo(`shutdownSession ${kernelId} - session dispose complete`); } } catch (e) { // Ignore, just trace. @@ -361,17 +370,23 @@ export class JupyterSession implements IJupyterSession { //tslint:disable:cyclomatic-complexity private async shutdownSessionAndConnection(): Promise { if (this.contentsManager) { + traceInfo('ShutdownSessionAndConnection - dispose contents manager'); this.contentsManager.dispose(); this.contentsManager = undefined; } if (this.session || this.sessionManager) { try { + traceInfo('ShutdownSessionAndConnection - old sessions'); await Promise.all(this.shuttingDownSessions); + traceInfo('ShutdownSessionAndConnection - current session'); await this.shutdownSession(this.session, this.statusHandler); + traceInfo('ShutdownSessionAndConnection - get restart session'); const restartSession = await this.restartSessionPromise; + traceInfo('ShutdownSessionAndConnection - shutdown restart session'); await this.shutdownSession(restartSession, undefined); if (this.sessionManager && !this.sessionManager.isDisposed) { + traceInfo('ShutdownSessionAndConnection - dispose session manager'); this.sessionManager.dispose(); } } catch { @@ -385,9 +400,11 @@ export class JupyterSession implements IJupyterSession { this.onRestartedEvent.dispose(); } if (this.connInfo) { + traceInfo('ShutdownSessionAndConnection - dispose conn info'); this.connInfo.dispose(); // This should kill the process that's running this.connInfo = undefined; } + traceInfo('ShutdownSessionAndConnection -- complete'); } } From 053d41ec5b22b57b5b8b2b3eca6e956c8649be83 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 10:14:52 -0700 Subject: [PATCH 10/30] More logging --- src/client/datascience/jupyter/jupyterServer.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index 68fb2201376f..6152aaed49d6 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -559,6 +559,7 @@ export class JupyterServerBase implements INotebookServer { // Set up our initial plotting and imports private async initialNotebookSetup(cancelToken?: CancellationToken): Promise { if (this.ranInitialSetup) { + traceInfo(`Already ran setup for ${this.id}`); return; } this.ranInitialSetup = true; @@ -566,18 +567,21 @@ export class JupyterServerBase implements INotebookServer { try { // When we start our notebook initial, change to our workspace or user specified root directory if (this.launchInfo && this.launchInfo.workingDir && this.launchInfo.connectionInfo.localLaunch) { + traceInfo(`Changing directory for ${this.id}`); await this.changeDirectoryIfPossible(this.launchInfo.workingDir); } const settings = this.configService.getSettings().datascience; const matplobInit = !settings || settings.enablePlotViewer ? CodeSnippits.MatplotLibInitSvg : CodeSnippits.MatplotLibInitPng; + traceInfo(`Initialize matplotlib for ${this.id}`); // Force matplotlib to inline and save the default style. We'll use this later if we // get a request to update style await this.executeSilently( matplobInit, cancelToken ); + traceInfo(`Initial setup complete for ${this.id}`); } catch (e) { traceWarning(e); } From c379710b9b8ec7924611b51343f0779fc9cf8a56 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 10:15:38 -0700 Subject: [PATCH 11/30] Just run functional tests --- build/ci/vscode-python-nightly-ci.yaml | 598 ++++++++++++------------- 1 file changed, 299 insertions(+), 299 deletions(-) diff --git a/build/ci/vscode-python-nightly-ci.yaml b/build/ci/vscode-python-nightly-ci.yaml index 6cd29e185ae5..6e50493003f4 100644 --- a/build/ci/vscode-python-nightly-ci.yaml +++ b/build/ci/vscode-python-nightly-ci.yaml @@ -50,309 +50,309 @@ jobs: ## Virtual Environment Tests: - 'Win-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Unit': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testUnitTests, pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Unit': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Unit': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Win-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Unit': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'pythonUnitTests' - NeedsPythonTestReqs: true + # 'Win-Py3.7 Unit': + # PythonVersion: '3.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testUnitTests, pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Linux-Py3.7 Unit': + # PythonVersion: '3.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testUnitTests, pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Mac-Py3.7 Unit': + # PythonVersion: '3.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testUnitTests, pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Win-Py3.6 Unit': + # PythonVersion: '3.6' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Linux-Py3.6 Unit': + # PythonVersion: '3.6' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Mac-Py3.6 Unit': + # PythonVersion: '3.6' + # VMImageName: 'macos-10.13' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Win-Py3.5 Unit': + # PythonVersion: '3.5' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Linux-Py3.5 Unit': + # PythonVersion: '3.5' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Mac-Py3.5 Unit': + # PythonVersion: '3.5' + # VMImageName: 'macos-10.13' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Win-Py2.7 Unit': + # PythonVersion: '2.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Linux-Py2.7 Unit': + # PythonVersion: '2.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true + # 'Mac-Py2.7 Unit': + # PythonVersion: '2.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'pythonUnitTests' + # NeedsPythonTestReqs: true - 'Win-Py3.7 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - # This is for the venvTests to use, not needed if you don't run venv tests... - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.7 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.7 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.7' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Win-Py3.6 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.6 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.6 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.6' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Win-Py3.5 Venv': - VMImageName: 'vs2017-win2016' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Linux-Py3.5 Venv': - VMImageName: 'ubuntu-16.04' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - 'Mac-Py3.5 Venv': - VMImageName: 'macos-10.13' - PythonVersion: '3.5' - TestsToRun: 'venvTests' - NeedsPythonTestReqs: true - PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # Note: Virtual env tests use `venv` and won't currently work with Python 2.7 + # 'Win-Py3.7 Venv': + # VMImageName: 'vs2017-win2016' + # PythonVersion: '3.7' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # # This is for the venvTests to use, not needed if you don't run venv tests... + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Linux-Py3.7 Venv': + # VMImageName: 'ubuntu-16.04' + # PythonVersion: '3.7' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Mac-Py3.7 Venv': + # VMImageName: 'macos-10.13' + # PythonVersion: '3.7' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Win-Py3.6 Venv': + # VMImageName: 'vs2017-win2016' + # PythonVersion: '3.6' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Linux-Py3.6 Venv': + # VMImageName: 'ubuntu-16.04' + # PythonVersion: '3.6' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Mac-Py3.6 Venv': + # VMImageName: 'macos-10.13' + # PythonVersion: '3.6' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Win-Py3.5 Venv': + # VMImageName: 'vs2017-win2016' + # PythonVersion: '3.5' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Linux-Py3.5 Venv': + # VMImageName: 'ubuntu-16.04' + # PythonVersion: '3.5' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # 'Mac-Py3.5 Venv': + # VMImageName: 'macos-10.13' + # PythonVersion: '3.5' + # TestsToRun: 'venvTests' + # NeedsPythonTestReqs: true + # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # # Note: Virtual env tests use `venv` and won't currently work with Python 2.7 - # SingleWorkspace Tests - 'Win-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Single': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Single': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Single': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Win-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Single': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testSingleWorkspace' - NeedsPythonTestReqs: true + # # SingleWorkspace Tests + # 'Win-Py3.7 Single': + # PythonVersion: '3.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.7 Single': + # PythonVersion: '3.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.7 Single': + # PythonVersion: '3.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py3.6 Single': + # PythonVersion: '3.6' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.6 Single': + # PythonVersion: '3.6' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.6 Single': + # PythonVersion: '3.6' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py3.5 Single': + # PythonVersion: '3.5' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.5 Single': + # PythonVersion: '3.5' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.5 Single': + # PythonVersion: '3.5' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py2.7 Single': + # PythonVersion: '2.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py2.7 Single': + # PythonVersion: '2.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py2.7 Single': + # PythonVersion: '2.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testSingleWorkspace' + # NeedsPythonTestReqs: true - # MultiWorkspace Tests - 'Win-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Multi': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Multi': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Multi': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Win-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Multi': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testMultiWorkspace' - NeedsPythonTestReqs: true + # # MultiWorkspace Tests + # 'Win-Py3.7 Multi': + # PythonVersion: '3.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.7 Multi': + # PythonVersion: '3.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.7 Multi': + # PythonVersion: '3.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py3.6 Multi': + # PythonVersion: '3.6' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.6 Multi': + # PythonVersion: '3.6' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.6 Multi': + # PythonVersion: '3.6' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py3.5 Multi': + # PythonVersion: '3.5' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py3.5 Multi': + # PythonVersion: '3.5' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py3.5 Multi': + # PythonVersion: '3.5' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Win-Py2.7 Multi': + # PythonVersion: '2.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Linux-Py2.7 Multi': + # PythonVersion: '2.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true + # 'Mac-Py2.7 Multi': + # PythonVersion: '2.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testMultiWorkspace' + # NeedsPythonTestReqs: true - # Debugger integration Tests - 'Win-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.7 Debugger': - PythonVersion: '3.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.6 Debugger': - PythonVersion: '3.6' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py3.5 Debugger': - PythonVersion: '3.5' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Win-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'vs2017-win2016' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Linux-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'ubuntu-16.04' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true - 'Mac-Py2.7 Debugger': - PythonVersion: '2.7' - VMImageName: 'macos-10.13' - TestsToRun: 'testDebugger' - NeedsPythonTestReqs: true + # # Debugger integration Tests + # 'Win-Py3.7 Debugger': + # PythonVersion: '3.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Linux-Py3.7 Debugger': + # PythonVersion: '3.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Mac-Py3.7 Debugger': + # PythonVersion: '3.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Win-Py3.6 Debugger': + # PythonVersion: '3.6' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Linux-Py3.6 Debugger': + # PythonVersion: '3.6' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Mac-Py3.6 Debugger': + # PythonVersion: '3.6' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Win-Py3.5 Debugger': + # PythonVersion: '3.5' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Linux-Py3.5 Debugger': + # PythonVersion: '3.5' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Mac-Py3.5 Debugger': + # PythonVersion: '3.5' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Win-Py2.7 Debugger': + # PythonVersion: '2.7' + # VMImageName: 'vs2017-win2016' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Linux-Py2.7 Debugger': + # PythonVersion: '2.7' + # VMImageName: 'ubuntu-16.04' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true + # 'Mac-Py2.7 Debugger': + # PythonVersion: '2.7' + # VMImageName: 'macos-10.13' + # TestsToRun: 'testDebugger' + # NeedsPythonTestReqs: true # Functional tests (not mocked Jupyter) 'Windows-Py3.7 Functional': From f9a2362763674775ff23b838f664f596dc679df4 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 12:41:02 -0700 Subject: [PATCH 12/30] Remote ready session work. Only wait for ready on restart. --- .../datascience/jupyter/jupyterSession.ts | 37 ++++--------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index dac43888fce4..7483ca90a24f 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -92,7 +92,7 @@ export class JupyterSession implements IJupyterSession { return this.waitForIdleOnSession(this.session, timeout); } - public async restart(_timeout: number): Promise { + public async restart(timeout: number): Promise { // Just kill the current session and switch to the other if (this.restartSessionPromise && this.session && this.sessionManager && this.contentsManager) { traceInfo(`Restarting ${this.session.kernel.id}`); @@ -108,12 +108,15 @@ export class JupyterSession implements IJupyterSession { } traceInfo(`Got new session ${this.session.kernel.id}`); + // Wait for idle on this session. It may or may not be ready yet. + await this.waitForIdleOnSession(this.session, timeout); + // Rewire our status changed event. this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); this.session.statusChanged.connect(this.statusHandler); // After switching, start another in case we restart again. - this.restartSessionPromise = this.createReadySession(oldSession.serverSettings, this.contentsManager); + this.restartSessionPromise = this.createSession(oldSession.serverSettings, this.contentsManager); traceInfo('Started new restart session'); this.shuttingDownSessions.push(this.shutdownSession(oldSession, oldStatusHandler)); traceInfo('Started shutdown of old session'); @@ -149,7 +152,7 @@ export class JupyterSession implements IJupyterSession { this.session = await this.createSession(serverSettings, this.contentsManager, cancelToken); // Start another session to handle restarts - this.restartSessionPromise = this.createReadySession(serverSettings, this.contentsManager, cancelToken); + this.restartSessionPromise = this.createSession(serverSettings, this.contentsManager, cancelToken); // Listen for session status changes this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); @@ -184,32 +187,6 @@ export class JupyterSession implements IJupyterSession { } } - private async createReadySession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { - // This is the same as a regular session, but it should already be in the idle state when this function returns. This allows the restart session to just be used. - - // Try connecting a bunch of times. This can fail occassionally. - let session: Session.ISession | undefined; - let tryCount = 0; - const maxTries = 3; - while (tryCount < maxTries) { - try { - session = await this.createSession(serverSettings, contentsManager, cancelToken); - await this.waitForIdleOnSession(session, 10000); - return session; - } catch (exc) { - if (session) { - await this.shutdownSession(session, undefined); - session = undefined; - } - // Try 3 times - if (exc instanceof JupyterWaitForIdleError && tryCount < maxTries) { - tryCount += 1; - } - } - } - return undefined; - } - private async createSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { // Create a temporary notebook for this session. @@ -344,7 +321,7 @@ export class JupyterSession implements IJupyterSession { } } traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); - await waitForPromise(session.shutdown(), 20000); + await waitForPromise(session.shutdown(), 1000); traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } else { traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); From efcdc46bace4c2c2aee8ba8fa25f0c2d95f2b824 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 14:34:11 -0700 Subject: [PATCH 13/30] Fix debugger tests. Try not shutting down during restart --- build/ci/templates/test_phases.yml | 1 + build/functional-test-requirements.txt | 3 +-- src/client/datascience/jupyter/jupyterSession.ts | 11 +++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build/ci/templates/test_phases.yml b/build/ci/templates/test_phases.yml index f7edee7583e9..0888acd8dc18 100644 --- a/build/ci/templates/test_phases.yml +++ b/build/ci/templates/test_phases.yml @@ -203,6 +203,7 @@ steps: python -m pip install -U pip python -m pip install numpy python -m pip install --upgrade -r ./build/functional-test-requirements.txt + python -m pip install --upgrade --pre ptvsd displayName: 'pip install functional requirements' condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true')) diff --git a/build/functional-test-requirements.txt b/build/functional-test-requirements.txt index 25c657ec9645..4f328dc438ef 100644 --- a/build/functional-test-requirements.txt +++ b/build/functional-test-requirements.txt @@ -5,5 +5,4 @@ numpy matplotlib pandas livelossplot -# This is temporary until these bits are ready ---pre ptvsd +# PTVSD can't be listed here as we need the --pre version. See the test_phases.yml for ptvsd install diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 7483ca90a24f..4fadc2308737 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -46,7 +46,7 @@ export class JupyterSession implements IJupyterSession { private statusHandler: Slot | undefined; private connected: boolean = false; private jupyterPasswordConnect: IJupyterPasswordConnect; - private shuttingDownSessions: Promise[] = []; + private oldSessions: Session.ISession[] = []; constructor( connInfo: IConnection, @@ -118,8 +118,11 @@ export class JupyterSession implements IJupyterSession { // After switching, start another in case we restart again. this.restartSessionPromise = this.createSession(oldSession.serverSettings, this.contentsManager); traceInfo('Started new restart session'); - this.shuttingDownSessions.push(this.shutdownSession(oldSession, oldStatusHandler)); - traceInfo('Started shutdown of old session'); + if (oldStatusHandler) { + oldSession.statusChanged.disconnect(oldStatusHandler); + } + // Don't shutdown old sessions yet. This seems to hang tests. + this.oldSessions.push(oldSession); } else { throw new Error(localize.DataScience.sessionDisposed()); } @@ -354,7 +357,7 @@ export class JupyterSession implements IJupyterSession { if (this.session || this.sessionManager) { try { traceInfo('ShutdownSessionAndConnection - old sessions'); - await Promise.all(this.shuttingDownSessions); + await Promise.all(this.oldSessions.map(s => this.shutdownSession(s, undefined))); traceInfo('ShutdownSessionAndConnection - current session'); await this.shutdownSession(this.session, this.statusHandler); traceInfo('ShutdownSessionAndConnection - get restart session'); From 0131a32fdb43e0b1dd28c5b5b1e8d5c1b3180531 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 11 Jul 2019 14:36:20 -0700 Subject: [PATCH 14/30] More logging --- src/client/datascience/jupyter/jupyterServer.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index 3ab978cccad4..efeafa290ee1 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -305,15 +305,19 @@ export class JupyterServerBase implements INotebookServer { // Update our start time so we don't keep sending responses this.sessionStartTime = Date.now(); + traceInfo('restartKernel - finishing cells that are outstanding'); // Complete all pending as an error. We're restarting this.finishUncompletedCells(); + traceInfo('restartKernel - restarting kernel'); // Restart our kernel await this.session.restart(timeoutMs); // Rerun our initial setup for the notebook this.ranInitialSetup = false; + traceInfo('restartKernel - initialSetup'); await this.initialNotebookSetup(); + traceInfo('restartKernel - initialSetup completed'); return; } From c79d99e5bf3c518eac3dc4e25f5b5cf7d939d619 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 09:15:55 -0700 Subject: [PATCH 15/30] Put off restart session --- .../datascience/jupyter/jupyterSession.ts | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 4fadc2308737..2d79090bcae9 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -14,13 +14,13 @@ import { JSONObject } from '@phosphor/coreutils'; import { Slot } from '@phosphor/signaling'; import { Agent as HttpsAgent } from 'https'; import * as uuid from 'uuid/v4'; -import { Event, EventEmitter } from 'vscode'; +import { Event, EventEmitter, Disposable } from 'vscode'; import { CancellationToken } from 'vscode-jsonrpc'; import { Cancellation } from '../../common/cancellation'; import { isTestExecution } from '../../common/constants'; import { traceInfo, traceWarning } from '../../common/logger'; -import { sleep, waitForPromise } from '../../common/utils/async'; +import { sleep, waitForPromise, createDeferred } from '../../common/utils/async'; import * as localize from '../../common/utils/localize'; import { noop } from '../../common/utils/misc'; import { @@ -116,7 +116,7 @@ export class JupyterSession implements IJupyterSession { this.session.statusChanged.connect(this.statusHandler); // After switching, start another in case we restart again. - this.restartSessionPromise = this.createSession(oldSession.serverSettings, this.contentsManager); + this.restartSessionPromise = this.createRestartSession(oldSession.serverSettings, this.contentsManager); traceInfo('Started new restart session'); if (oldStatusHandler) { oldSession.statusChanged.disconnect(oldStatusHandler); @@ -155,7 +155,7 @@ export class JupyterSession implements IJupyterSession { this.session = await this.createSession(serverSettings, this.contentsManager, cancelToken); // Start another session to handle restarts - this.restartSessionPromise = this.createSession(serverSettings, this.contentsManager, cancelToken); + this.restartSessionPromise = this.createRestartSession(serverSettings, this.contentsManager, cancelToken); // Listen for session status changes this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); @@ -190,6 +190,26 @@ export class JupyterSession implements IJupyterSession { } } + private createRestartSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { + // Don't do this now as this could interfere with the startup of the other session in use. + const deferred = createDeferred(); + let cancelDisposable: Disposable | undefined; + const timer = setTimeout(() => { + if (cancelDisposable) { + cancelDisposable.dispose(); + } + this.createSession(serverSettings, contentsManager, cancelToken). + then(s => deferred.resolve(s)). + catch(e => deferred.reject(e)); + }, 10); + if (cancelToken) { + cancelDisposable = cancelToken.onCancellationRequested(() => { + clearTimeout(timer); + }); + } + return deferred.promise; + } + private async createSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { // Create a temporary notebook for this session. From 8b7c3cb47593eabdf88d2db1a5601118f91ebc34 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 09:17:48 -0700 Subject: [PATCH 16/30] Add some more logging --- src/client/datascience/jupyter/jupyterServer.ts | 2 +- src/client/datascience/jupyter/jupyterSession.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index efeafa290ee1..e7fbaeec2683 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -543,7 +543,7 @@ export class JupyterServerBase implements INotebookServer { } private generateRequest = (code: string, silent?: boolean): Kernel.IFuture | undefined => { - //this.logger.logInformation(`Executing code in jupyter : ${code}`) + traceInfo(`Executing code in jupyter : ${code}`); try { const cellMatcher = new CellMatcher(this.configService.getSettings().datascience); return this.session ? this.session.requestExecute( diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 2d79090bcae9..f4443b2b0670 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -14,13 +14,13 @@ import { JSONObject } from '@phosphor/coreutils'; import { Slot } from '@phosphor/signaling'; import { Agent as HttpsAgent } from 'https'; import * as uuid from 'uuid/v4'; -import { Event, EventEmitter, Disposable } from 'vscode'; +import { Disposable, Event, EventEmitter } from 'vscode'; import { CancellationToken } from 'vscode-jsonrpc'; import { Cancellation } from '../../common/cancellation'; import { isTestExecution } from '../../common/constants'; import { traceInfo, traceWarning } from '../../common/logger'; -import { sleep, waitForPromise, createDeferred } from '../../common/utils/async'; +import { createDeferred, sleep, waitForPromise } from '../../common/utils/async'; import * as localize from '../../common/utils/localize'; import { noop } from '../../common/utils/misc'; import { From b4c79f3d1fda947e2d0a995f9d96c88f4f5415dd Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 10:31:45 -0700 Subject: [PATCH 17/30] More logging --- src/client/datascience/jupyter/jupyterServer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index e7fbaeec2683..014b7e9d660c 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -14,7 +14,7 @@ import { CancellationToken } from 'vscode-jsonrpc'; import { ILiveShareApi } from '../../common/application/types'; import { Cancellation, CancellationError } from '../../common/cancellation'; -import { traceInfo, traceWarning } from '../../common/logger'; +import { traceInfo, traceWarning, traceError } from '../../common/logger'; import { IAsyncDisposableRegistry, IConfigurationService, IDisposableRegistry, ILogger } from '../../common/types'; import { createDeferred, Deferred, waitForPromise } from '../../common/utils/async'; import * as localize from '../../common/utils/localize'; @@ -535,6 +535,8 @@ export class JupyterServerBase implements INotebookServer { } } + traceError('No session during execute observable'); + // Can't run because no session return new Observable(subscriber => { subscriber.error(this.getDisposedError()); @@ -757,7 +759,9 @@ export class JupyterServerBase implements INotebookServer { } private async logPreCode(cell: ICell, silent: boolean): Promise { + traceInfo(`Logging pre code for ${cell.data.source}`) await Promise.all(this.loggers.map(l => l.preExecute(cell, silent))); + traceInfo(`Finished Logging pre code for ${cell.data.source}`) } private async logPostCode(cell: ICell, silent: boolean): Promise { From 688fcf0912e57fed311a602dd58c15936e02fae4 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 11:55:28 -0700 Subject: [PATCH 18/30] More logging --- src/client/datascience/jupyter/jupyterServer.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index 014b7e9d660c..ebdccec8146a 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -44,13 +44,17 @@ class CellSubscriber { private cellRef: ICell; private subscriber: Subscriber; private promiseComplete: (self: CellSubscriber) => void; - private startTime: number; + private _startTime: number; constructor(cell: ICell, subscriber: Subscriber, promiseComplete: (self: CellSubscriber) => void) { this.cellRef = cell; this.subscriber = subscriber; this.promiseComplete = promiseComplete; - this.startTime = Date.now(); + this._startTime = Date.now(); + } + + public get startTime(): number { + return this._startTime; } public isValid(sessionStartTime: number | undefined) { @@ -650,6 +654,7 @@ export class JupyterServerBase implements INotebookServer { if (this.launchInfo && this.launchInfo.connectionInfo && this.launchInfo.connectionInfo.localProcExitCode) { // Not running, just exit const exitCode = this.launchInfo.connectionInfo.localProcExitCode; + traceError(`Jupyter crashed with code ${exitCode}`); subscriber.error(this.sessionStartTime, new Error(localize.DataScience.jupyterServerCrashed().format(exitCode.toString()))); subscriber.complete(this.sessionStartTime); } else { @@ -723,6 +728,10 @@ export class JupyterServerBase implements INotebookServer { } } } else { + const sessionDate = new Date(this.sessionStartTime!); + const cellDate = new Date(subscriber.startTime); + traceInfo(`Session start time is newer than cell : \r\n${sessionDate.toTimeString()}\r\n${cellDate.toTimeString()}`); + // Otherwise just set to an error this.handleInterrupted(subscriber.cell); subscriber.cell.state = CellState.error; From 454a945c9cbd9763a3e9ffcf5028880ae5adb739 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 13:35:53 -0700 Subject: [PATCH 19/30] Fix restart bug --- src/client/datascience/jupyter/jupyterServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index ebdccec8146a..64e8dc9f9789 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -58,7 +58,7 @@ class CellSubscriber { } public isValid(sessionStartTime: number | undefined) { - return sessionStartTime && this.startTime > sessionStartTime; + return sessionStartTime && this.startTime >= sessionStartTime; } public next(sessionStartTime: number | undefined) { From 60bd05b0166d778034ecacc51dd99f4e6b768203 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 14:46:50 -0700 Subject: [PATCH 20/30] More logging --- src/test/datascience/notebook.functional.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/datascience/notebook.functional.test.ts b/src/test/datascience/notebook.functional.test.ts index c92dcc113007..bb66452cbbfd 100644 --- a/src/test/datascience/notebook.functional.test.ts +++ b/src/test/datascience/notebook.functional.test.ts @@ -486,7 +486,7 @@ suite('DataScience notebook tests', () => { await verifyError(server, 'a', `name 'a' is not defined`); } catch (exc) { - assert.ok(exc instanceof JupyterKernelPromiseFailedError, 'Restarting did not timeout correctly'); + assert.ok(exc instanceof JupyterKernelPromiseFailedError, `Restarting did not timeout correctly for ${exc}`); } }); From 69d8ecb9bbe73935a2dde0cf577331690a198ac0 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 15:02:26 -0700 Subject: [PATCH 21/30] Linter errors --- src/client/datascience/jupyter/jupyterServer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index 64e8dc9f9789..17bdf1dc5cf5 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -14,7 +14,7 @@ import { CancellationToken } from 'vscode-jsonrpc'; import { ILiveShareApi } from '../../common/application/types'; import { Cancellation, CancellationError } from '../../common/cancellation'; -import { traceInfo, traceWarning, traceError } from '../../common/logger'; +import { traceError, traceInfo, traceWarning } from '../../common/logger'; import { IAsyncDisposableRegistry, IConfigurationService, IDisposableRegistry, ILogger } from '../../common/types'; import { createDeferred, Deferred, waitForPromise } from '../../common/utils/async'; import * as localize from '../../common/utils/localize'; @@ -768,9 +768,9 @@ export class JupyterServerBase implements INotebookServer { } private async logPreCode(cell: ICell, silent: boolean): Promise { - traceInfo(`Logging pre code for ${cell.data.source}`) + traceInfo(`Logging pre code for ${cell.data.source}`); await Promise.all(this.loggers.map(l => l.preExecute(cell, silent))); - traceInfo(`Finished Logging pre code for ${cell.data.source}`) + traceInfo(`Finished Logging pre code for ${cell.data.source}`); } private async logPostCode(cell: ICell, silent: boolean): Promise { From c9d9b659d2c2e0110cb822f0613451a923a453cf Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 16:14:03 -0700 Subject: [PATCH 22/30] Loop for idle for restart --- .../datascience/jupyter/jupyterSession.ts | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index f4443b2b0670..a33baea5768e 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -108,9 +108,6 @@ export class JupyterSession implements IJupyterSession { } traceInfo(`Got new session ${this.session.kernel.id}`); - // Wait for idle on this session. It may or may not be ready yet. - await this.waitForIdleOnSession(this.session, timeout); - // Rewire our status changed event. this.statusHandler = this.onStatusChanged.bind(this.onStatusChanged); this.session.statusChanged.connect(this.statusHandler); @@ -190,24 +187,28 @@ export class JupyterSession implements IJupyterSession { } } - private createRestartSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { - // Don't do this now as this could interfere with the startup of the other session in use. - const deferred = createDeferred(); - let cancelDisposable: Disposable | undefined; - const timer = setTimeout(() => { - if (cancelDisposable) { - cancelDisposable.dispose(); + private async createRestartSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { + let result: Session.ISession | undefined; + let tryCount = 0; + // tslint:disable-next-line: no-any + let exception: any; + while (tryCount < 3) { + try { + result = await this.createSession(serverSettings, contentsManager, cancelToken); + await this.waitForIdleOnSession(result, 30000); + return result; + } catch (exc) { + traceInfo(`Error waiting for restart session: ${exc}`); + tryCount += 1; + if (result) { + // Cleanup later. + this.oldSessions.push(result); + } + result = undefined; + exception = exc; } - this.createSession(serverSettings, contentsManager, cancelToken). - then(s => deferred.resolve(s)). - catch(e => deferred.reject(e)); - }, 10); - if (cancelToken) { - cancelDisposable = cancelToken.onCancellationRequested(() => { - clearTimeout(timer); - }); } - return deferred.promise; + throw exception; } private async createSession(serverSettings: ServerConnection.ISettings, contentsManager: ContentsManager, cancelToken?: CancellationToken): Promise { From 05b7ef7a46b7e3c86b6f26d203c0b4666e50f1b8 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Fri, 12 Jul 2019 16:24:39 -0700 Subject: [PATCH 23/30] Fix linter errors --- src/client/datascience/jupyter/jupyterSession.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index a33baea5768e..9730f42b5c37 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -14,13 +14,13 @@ import { JSONObject } from '@phosphor/coreutils'; import { Slot } from '@phosphor/signaling'; import { Agent as HttpsAgent } from 'https'; import * as uuid from 'uuid/v4'; -import { Disposable, Event, EventEmitter } from 'vscode'; +import { Event, EventEmitter } from 'vscode'; import { CancellationToken } from 'vscode-jsonrpc'; import { Cancellation } from '../../common/cancellation'; import { isTestExecution } from '../../common/constants'; import { traceInfo, traceWarning } from '../../common/logger'; -import { createDeferred, sleep, waitForPromise } from '../../common/utils/async'; +import { sleep, waitForPromise } from '../../common/utils/async'; import * as localize from '../../common/utils/localize'; import { noop } from '../../common/utils/misc'; import { @@ -92,7 +92,7 @@ export class JupyterSession implements IJupyterSession { return this.waitForIdleOnSession(this.session, timeout); } - public async restart(timeout: number): Promise { + public async restart(_timeout: number): Promise { // Just kill the current session and switch to the other if (this.restartSessionPromise && this.session && this.sessionManager && this.contentsManager) { traceInfo(`Restarting ${this.session.kernel.id}`); From e21dff9a30b16d7994fde2cc8e7522c6a389154f Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 09:04:33 -0700 Subject: [PATCH 24/30] Let ptvsd be installed --- build/ci/templates/test_phases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/build/ci/templates/test_phases.yml b/build/ci/templates/test_phases.yml index 0888acd8dc18..f7edee7583e9 100644 --- a/build/ci/templates/test_phases.yml +++ b/build/ci/templates/test_phases.yml @@ -203,7 +203,6 @@ steps: python -m pip install -U pip python -m pip install numpy python -m pip install --upgrade -r ./build/functional-test-requirements.txt - python -m pip install --upgrade --pre ptvsd displayName: 'pip install functional requirements' condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true')) From b18222fa07a9a2daea922959cefd5b52dfc5b2eb Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 09:16:39 -0700 Subject: [PATCH 25/30] Update package-lock --- package-lock.json | 52 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7396d6f5abc4..bc43bf2714c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1888,13 +1888,13 @@ }, "@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "resolved": "http://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/loader-utils": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz", "integrity": "sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg==", "dev": true, "requires": { @@ -2015,7 +2015,7 @@ }, "@types/relateurl": { "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", + "resolved": "http://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=", "dev": true }, @@ -3363,7 +3363,7 @@ }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, @@ -3774,7 +3774,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -3826,7 +3826,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -5333,7 +5333,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -5789,7 +5789,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -5802,7 +5802,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -6740,7 +6740,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -7708,7 +7708,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -9245,7 +9245,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -10280,7 +10280,7 @@ }, "html-webpack-plugin": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { @@ -12775,7 +12775,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -13021,9 +13021,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -13344,7 +13344,7 @@ }, "moment": { "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "resolved": "http://registry.npmjs.org/moment/-/moment-2.21.0.tgz", "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" }, "monaco-editor": { @@ -14696,7 +14696,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -16957,7 +16957,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -17042,7 +17042,7 @@ }, "simple-html-tokenizer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=", "dev": true }, @@ -17689,7 +17689,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -19117,7 +19117,7 @@ "dependencies": { "@types/react": { "version": "0.14.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-0.14.57.tgz", + "resolved": "http://registry.npmjs.org/@types/react/-/react-0.14.57.tgz", "integrity": "sha1-GHioZU+v3R04G4RXKStkM0mMW2I=", "dev": true } @@ -19909,7 +19909,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -20739,7 +20739,7 @@ }, "webpack-node-externals": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", + "resolved": "http://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", "dev": true }, @@ -20971,7 +20971,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { From 2167246c12712284e5fc0445bd2511ea678b76be Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 09:17:28 -0700 Subject: [PATCH 26/30] Remove some logging --- src/client/datascience/jupyter/jupyterServer.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/client/datascience/jupyter/jupyterServer.ts b/src/client/datascience/jupyter/jupyterServer.ts index abac3b1ab13e..03f68f046ff6 100644 --- a/src/client/datascience/jupyter/jupyterServer.ts +++ b/src/client/datascience/jupyter/jupyterServer.ts @@ -549,7 +549,7 @@ export class JupyterServerBase implements INotebookServer { } private generateRequest = (code: string, silent?: boolean): Kernel.IFuture | undefined => { - traceInfo(`Executing code in jupyter : ${code}`); + //traceInfo(`Executing code in jupyter : ${code}`); try { const cellMatcher = new CellMatcher(this.configService.getSettings().datascience); return this.session ? this.session.requestExecute( @@ -771,9 +771,7 @@ export class JupyterServerBase implements INotebookServer { } private async logPreCode(cell: ICell, silent: boolean): Promise { - traceInfo(`Logging pre code for ${cell.data.source}`); await Promise.all(this.loggers.map(l => l.preExecute(cell, silent))); - traceInfo(`Finished Logging pre code for ${cell.data.source}`); } private async logPostCode(cell: ICell, silent: boolean): Promise { From 04031990627128afdd4363302574cc84b8a2f149 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 10:50:49 -0700 Subject: [PATCH 27/30] Put ptvsd back in the functional requirements. Installer isn't working --- build/ci/templates/test_phases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/ci/templates/test_phases.yml b/build/ci/templates/test_phases.yml index f7edee7583e9..0888acd8dc18 100644 --- a/build/ci/templates/test_phases.yml +++ b/build/ci/templates/test_phases.yml @@ -203,6 +203,7 @@ steps: python -m pip install -U pip python -m pip install numpy python -m pip install --upgrade -r ./build/functional-test-requirements.txt + python -m pip install --upgrade --pre ptvsd displayName: 'pip install functional requirements' condition: and(succeeded(), eq(variables['NeedsPythonFunctionalReqs'], 'true')) From 9acdbc9df90bad930a8a537ed112483afaa68484 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 12:32:41 -0700 Subject: [PATCH 28/30] Remove some logging and put back full nightly --- build/ci/vscode-python-nightly-ci.yaml | 598 +++++++++--------- .../datascience/jupyter/jupyterSession.ts | 10 +- 2 files changed, 300 insertions(+), 308 deletions(-) diff --git a/build/ci/vscode-python-nightly-ci.yaml b/build/ci/vscode-python-nightly-ci.yaml index 6e50493003f4..6cd29e185ae5 100644 --- a/build/ci/vscode-python-nightly-ci.yaml +++ b/build/ci/vscode-python-nightly-ci.yaml @@ -50,309 +50,309 @@ jobs: ## Virtual Environment Tests: - # 'Win-Py3.7 Unit': - # PythonVersion: '3.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testUnitTests, pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Linux-Py3.7 Unit': - # PythonVersion: '3.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testUnitTests, pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Mac-Py3.7 Unit': - # PythonVersion: '3.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testUnitTests, pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Win-Py3.6 Unit': - # PythonVersion: '3.6' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Linux-Py3.6 Unit': - # PythonVersion: '3.6' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Mac-Py3.6 Unit': - # PythonVersion: '3.6' - # VMImageName: 'macos-10.13' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Win-Py3.5 Unit': - # PythonVersion: '3.5' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Linux-Py3.5 Unit': - # PythonVersion: '3.5' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Mac-Py3.5 Unit': - # PythonVersion: '3.5' - # VMImageName: 'macos-10.13' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Win-Py2.7 Unit': - # PythonVersion: '2.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Linux-Py2.7 Unit': - # PythonVersion: '2.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true - # 'Mac-Py2.7 Unit': - # PythonVersion: '2.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'pythonUnitTests' - # NeedsPythonTestReqs: true + 'Win-Py3.7 Unit': + PythonVersion: '3.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testUnitTests, pythonUnitTests' + NeedsPythonTestReqs: true + 'Linux-Py3.7 Unit': + PythonVersion: '3.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testUnitTests, pythonUnitTests' + NeedsPythonTestReqs: true + 'Mac-Py3.7 Unit': + PythonVersion: '3.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testUnitTests, pythonUnitTests' + NeedsPythonTestReqs: true + 'Win-Py3.6 Unit': + PythonVersion: '3.6' + VMImageName: 'vs2017-win2016' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Linux-Py3.6 Unit': + PythonVersion: '3.6' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Mac-Py3.6 Unit': + PythonVersion: '3.6' + VMImageName: 'macos-10.13' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Win-Py3.5 Unit': + PythonVersion: '3.5' + VMImageName: 'vs2017-win2016' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Linux-Py3.5 Unit': + PythonVersion: '3.5' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Mac-Py3.5 Unit': + PythonVersion: '3.5' + VMImageName: 'macos-10.13' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Win-Py2.7 Unit': + PythonVersion: '2.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Linux-Py2.7 Unit': + PythonVersion: '2.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true + 'Mac-Py2.7 Unit': + PythonVersion: '2.7' + VMImageName: 'macos-10.13' + TestsToRun: 'pythonUnitTests' + NeedsPythonTestReqs: true - # 'Win-Py3.7 Venv': - # VMImageName: 'vs2017-win2016' - # PythonVersion: '3.7' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # # This is for the venvTests to use, not needed if you don't run venv tests... - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Linux-Py3.7 Venv': - # VMImageName: 'ubuntu-16.04' - # PythonVersion: '3.7' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Mac-Py3.7 Venv': - # VMImageName: 'macos-10.13' - # PythonVersion: '3.7' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Win-Py3.6 Venv': - # VMImageName: 'vs2017-win2016' - # PythonVersion: '3.6' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Linux-Py3.6 Venv': - # VMImageName: 'ubuntu-16.04' - # PythonVersion: '3.6' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Mac-Py3.6 Venv': - # VMImageName: 'macos-10.13' - # PythonVersion: '3.6' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Win-Py3.5 Venv': - # VMImageName: 'vs2017-win2016' - # PythonVersion: '3.5' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Linux-Py3.5 Venv': - # VMImageName: 'ubuntu-16.04' - # PythonVersion: '3.5' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # 'Mac-Py3.5 Venv': - # VMImageName: 'macos-10.13' - # PythonVersion: '3.5' - # TestsToRun: 'venvTests' - # NeedsPythonTestReqs: true - # PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' - # # Note: Virtual env tests use `venv` and won't currently work with Python 2.7 + 'Win-Py3.7 Venv': + VMImageName: 'vs2017-win2016' + PythonVersion: '3.7' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + # This is for the venvTests to use, not needed if you don't run venv tests... + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Linux-Py3.7 Venv': + VMImageName: 'ubuntu-16.04' + PythonVersion: '3.7' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Mac-Py3.7 Venv': + VMImageName: 'macos-10.13' + PythonVersion: '3.7' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Win-Py3.6 Venv': + VMImageName: 'vs2017-win2016' + PythonVersion: '3.6' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Linux-Py3.6 Venv': + VMImageName: 'ubuntu-16.04' + PythonVersion: '3.6' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Mac-Py3.6 Venv': + VMImageName: 'macos-10.13' + PythonVersion: '3.6' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Win-Py3.5 Venv': + VMImageName: 'vs2017-win2016' + PythonVersion: '3.5' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Linux-Py3.5 Venv': + VMImageName: 'ubuntu-16.04' + PythonVersion: '3.5' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + 'Mac-Py3.5 Venv': + VMImageName: 'macos-10.13' + PythonVersion: '3.5' + TestsToRun: 'venvTests' + NeedsPythonTestReqs: true + PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json' + # Note: Virtual env tests use `venv` and won't currently work with Python 2.7 - # # SingleWorkspace Tests - # 'Win-Py3.7 Single': - # PythonVersion: '3.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.7 Single': - # PythonVersion: '3.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.7 Single': - # PythonVersion: '3.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py3.6 Single': - # PythonVersion: '3.6' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.6 Single': - # PythonVersion: '3.6' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.6 Single': - # PythonVersion: '3.6' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py3.5 Single': - # PythonVersion: '3.5' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.5 Single': - # PythonVersion: '3.5' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.5 Single': - # PythonVersion: '3.5' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py2.7 Single': - # PythonVersion: '2.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py2.7 Single': - # PythonVersion: '2.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py2.7 Single': - # PythonVersion: '2.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testSingleWorkspace' - # NeedsPythonTestReqs: true + # SingleWorkspace Tests + 'Win-Py3.7 Single': + PythonVersion: '3.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.7 Single': + PythonVersion: '3.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.7 Single': + PythonVersion: '3.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Win-Py3.6 Single': + PythonVersion: '3.6' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.6 Single': + PythonVersion: '3.6' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.6 Single': + PythonVersion: '3.6' + VMImageName: 'macos-10.13' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Win-Py3.5 Single': + PythonVersion: '3.5' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.5 Single': + PythonVersion: '3.5' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.5 Single': + PythonVersion: '3.5' + VMImageName: 'macos-10.13' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Win-Py2.7 Single': + PythonVersion: '2.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py2.7 Single': + PythonVersion: '2.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py2.7 Single': + PythonVersion: '2.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testSingleWorkspace' + NeedsPythonTestReqs: true - # # MultiWorkspace Tests - # 'Win-Py3.7 Multi': - # PythonVersion: '3.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.7 Multi': - # PythonVersion: '3.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.7 Multi': - # PythonVersion: '3.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py3.6 Multi': - # PythonVersion: '3.6' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.6 Multi': - # PythonVersion: '3.6' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.6 Multi': - # PythonVersion: '3.6' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py3.5 Multi': - # PythonVersion: '3.5' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py3.5 Multi': - # PythonVersion: '3.5' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py3.5 Multi': - # PythonVersion: '3.5' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Win-Py2.7 Multi': - # PythonVersion: '2.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Linux-Py2.7 Multi': - # PythonVersion: '2.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true - # 'Mac-Py2.7 Multi': - # PythonVersion: '2.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testMultiWorkspace' - # NeedsPythonTestReqs: true + # MultiWorkspace Tests + 'Win-Py3.7 Multi': + PythonVersion: '3.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.7 Multi': + PythonVersion: '3.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.7 Multi': + PythonVersion: '3.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Win-Py3.6 Multi': + PythonVersion: '3.6' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.6 Multi': + PythonVersion: '3.6' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.6 Multi': + PythonVersion: '3.6' + VMImageName: 'macos-10.13' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Win-Py3.5 Multi': + PythonVersion: '3.5' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py3.5 Multi': + PythonVersion: '3.5' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py3.5 Multi': + PythonVersion: '3.5' + VMImageName: 'macos-10.13' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Win-Py2.7 Multi': + PythonVersion: '2.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Linux-Py2.7 Multi': + PythonVersion: '2.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true + 'Mac-Py2.7 Multi': + PythonVersion: '2.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testMultiWorkspace' + NeedsPythonTestReqs: true - # # Debugger integration Tests - # 'Win-Py3.7 Debugger': - # PythonVersion: '3.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Linux-Py3.7 Debugger': - # PythonVersion: '3.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Mac-Py3.7 Debugger': - # PythonVersion: '3.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Win-Py3.6 Debugger': - # PythonVersion: '3.6' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Linux-Py3.6 Debugger': - # PythonVersion: '3.6' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Mac-Py3.6 Debugger': - # PythonVersion: '3.6' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Win-Py3.5 Debugger': - # PythonVersion: '3.5' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Linux-Py3.5 Debugger': - # PythonVersion: '3.5' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Mac-Py3.5 Debugger': - # PythonVersion: '3.5' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Win-Py2.7 Debugger': - # PythonVersion: '2.7' - # VMImageName: 'vs2017-win2016' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Linux-Py2.7 Debugger': - # PythonVersion: '2.7' - # VMImageName: 'ubuntu-16.04' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true - # 'Mac-Py2.7 Debugger': - # PythonVersion: '2.7' - # VMImageName: 'macos-10.13' - # TestsToRun: 'testDebugger' - # NeedsPythonTestReqs: true + # Debugger integration Tests + 'Win-Py3.7 Debugger': + PythonVersion: '3.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Linux-Py3.7 Debugger': + PythonVersion: '3.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Mac-Py3.7 Debugger': + PythonVersion: '3.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Win-Py3.6 Debugger': + PythonVersion: '3.6' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Linux-Py3.6 Debugger': + PythonVersion: '3.6' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Mac-Py3.6 Debugger': + PythonVersion: '3.6' + VMImageName: 'macos-10.13' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Win-Py3.5 Debugger': + PythonVersion: '3.5' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Linux-Py3.5 Debugger': + PythonVersion: '3.5' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Mac-Py3.5 Debugger': + PythonVersion: '3.5' + VMImageName: 'macos-10.13' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Win-Py2.7 Debugger': + PythonVersion: '2.7' + VMImageName: 'vs2017-win2016' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Linux-Py2.7 Debugger': + PythonVersion: '2.7' + VMImageName: 'ubuntu-16.04' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true + 'Mac-Py2.7 Debugger': + PythonVersion: '2.7' + VMImageName: 'macos-10.13' + TestsToRun: 'testDebugger' + NeedsPythonTestReqs: true # Functional tests (not mocked Jupyter) 'Windows-Py3.7 Functional': diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 9730f42b5c37..1cd553de902b 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -322,9 +322,7 @@ export class JupyterSession implements IJupyterSession { traceInfo(`shutdownSession ${kernelId} - start`); try { if (statusHandler) { - traceInfo(`shutdownSession ${kernelId} - disconnect`); session.statusChanged.disconnect(statusHandler); - traceInfo(`shutdownSession ${kernelId} - disconnect complete`); } try { // When running under a test, mark all futures as done so we @@ -334,7 +332,6 @@ export class JupyterSession implements IJupyterSession { if (isTestExecution()) { const defaultKernel = session.kernel as any; if (defaultKernel && defaultKernel._futures) { - traceInfo(`shutdownSession ${kernelId} - fixing futures`); const futures = defaultKernel._futures as Map; if (futures) { futures.forEach(f => { @@ -344,27 +341,22 @@ export class JupyterSession implements IJupyterSession { }); } } - traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); await waitForPromise(session.shutdown(), 1000); - traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } else { - traceInfo(`shutdownSession ${kernelId} - waiting for shutdown`); // Shutdown may fail if the process has been killed await waitForPromise(session.shutdown(), 1000); - traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } } catch { noop(); } if (session && !session.isDisposed) { - traceInfo(`shutdownSession ${kernelId} - session dispose`); session.dispose(); - traceInfo(`shutdownSession ${kernelId} - session dispose complete`); } } catch (e) { // Ignore, just trace. traceWarning(e); } + traceInfo(`shutdownSession ${kernelId} - shutdown complete`); } } From c26490965f04c4b54948cc499bf5d32cde8633b7 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 12:34:11 -0700 Subject: [PATCH 29/30] Remove some logging --- src/client/datascience/jupyter/jupyterSession.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/datascience/jupyter/jupyterSession.ts b/src/client/datascience/jupyter/jupyterSession.ts index 1cd553de902b..aee1df5e4522 100644 --- a/src/client/datascience/jupyter/jupyterSession.ts +++ b/src/client/datascience/jupyter/jupyterSession.ts @@ -168,6 +168,8 @@ export class JupyterSession implements IJupyterSession { private async waitForIdleOnSession(session: Session.ISession | undefined, timeout: number): Promise { if (session && session.kernel) { + traceInfo(`Waiting for idle on: ${session.kernel.id}${session.kernel.status}`); + // This function seems to cause CI builds to timeout randomly on // different tests. Waiting for status to go idle doesn't seem to work and // in the past, waiting on the ready promise doesn't work either. Check status with a maximum of 5 seconds @@ -176,10 +178,11 @@ export class JupyterSession implements IJupyterSession { session.kernel && session.kernel.status !== 'idle' && (Date.now() - startTime < timeout)) { - traceInfo(`Waiting for idle: ${session.kernel.status}`); await sleep(100); } + traceInfo(`Finished waiting for idle on: ${session.kernel.id}${session.kernel.status}`); + // If we didn't make it out in ten seconds, indicate an error if (!session || !session.kernel || session.kernel.status !== 'idle') { throw new JupyterWaitForIdleError(localize.DataScience.jupyterLaunchTimedOut()); From 628f2c7fc8c3dfdacf6fad889fa17dae63145842 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Mon, 15 Jul 2019 12:40:17 -0700 Subject: [PATCH 30/30] Up timeout to 90 minutes --- build/ci/vscode-python-nightly-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ci/vscode-python-nightly-ci.yaml b/build/ci/vscode-python-nightly-ci.yaml index 6cd29e185ae5..da556caeed3a 100644 --- a/build/ci/vscode-python-nightly-ci.yaml +++ b/build/ci/vscode-python-nightly-ci.yaml @@ -34,7 +34,7 @@ jobs: # ignorePythonVersions: "3.6,3.5" - job: 'Nightly' - + timeoutInMinutes: 90 strategy: matrix: # Each member of this list must contain these values: