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

ckj pushed a commit to branch ozone-1.3
in repository https://gitbox.apache.org/repos/asf/ozone.git

commit fd173eeb2aeba4b3b63efa807674c63f33cbfb5c
Author: Sumit Agrawal <[email protected]>
AuthorDate: Thu Nov 24 11:47:26 2022 +0530

    HDDS-7481. Set quota with reduced size than actual used do not fail (#3978)
---
 .../request/bucket/OMBucketSetPropertyRequest.java | 23 ++++++--
 .../bucket/TestOMBucketSetPropertyRequest.java     | 67 ++++++++++++++++++++++
 2 files changed, 86 insertions(+), 4 deletions(-)

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 daa9fc3f6c..6dd4e43a3e 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
@@ -182,12 +182,13 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
       String volumeKey = omMetadataManager.getVolumeKey(volumeName);
       OmVolumeArgs omVolumeArgs = omMetadataManager.getVolumeTable()
           .get(volumeKey);
-      if (checkQuotaBytesValid(omMetadataManager, omVolumeArgs, omBucketArgs)) 
{
+      if (checkQuotaBytesValid(omMetadataManager, omVolumeArgs, omBucketArgs,
+          dbBucketInfo)) {
         bucketInfoBuilder.setQuotaInBytes(omBucketArgs.getQuotaInBytes());
       } else {
         bucketInfoBuilder.setQuotaInBytes(dbBucketInfo.getQuotaInBytes());
       }
-      if (checkQuotaNamespaceValid(omVolumeArgs, omBucketArgs)) {
+      if (checkQuotaNamespaceValid(omVolumeArgs, omBucketArgs, dbBucketInfo)) {
         bucketInfoBuilder.setQuotaInNamespace(
             omBucketArgs.getQuotaInNamespace());
       } else {
@@ -264,7 +265,8 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
   }
 
   public boolean checkQuotaBytesValid(OMMetadataManager metadataManager,
-                     OmVolumeArgs omVolumeArgs, OmBucketArgs omBucketArgs)
+                     OmVolumeArgs omVolumeArgs, OmBucketArgs omBucketArgs,
+                     OmBucketInfo dbBucketInfo)
       throws IOException {
     if (!omBucketArgs.hasQuotaInBytes()) {
       // Quota related values are not in the request, so we don't need to check
@@ -289,6 +291,11 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
 
     if (quotaInBytes > OzoneConsts.QUOTA_RESET) {
       totalBucketQuota = quotaInBytes;
+      if (quotaInBytes < dbBucketInfo.getUsedBytes()) {
+        throw new OMException("Cannot update bucket quota. Requested " +
+            "spaceQuota less than used spaceQuota.",
+            OMException.ResultCodes.QUOTA_ERROR);
+      }
     }
     List<OmBucketInfo> bucketList = metadataManager.listBuckets(
         omVolumeArgs.getVolume(), null, null, Integer.MAX_VALUE);
@@ -311,7 +318,8 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
   }
 
   public boolean checkQuotaNamespaceValid(OmVolumeArgs omVolumeArgs,
-      OmBucketArgs omBucketArgs) {
+      OmBucketArgs omBucketArgs, OmBucketInfo dbBucketInfo)
+      throws IOException {
     if (!omBucketArgs.hasQuotaInNamespace()) {
       // Quota related values are not in the request, so we don't need to check
       // them as they have not changed.
@@ -322,6 +330,13 @@ public class OMBucketSetPropertyRequest extends 
OMClientRequest {
     if (quotaInNamespace < OzoneConsts.QUOTA_RESET || quotaInNamespace == 0) {
       return false;
     }
+    
+    if (quotaInNamespace != OzoneConsts.QUOTA_RESET
+        && quotaInNamespace < dbBucketInfo.getUsedNamespace()) {
+      throw new OMException("Cannot update bucket quota. NamespaceQuota " +
+          "requested is less than used namespaceQuota.",
+          OMException.ResultCodes.QUOTA_ERROR);
+    }
     return true;
   }
 
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 77efd3562e..0ff25d5f31 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
@@ -23,6 +23,8 @@ import java.util.UUID;
 
 import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
 import org.apache.hadoop.hdds.client.ECReplicationConfig;
+import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
+import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.om.helpers.OmBucketArgs;
 import org.slf4j.LoggerFactory;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -284,4 +286,69 @@ public class TestOMBucketSetPropertyRequest extends 
TestBucketRequest {
     Assert.assertEquals(EC,
         dbBucketInfo.getDefaultReplicationConfig().getType());
   }
+
+  @Test
+  public void testValidateAndUpdateCacheWithQuotaSpaceUsed() throws Exception {
+    String volumeName = UUID.randomUUID().toString();
+    String bucketName = UUID.randomUUID().toString();
+
+    OMRequestTestUtils.addVolumeToDB(
+        volumeName, omMetadataManager, 10 * GB);
+    OMRequestTestUtils.addBucketToDB(
+        volumeName, bucketName, omMetadataManager, 8 * GB);
+    String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName);
+    CacheValue<OmBucketInfo> cacheValue = omMetadataManager.getBucketTable()
+        .getCacheValue(new CacheKey<>(bucketKey));
+    cacheValue.getCacheValue().incrUsedBytes(5 * GB);
+    cacheValue.getCacheValue().incrUsedNamespace(10);
+    OMRequest omRequest = createSetBucketPropertyRequest(volumeName,
+        bucketName, true, 1 * GB);
+
+    OMBucketSetPropertyRequest omBucketSetPropertyRequest =
+        new OMBucketSetPropertyRequest(omRequest);
+
+    OMClientResponse omClientResponse = omBucketSetPropertyRequest
+        .validateAndUpdateCache(ozoneManager, 1,
+            ozoneManagerDoubleBufferHelper);
+
+    Assert.assertFalse(omClientResponse.getOMResponse().getSuccess());
+    Assert.assertEquals(omClientResponse.getOMResponse().getStatus(),
+        OzoneManagerProtocolProtos.Status.QUOTA_ERROR);
+    Assert.assertTrue(omClientResponse.getOMResponse().getMessage().
+        contains("Cannot update bucket quota. Requested spaceQuota less than " 
+
+            "used spaceQuota"));
+  }
+
+  @Test
+  public void testValidateAndUpdateCacheWithQuotaNamespaceUsed()
+      throws Exception {
+    String volumeName = UUID.randomUUID().toString();
+    String bucketName = UUID.randomUUID().toString();
+
+    OMRequestTestUtils.addVolumeToDB(
+        volumeName, omMetadataManager, 10 * GB);
+    OMRequestTestUtils.addBucketToDB(
+        volumeName, bucketName, omMetadataManager, 8 * GB);
+    String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName);
+    CacheValue<OmBucketInfo> cacheValue = omMetadataManager.getBucketTable()
+        .getCacheValue(new CacheKey<>(bucketKey));
+    cacheValue.getCacheValue().incrUsedBytes(5 * GB);
+    cacheValue.getCacheValue().incrUsedNamespace(2000);
+    OMRequest omRequest = createSetBucketPropertyRequest(volumeName,
+        bucketName, true, 9 * GB);
+
+    OMBucketSetPropertyRequest omBucketSetPropertyRequest =
+        new OMBucketSetPropertyRequest(omRequest);
+
+    OMClientResponse omClientResponse = omBucketSetPropertyRequest
+        .validateAndUpdateCache(ozoneManager, 1,
+            ozoneManagerDoubleBufferHelper);
+
+    Assert.assertFalse(omClientResponse.getOMResponse().getSuccess());
+    Assert.assertEquals(omClientResponse.getOMResponse().getStatus(),
+        OzoneManagerProtocolProtos.Status.QUOTA_ERROR);
+    Assert.assertTrue(omClientResponse.getOMResponse().getMessage().
+        contains("Cannot update bucket quota. NamespaceQuota requested " +
+            "is less than used namespaceQuota"));
+  }
 }


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

Reply via email to