From 73ae1a7eb0b68872b79d6d8546d598ef26e3fbc3 Mon Sep 17 00:00:00 2001 From: Zita Dombi Date: Tue, 24 Feb 2026 16:01:15 +0100 Subject: [PATCH 1/2] HDDS-14705. Ozone clients should retry when OM is in prepare mode --- .../ozone/om/ha/OMFailoverProxyProviderBase.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java index 57d6caf823eb..1892882ba2d6 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java @@ -157,16 +157,6 @@ protected synchronized boolean shouldFailover(Exception ex) { } } else if (HddsUtils.shouldNotFailoverOnRpcException(unwrappedException)) { return false; - } else if (ex instanceof StateMachineException) { - StateMachineException smEx = (StateMachineException) ex; - Throwable cause = smEx.getCause(); - if (cause instanceof OMException) { - OMException omEx = (OMException) cause; - // Do not failover if the operation was blocked because the OM was - // prepared. - return omEx.getResult() != - OMException.ResultCodes.NOT_SUPPORTED_OPERATION_WHEN_PREPARED; - } } return true; } From d804897851053fd8d526eeb3fb61b114f1c162fd Mon Sep 17 00:00:00 2001 From: Zita Dombi Date: Tue, 24 Feb 2026 17:18:18 +0100 Subject: [PATCH 2/2] Remove unused imports and added a test to verify the logic --- .../ozone/om/ha/OMFailoverProxyProviderBase.java | 2 -- .../ozone/om/ha/TestOMFailoverProxyProvider.java | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java index 1892882ba2d6..8a41ba63cbe7 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/OMFailoverProxyProviderBase.java @@ -39,13 +39,11 @@ import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.OzoneConfigKeys; -import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.exceptions.OMLeaderNotReadyException; import org.apache.hadoop.ozone.om.exceptions.OMNotLeaderException; import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.SecretManager; -import org.apache.ratis.protocol.exceptions.StateMachineException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestOMFailoverProxyProvider.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestOMFailoverProxyProvider.java index 4fdb3e1cb1d8..54b4237c1640 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestOMFailoverProxyProvider.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestOMFailoverProxyProvider.java @@ -38,8 +38,10 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.io.Text; import org.apache.hadoop.ozone.ha.ConfUtils; +import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.ratis.protocol.exceptions.StateMachineException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -254,4 +256,16 @@ public void testCanonicalTokenServiceName() throws IOException { } } + /** + * If OM is in prepare mode it should still retry. + */ + @Test + public void testShouldFailoverOnPreparedStateMachineException() { + OMException omEx = new OMException("prepared", + OMException.ResultCodes.NOT_SUPPORTED_OPERATION_WHEN_PREPARED); + StateMachineException smEx = new StateMachineException("sme", omEx); + + assertTrue(provider.shouldFailover(smEx)); + } + }