Skip to content

Commit cf715e8

Browse files
committed
Fix interrupt_request to use control channel instead of shell
When interrupt_mode is 'message', send interrupt_request on the control channel as specified by Jupyter protocol. This prevents the interrupt from being queued behind pending shell messages.
1 parent 4efd36f commit cf715e8

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

src/kernels/raw/session/rawKernelConnection.node.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -357,16 +357,16 @@ export class RawKernelConnection implements Kernel.IKernelConnection {
357357
if (this.kernelProcess?.canInterrupt) {
358358
return this.kernelProcess?.interrupt();
359359
} else if (this.kernelConnectionMetadata.kernelSpec.interrupt_mode === 'message') {
360-
logger.info(`Interrupting kernel with a shell message`);
360+
logger.info(`Interrupting kernel with a control message`);
361361
const jupyterLab = require('@jupyterlab/services') as typeof import('@jupyterlab/services');
362362
const msg = jupyterLab.KernelMessage.createMessage({
363363
msgType: 'interrupt_request' as any,
364-
channel: 'shell',
364+
channel: 'control',
365365
username: this.realKernel!.username,
366366
session: this.realKernel!.clientId,
367367
content: {}
368-
}) as any as KernelMessage.IShellMessage<'inspect_request'>;
369-
await this.realKernel!.sendShellMessage<'interrupt_request'>(msg as any, true, true).done.catch((ex) =>
368+
}) as any as KernelMessage.IControlMessage<'interrupt_request'>;
369+
await this.realKernel!.sendControlMessage<'interrupt_request'>(msg as any, true, true).done.catch((ex) =>
370370
logger.error('Failed to interrupt via a message', ex)
371371
);
372372
} else {

src/kernels/raw/session/rawSessionConnection.node.unit.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -505,16 +505,16 @@ suite('Raw Session & Raw Kernel Connection', () => {
505505
test('Send and interrupt message', async () => {
506506
(kernelConnectionMetadata.kernelSpec as ReadWrite<IJupyterKernelSpec>).interrupt_mode = 'message';
507507
when(kernelProcess.canInterrupt).thenReturn(false);
508-
let request: KernelMessage.IShellMessage<KernelMessage.ShellMessageType> | undefined;
509-
when(kernel.sendShellMessage(anything(), anything(), anything())).thenCall((msg) => {
508+
let request: KernelMessage.IControlMessage<KernelMessage.ControlMessageType> | undefined;
509+
when(kernel.sendControlMessage(anything(), anything(), anything())).thenCall((msg) => {
510510
request = msg;
511511
return { done: Promise.resolve() } as any;
512512
});
513513

514514
await session.kernel?.interrupt();
515515

516516
verify(kernelProcess.interrupt()).never();
517-
verify(kernel.sendShellMessage(anything(), anything(), anything())).once();
517+
verify(kernel.sendControlMessage(anything(), anything(), anything())).once();
518518
assert.strictEqual(request?.header.msg_type, 'interrupt_request');
519519
});
520520
});

0 commit comments

Comments
 (0)