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());
     }
 }

Reply via email to