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]
