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

Reply via email to