diff --git a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/http/DartSqlResource.java b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/http/DartSqlResource.java index 37e9f1051318..944711b90ccb 100644 --- a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/http/DartSqlResource.java +++ b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/http/DartSqlResource.java @@ -237,7 +237,10 @@ public Response cancelQuery( List cancelables = sqlLifecycleManager.getAll(sqlQueryId); if (cancelables.isEmpty()) { - return Response.status(Response.Status.NOT_FOUND).build(); + // Return ACCEPTED even if the query wasn't found. When the Router broadcasts cancellation requests to all + // Brokers, this ensures the user sees a successful request. + AuthorizationUtils.setRequestAuthorizationAttributeIfNeeded(req); + return Response.status(Response.Status.ACCEPTED).build(); } final Access access = authorizeCancellation(req, cancelables); @@ -247,14 +250,12 @@ public Response cancelQuery( // Don't call cancel() on the cancelables. That just cancels native queries, which is useless here. Instead, // get the controller and stop it. - boolean found = false; for (SqlLifecycleManager.Cancelable cancelable : cancelables) { final HttpStatement stmt = (HttpStatement) cancelable; final Object dartQueryId = stmt.context().get(DartSqlEngine.CTX_DART_QUERY_ID); if (dartQueryId instanceof String) { final ControllerHolder holder = controllerRegistry.get((String) dartQueryId); if (holder != null) { - found = true; holder.cancel(); } } else { @@ -267,7 +268,9 @@ public Response cancelQuery( } } - return Response.status(found ? Response.Status.ACCEPTED : Response.Status.NOT_FOUND).build(); + // Return ACCEPTED even if the query wasn't found. When the Router broadcasts cancellation requests to all + // Brokers, this ensures the user sees a successful request. + return Response.status(Response.Status.ACCEPTED).build(); } else { return Response.status(Response.Status.FORBIDDEN).build(); } diff --git a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java index db3479178724..f297e670506e 100644 --- a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java +++ b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java @@ -724,7 +724,7 @@ public void test_cancelQuery_regularUser_unknownQuery() .thenReturn(makeAuthenticationResult(REGULAR_USER_NAME)); final Response cancellationResponse = sqlResource.cancelQuery("nonexistent", httpServletRequest); - Assertions.assertEquals(Response.Status.NOT_FOUND.getStatusCode(), cancellationResponse.getStatus()); + Assertions.assertEquals(Response.Status.ACCEPTED.getStatusCode(), cancellationResponse.getStatus()); } /**