diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieStateReadOnlyService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieStateReadOnlyService.java index 23211d5218f..571151a0332 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieStateReadOnlyService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieStateReadOnlyService.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -62,6 +63,13 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } else if (!stateManager.isReadOnly() && inState.isReadOnly()) { stateManager.transitionToReadOnlyMode().get(); } + Map params = request.getParams(); + if (params != null) { + boolean isForce = params.getOrDefault("force", "false").equals("true"); + if (stateManager.isReadOnly() && isForce) { + stateManager.forceToReadOnly(); + } + } } else if (!HttpServer.Method.GET.equals(request.getMethod())) { response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Unsupported method. Should be GET or PUT method"); diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java index a59adcf6aff..141b83785d7 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java @@ -1022,6 +1022,17 @@ public void testBookieReadOnlyState() throws Exception { readOnlyState = JsonUtil.fromJson(response.getBody(), ReadOnlyState.class); assertFalse(readOnlyState.isReadOnly()); + // force=true force the bookie to readonly + Map params = new HashMap<>(); + params.put("force", "true"); + request = new HttpServiceRequest(JsonUtil.toJson(new ReadOnlyState(true)), HttpServer.Method.PUT, params); + response = bookieReadOnlyService.handle(request); + readOnlyState = JsonUtil.fromJson(response.getBody(), ReadOnlyState.class); + assertTrue(readOnlyState.isReadOnly()); + request = new HttpServiceRequest(JsonUtil.toJson(new ReadOnlyState(false)), HttpServer.Method.PUT, null); + response = bookieReadOnlyService.handle(request); + assertEquals(400, response.getStatusCode()); + //forceReadonly to writable baseConf.setForceReadOnlyBookie(true); baseConf.setReadOnlyModeEnabled(true);