From 0c612a1635bd971ab9c62bf7fba48676a8681341 Mon Sep 17 00:00:00 2001 From: N V Harikrishna Date: Wed, 31 Dec 2025 11:56:08 +0530 Subject: [PATCH 1/2] CASSSIDECAR-395 Returning JSON response for live migration status endpoints when returning error status codes --- .../LiveMigrationStatusCompleteHandler.java | 15 ++++++++------- .../LiveMigrationStatusGetHandler.java | 9 +++++---- .../LiveMigrationStatusHandlersTest.java | 2 ++ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusCompleteHandler.java b/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusCompleteHandler.java index 75e3d3cb5..e319d8cb9 100644 --- a/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusCompleteHandler.java +++ b/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusCompleteHandler.java @@ -25,7 +25,6 @@ import com.google.inject.Inject; import com.google.inject.Singleton; -import io.netty.handler.codec.http.HttpResponseStatus; import io.vertx.core.Future; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.json.Json; @@ -43,6 +42,10 @@ import org.apache.cassandra.sidecar.utils.InstanceMetadataFetcher; import org.jetbrains.annotations.NotNull; +import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; +import static io.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE; +import static org.apache.cassandra.sidecar.utils.HttpExceptions.wrapHttpException; + /** * Handler to safely mark a live migration as COMPLETED for an instance. *

@@ -113,15 +116,13 @@ protected void handleInternal(RoutingContext routingContext, HttpServerRequest h instanceMetadata.host(), e); if (e instanceof IllegalStateException) { - routingContext.response() - .setStatusCode(HttpResponseStatus.BAD_REQUEST.code()) - .end("Live migration marked as COMPLETED earlier."); + routingContext.fail(wrapHttpException(BAD_REQUEST, + "Live migration marked as COMPLETED earlier.")); } else { - routingContext.response() - .setStatusCode(HttpResponseStatus.SERVICE_UNAVAILABLE.code()) - .end("Could not update Live Migration as complete."); + routingContext.fail(wrapHttpException(SERVICE_UNAVAILABLE, + "Could not update Live Migration as complete.")); } }); } diff --git a/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusGetHandler.java b/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusGetHandler.java index 9cee6ad0b..e2974a595 100644 --- a/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusGetHandler.java +++ b/server/src/main/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusGetHandler.java @@ -22,7 +22,6 @@ import com.google.inject.Inject; import com.google.inject.Singleton; -import io.netty.handler.codec.http.HttpResponseStatus; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.net.SocketAddress; import io.vertx.ext.auth.authorization.Authorization; @@ -37,6 +36,9 @@ import org.apache.cassandra.sidecar.utils.InstanceMetadataFetcher; import org.jetbrains.annotations.NotNull; +import static io.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE; +import static org.apache.cassandra.sidecar.utils.HttpExceptions.wrapHttpException; + /** * Handler to retrieve the current live migration status for an instance. *

@@ -73,9 +75,8 @@ protected void handleInternal(RoutingContext routingContext, HttpServerRequest h InstanceMetadata instance = metadataFetcher.instance(host); statusTracker.getMigrationStatus(instance) .compose(routingContext::json) - .onFailure(e -> routingContext.response() - .setStatusCode(HttpResponseStatus.SERVICE_UNAVAILABLE.code()) - .end(e.getMessage())); + .onFailure(e -> routingContext.fail(wrapHttpException(SERVICE_UNAVAILABLE, + e.getMessage()))); } @Override diff --git a/server/src/test/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusHandlersTest.java b/server/src/test/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusHandlersTest.java index 7f9bf8107..dcf4d74df 100644 --- a/server/src/test/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusHandlersTest.java +++ b/server/src/test/java/org/apache/cassandra/sidecar/handlers/livemigration/LiveMigrationStatusHandlersTest.java @@ -164,6 +164,7 @@ void testUpdatingStatusSecondTimeShouldFail(VertxTestContext context) .send() .compose(response -> { assertThat(response.statusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code()); + assertThat(response.bodyAsJsonObject()).isNotNull(); return Future.succeededFuture(); })) .onSuccess(r -> context.completeNow()) @@ -251,6 +252,7 @@ void testCompleteStatusShouldNotSucceedWhenFetchingMigrationMapFails(VertxTestCo .send() .compose(response -> { assertThat(response.statusCode()).isEqualTo(HttpResponseStatus.SERVICE_UNAVAILABLE.code()); + assertThat(response.bodyAsJsonObject()).isNotNull(); return Future.succeededFuture(); }) .onSuccess(r -> context.completeNow()) From 59c86e831acc00cfdf837a13d4844a4bc73c3f60 Mon Sep 17 00:00:00 2001 From: N V Harikrishna Date: Tue, 6 Jan 2026 00:38:49 +0530 Subject: [PATCH 2/2] Updated CHANGES.txt --- CHANGES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.txt b/CHANGES.txt index 6ddd84af4..46ffa3593 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ 0.3.0 ----- + * Returning JSON responses for live migration status endpoints in case of errors (CASSSIDECAR-395) * Upgrade vertx to 4.5.23 (CASSSIDECAR-391) * Fix for deadlock during JMX reconnection (CASSSIDECAR-390) * Fix request execution continues on wrong thread (CASSSIDECAR-368)