diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java index a2f4d6aef5a1..b676bca54dda 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java @@ -231,7 +231,9 @@ public enum ResultCodes { PARTIAL_RENAME, - QUOTA_EXCEEDED + QUOTA_EXCEEDED, + + QUOTA_ERROR } } diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot index 0a1c855f79d1..d65b8fd6b31e 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot @@ -58,17 +58,17 @@ Test ozone shell ${result} = Execute ozone sh bucket list ${protocol}${server}/${volume}/ | jq -r '. | select(.name=="bb1") | .volumeName' Should Be Equal ${result} ${volume} Run Keyword Test key handling ${protocol} ${server} ${volume} - Execute ozone sh bucket clrquota --space-quota ${protocol}${server}/${volume}/bb1 - ${result} = Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 | jq -r '. | select(.name=="bb1") | .quotaInBytes' - Should Be Equal ${result} -1 - Execute ozone sh bucket clrquota --namespace-quota ${protocol}${server}/${volume}/bb1 - ${result} = Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 | jq -r '. | select(.name=="bb1") | .quotaInNamespace' - Should Be Equal ${result} -1 Execute ozone sh volume clrquota --space-quota ${protocol}${server}/${volume} ${result} = Execute ozone sh volume info ${protocol}${server}/${volume} | jq -r '. | select(.name=="${volume}") | .quotaInBytes' Should Be Equal ${result} -1 Execute ozone sh volume clrquota --namespace-quota ${protocol}${server}/${volume} ${result} = Execute ozone sh volume info ${protocol}${server}/${volume} | jq -r '. | select(.name=="${volume}") | .quotaInNamespace' + Should Be Equal ${result} -1 + Execute ozone sh bucket clrquota --space-quota ${protocol}${server}/${volume}/bb1 + ${result} = Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 | jq -r '. | select(.name=="bb1") | .quotaInBytes' + Should Be Equal ${result} -1 + Execute ozone sh bucket clrquota --namespace-quota ${protocol}${server}/${volume}/bb1 + ${result} = Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 | jq -r '. | select(.name=="bb1") | .quotaInNamespace' Should Be Equal ${result} -1 Execute ozone sh bucket delete ${protocol}${server}/${volume}/bb1 Execute ozone sh volume delete ${protocol}${server}/${volume} 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 eada2f7cdbed..770a6930cd2b 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 @@ -280,7 +280,7 @@ public void testVolumeSetOwner() throws IOException { } @Test - public void testSetAndClrQuota() throws IOException { + public void testSetAndClrQuota() throws Exception { String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); OzoneVolume volume = null; @@ -314,6 +314,10 @@ public void testSetAndClrQuota() throws IOException { ozoneBucket.getQuotaInBytes()); Assert.assertEquals(1000L, ozoneBucket.getQuotaInNamespace()); + LambdaTestUtils.intercept(IOException.class, "Can not clear bucket" + + " spaceQuota because volume spaceQuota is not cleared.", + () -> ozoneBucket.clearSpaceQuota()); + store.getVolume(volumeName).clearSpaceQuota(); store.getVolume(volumeName).clearNamespaceQuota(); OzoneVolume clrVolume = store.getVolume(volumeName); diff --git a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto index 694bc77af3ee..d024e9e54a91 100644 --- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto +++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto @@ -318,6 +318,8 @@ enum Status { QUOTA_EXCEEDED = 66; + QUOTA_ERROR = 67; + } /** 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 331299101f33..21416d3652ce 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 @@ -228,6 +228,13 @@ public boolean checkQuotaBytesValid(OMMetadataManager metadataManager, throws IOException { long quotaInBytes = omBucketArgs.getQuotaInBytes(); + if (quotaInBytes == OzoneConsts.QUOTA_RESET && + omVolumeArgs.getQuotaInBytes() != OzoneConsts.QUOTA_RESET) { + throw new OMException("Can not clear bucket spaceQuota because" + + " volume spaceQuota is not cleared.", + OMException.ResultCodes.QUOTA_ERROR); + } + if (quotaInBytes == 0) { return false; }