This is an automated email from the ASF dual-hosted git repository.
nicoloboschi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push:
new a6387d191f [Bookie] Prevent transit to writable mode when
forceReadOnly mode is active (#3881)
a6387d191f is described below
commit a6387d191f28a59af72f6613b633d6898980a0b0
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]>
---
.../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 83ae611ef0..80226bd38e 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 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 f7f7a3feca..d279893a8a 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 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 fdab2f8f9a..a59adcf6af 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 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());
}
@Test