This is an automated email from the ASF dual-hosted git repository.
sodonnell 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 721b02593b HDDS-7526. Avoid overwriting replication config on existing
bucket when quota is set (#4013)
721b02593b is described below
commit 721b02593be08608b16d76dde877b7abc483f029
Author: SaketaChalamchala <[email protected]>
AuthorDate: Tue Dec 6 07:04:29 2022 -0800
HDDS-7526. Avoid overwriting replication config on existing bucket when
quota is set (#4013)
---
.../hadoop/ozone/om/helpers/OmBucketArgs.java | 7 +-
.../hadoop/ozone/om/helpers/TestOmBucketArgs.java | 30 ++++++++
.../request/bucket/OMBucketSetPropertyRequest.java | 4 +
.../bucket/TestOMBucketSetPropertyRequest.java | 88 ++++++++++++++++++++++
4 files changed, 126 insertions(+), 3 deletions(-)
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 b038f894ad..f5a4c1930c 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
@@ -343,9 +343,10 @@ public final class OmBucketArgs extends WithMetadata
implements Auditable {
bucketArgs.getOwnerName() : null);
// OmBucketArgs ctor already has more arguments, so setting the default
// replication config separately.
- omBucketArgs.setDefaultReplicationConfig(
- new
DefaultReplicationConfig(bucketArgs.getDefaultReplicationConfig()));
-
+ if (bucketArgs.hasDefaultReplicationConfig()) {
+ omBucketArgs.setDefaultReplicationConfig(new DefaultReplicationConfig(
+ bucketArgs.getDefaultReplicationConfig()));
+ }
if (bucketArgs.hasQuotaInBytes()) {
omBucketArgs.setQuotaInBytes(bucketArgs.getQuotaInBytes());
}
diff --git
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmBucketArgs.java
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmBucketArgs.java
index 2e843f84b2..251033ac27 100644
---
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmBucketArgs.java
+++
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmBucketArgs.java
@@ -18,9 +18,13 @@
package org.apache.hadoop.ozone.om.helpers;
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
+import org.apache.hadoop.hdds.client.ECReplicationConfig;
import org.junit.Assert;
import org.junit.Test;
+import static org.apache.hadoop.hdds.client.ReplicationType.EC;
+
/**
* Tests for the OmBucketArgs class.
*/
@@ -58,4 +62,30 @@ public class TestOmBucketArgs {
Assert.assertEquals(true, argsFromProto.hasQuotaInBytes());
Assert.assertEquals(true, argsFromProto.hasQuotaInNamespace());
}
+
+ @Test
+ public void testDefaultReplicationConfigIsSetCorrectly() {
+ OmBucketArgs bucketArgs = OmBucketArgs.newBuilder()
+ .setBucketName("bucket")
+ .setVolumeName("volume")
+ .build();
+
+ OmBucketArgs argsFromProto = OmBucketArgs.getFromProtobuf(
+ bucketArgs.getProtobuf());
+
+ Assert.assertEquals(null, argsFromProto.getDefaultReplicationConfig());
+
+ bucketArgs = OmBucketArgs.newBuilder()
+ .setBucketName("bucket")
+ .setVolumeName("volume")
+ .setDefaultReplicationConfig(new DefaultReplicationConfig(
+ EC, new ECReplicationConfig(3, 2)))
+ .build();
+
+ argsFromProto = OmBucketArgs.getFromProtobuf(
+ bucketArgs.getProtobuf());
+
+ Assert.assertEquals(EC,
+ argsFromProto.getDefaultReplicationConfig().getType());
+ }
}
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 f3fd3fc71e..a780f9f8ed 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
@@ -202,6 +202,10 @@ public class OMBucketSetPropertyRequest extends
OMClientRequest {
if (defaultReplicationConfig != null) {
// Resetting the default replication config.
bucketInfoBuilder.setDefaultReplicationConfig(defaultReplicationConfig);
+ } else if (dbBucketInfo.getDefaultReplicationConfig() != null) {
+ // Retaining existing default replication config
+ bucketInfoBuilder.setDefaultReplicationConfig(
+ dbBucketInfo.getDefaultReplicationConfig());
}
bucketInfoBuilder.setCreationTime(dbBucketInfo.getCreationTime());
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestOMBucketSetPropertyRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestOMBucketSetPropertyRequest.java
index 95d05c4ace..2d96aa9571 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestOMBucketSetPropertyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestOMBucketSetPropertyRequest.java
@@ -444,4 +444,92 @@ public class TestOMBucketSetPropertyRequest extends
TestBucketRequest {
contains("Cannot update bucket quota. NamespaceQuota requested " +
"is less than used namespaceQuota"));
}
+
+ @Test
+ public void testSettingQuotaRetainsReplication() throws Exception {
+ String volumeName1 = UUID.randomUUID().toString();
+ String bucketName1 = UUID.randomUUID().toString();
+ String volumeName2 = UUID.randomUUID().toString();
+ String bucketName2 = UUID.randomUUID().toString();
+
+ /* Bucket with default replication */
+ OMRequestTestUtils.addVolumeAndBucketToDB(
+ volumeName1, bucketName1, omMetadataManager);
+
+ String bucketKey = omMetadataManager
+ .getBucketKey(volumeName1, bucketName1);
+
+ OmBucketInfo dbBucketInfoBefore =
+ omMetadataManager.getBucketTable().get(bucketKey);
+
+ /* Setting quota on a bucket with default replication */
+ OMRequest omRequest = createSetBucketPropertyRequest(volumeName1,
+ bucketName1, true, 20 * GB);
+
+ OMBucketSetPropertyRequest omBucketSetPropertyRequest =
+ new OMBucketSetPropertyRequest(omRequest);
+
+ OMClientResponse omClientResponse = omBucketSetPropertyRequest
+ .validateAndUpdateCache(ozoneManager, 1,
+ ozoneManagerDoubleBufferHelper);
+
+ Assert.assertEquals(true, omClientResponse.getOMResponse().getSuccess());
+
+ OmBucketInfo dbBucketInfoAfter =
+ omMetadataManager.getBucketTable().get(bucketKey);
+
+ Assert.assertEquals(null,
+ dbBucketInfoAfter.getDefaultReplicationConfig());
+ Assert.assertEquals(
+ dbBucketInfoBefore.getDefaultReplicationConfig(),
+ dbBucketInfoAfter.getDefaultReplicationConfig());
+ Assert.assertEquals(20 * GB,
+ dbBucketInfoAfter.getQuotaInBytes());
+ Assert.assertEquals(1000L,
+ dbBucketInfoAfter.getQuotaInNamespace());
+
+ /* Bucket with EC replication */
+ OmBucketInfo.Builder bucketInfo = new OmBucketInfo.Builder()
+ .setVolumeName(volumeName2)
+ .setBucketName(bucketName2)
+ .setDefaultReplicationConfig(new DefaultReplicationConfig(
+ EC, new ECReplicationConfig(3, 2)));
+
+ OMRequestTestUtils.addVolumeToDB(volumeName2, omMetadataManager);
+ OMRequestTestUtils.addBucketToDB(omMetadataManager, bucketInfo);
+
+ bucketKey = omMetadataManager
+ .getBucketKey(volumeName2, bucketName2);
+ dbBucketInfoBefore =
+ omMetadataManager.getBucketTable().get(bucketKey);
+
+ /* Setting quota on a bucket with non-default EC replication */
+ omRequest = createSetBucketPropertyRequest(volumeName2,
+ bucketName2, true, 20 * GB);
+
+ omBucketSetPropertyRequest =
+ new OMBucketSetPropertyRequest(omRequest);
+
+ omClientResponse = omBucketSetPropertyRequest
+ .validateAndUpdateCache(ozoneManager, 1,
+ ozoneManagerDoubleBufferHelper);
+
+ Assert.assertEquals(true, omClientResponse.getOMResponse().getSuccess());
+
+ dbBucketInfoAfter =
+ omMetadataManager.getBucketTable().get(bucketKey);
+
+ Assert.assertEquals(EC,
+ dbBucketInfoAfter.getDefaultReplicationConfig().getType());
+ Assert.assertEquals(
+ dbBucketInfoBefore.getDefaultReplicationConfig().getType(),
+ dbBucketInfoAfter.getDefaultReplicationConfig().getType());
+ Assert.assertEquals(
+ dbBucketInfoBefore.getDefaultReplicationConfig().getFactor(),
+ dbBucketInfoAfter.getDefaultReplicationConfig().getFactor());
+ Assert.assertEquals(20 * GB,
+ dbBucketInfoAfter.getQuotaInBytes());
+ Assert.assertEquals(1000L,
+ dbBucketInfoAfter.getQuotaInNamespace());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]