diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java index 83ae611ef0a..80226bd38e3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java @@ -193,6 +193,11 @@ public boolean isReadOnly(){ return forceReadOnly.get() || bookieStatus.isInReadOnlyMode(); } + @Override + public boolean isForceReadOnly(){ + return forceReadOnly.get(); + } + @Override public boolean isAvailableForHighPriorityWrites() { return availableForHighPriorityWrites; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/StateManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/StateManager.java index f7f7a3feca3..d279893a8ac 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/StateManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/StateManager.java @@ -48,6 +48,11 @@ public interface StateManager extends AutoCloseable { */ boolean isReadOnly(); + /** + * Check is forceReadOnly. + */ + boolean isForceReadOnly(); + /** * Check is Running. */ 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 2fe317728fa..23211d5218f 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 @@ -53,6 +53,11 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { if (HttpServer.Method.PUT.equals(request.getMethod())) { ReadOnlyState inState = JsonUtil.fromJson(request.getBody(), ReadOnlyState.class); if (stateManager.isReadOnly() && !inState.isReadOnly()) { + if (stateManager.isForceReadOnly()) { + response.setCode(HttpServer.StatusCode.BAD_REQUEST); + response.setBody("Bookie is in forceReadOnly mode, cannot transit to writable mode"); + return response; + } stateManager.transitionToWritableMode().get(); } else if (!stateManager.isReadOnly() && inState.isReadOnly()) { stateManager.transitionToReadOnlyMode().get(); 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 fdab2f8f9ad..a59adcf6aff 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 @@ -1021,6 +1021,14 @@ public void testBookieReadOnlyState() throws Exception { response = bookieReadOnlyService.handle(request); readOnlyState = JsonUtil.fromJson(response.getBody(), ReadOnlyState.class); assertFalse(readOnlyState.isReadOnly()); + + //forceReadonly to writable + baseConf.setForceReadOnlyBookie(true); + baseConf.setReadOnlyModeEnabled(true); + restartBookies(); + request = new HttpServiceRequest(JsonUtil.toJson(new ReadOnlyState(false)), HttpServer.Method.PUT, null); + response = bookieReadOnlyService.handle(request); + assertEquals(400, response.getStatusCode()); } @Test