You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by ca...@apache.org on 2020/12/14 04:35:21 UTC
[ozone] branch master updated: HDDS-4272. Volume namespace: add
usedNamespace and update it when create and delete bucket (#1445)
This is an automated email from the ASF dual-hosted git repository.
captainzmc 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 1f5a965 HDDS-4272. Volume namespace: add usedNamespace and update it when create and delete bucket (#1445)
1f5a965 is described below
commit 1f5a965d7d295cd4182e71a61d7dc619c9a22200
Author: Rui Wang <am...@users.noreply.github.com>
AuthorDate: Sun Dec 13 20:35:06 2020 -0800
HDDS-4272. Volume namespace: add usedNamespace and update it when create and delete bucket (#1445)
* HDDS-4272. Volume namespace: add usedNamesapce and update it when create and delete bucket
* fixup! comments addressed.
* fjxup! address comments
* trigger new CI check
* fixup! fix UT
* fixup! fix CI
---
.../java/org/apache/hadoop/ozone/OzoneConsts.java | 1 +
.../apache/hadoop/ozone/client/OzoneVolume.java | 23 +++++++++--
.../apache/hadoop/ozone/client/rpc/RpcClient.java | 4 ++
.../hadoop/ozone/om/helpers/OmVolumeArgs.java | 45 ++++++++++++++++++----
.../client/rpc/TestOzoneRpcClientAbstract.java | 45 ++++++++++++++++++++++
.../src/main/proto/OmClientProtocol.proto | 2 +-
.../om/request/bucket/OMBucketCreateRequest.java | 29 +++++++++++++-
.../om/request/bucket/OMBucketDeleteRequest.java | 17 +++++++-
.../om/response/bucket/OMBucketCreateResponse.java | 17 ++++++++
.../om/response/bucket/OMBucketDeleteResponse.java | 18 +++++++++
.../ozone/om/request/TestOMRequestUtils.java | 4 +-
11 files changed, 190 insertions(+), 15 deletions(-)
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
index 07e2815..bf35043 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
@@ -270,6 +270,7 @@ public final class OzoneConsts {
public static final String SRC_KEY = "srcKey";
public static final String DST_KEY = "dstKey";
public static final String USED_BYTES = "usedBytes";
+ public static final String USED_NAMESPACE = "usedNamespace";
public static final String QUOTA_IN_BYTES = "quotaInBytes";
public static final String QUOTA_IN_COUNTS = "quotaInCounts";
public static final String OBJECT_ID = "objectID";
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
index b54692a..e2ca82f 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java
@@ -71,6 +71,10 @@ public class OzoneVolume extends WithMetadata {
*/
private long quotaInCounts;
/**
+ * Bucket namespace quota usage.
+ */
+ private long usedNamespace;
+ /**
* Creation time of the volume.
*/
private Instant creationTime;
@@ -126,11 +130,13 @@ public class OzoneVolume extends WithMetadata {
@SuppressWarnings("parameternumber")
public OzoneVolume(ConfigurationSource conf, ClientProtocol proxy,
String name, String admin, String owner, long quotaInBytes,
- long quotaInCounts, long creationTime, long modificationTime,
- List<OzoneAcl> acls, Map<String, String> metadata) {
+ long quotaInCounts, long usedNamespace, long creationTime,
+ long modificationTime, List<OzoneAcl> acls,
+ Map<String, String> metadata) {
this(conf, proxy, name, admin, owner, quotaInBytes, quotaInCounts,
creationTime, acls, metadata);
this.modificationTime = Instant.ofEpochMilli(modificationTime);
+ this.usedNamespace = usedNamespace;
}
@SuppressWarnings("parameternumber")
@@ -149,11 +155,12 @@ public class OzoneVolume extends WithMetadata {
@SuppressWarnings("parameternumber")
public OzoneVolume(ConfigurationSource conf, ClientProtocol proxy,
String name, String admin, String owner, long quotaInBytes,
- long quotaInCounts, long creationTime, long modificationTime,
- List<OzoneAcl> acls) {
+ long quotaInCounts, long usedNamespace, long creationTime,
+ long modificationTime, List<OzoneAcl> acls) {
this(conf, proxy, name, admin, owner, quotaInBytes, quotaInCounts,
creationTime, acls);
this.modificationTime = Instant.ofEpochMilli(modificationTime);
+ this.usedNamespace = usedNamespace;
}
@VisibleForTesting
@@ -257,6 +264,14 @@ public class OzoneVolume extends WithMetadata {
}
/**
+ * Returns used bucket namespace.
+ * @return usedNamespace
+ */
+ public long getUsedNamespace() {
+ return usedNamespace;
+ }
+
+ /**
* Sets/Changes the owner of this Volume.
* @param userName new owner
* @throws IOException
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 532a3f3..dcb1626 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
@@ -260,6 +260,7 @@ public class RpcClient implements ClientProtocol {
builder.setOwnerName(owner);
builder.setQuotaInBytes(quotaInBytes);
builder.setQuotaInCounts(quotaInCounts);
+ builder.setUsedNamespace(0L);
builder.addAllMetadata(volArgs.getMetadata());
//Remove duplicates and add ACLs
@@ -308,6 +309,7 @@ public class RpcClient implements ClientProtocol {
volume.getOwnerName(),
volume.getQuotaInBytes(),
volume.getQuotaInCounts(),
+ volume.getUsedNamespace(),
volume.getCreationTime(),
volume.getModificationTime(),
volume.getAclMap().ozoneAclGetProtobuf().stream().
@@ -342,6 +344,7 @@ public class RpcClient implements ClientProtocol {
volume.getOwnerName(),
volume.getQuotaInBytes(),
volume.getQuotaInCounts(),
+ volume.getUsedNamespace(),
volume.getCreationTime(),
volume.getModificationTime(),
volume.getAclMap().ozoneAclGetProtobuf().stream().
@@ -364,6 +367,7 @@ public class RpcClient implements ClientProtocol {
volume.getOwnerName(),
volume.getQuotaInBytes(),
volume.getQuotaInCounts(),
+ volume.getUsedNamespace(),
volume.getCreationTime(),
volume.getModificationTime(),
volume.getAclMap().ozoneAclGetProtobuf().stream().
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
index 13c67c8..4027d43 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
@@ -45,6 +45,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
private long modificationTime;
private long quotaInBytes;
private long quotaInCounts;
+ private long usedNamespace;
private final OmOzoneAclMap aclMap;
/**
@@ -54,6 +55,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
* @param volume - volume name
* @param quotaInBytes - Volume Quota in bytes.
* @param quotaInCounts - Volume Quota in counts.
+ * @param usedNamespace - Volume Namespace Quota Usage in counts.
* @param metadata - metadata map for custom key/value data.
* @param aclMap - User to access rights map.
* @param creationTime - Volume creation time.
@@ -64,14 +66,15 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
@SuppressWarnings({"checkstyle:ParameterNumber", "This is invoked from a " +
"builder."})
private OmVolumeArgs(String adminName, String ownerName, String volume,
- long quotaInBytes, long quotaInCounts, Map<String, String> metadata,
- OmOzoneAclMap aclMap, long creationTime, long modificationTime,
- long objectID, long updateID) {
+ long quotaInBytes, long quotaInCounts, long usedNamespace,
+ Map<String, String> metadata, OmOzoneAclMap aclMap, long creationTime,
+ long modificationTime, long objectID, long updateID) {
this.adminName = adminName;
this.ownerName = ownerName;
this.volume = volume;
this.quotaInBytes = quotaInBytes;
this.quotaInCounts = quotaInCounts;
+ this.usedNamespace = usedNamespace;
this.metadata = metadata;
this.aclMap = aclMap;
this.creationTime = creationTime;
@@ -174,6 +177,21 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
}
/**
+ * increase used bucket namespace by n.
+ */
+ public void incrUsedNamespace(long n) {
+ usedNamespace += n;
+ }
+
+ /**
+ * Returns used bucket namespace.
+ * @return usedNamespace
+ */
+ public long getUsedNamespace() {
+ return usedNamespace;
+ }
+
+ /**
* Returns new builder class that builds a OmVolumeArgs.
*
* @return Builder
@@ -194,6 +212,8 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
auditMap.put(OzoneConsts.QUOTA_IN_BYTES, String.valueOf(this.quotaInBytes));
auditMap.put(OzoneConsts.QUOTA_IN_COUNTS,
String.valueOf(this.quotaInCounts));
+ auditMap.put(OzoneConsts.USED_NAMESPACE,
+ String.valueOf(this.usedNamespace));
auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.getObjectID()));
auditMap.put(OzoneConsts.UPDATE_ID, String.valueOf(this.getUpdateID()));
return auditMap;
@@ -227,6 +247,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
private long modificationTime;
private long quotaInBytes;
private long quotaInCounts;
+ private long usedNamespace;
private Map<String, String> metadata;
private OmOzoneAclMap aclMap;
private long objectID;
@@ -259,6 +280,8 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
public Builder() {
metadata = new HashMap<>();
aclMap = new OmOzoneAclMap();
+ quotaInBytes = OzoneConsts.QUOTA_RESET;
+ quotaInCounts = OzoneConsts.QUOTA_RESET;
}
public Builder setAdminName(String admin) {
@@ -296,6 +319,11 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
return this;
}
+ public Builder setUsedNamespace(long namespaceUsage) {
+ this.usedNamespace = namespaceUsage;
+ return this;
+ }
+
public Builder addMetadata(String key, String value) {
metadata.put(key, value); // overwrite if present.
return this;
@@ -322,8 +350,8 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
Preconditions.checkNotNull(ownerName);
Preconditions.checkNotNull(volume);
return new OmVolumeArgs(adminName, ownerName, volume, quotaInBytes,
- quotaInCounts, metadata, aclMap, creationTime, modificationTime,
- objectID, updateID);
+ quotaInCounts, usedNamespace, metadata, aclMap, creationTime,
+ modificationTime, objectID, updateID);
}
}
@@ -336,6 +364,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
.setVolume(volume)
.setQuotaInBytes(quotaInBytes)
.setQuotaInCounts(quotaInCounts)
+ .setUsedNamespace(usedNamespace)
.addAllMetadata(KeyValueUtil.toProtobuf(metadata))
.addAllVolumeAcls(aclList)
.setCreationTime(
@@ -356,6 +385,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
volInfo.getVolume(),
volInfo.getQuotaInBytes(),
volInfo.getQuotaInCounts(),
+ volInfo.getUsedNamespace(),
KeyValueUtil.getFromProtobuf(volInfo.getMetadataList()),
aclMap,
volInfo.getCreationTime(),
@@ -372,6 +402,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
", owner='" + ownerName + '\'' +
", creationTime='" + creationTime + '\'' +
", quotaInBytes='" + quotaInBytes + '\'' +
+ ", usedNamespace='" + usedNamespace + '\'' +
'}';
}
@@ -387,7 +418,7 @@ public final class OmVolumeArgs extends WithObjectID implements Auditable {
OmOzoneAclMap cloneAclMap = aclMap.copyObject();
return new OmVolumeArgs(adminName, ownerName, volume, quotaInBytes,
- quotaInCounts, cloneMetadata, cloneAclMap, creationTime,
- modificationTime, objectID, updateID);
+ quotaInCounts, usedNamespace, cloneMetadata, cloneAclMap,
+ creationTime, modificationTime, objectID, updateID);
}
}
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 88222f1..f5b3d29 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
@@ -885,6 +885,51 @@ public abstract class TestOzoneRpcClientAbstract {
Assert.assertEquals(3, countException);
}
+ @Test
+ public void testVolumeUsedNamespace() throws IOException {
+ String volumeName = UUID.randomUUID().toString();
+ String bucketName = UUID.randomUUID().toString();
+ String bucketName2 = UUID.randomUUID().toString();
+ OzoneVolume volume = null;
+
+ // set Volume namespace quota as 1
+ store.createVolume(volumeName,
+ VolumeArgs.newBuilder().setQuotaInCounts(1L).build());
+ volume = store.getVolume(volumeName);
+ // The initial value should be 0
+ Assert.assertEquals(0L, volume.getUsedNamespace());
+ volume.createBucket(bucketName);
+ // Used namespace should be 1
+ volume = store.getVolume(volumeName);
+ Assert.assertEquals(1L, volume.getUsedNamespace());
+
+ try {
+ volume.createBucket(bucketName2);
+ } catch (IOException ex) {
+ GenericTestUtils.assertExceptionContains("QUOTA_EXCEEDED", ex);
+ }
+
+ // test linked bucket
+ String targetVolName = UUID.randomUUID().toString();
+ store.createVolume(targetVolName);
+ OzoneVolume volumeWithLinkedBucket = store.getVolume(targetVolName);
+ String targetBucketName = UUID.randomUUID().toString();
+ BucketArgs.Builder argsBuilder = new BucketArgs.Builder()
+ .setStorageType(StorageType.DEFAULT)
+ .setVersioning(false)
+ .setSourceVolume(volumeName)
+ .setSourceBucket(bucketName);
+ volumeWithLinkedBucket.createBucket(targetBucketName, argsBuilder.build());
+ // Used namespace should be 0 because linked bucket does not consume
+ // namespace quota
+ Assert.assertEquals(0L, volumeWithLinkedBucket.getUsedNamespace());
+
+ volume.deleteBucket(bucketName);
+ // Used namespace should be 0
+ volume = store.getVolume(volumeName);
+ Assert.assertEquals(0L, volume.getUsedNamespace());
+ }
+
private void writeKey(OzoneBucket bucket, String keyName,
ReplicationFactor replication, String value, int valueLength)
throws IOException{
diff --git a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 613838f..993453c 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -364,7 +364,7 @@ message VolumeInfo {
optional uint64 updateID = 9;
optional uint64 modificationTime = 10;
optional uint64 quotaInCounts = 11;
-
+ optional uint64 usedNamespace = 12;
}
/**
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
index 678d04e..e4a20df 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
@@ -205,14 +205,22 @@ public class OMBucketCreateRequest extends OMClientRequest {
// Add default acls from volume.
addDefaultAcls(omBucketInfo, omVolumeArgs);
+ // check namespace quota
+ checkQuotaInNamespace(omVolumeArgs, 1L);
+
+ // update used namespace for volume
+ omVolumeArgs.incrUsedNamespace(1L);
+
// Update table cache.
+ metadataManager.getVolumeTable().addCacheEntry(new CacheKey<>(volumeKey),
+ new CacheValue<>(Optional.of(omVolumeArgs), transactionLogIndex));
metadataManager.getBucketTable().addCacheEntry(new CacheKey<>(bucketKey),
new CacheValue<>(Optional.of(omBucketInfo), transactionLogIndex));
omResponse.setCreateBucketResponse(
CreateBucketResponse.newBuilder().build());
omClientResponse = new OMBucketCreateResponse(omResponse.build(),
- omBucketInfo);
+ omBucketInfo, omVolumeArgs.copyObject());
} catch (IOException ex) {
exception = ex;
omClientResponse = new OMBucketCreateResponse(
@@ -301,6 +309,25 @@ public class OMBucketCreateRequest extends OMClientRequest {
return bekb.build();
}
+ /**
+ * Check namespace quota.
+ */
+ private void checkQuotaInNamespace(OmVolumeArgs omVolumeArgs,
+ long allocatedNamespace) throws IOException {
+ if (omVolumeArgs.getQuotaInCounts() != OzoneConsts.QUOTA_RESET) {
+ long usedNamespace = omVolumeArgs.getUsedNamespace();
+ long quotaInNamespace = omVolumeArgs.getQuotaInCounts();
+ long toUseNamespaceInTotal = usedNamespace + allocatedNamespace;
+ if (quotaInNamespace < toUseNamespaceInTotal) {
+ throw new OMException("The namespace quota of Volume:"
+ + omVolumeArgs.getVolume() + " exceeded: quotaInNamespace: "
+ + quotaInNamespace + " but namespace consumed: "
+ + toUseNamespaceInTotal + ".",
+ OMException.ResultCodes.QUOTA_EXCEEDED);
+ }
+ }
+ }
+
public boolean checkQuotaBytesValid(OMMetadataManager metadataManager,
OmVolumeArgs omVolumeArgs, OmBucketInfo omBucketInfo, String volumeKey)
throws IOException {
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
index 91aef6a..7b165b2 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.util.Map;
import com.google.common.base.Optional;
+import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.slf4j.Logger;
@@ -134,9 +135,23 @@ public class OMBucketDeleteRequest extends OMClientRequest {
omResponse.setDeleteBucketResponse(
DeleteBucketResponse.newBuilder().build());
+ // update used namespace for volume
+ String volumeKey = omMetadataManager.getVolumeKey(volumeName);
+ OmVolumeArgs omVolumeArgs =
+ omMetadataManager.getVolumeTable().getReadCopy(volumeKey);
+ if (omVolumeArgs == null) {
+ throw new OMException("Volume " + volumeName + " is not found",
+ OMException.ResultCodes.VOLUME_NOT_FOUND);
+ }
+ omVolumeArgs.incrUsedNamespace(-1L);
+ // Update table cache.
+ omMetadataManager.getVolumeTable().addCacheEntry(
+ new CacheKey<>(volumeKey),
+ new CacheValue<>(Optional.of(omVolumeArgs), transactionLogIndex));
+
// Add to double buffer.
omClientResponse = new OMBucketDeleteResponse(omResponse.build(),
- volumeName, bucketName);
+ volumeName, bucketName, omVolumeArgs.copyObject());
} catch (IOException ex) {
success = false;
exception = ex;
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java
index cb1f322..ca74a6f 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
@@ -40,11 +41,20 @@ import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
public final class OMBucketCreateResponse extends OMClientResponse {
private final OmBucketInfo omBucketInfo;
+ private final OmVolumeArgs omVolumeArgs;
+
+ public OMBucketCreateResponse(@Nonnull OMResponse omResponse,
+ @Nonnull OmBucketInfo omBucketInfo, @Nonnull OmVolumeArgs omVolumeArgs) {
+ super(omResponse);
+ this.omBucketInfo = omBucketInfo;
+ this.omVolumeArgs = omVolumeArgs;
+ }
public OMBucketCreateResponse(@Nonnull OMResponse omResponse,
@Nonnull OmBucketInfo omBucketInfo) {
super(omResponse);
this.omBucketInfo = omBucketInfo;
+ this.omVolumeArgs = null;
}
/**
@@ -55,6 +65,7 @@ public final class OMBucketCreateResponse extends OMClientResponse {
super(omResponse);
checkStatusNotOK();
omBucketInfo = null;
+ omVolumeArgs = null;
}
@Override
@@ -66,6 +77,12 @@ public final class OMBucketCreateResponse extends OMClientResponse {
omBucketInfo.getBucketName());
omMetadataManager.getBucketTable().putWithBatch(batchOperation,
dbBucketKey, omBucketInfo);
+ // update volume usedNamespace
+ if (omVolumeArgs != null) {
+ omMetadataManager.getVolumeTable().putWithBatch(batchOperation,
+ omMetadataManager.getVolumeKey(omVolumeArgs.getVolume()),
+ omVolumeArgs);
+ }
}
@Nullable
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
index c3c7fef..00247aa 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
@@ -21,6 +21,7 @@ package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
@@ -39,12 +40,22 @@ public final class OMBucketDeleteResponse extends OMClientResponse {
private String volumeName;
private String bucketName;
+ private final OmVolumeArgs omVolumeArgs;
+
+ public OMBucketDeleteResponse(@Nonnull OMResponse omResponse,
+ String volumeName, String bucketName, OmVolumeArgs volumeArgs) {
+ super(omResponse);
+ this.volumeName = volumeName;
+ this.bucketName = bucketName;
+ this.omVolumeArgs = volumeArgs;
+ }
public OMBucketDeleteResponse(@Nonnull OMResponse omResponse,
String volumeName, String bucketName) {
super(omResponse);
this.volumeName = volumeName;
this.bucketName = bucketName;
+ this.omVolumeArgs = null;
}
/**
@@ -54,6 +65,7 @@ public final class OMBucketDeleteResponse extends OMClientResponse {
public OMBucketDeleteResponse(@Nonnull OMResponse omResponse) {
super(omResponse);
checkStatusNotOK();
+ this.omVolumeArgs = null;
}
@Override
@@ -64,6 +76,12 @@ public final class OMBucketDeleteResponse extends OMClientResponse {
omMetadataManager.getBucketKey(volumeName, bucketName);
omMetadataManager.getBucketTable().deleteWithBatch(batchOperation,
dbBucketKey);
+ // update volume usedNamespace
+ if (omVolumeArgs != null) {
+ omMetadataManager.getVolumeTable().putWithBatch(batchOperation,
+ omMetadataManager.getVolumeKey(omVolumeArgs.getVolume()),
+ omVolumeArgs);
+ }
}
public String getVolumeName() {
diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMRequestUtils.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMRequestUtils.java
index ce1b2b6..70ac922 100644
--- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMRequestUtils.java
+++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMRequestUtils.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
@@ -702,7 +703,8 @@ public final class TestOMRequestUtils {
String adminName, String ownerName) {
OzoneManagerProtocolProtos.VolumeInfo volumeInfo =
OzoneManagerProtocolProtos.VolumeInfo.newBuilder().setVolume(volumeName)
- .setAdminName(adminName).setOwnerName(ownerName).build();
+ .setAdminName(adminName).setOwnerName(ownerName)
+ .setQuotaInCounts(OzoneConsts.QUOTA_RESET).build();
OzoneManagerProtocolProtos.CreateVolumeRequest createVolumeRequest =
OzoneManagerProtocolProtos.CreateVolumeRequest.newBuilder()
.setVolumeInfo(volumeInfo).build();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org