This is an automated email from the ASF dual-hosted git repository. chenhang pushed a commit to branch branch-4.14 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit eef294865a56afedacfe0baecaba0c2eb8a88e3f Author: Zhangao <[email protected]> AuthorDate: Mon Apr 3 16:01:22 2023 +0800 [Bookie] Prevent transit to writable mode when forceReadOnly mode is active (#3881) * Fix forceReadOnly * add unittest --------- Co-authored-by: gavingaozhangmin <[email protected]> (cherry picked from commit a6387d191f28a59af72f6613b633d6898980a0b0) --- .../java/org/apache/bookkeeper/bookie/BookieStateManager.java | 5 +++++ .../src/main/java/org/apache/bookkeeper/bookie/StateManager.java | 5 +++++ .../server/http/service/BookieStateReadOnlyService.java | 5 +++++ .../java/org/apache/bookkeeper/server/http/TestHttpService.java | 8 ++++++++ 4 files changed, 23 insertions(+) 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 096512478e..8513d38f7f 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 @@ -184,6 +184,11 @@ public class BookieStateManager implements StateManager { 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 538f3ac19e..a3f1065fb2 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 @@ -49,6 +49,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 2fe317728f..23211d5218 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 class BookieStateReadOnlyService implements HttpEndpointService { 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 ece5e1be0f..1ad36747f3 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 @@ -984,5 +984,13 @@ public class TestHttpService extends BookKeeperClusterTestCase { 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()); } }
