diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/ServerNotLeaderException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/ServerNotLeaderException.java index 89e6a05b6bb..4fb558f952b 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/ServerNotLeaderException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/ServerNotLeaderException.java @@ -30,20 +30,21 @@ public class ServerNotLeaderException extends IOException { private final String leader; private static final Pattern CURRENT_PEER_ID_PATTERN = - Pattern.compile("Server:(.*) is not the leader[.]+.*", Pattern.DOTALL); + Pattern.compile(".* Server:(.*?) is not the leader[.]+.*", Pattern.DOTALL); private static final Pattern SUGGESTED_LEADER_PATTERN = Pattern.compile(".*Suggested leader is Server:([^:]*)(:[0-9]+).*", Pattern.DOTALL); - public ServerNotLeaderException(RaftPeerId currentPeerId) { - super("Server:" + currentPeerId + " is not the leader. Could not " + + public ServerNotLeaderException(RaftPeerId currentPeerId, String hostname, + String roleType) { + super(roleType + " Server:" + currentPeerId + "(" + hostname + ") is not the leader. Could not " + "determine the leader node."); this.leader = null; } public ServerNotLeaderException(RaftPeerId currentPeerId, - String suggestedLeader) { - super("Server:" + currentPeerId + " is not the leader. Suggested leader is" + String suggestedLeader, String hostname, String roleType) { + super(roleType + " Server:" + currentPeerId + "(" + hostname + ") is not the leader. Suggested leader is" + " Server:" + suggestedLeader + "."); this.leader = suggestedLeader; } @@ -90,7 +91,7 @@ public String getSuggestedLeader() { */ public static ServerNotLeaderException convertToNotLeaderException( NotLeaderException notLeaderException, - RaftPeerId currentPeer, String port) { + RaftPeerId currentPeer, String port, String hostname, String roleType) { String suggestedLeader = notLeaderException.getSuggestedLeader() != null ? HddsUtils .getHostName(notLeaderException.getSuggestedLeader().getAddress()) @@ -100,9 +101,9 @@ public static ServerNotLeaderException convertToNotLeaderException( if (suggestedLeader != null) { String suggestedLeaderHostPort = suggestedLeader + ":" + port; serverNotLeaderException = - new ServerNotLeaderException(currentPeer, suggestedLeaderHostPort); + new ServerNotLeaderException(currentPeer, suggestedLeaderHostPort, hostname, roleType); } else { - serverNotLeaderException = new ServerNotLeaderException(currentPeer); + serverNotLeaderException = new ServerNotLeaderException(currentPeer, hostname, roleType); } return serverNotLeaderException; } diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestServerNotLeaderExceptionMessageParsing.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestServerNotLeaderExceptionMessageParsing.java index ac6fa396c15..12fa0405673 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestServerNotLeaderExceptionMessageParsing.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestServerNotLeaderExceptionMessageParsing.java @@ -30,13 +30,13 @@ public void testServerNotLeaderException() { // Test hostname with "." final String msg = - "Server:cf0bc565-a41b-4784-a24d-3048d5a5b013 is not the leader. " + "SCM Server:cf0bc565-a41b-4784-a24d-3048d5a5b013(172.16.102.111) is not the leader. " + "Suggested leader is Server:scm5-3.scm5.root.hwx.site:9863"; ServerNotLeaderException snle = new ServerNotLeaderException(msg); assertEquals(snle.getSuggestedLeader(), "scm5-3.scm5.root.hwx" + ".site:9863"); - String message = "Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39 is not the " + + String message = "SCM Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39(172.16.102.111) is not the " + "leader.Suggested leader is Server:scm5-3.scm5.root.hwx.site:9863 \n" + "at org.apache.hadoop.hdds.ratis.ServerNotLeaderException" + ".convertToNotLeaderException(ServerNotLeaderException.java:96)"; @@ -45,7 +45,7 @@ public void testServerNotLeaderException() { snle.getSuggestedLeader()); // Test hostname with out "." - message = "Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39 is not the " + + message = "SCM Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39(172.16.102.111) is not the " + "leader.Suggested leader is Server:localhost:98634 \n" + "at org.apache.hadoop.hdds.ratis.ServerNotLeaderException" + ".convertToNotLeaderException(ServerNotLeaderException.java:96)"; @@ -53,14 +53,14 @@ public void testServerNotLeaderException() { assertEquals("localhost:98634", snle.getSuggestedLeader()); - message = "Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39 is not the " + + message = "SCM Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39(172.16.102.111) is not the " + "leader.Suggested leader is Server::98634 \n" + "at org.apache.hadoop.hdds.ratis.ServerNotLeaderException" + ".convertToNotLeaderException(ServerNotLeaderException.java:96)"; snle = new ServerNotLeaderException(message); assertNull(snle.getSuggestedLeader()); - message = "Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39 is not the " + + message = "SCM Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39(172.16.102.111) is not the " + "leader.Suggested leader is Server:localhost:98634:8988 \n" + "at org.apache.hadoop.hdds.ratis.ServerNotLeaderException" + ".convertToNotLeaderException(ServerNotLeaderException.java:96)"; @@ -68,7 +68,7 @@ public void testServerNotLeaderException() { assertEquals("localhost:98634", snle.getSuggestedLeader()); - message = "Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39 is not the " + + message = "SCM Server:7fdd7170-75cc-4e11-b343-c2657c2f2f39(172.16.102.111) is not the " + "leader.Suggested leader is Server:localhost \n" + "at org.apache.hadoop.hdds.ratis.ServerNotLeaderException" + ".convertToNotLeaderException(ServerNotLeaderException.java)"; diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java index 229ba6afe0d..c1c169cc56f 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java @@ -236,7 +236,7 @@ private static void setRaftSnapshotProperties( } public static void checkRatisException(IOException e, String port, - String scmId) throws ServiceException { + String scmId, String hostname, String roleType) throws ServiceException { if (SCMHAUtils.isNonRetriableException(e)) { throw new ServiceException(new NonRetriableException(e)); } else if (SCMHAUtils.isRetriableWithNoFailoverException(e)) { @@ -246,7 +246,7 @@ public static void checkRatisException(IOException e, String port, (NotLeaderException) SCMHAUtils.getNotLeaderException(e); throw new ServiceException(ServerNotLeaderException .convertToNotLeaderException(nle, - SCMRatisServerImpl.getSelfPeerId(scmId), port)); + SCMRatisServerImpl.getSelfPeerId(scmId), port, hostname, roleType)); } else if (e instanceof SCMSecurityException) { // For NOT_A_PRIMARY_SCM error client needs to retry on next SCM. // GetSCMCertificate call can happen on non-leader SCM and only an diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java index 88d95d1c82d..37ca5f57f83 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java @@ -61,6 +61,7 @@ public class SCMSecurityProtocolServerSideTranslatorPB private final SCMSecurityProtocol impl; private final StorageContainerManager scm; + private static final String ROLE_TYPE = "SCM"; private OzoneProtocolMessageDispatcher @@ -82,7 +83,7 @@ public SCMSecurityResponse submitRequest(RpcController controller, if (!scm.checkLeader()) { RatisUtil.checkRatisException( scm.getScmHAManager().getRatisServer().triggerNotLeaderException(), - scm.getSecurityProtocolRpcPort(), scm.getScmId()); + scm.getSecurityProtocolRpcPort(), scm.getScmId(), scm.getHostname(), ROLE_TYPE); } return dispatcher.processRequest(request, this::processRequest, request.getCmdType(), request.getTraceID()); @@ -150,7 +151,7 @@ public SCMSecurityResponse processRequest(SCMSecurityRequest request) } } catch (IOException e) { RatisUtil.checkRatisException(e, scm.getSecurityProtocolRpcPort(), - scm.getScmId()); + scm.getScmId(), scm.getHostname(), ROLE_TYPE); scmSecurityResponse.setSuccess(false); scmSecurityResponse.setStatus(exceptionToResponseStatus(e)); // If actual cause is set in SCMSecurityException, set message with diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java index c1431845ce1..878d08ddf47 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java @@ -72,6 +72,7 @@ public final class ScmBlockLocationProtocolServerSideTranslatorPB private final ScmBlockLocationProtocol impl; private final StorageContainerManager scm; + private static final String ROLE_TYPE = "SCM"; private static final Logger LOG = LoggerFactory .getLogger(ScmBlockLocationProtocolServerSideTranslatorPB.class); @@ -111,7 +112,7 @@ public SCMBlockLocationResponse send(RpcController controller, if (!scm.checkLeader()) { RatisUtil.checkRatisException( scm.getScmHAManager().getRatisServer().triggerNotLeaderException(), - scm.getBlockProtocolRpcPort(), scm.getScmId()); + scm.getBlockProtocolRpcPort(), scm.getScmId(), scm.getHostname(), ROLE_TYPE); } return dispatcher.processRequest( request, @@ -173,7 +174,7 @@ private SCMBlockLocationResponse processMessage( } } catch (IOException e) { RatisUtil.checkRatisException(e, scm.getBlockProtocolRpcPort(), - scm.getScmId()); + scm.getScmId(), scm.getHostname(), ROLE_TYPE); response.setSuccess(false); response.setStatus(exceptionToResponseStatus(e)); if (e.getMessage() != null) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SecretKeyProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SecretKeyProtocolServerSideTranslatorPB.java index f9b830620d0..a7dc40748d1 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SecretKeyProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SecretKeyProtocolServerSideTranslatorPB.java @@ -55,6 +55,7 @@ public class SecretKeyProtocolServerSideTranslatorPB private final SecretKeyProtocolScm impl; private final StorageContainerManager scm; + private static final String ROLE_TYPE = "SCM"; private OzoneProtocolMessageDispatcher dispatcher; @@ -75,7 +76,7 @@ public SCMSecretKeyResponse submitRequest(RpcController controller, if (!scm.checkLeader()) { RatisUtil.checkRatisException( scm.getScmHAManager().getRatisServer().triggerNotLeaderException(), - scm.getSecurityProtocolRpcPort(), scm.getScmId()); + scm.getSecurityProtocolRpcPort(), scm.getScmId(), scm.getHostname(), ROLE_TYPE); } return dispatcher.processRequest(request, this::processRequest, request.getCmdType(), request.getTraceID()); @@ -115,7 +116,7 @@ public SCMSecretKeyResponse processRequest(SCMSecretKeyRequest request) } } catch (IOException e) { RatisUtil.checkRatisException(e, scm.getSecurityProtocolRpcPort(), - scm.getScmId()); + scm.getScmId(), scm.getHostname(), ROLE_TYPE); scmSecurityResponse.setSuccess(false); scmSecurityResponse.setStatus(exceptionToResponseStatus(e)); // If actual cause is set in SCMSecurityException, set message with diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java index c4d2bfdc642..dc92b3f53a5 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java @@ -179,6 +179,7 @@ public final class StorageContainerLocationProtocolServerSideTranslatorPB private final StorageContainerLocationProtocol impl; private final StorageContainerManager scm; + private static final String ROLE_TYPE = "SCM"; private OzoneProtocolMessageDispatcher @@ -211,7 +212,7 @@ public ScmContainerLocationResponse submitRequest(RpcController controller, && !ADMIN_COMMAND_TYPE.contains(request.getCmdType())) { RatisUtil.checkRatisException( scm.getScmHAManager().getRatisServer().triggerNotLeaderException(), - scm.getClientRpcPort(), scm.getScmId()); + scm.getClientRpcPort(), scm.getScmId(), scm.getHostname(), ROLE_TYPE); } // After the request interceptor (now validator) framework is extended to // this server interface, this should be removed and solved via new @@ -737,7 +738,7 @@ public ScmContainerLocationResponse processRequest( } } catch (IOException e) { RatisUtil - .checkRatisException(e, scm.getClientRpcPort(), scm.getScmId()); + .checkRatisException(e, scm.getClientRpcPort(), scm.getScmId(), scm.getHostname(), ROLE_TYPE); throw new ServiceException(e); } }