From 21b1b4e2d729258fd6610299c8b00d7f35948678 Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Fri, 6 Mar 2026 13:58:30 +0530 Subject: [PATCH 1/3] HDDS-14775. Check leader status before serving bootstrap request. --- .../ozone/om/OMDBCheckpointServlet.java | 20 +++++++++++++++++++ .../OMDBCheckpointServletInodeBasedXfer.java | 13 ++++++++++++ .../apache/hadoop/ozone/om/OzoneManager.java | 12 +++++++++++ 3 files changed, 45 insertions(+) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java index a90ee336b001..eb264ce1fd2b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java @@ -54,6 +54,7 @@ import java.util.stream.Stream; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.commons.compress.archivers.ArchiveOutputStream; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.io.FileUtils; @@ -133,6 +134,25 @@ public void init() throws ServletException { lock = new Lock(om); } + @Override + public void processMetadataSnapshotRequest(HttpServletRequest request, HttpServletResponse response, + boolean isFormData, boolean flush) { + OzoneManager om = (OzoneManager) getServletContext().getAttribute(OzoneConsts.OM_CONTEXT_ATTRIBUTE); + boolean isOmLeader = om.isLeader(); + if (!isOmLeader) { + String msg = "Unable to process metadata snapshot request as this OM is not the leader"; + LOG.warn(msg); + try { + response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, msg); + } catch (IOException e) { + LOG.warn("Failed to send error response, falling back to status only", e); + response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE); + } + return; + } + super.processMetadataSnapshotRequest(request, response, isFormData, flush); + } + @Override public void writeDbDataToStream(DBCheckpoint checkpoint, HttpServletRequest request, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java index 817dfc30b449..ab63daee0782 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java @@ -142,6 +142,19 @@ public BootstrapStateHandler.Lock getBootstrapStateLock() { @Override public void processMetadataSnapshotRequest(HttpServletRequest request, HttpServletResponse response, boolean isFormData, boolean flush) { + OzoneManager om = (OzoneManager) getServletContext().getAttribute(OzoneConsts.OM_CONTEXT_ATTRIBUTE); + boolean isOmLeader = om.isLeader(); + if (!isOmLeader) { + String msg = "Unable to process metadata snapshot request as this OM is not the leader"; + LOG.warn(msg); + try { + response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, msg); + } catch (IOException e) { + LOG.warn("Failed to send error response, falling back to status only", e); + response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE); + } + return; + } String[] sstParam = isFormData ? parseFormDataParameters(request) : request.getParameterValues( OZONE_DB_CHECKPOINT_REQUEST_TO_EXCLUDE_SST); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index 7a9d66f86dff..c72521b35b86 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -94,6 +94,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKEN_ERROR_OTHER; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.RaftServerStatus.LEADER_AND_NOT_READY; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.RaftServerStatus.LEADER_AND_READY; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.getRaftGroupIdFromOmServiceId; import static org.apache.hadoop.ozone.om.s3.S3SecretStoreConfigurationKeys.DEFAULT_SECRET_STORAGE_TYPE; @@ -4500,6 +4501,17 @@ public boolean isLeaderReady() { return ratisServer != null && ratisServer.getLeaderStatus() == LEADER_AND_READY; } + /** + * Return true, if the current OM node is leader regardless of ready state. + * If ratis is not enabled, then it always returns true. + */ + public boolean isLeader() { + final OzoneManagerRatisServer ratisServer = omRatisServer; + return ratisServer != null && + (ratisServer.getLeaderStatus() == LEADER_AND_READY || + ratisServer.getLeaderStatus() == LEADER_AND_NOT_READY); + } + /** * Checks the leader status. Does nothing if this OM is leader and is ready. * @throws OMLeaderNotReadyException if leader, but not ready From 3a613b928b3f21c5b3cb370f2e4cb08cc51ca6cf Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Fri, 6 Mar 2026 22:00:51 +0530 Subject: [PATCH 2/3] use leaderReady --- .../apache/hadoop/ozone/om/OMDBCheckpointServlet.java | 2 +- .../ozone/om/OMDBCheckpointServletInodeBasedXfer.java | 2 +- .../java/org/apache/hadoop/ozone/om/OzoneManager.java | 11 ----------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java index eb264ce1fd2b..342d7eda5d45 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java @@ -138,7 +138,7 @@ public void init() throws ServletException { public void processMetadataSnapshotRequest(HttpServletRequest request, HttpServletResponse response, boolean isFormData, boolean flush) { OzoneManager om = (OzoneManager) getServletContext().getAttribute(OzoneConsts.OM_CONTEXT_ATTRIBUTE); - boolean isOmLeader = om.isLeader(); + boolean isOmLeader = om.isLeaderReady(); if (!isOmLeader) { String msg = "Unable to process metadata snapshot request as this OM is not the leader"; LOG.warn(msg); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java index ab63daee0782..2c4a423db2c3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java @@ -143,7 +143,7 @@ public BootstrapStateHandler.Lock getBootstrapStateLock() { public void processMetadataSnapshotRequest(HttpServletRequest request, HttpServletResponse response, boolean isFormData, boolean flush) { OzoneManager om = (OzoneManager) getServletContext().getAttribute(OzoneConsts.OM_CONTEXT_ATTRIBUTE); - boolean isOmLeader = om.isLeader(); + boolean isOmLeader = om.isLeaderReady(); if (!isOmLeader) { String msg = "Unable to process metadata snapshot request as this OM is not the leader"; LOG.warn(msg); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index c72521b35b86..9c80314ad93e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -4501,17 +4501,6 @@ public boolean isLeaderReady() { return ratisServer != null && ratisServer.getLeaderStatus() == LEADER_AND_READY; } - /** - * Return true, if the current OM node is leader regardless of ready state. - * If ratis is not enabled, then it always returns true. - */ - public boolean isLeader() { - final OzoneManagerRatisServer ratisServer = omRatisServer; - return ratisServer != null && - (ratisServer.getLeaderStatus() == LEADER_AND_READY || - ratisServer.getLeaderStatus() == LEADER_AND_NOT_READY); - } - /** * Checks the leader status. Does nothing if this OM is leader and is ready. * @throws OMLeaderNotReadyException if leader, but not ready From f03dcb820086ae8b8c7e818d8e947e3be363cd2a Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Fri, 6 Mar 2026 22:01:57 +0530 Subject: [PATCH 3/3] unused imports --- .../src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index 9c80314ad93e..7a9d66f86dff 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -94,7 +94,6 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKEN_ERROR_OTHER; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; -import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.RaftServerStatus.LEADER_AND_NOT_READY; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.RaftServerStatus.LEADER_AND_READY; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.getRaftGroupIdFromOmServiceId; import static org.apache.hadoop.ozone.om.s3.S3SecretStoreConfigurationKeys.DEFAULT_SECRET_STORAGE_TYPE;