You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by el...@apache.org on 2021/04/21 09:29:36 UTC

[ozone] branch HDDS-3816-ec updated: HDDS-5011. Introduce ECReplicationConfig and Java based ReplicationConfig implementation (#2068)

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

elek pushed a commit to branch HDDS-3816-ec
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-3816-ec by this push:
     new c050b8f  HDDS-5011. Introduce ECReplicationConfig and Java based ReplicationConfig implementation (#2068)
c050b8f is described below

commit c050b8f67e8af0fef3713c9f0a5cbd8a88073a7a
Author: Elek, Márton <el...@users.noreply.github.com>
AuthorDate: Wed Apr 21 11:29:15 2021 +0200

    HDDS-5011. Introduce ECReplicationConfig and Java based ReplicationConfig implementation (#2068)
---
 .../hadoop/hdds/scm/XceiverClientManager.java      |  2 +-
 .../hadoop/hdds/client/ECReplicationConfig.java    | 94 ++++++++++++++++++++++
 .../hadoop/hdds/client/ReplicationConfig.java      | 10 +--
 .../hdds/scm/protocol/TestReplicationConfig.java   | 20 +++++
 .../interface-client/src/main/proto/hdds.proto     |  5 ++
 .../src/main/proto/ScmServerProtocol.proto         |  6 +-
 6 files changed, 129 insertions(+), 8 deletions(-)

diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java
index e88ab23..8d16094 100644
--- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java
+++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java
@@ -231,7 +231,7 @@ public class XceiverClientManager implements Closeable, XceiverClientFactory {
               client = new XceiverClientGrpc(pipeline, conf, caCerts);
               break;
             case EC:
-              client = new XceiverClientGrpc(pipeline, conf, caCert);
+              client = new XceiverClientGrpc(pipeline, conf, caCerts);
               break;
             case CHAINED:
             default:
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ECReplicationConfig.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ECReplicationConfig.java
new file mode 100644
index 0000000..1d9da50
--- /dev/null
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ECReplicationConfig.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.client;
+
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+
+import java.util.Objects;
+
+/**
+ * Replication configuration for EC replication.
+ */
+public class ECReplicationConfig implements ReplicationConfig {
+
+  private int data;
+
+  private int parity;
+
+  public ECReplicationConfig(int data, int parity) {
+    this.data = data;
+    this.parity = parity;
+  }
+
+  public ECReplicationConfig(
+      HddsProtos.ECReplicationConfig ecReplicationConfig) {
+    this.data = ecReplicationConfig.getData();
+    this.parity = ecReplicationConfig.getParity();
+  }
+
+  @Override
+  public HddsProtos.ReplicationType getReplicationType() {
+    return HddsProtos.ReplicationType.EC;
+  }
+
+  @Override
+  public int getRequiredNodes() {
+    return data + parity;
+  }
+
+  public HddsProtos.ECReplicationConfig toProto() {
+    return HddsProtos.ECReplicationConfig.newBuilder()
+        .setData(data)
+        .setParity(parity)
+        .build();
+  }
+
+  public int getData() {
+    return data;
+  }
+
+  public void setData(int data) {
+    this.data = data;
+  }
+
+  public int getParity() {
+    return parity;
+  }
+
+  public void setParity(int parity) {
+    this.parity = parity;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ECReplicationConfig that = (ECReplicationConfig) o;
+    return data == that.data && parity == that.parity;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(data, parity);
+  }
+}
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ReplicationConfig.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ReplicationConfig.java
index 7818661..694f997 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ReplicationConfig.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ReplicationConfig.java
@@ -52,16 +52,14 @@ public interface ReplicationConfig {
    * <p>
    * This uses either the old type/factor or the new ecConfig depends on the
    * type.
-   * <p>
-   * Note: It will support all the available replication types (including EC).
-   * <p>
-   * Separated to remain be synced with the EC feature branch, as later it
-   * will have different signature.
    */
   static ReplicationConfig fromProto(
       HddsProtos.ReplicationType type,
-      HddsProtos.ReplicationFactor factor) {
+      HddsProtos.ReplicationFactor factor,
+      HddsProtos.ECReplicationConfig ecConfig) {
     switch (type) {
+    case EC:
+      return new ECReplicationConfig(ecConfig);
     case RATIS:
     case STAND_ALONE:
       return fromTypeAndFactor(type, factor);
diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestReplicationConfig.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestReplicationConfig.java
index 4ab60bc..fdcebc8 100644
--- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestReplicationConfig.java
+++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestReplicationConfig.java
@@ -17,9 +17,11 @@
  */
 package org.apache.hadoop.hdds.scm.protocol;
 
+import org.apache.hadoop.hdds.client.ECReplicationConfig;
 import org.apache.hadoop.hdds.client.RatisReplicationConfig;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
 import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
 import org.junit.Assert;
@@ -31,6 +33,24 @@ import org.junit.Test;
 public class TestReplicationConfig {
 
   @Test
+  public void deserializeEC() {
+    final ReplicationConfig replicationConfig = ReplicationConfig
+        .fromProto(ReplicationType.EC, ReplicationFactor.THREE,
+            HddsProtos.ECReplicationConfig.newBuilder()
+                .setParity(2)
+                .setData(3)
+                .build());
+
+    Assert
+        .assertEquals(ECReplicationConfig.class, replicationConfig.getClass());
+
+    ECReplicationConfig ecConfig = (ECReplicationConfig) replicationConfig;
+    Assert.assertEquals(ReplicationType.EC, ecConfig.getReplicationType());
+    Assert.assertEquals(3, ecConfig.getData());
+    Assert.assertEquals(2, ecConfig.getParity());
+  }
+
+  @Test
   public void deserializeRatis() {
     final ReplicationConfig replicationConfig = ReplicationConfig
         .fromTypeAndFactor(ReplicationType.RATIS, ReplicationFactor.THREE);
diff --git a/hadoop-hdds/interface-client/src/main/proto/hdds.proto b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
index ac23040..b83d096 100644
--- a/hadoop-hdds/interface-client/src/main/proto/hdds.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
@@ -260,6 +260,11 @@ enum ReplicationFactor {
     THREE = 3;
 }
 
+message ECReplicationConfig {
+    required int32 data = 1;
+    required int32 parity = 2;
+}
+
 enum ScmOps {
     allocateBlock = 1;
     keyBlocksInfoList = 2;
diff --git a/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto b/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
index 1b73d6a..b5d2408 100644
--- a/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
+++ b/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
@@ -132,9 +132,13 @@ message AllocateScmBlockRequestProto {
   required uint64 size = 1;
   required uint32 numBlocks = 2;
   required ReplicationType type = 3;
-  required hadoop.hdds.ReplicationFactor factor = 4;
+  optional hadoop.hdds.ReplicationFactor factor = 4;
   required string owner = 5;
   optional ExcludeListProto excludeList = 7;
+
+  //used for EC replicaiton instead of the replication factor
+  optional hadoop.hdds.ECReplicationConfig ecReplicationConfig = 8;
+
 }
 
 /**

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org