This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 918bb9809c HDDS-12626. Move the compare method in NodeStatus to 
ECPipelineProvider. (#8116)
918bb9809c is described below

commit 918bb9809c8731ff04645e4634a0955b01dc115a
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Mar 20 07:58:16 2025 -0700

    HDDS-12626. Move the compare method in NodeStatus to ECPipelineProvider. 
(#8116)
---
 .../apache/hadoop/hdds/scm/node/NodeStatus.java    | 31 +++++++-------------
 .../node/states/NodeAlreadyExistsException.java    | 13 ++++-----
 .../hadoop/hdds/scm/node/states/NodeStateMap.java  |  2 +-
 .../hdds/scm/pipeline/ECPipelineProvider.java      | 14 +++++++--
 .../TestCreateForReadComparator.java}              | 34 +++++++++++++++-------
 5 files changed, 52 insertions(+), 42 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStatus.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStatus.java
index 9b9be03a49..a67525acce 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStatus.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStatus.java
@@ -43,9 +43,9 @@
  * <p>
  * This class is value-based.
  */
-public final class NodeStatus implements Comparable<NodeStatus> {
+public final class NodeStatus {
   /** For the {@link NodeStatus} objects with {@link 
#opStateExpiryEpochSeconds} == 0. */
-  private static final Map<NodeOperationalState, Map<NodeState, NodeStatus>> 
CONSTANT_MAP;
+  private static final Map<NodeOperationalState, Map<NodeState, NodeStatus>> 
CONSTANTS;
   static {
     final Map<NodeOperationalState, Map<NodeState, NodeStatus>> map = new 
EnumMap<>(NodeOperationalState.class);
     for (NodeOperationalState op : NodeOperationalState.values()) {
@@ -53,19 +53,21 @@ public final class NodeStatus implements 
Comparable<NodeStatus> {
       for (NodeState health : NodeState.values()) {
         healthMap.put(health, new NodeStatus(health, op, 0));
       }
-      map.put(op, healthMap);
+      map.put(op, Collections.unmodifiableMap(healthMap));
     }
-    CONSTANT_MAP = map;
+    CONSTANTS = Collections.unmodifiableMap(map);
   }
 
   /** @return a {@link NodeStatus} object with {@link 
#opStateExpiryEpochSeconds} == 0. */
   public static NodeStatus valueOf(NodeOperationalState op, NodeState health) {
-    return CONSTANT_MAP.get(op).get(health);
+    return valueOf(op, health, 0);
   }
 
   /** @return a {@link NodeStatus} object. */
   public static NodeStatus valueOf(NodeOperationalState op, NodeState health, 
long opExpiryEpochSeconds) {
-    return opExpiryEpochSeconds == 0 ? valueOf(op, health)
+    Objects.requireNonNull(op, "op == null");
+    Objects.requireNonNull(health, "health == null");
+    return opExpiryEpochSeconds == 0 ? CONSTANTS.get(op).get(health)
         : new NodeStatus(health, op, opExpiryEpochSeconds);
   }
 
@@ -250,19 +252,8 @@ public int hashCode() {
 
   @Override
   public String toString() {
-    return "OperationalState: " + operationalState
-        + "(expiry: " + opStateExpiryEpochSeconds + "s), Health: " + health;
-  }
-
-  @Override
-  public int compareTo(NodeStatus o) {
-    int order = Boolean.compare(o.isHealthy(), isHealthy());
-    if (order == 0) {
-      order = Boolean.compare(isDead(), o.isDead());
-    }
-    if (order == 0) {
-      order = operationalState.compareTo(o.operationalState);
-    }
-    return order;
+    final String expiry = opStateExpiryEpochSeconds == 0 ? "no expiry"
+        : "expiry: " + opStateExpiryEpochSeconds + "s";
+    return operationalState + "(" + expiry + ")-" + health;
   }
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeAlreadyExistsException.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeAlreadyExistsException.java
index 4341d74ec9..e99032680e 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeAlreadyExistsException.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeAlreadyExistsException.java
@@ -17,6 +17,8 @@
 
 package org.apache.hadoop.hdds.scm.node.states;
 
+import org.apache.hadoop.hdds.protocol.DatanodeID;
+
 /**
  * This exception represents that there is already a node added to NodeStateMap
  * with same UUID.
@@ -32,14 +34,9 @@ public NodeAlreadyExistsException() {
   }
 
   /**
-   * Constructs an {@code NodeAlreadyExistsException} with the specified
-   * detail message.
-   *
-   * @param message
-   *        The detail message (which is saved for later retrieval
-   *        by the {@link #getMessage()} method)
+   * Constructs an {@code NodeAlreadyExistsException} with the given {@link 
DatanodeID}.
    */
-  public NodeAlreadyExistsException(String message) {
-    super(message);
+  public NodeAlreadyExistsException(DatanodeID datanodeID) {
+    super("Datanode " + datanodeID + " already exists");
   }
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java
index ce49cb6c64..0f4420f8a6 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java
@@ -80,7 +80,7 @@ public void addNode(DatanodeDetails datanodeDetails, 
NodeStatus nodeStatus,
     try {
       final DatanodeID id = datanodeDetails.getID();
       if (nodeMap.containsKey(id)) {
-        throw new NodeAlreadyExistsException("Node UUID: " + id);
+        throw new NodeAlreadyExistsException(id);
       }
       nodeMap.put(id, new DatanodeInfo(datanodeDetails, nodeStatus,
           layoutInfo));
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/ECPipelineProvider.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/ECPipelineProvider.java
index 1f884404c1..b28a435de0 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/ECPipelineProvider.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/ECPipelineProvider.java
@@ -97,6 +97,16 @@ protected Pipeline create(ECReplicationConfig 
replicationConfig,
     return createPipelineInternal(replicationConfig, nodes, dnIndexes);
   }
 
+  static final Comparator<NodeStatus> CREATE_FOR_READ_COMPARATOR = (left, 
right) -> {
+    final int healthy = Boolean.compare(right.isHealthy(), left.isHealthy());
+    if (healthy != 0) {
+      return healthy;
+    }
+    final int dead = Boolean.compare(left.isDead(), right.isDead());
+    return dead != 0 ? dead : 
left.getOperationalState().compareTo(right.getOperationalState());
+  };
+
+
   @Override
   public Pipeline createForRead(
       ECReplicationConfig replicationConfig,
@@ -115,11 +125,11 @@ public Pipeline createForRead(
           nodeStatusMap.put(dn, nodeStatus);
         }
       } catch (NodeNotFoundException e) {
-        LOG.error("Node not found", e);
+        LOG.error("Failed to getNodeStatus for {}", dn, e);
       }
     }
 
-    dns.sort(Comparator.comparing(nodeStatusMap::get));
+    dns.sort(Comparator.comparing(nodeStatusMap::get, 
CREATE_FOR_READ_COMPARATOR));
 
     return createPipelineInternal(replicationConfig, dns, map);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeStatus.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestCreateForReadComparator.java
similarity index 66%
rename from 
hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeStatus.java
rename to 
hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestCreateForReadComparator.java
index 01ceab3ab3..f7b561a45b 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeStatus.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestCreateForReadComparator.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hdds.scm.node;
+package org.apache.hadoop.hdds.scm.pipeline;
 
 import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.DECOMMISSIONING;
 import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.ENTERING_MAINTENANCE;
@@ -27,40 +27,52 @@
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import java.util.Comparator;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.hdds.scm.node.NodeStatus;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
 
 /**
- * Tests for {@link NodeStatus}.
+ * Tests for {@link ECPipelineProvider#CREATE_FOR_READ_COMPARATOR}.
  */
-class TestNodeStatus {
+class TestCreateForReadComparator {
+  private final Comparator<NodeStatus> comparator = 
ECPipelineProvider.CREATE_FOR_READ_COMPARATOR;
+
+  int compare(NodeStatus left, NodeStatus right) {
+    return comparator.compare(left, right);
+  }
 
   @ParameterizedTest
   @EnumSource
   void readOnly(HddsProtos.NodeOperationalState state) {
-    assertEquals(0, NodeStatus.valueOf(state, HEALTHY)
-        .compareTo(NodeStatus.valueOf(state, HEALTHY_READONLY)));
+    assertEquals(0, compare(
+        NodeStatus.valueOf(state, HEALTHY),
+        NodeStatus.valueOf(state, HEALTHY_READONLY)));
   }
 
   @Test
   void healthyFirst() {
-    
assertThat(0).isGreaterThan(inServiceHealthy().compareTo(inServiceStale()));
-    assertThat(0).isLessThan(inServiceDead().compareTo(inServiceHealthy()));
-    assertThat(0).isGreaterThan(NodeStatus.valueOf(ENTERING_MAINTENANCE, 
HEALTHY).compareTo(
+    assertThat(0).isGreaterThan(compare(inServiceHealthy(), inServiceStale()));
+    assertThat(0).isLessThan(compare(inServiceDead(), inServiceHealthy()));
+    assertThat(0).isGreaterThan(compare(
+        NodeStatus.valueOf(ENTERING_MAINTENANCE, HEALTHY),
         inServiceStale()
     ));
-    assertThat(0).isLessThan(inServiceStale().compareTo(
+    assertThat(0).isLessThan(compare(
+        inServiceStale(),
         NodeStatus.valueOf(DECOMMISSIONING, HEALTHY)
     ));
   }
 
   @Test
   void inServiceFirst() {
-    assertThat(0).isGreaterThan(inServiceHealthy().compareTo(
+    assertThat(0).isGreaterThan(compare(
+        inServiceHealthy(),
         NodeStatus.valueOf(ENTERING_MAINTENANCE, HEALTHY)));
-    assertThat(0).isLessThan(NodeStatus.valueOf(DECOMMISSIONING, 
HEALTHY).compareTo(
+    assertThat(0).isLessThan(compare(
+        NodeStatus.valueOf(DECOMMISSIONING, HEALTHY),
         inServiceHealthy()
     ));
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to