Skip to content

Commit ad53c82

Browse files
authored
Don't send expression updates about interrupts (#11218)
There is no value in sending expression updates involving interrupts to the user: ![Screenshot from 2024-09-30 14-47-17-2](https://github.com/user-attachments/assets/78fca5bf-085d-4c1c-99fb-0acb5f0a31a3) Adding more logging information to see how aborts affect execution. Related to #11084.
1 parent 3a22147 commit ad53c82

File tree

15 files changed

+231
-54
lines changed

15 files changed

+231
-54
lines changed

engine/runtime-instrument-common/src/main/java/org/enso/interpreter/instrument/command/ExecuteExpressionCommand.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ public void executeSynchronously(RuntimeContext ctx, ExecutionContext ec) {
4747
ctx.jobControlPlane()
4848
.abortJobs(
4949
contextId,
50+
"execute expression for expression "
51+
+ expressionId
52+
+ " in visualization "
53+
+ visualizationId,
5054
job -> {
5155
if (job instanceof ExecuteJob e) {
5256
return e.visualizationTriggered();

engine/runtime-instrument-common/src/main/java/org/enso/interpreter/instrument/command/InvalidateModulesIndexCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public Future<BoxedUnit> executeAsynchronously(RuntimeContext ctx, ExecutionCont
3333
try {
3434
logger.log(Level.FINE, "Invalidating modules, cancelling background jobs");
3535
ctx.jobControlPlane().stopBackgroundJobs();
36-
ctx.jobControlPlane().abortBackgroundJobs(DeserializeLibrarySuggestionsJob.class);
36+
ctx.jobControlPlane()
37+
.abortBackgroundJobs(
38+
"invalidate modules index", DeserializeLibrarySuggestionsJob.class);
3739

3840
EnsoContext context = ctx.executionService().getContext();
3941
context

engine/runtime-instrument-common/src/main/java/org/enso/interpreter/instrument/command/SetExecutionEnvironmentCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ private void setExecutionEnvironment(
5050
var oldEnvironmentName =
5151
ctx.executionService().getContext().getExecutionEnvironment().getName();
5252
if (!oldEnvironmentName.equals(executionEnvironment.name())) {
53-
ctx.jobControlPlane().abortJobs(contextId);
53+
ctx.jobControlPlane()
54+
.abortJobs(
55+
contextId, "set execution environment to " + executionEnvironment.name());
5456
ctx.locking()
5557
.withWriteCompilationLock(
5658
this.getClass(),

engine/runtime-instrument-common/src/main/java/org/enso/interpreter/instrument/execution/JobControlPlane.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
public interface JobControlPlane {
88

99
/** Aborts all interruptible jobs. */
10-
void abortAllJobs();
10+
void abortAllJobs(String reason);
1111

1212
/**
1313
* Abort all jobs except the ignored jobs.
1414
*
1515
* @param ignoredJobs the list of jobs to keep in the execution queue
1616
*/
1717
@SuppressWarnings("unchecked")
18-
void abortAllExcept(Class<? extends Job<?>>... ignoredJobs);
18+
void abortAllExcept(String reason, Class<? extends Job<?>>... ignoredJobs);
1919

2020
/**
2121
* Aborts jobs that relates to the specified execution context.
@@ -25,7 +25,7 @@ public interface JobControlPlane {
2525
* aborted
2626
*/
2727
@SuppressWarnings("unchecked")
28-
void abortJobs(UUID contextId, Class<? extends Job<?>>... classOf);
28+
void abortJobs(UUID contextId, String reason, Class<? extends Job<?>>... classOf);
2929

3030
/**
3131
* Aborts jobs that relate to the specified execution context.
@@ -34,15 +34,16 @@ public interface JobControlPlane {
3434
* @param accept filter that selects jobs to be aborted
3535
*/
3636
@SuppressWarnings("unchecked")
37-
void abortJobs(UUID contextId, java.util.function.Function<Job<?>, Boolean> accept);
37+
void abortJobs(
38+
UUID contextId, String reason, java.util.function.Function<Job<?>, Boolean> accept);
3839

3940
/**
4041
* Abort provided background jobs.
4142
*
4243
* @param toAbort the list of jobs to abort
4344
*/
4445
@SuppressWarnings("unchecked")
45-
void abortBackgroundJobs(Class<? extends Job<?>>... toAbort);
46+
void abortBackgroundJobs(String reason, Class<? extends Job<?>>... toAbort);
4647

4748
/**
4849
* Starts background jobs processing.

engine/runtime-instrument-common/src/main/java/org/enso/interpreter/instrument/job/VisualizationResult.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.enso.interpreter.instrument.job;
22

33
import com.oracle.truffle.api.CompilerDirectives;
4+
import com.oracle.truffle.api.interop.ExceptionType;
45
import com.oracle.truffle.api.interop.InteropLibrary;
56
import com.oracle.truffle.api.interop.UnsupportedMessageException;
67
import java.nio.charset.StandardCharsets;
@@ -42,6 +43,28 @@ public static String findExceptionMessage(Throwable ex) {
4243
}
4344
}
4445

46+
public static boolean isInterruptedException(Throwable ex) {
47+
var iop = InteropLibrary.getUncached();
48+
return isInterruptedException(ex, iop);
49+
}
50+
51+
private static boolean isInterruptedException(Object ex, InteropLibrary iop) {
52+
try {
53+
var interrupt = iop.getExceptionType(ex) == ExceptionType.INTERRUPT;
54+
if (interrupt) {
55+
return true;
56+
}
57+
try {
58+
var cause = iop.getExceptionCause(ex);
59+
return cause != null && isInterruptedException(cause, iop);
60+
} catch (UnsupportedMessageException e) {
61+
return false;
62+
}
63+
} catch (UnsupportedMessageException e) {
64+
throw CompilerDirectives.shouldNotReachHere(e);
65+
}
66+
}
67+
4568
public static byte[] visualizationResultToBytes(Object value) {
4669
if (value instanceof byte[] arr) {
4770
return arr;

engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/DestroyContextCmd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class DestroyContextCmd(
3434
}
3535

3636
private def removeContext()(implicit ctx: RuntimeContext): Unit = {
37-
ctx.jobControlPlane.abortJobs(request.contextId)
37+
ctx.jobControlPlane.abortJobs(request.contextId, "destroy context")
3838
val contextLock = ctx.locking.getOrCreateContextLock(request.contextId)
3939
try {
4040
ctx.locking.withContextLock(

engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/EditFileCmd.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class EditFileCmd(request: Api.EditFileNotification)
3434
() => {
3535
logger.log(
3636
Level.FINEST,
37-
"Adding pending file [{0}] edits [{1}] idMap [{2}]",
37+
"Adding pending file [{0}] edits [{1}] and IdMap of length {2}",
3838
Array[Any](
3939
MaskedPath(request.path.toPath),
4040
request.edits.map(e => (e.range, e.text.length)),
@@ -50,7 +50,7 @@ class EditFileCmd(request: Api.EditFileNotification)
5050
ctx.state.pendingEdits.updateIdMap(request.path, idMap)
5151
}
5252
if (request.execute) {
53-
ctx.jobControlPlane.abortAllJobs()
53+
ctx.jobControlPlane.abortAllJobs("edit file")
5454
ctx.jobProcessor
5555
.run(compileJob())
5656
.foreach(_ => executeJobs.foreach(ctx.jobProcessor.run))

engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/InterruptContextCmd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class InterruptContextCmd(
2323
): Future[Unit] =
2424
if (doesContextExist) {
2525
Future {
26-
ctx.jobControlPlane.abortJobs(request.contextId)
26+
ctx.jobControlPlane.abortJobs(request.contextId, "interrupt context")
2727
reply(Api.InterruptContextResponse(request.contextId))
2828
}
2929
} else {

engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/PopContextCmd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class PopContextCmd(
4343
ec: ExecutionContext
4444
): Future[Unit] =
4545
Future {
46-
ctx.jobControlPlane.abortJobs(request.contextId)
46+
ctx.jobControlPlane.abortJobs(request.contextId, "pop context")
4747
val maybeTopItem = ctx.contextManager.pop(request.contextId)
4848
if (maybeTopItem.isDefined) {
4949
reply(Api.PopContextResponse(request.contextId))

engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/PushContextCmd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class PushContextCmd(
4646
ec: ExecutionContext
4747
): Future[Boolean] =
4848
Future {
49-
ctx.jobControlPlane.abortJobs(request.contextId)
49+
ctx.jobControlPlane.abortJobs(request.contextId, "push context")
5050
val stack = ctx.contextManager.getStack(request.contextId)
5151
val pushed = request.stackItem match {
5252
case _: Api.StackItem.ExplicitCall if stack.isEmpty =>

0 commit comments

Comments
 (0)