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

umamahesh 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 460aa9b  HDDS-6020: EC: Provide set replicationConfig option to bucket 
(#2880)
460aa9b is described below

commit 460aa9b89bb8a27eef4e17a9864f86da33763bfb
Author: Uma Maheswara Rao G <[email protected]>
AuthorDate: Tue Dec 7 16:59:56 2021 -0800

    HDDS-6020: EC: Provide set replicationConfig option to bucket (#2880)
    
    Co-authored-by: Uma Maheswara Rao G <[email protected]>
---
 .../hdds/client/DefaultReplicationConfig.java      | 24 +++++++++
 .../apache/hadoop/ozone/client/OzoneBucket.java    | 11 +++++
 .../ozone/client/protocol/ClientProtocol.java      | 11 +++++
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  | 15 ++++++
 .../hadoop/ozone/om/helpers/OmBucketArgs.java      | 57 +++++++++++++++++-----
 .../client/rpc/TestOzoneRpcClientAbstract.java     | 47 ++++++++++++++++++
 .../request/bucket/OMBucketSetPropertyRequest.java |  8 +++
 7 files changed, 162 insertions(+), 11 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DefaultReplicationConfig.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DefaultReplicationConfig.java
index a11b7fc..dda778f 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DefaultReplicationConfig.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DefaultReplicationConfig.java
@@ -37,6 +37,17 @@ public class DefaultReplicationConfig {
     this.ecReplicationConfig = null;
   }
 
+  public DefaultReplicationConfig(ReplicationConfig replicationConfig) {
+    this.type =
+        ReplicationType.fromProto(replicationConfig.getReplicationType());
+    if (replicationConfig instanceof ECReplicationConfig) {
+      this.ecReplicationConfig = (ECReplicationConfig) replicationConfig;
+    } else {
+      this.factor =
+          ReplicationFactor.valueOf(replicationConfig.getRequiredNodes());
+    }
+  }
+
   public DefaultReplicationConfig(ReplicationType type,
       ECReplicationConfig ecReplicationConfig) {
     this.type = type;
@@ -51,6 +62,19 @@ public class DefaultReplicationConfig {
     this.ecReplicationConfig = ecReplicationConfig;
   }
 
+  public DefaultReplicationConfig(
+      org.apache.hadoop.hdds.protocol.proto.HddsProtos.DefaultReplicationConfig
+          defaultReplicationConfig) {
+    this.type = ReplicationType.fromProto(defaultReplicationConfig.getType());
+    if (defaultReplicationConfig.hasEcReplicationConfig()) {
+      this.ecReplicationConfig = new ECReplicationConfig(
+          defaultReplicationConfig.getEcReplicationConfig());
+    } else {
+      this.factor =
+          ReplicationFactor.fromProto(defaultReplicationConfig.getFactor());
+    }
+  }
+
   public ReplicationType getType() {
     return this.type;
   }
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
index 575612d..37098a9 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java
@@ -514,6 +514,17 @@ public class OzoneBucket extends WithMetadata {
   }
 
   /**
+   * Sets/Changes the default replication config of this Bucket.
+   *
+   * @param replicationConfig Replication config that can be applied to bucket.
+   * @throws IOException
+   */
+  public void setReplicationConfig(ReplicationConfig replicationConfig)
+      throws IOException {
+    proxy.setReplicationConfig(volumeName, name, replicationConfig);
+  }
+
+  /**
    * Creates a new key in the bucket, with default replication type RATIS and
    * with replication factor THREE.
    * @param key Name of the key to be created.
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
index 2feb577..c2280ed 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
@@ -739,6 +739,17 @@ public interface ClientProtocol {
       long quotaInNamespace, long quotaInBytes) throws IOException;
 
   /**
+   * Set Bucket replication configuration.
+   *
+   * @param volumeName        Name of the Volume.
+   * @param bucketName        Name of the Bucket.
+   * @param replicationConfig The replication config to set on bucket.
+   * @throws IOException
+   */
+  void setReplicationConfig(String volumeName, String bucketName,
+      ReplicationConfig replicationConfig) throws IOException;
+
+  /**
    * Returns OzoneKey that contains the application generated/visible
    * metadata for an Ozone Object.
    *
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index da0b4c1..7fdb8fc 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -705,6 +705,21 @@ public class RpcClient implements ClientProtocol {
   }
 
   @Override
+  public void setReplicationConfig(
+      String volumeName, String bucketName, ReplicationConfig 
replicationConfig)
+      throws IOException {
+    verifyVolumeName(volumeName);
+    verifyBucketName(bucketName);
+    Preconditions.checkNotNull(replicationConfig);
+    OmBucketArgs.Builder builder = OmBucketArgs.newBuilder();
+    builder.setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .setDefaultReplicationConfig(
+            new DefaultReplicationConfig(replicationConfig));
+    ozoneManagerClient.setBucketProperty(builder.build());
+  }
+
+  @Override
   public void deleteBucket(
       String volumeName, String bucketName) throws IOException {
     verifyVolumeName(volumeName);
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketArgs.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketArgs.java
index 1c8c18a..56e825f 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketArgs.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketArgs.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.ozone.om.helpers;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
 import org.apache.hadoop.hdds.protocol.StorageType;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.Auditable;
@@ -51,6 +52,7 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
 
   private long quotaInBytes;
   private long quotaInNamespace;
+  private DefaultReplicationConfig defaultReplicationConfig = null;
 
   /**
    * Private constructor, constructed via builder.
@@ -122,6 +124,22 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
   }
 
   /**
+   * Returns Bucket default replication config.
+   * @return
+   */
+  public DefaultReplicationConfig getDefaultReplicationConfig() {
+    return defaultReplicationConfig;
+  }
+
+  /**
+   * Sets the Bucket default replication config.
+   */
+  private void setDefaultReplicationConfig(
+      DefaultReplicationConfig defaultReplicationConfig) {
+    this.defaultReplicationConfig = defaultReplicationConfig;
+  }
+
+  /**
    * Returns new builder class that builds a OmBucketArgs.
    * @return Builder
    */
@@ -155,6 +173,7 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
     private Map<String, String> metadata;
     private long quotaInBytes;
     private long quotaInNamespace;
+    private DefaultReplicationConfig defaultReplicationConfig;
 
     /**
      * Constructs a builder.
@@ -199,6 +218,12 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
       return this;
     }
 
+    public Builder setDefaultReplicationConfig(
+        DefaultReplicationConfig defaultRepConfig) {
+      this.defaultReplicationConfig = defaultRepConfig;
+      return this;
+    }
+
     /**
      * Constructs the OmBucketArgs.
      * @return instance of OmBucketArgs.
@@ -206,8 +231,11 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
     public OmBucketArgs build() {
       Preconditions.checkNotNull(volumeName);
       Preconditions.checkNotNull(bucketName);
-      return new OmBucketArgs(volumeName, bucketName, isVersionEnabled,
-          storageType, metadata, quotaInBytes, quotaInNamespace);
+      OmBucketArgs omBucketArgs =
+          new OmBucketArgs(volumeName, bucketName, isVersionEnabled,
+              storageType, metadata, quotaInBytes, quotaInNamespace);
+      omBucketArgs.setDefaultReplicationConfig(defaultReplicationConfig);
+      return omBucketArgs;
     }
   }
 
@@ -230,6 +258,9 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
     if(quotaInNamespace > 0 || quotaInNamespace == OzoneConsts.QUOTA_RESET) {
       builder.setQuotaInNamespace(quotaInNamespace);
     }
+    if (defaultReplicationConfig != null) {
+      builder.setDefaultReplicationConfig(defaultReplicationConfig.toProto());
+    }
     return builder.build();
   }
 
@@ -239,14 +270,18 @@ public final class OmBucketArgs extends WithMetadata 
implements Auditable {
    * @return instance of OmBucketArgs
    */
   public static OmBucketArgs getFromProtobuf(BucketArgs bucketArgs) {
-    return new OmBucketArgs(bucketArgs.getVolumeName(),
-        bucketArgs.getBucketName(),
-        bucketArgs.hasIsVersionEnabled() ?
-            bucketArgs.getIsVersionEnabled() : null,
-        bucketArgs.hasStorageType() ? StorageType.valueOf(
-            bucketArgs.getStorageType()) : null,
-        KeyValueUtil.getFromProtobuf(bucketArgs.getMetadataList()),
-        bucketArgs.getQuotaInBytes(),
-        bucketArgs.getQuotaInNamespace());
+    OmBucketArgs omBucketArgs =
+        new OmBucketArgs(bucketArgs.getVolumeName(), 
bucketArgs.getBucketName(),
+            bucketArgs.hasIsVersionEnabled() ?
+                bucketArgs.getIsVersionEnabled() :
+                null, bucketArgs.hasStorageType() ?
+            StorageType.valueOf(bucketArgs.getStorageType()) :
+            null, KeyValueUtil.getFromProtobuf(bucketArgs.getMetadataList()),
+            bucketArgs.getQuotaInBytes(), bucketArgs.getQuotaInNamespace());
+    // OmBucketArgs ctor already has more arguments, so setting the default
+    // replication config separately.
+    omBucketArgs.setDefaultReplicationConfig(
+        new 
DefaultReplicationConfig(bucketArgs.getDefaultReplicationConfig()));
+    return omBucketArgs;
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java
index b30121c..42197cc 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClientAbstract.java
@@ -37,10 +37,14 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
+import org.apache.hadoop.hdds.client.ECReplicationConfig;
 import org.apache.hadoop.hdds.client.OzoneQuota;
+import org.apache.hadoop.hdds.client.RatisReplicationConfig;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
 import org.apache.hadoop.hdds.client.ReplicationFactor;
 import org.apache.hadoop.hdds.client.ReplicationType;
+import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.StorageType;
@@ -3753,4 +3757,47 @@ public abstract class TestOzoneRpcClientAbstract {
     createRequiredForVersioningTest(volumeName, bucketName, keyName, true);
     checkExceptedResultForVersioningTest(volumeName, bucketName, keyName, 2);
   }
+
+  @Test
+  public void testSetECReplicationConfigOnBucket()
+      throws IOException {
+    String volumeName = UUID.randomUUID().toString();
+    store.createVolume(volumeName);
+    OzoneVolume volume = store.getVolume(volumeName);
+    OzoneBucket bucket = getBucket(volume);
+    ReplicationConfig currentReplicationConfig = bucket.getReplicationConfig();
+    Assert.assertEquals(
+        new StandaloneReplicationConfig(HddsProtos.ReplicationFactor.ONE),
+        currentReplicationConfig);
+    ECReplicationConfig ecReplicationConfig =
+        new ECReplicationConfig(3, 2, ECReplicationConfig.EcCodec.RS, 1024);
+    bucket.setReplicationConfig(ecReplicationConfig);
+
+    // Get the bucket and check the updated config.
+    bucket = volume.getBucket(bucket.getName());
+
+    Assert.assertEquals(ecReplicationConfig, bucket.getReplicationConfig());
+
+    RatisReplicationConfig ratisReplicationConfig =
+        new RatisReplicationConfig(HddsProtos.ReplicationFactor.THREE);
+    bucket.setReplicationConfig(ratisReplicationConfig);
+
+    // Get the bucket and check the updated config.
+    bucket = volume.getBucket(bucket.getName());
+
+    Assert.assertEquals(ratisReplicationConfig, bucket.getReplicationConfig());
+
+    //Reset replication config back.
+    bucket.setReplicationConfig(currentReplicationConfig);
+  }
+
+  private OzoneBucket getBucket(OzoneVolume volume) throws IOException {
+    String bucketName = UUID.randomUUID().toString();
+    BucketArgs.Builder builder = BucketArgs.newBuilder();
+    builder.setVersioning(true).setDefaultReplicationConfig(
+        new DefaultReplicationConfig(
+            new 
StandaloneReplicationConfig(HddsProtos.ReplicationFactor.ONE)));
+    volume.createBucket(bucketName, builder.build());
+    return volume.getBucket(bucketName);
+  }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
index 44c3756..8660ed9 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.OMAction;
@@ -182,6 +183,13 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
             dbBucketInfo.getQuotaInNamespace());
       }
 
+      DefaultReplicationConfig defaultReplicationConfig =
+          omBucketArgs.getDefaultReplicationConfig();
+      if (defaultReplicationConfig != null) {
+        // Resetting the default replication config.
+        
bucketInfoBuilder.setDefaultReplicationConfig(defaultReplicationConfig);
+      }
+
       bucketInfoBuilder.setCreationTime(dbBucketInfo.getCreationTime());
       bucketInfoBuilder.setModificationTime(
           setBucketPropertyRequest.getModificationTime());

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

Reply via email to