From ded04891d3893136216a653571e91fab87dd2796 Mon Sep 17 00:00:00 2001 From: labuladong Date: Fri, 10 Nov 2023 11:11:39 +0800 Subject: [PATCH 1/3] force readonly --- .../http/service/BookieStateReadOnlyService.java | 4 ++++ .../bookkeeper/server/http/TestHttpService.java | 11 +++++++++++ 2 files changed, 15 insertions(+) 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 23211d5218f..01ddc6378dd 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 @@ -62,6 +62,10 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } else if (!stateManager.isReadOnly() && inState.isReadOnly()) { stateManager.transitionToReadOnlyMode().get(); } + boolean isForce = request.getParams().getOrDefault("force", "false").equals("true"); + if (stateManager.isReadOnly() && isForce) { + stateManager.forceToReadOnly(); + } } else if (!HttpServer.Method.GET.equals(request.getMethod())) { response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Unsupported method. Should be GET or PUT method"); 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 a59adcf6aff..141b83785d7 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 @@ -1022,6 +1022,17 @@ public void testBookieReadOnlyState() throws Exception { readOnlyState = JsonUtil.fromJson(response.getBody(), ReadOnlyState.class); assertFalse(readOnlyState.isReadOnly()); + // force=true force the bookie to readonly + Map params = new HashMap<>(); + params.put("force", "true"); + request = new HttpServiceRequest(JsonUtil.toJson(new ReadOnlyState(true)), HttpServer.Method.PUT, params); + response = bookieReadOnlyService.handle(request); + readOnlyState = JsonUtil.fromJson(response.getBody(), ReadOnlyState.class); + assertTrue(readOnlyState.isReadOnly()); + request = new HttpServiceRequest(JsonUtil.toJson(new ReadOnlyState(false)), HttpServer.Method.PUT, null); + response = bookieReadOnlyService.handle(request); + assertEquals(400, response.getStatusCode()); + //forceReadonly to writable baseConf.setForceReadOnlyBookie(true); baseConf.setReadOnlyModeEnabled(true); From a310145b6fd1bbbb902d24cc9200700785017285 Mon Sep 17 00:00:00 2001 From: labuladong Date: Fri, 17 Nov 2023 12:46:59 +0800 Subject: [PATCH 2/3] fix npe --- .../http/service/BookieStateReadOnlyService.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 01ddc6378dd..f4f12d79ce1 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 @@ -31,6 +31,8 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; +import java.util.Map; + /** * HttpEndpointService that handles readOnly state related http requests. * The GET method will get the current readOnly state of the bookie. @@ -62,9 +64,12 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } else if (!stateManager.isReadOnly() && inState.isReadOnly()) { stateManager.transitionToReadOnlyMode().get(); } - boolean isForce = request.getParams().getOrDefault("force", "false").equals("true"); - if (stateManager.isReadOnly() && isForce) { - stateManager.forceToReadOnly(); + Map params = request.getParams(); + if (params != null) { + boolean isForce = params.getOrDefault("force", "false").equals("true"); + if (stateManager.isReadOnly() && isForce) { + stateManager.forceToReadOnly(); + } } } else if (!HttpServer.Method.GET.equals(request.getMethod())) { response.setCode(HttpServer.StatusCode.NOT_FOUND); From 50e29bd8cc97d9116fc8894218bc102dfeed98d2 Mon Sep 17 00:00:00 2001 From: labuladong Date: Mon, 20 Nov 2023 17:08:19 +0800 Subject: [PATCH 3/3] fix style --- .../server/http/service/BookieStateReadOnlyService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 f4f12d79ce1..571151a0332 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 @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -31,8 +32,6 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import java.util.Map; - /** * HttpEndpointService that handles readOnly state related http requests. * The GET method will get the current readOnly state of the bookie.