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 8d110cb893dc..0390b922edd0 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 @@ -38,6 +38,7 @@ /** * A class that encapsulates the OmVolumeArgs Args. */ +// not yet @Immutable, needs HDDS-13941 public final class OmVolumeArgs extends WithObjectID implements CopyObject, Auditable { private static final Codec CODEC = new DelegatedCodec<>( @@ -47,13 +48,13 @@ public final class OmVolumeArgs extends WithObjectID OmVolumeArgs.class); private final String adminName; - private String ownerName; + private final String ownerName; private final String volume; - private long creationTime; - private long modificationTime; - private long quotaInBytes; - private long quotaInNamespace; - private long usedNamespace; + private final long creationTime; + private final long modificationTime; + private final long quotaInBytes; + private final long quotaInNamespace; + private final long usedNamespace; private final CopyOnWriteArrayList acls; /** * Reference count on this Ozone volume. @@ -67,7 +68,7 @@ public final class OmVolumeArgs extends WithObjectID * Volumes created using CLI, ObjectStore API or upgraded from older OM DB * will have reference count set to zero by default. */ - private long refCount; + private final long refCount; private OmVolumeArgs(Builder b) { super(b); @@ -92,42 +93,6 @@ public long getRefCount() { return refCount; } - /** - * Increase refCount by 1. - */ - public void incRefCount() { - this.refCount++; - } - - /** - * Decrease refCount by 1. - */ - public void decRefCount() { - Preconditions.checkState(this.refCount > 0L, - "refCount should not become negative"); - this.refCount--; - } - - public void setOwnerName(String newOwner) { - this.ownerName = newOwner; - } - - public void setQuotaInBytes(long quotaInBytes) { - this.quotaInBytes = quotaInBytes; - } - - public void setQuotaInNamespace(long quotaInNamespace) { - this.quotaInNamespace = quotaInNamespace; - } - - public void setCreationTime(long time) { - this.creationTime = time; - } - - public void setModificationTime(long time) { - this.modificationTime = time; - } - public boolean addAcl(OzoneAcl ozoneAcl) { return OzoneAclUtil.addAcl(acls, ozoneAcl); } @@ -210,13 +175,6 @@ public List getDefaultAcls() { return defaultAcls; } - /** - * increase used bucket namespace by n. - */ - public void incrUsedNamespace(long n) { - usedNamespace += n; - } - /** * Returns used bucket namespace. * @return usedNamespace @@ -368,6 +326,14 @@ public Builder setUsedNamespace(long namespaceUsage) { return this; } + /** + * increase used bucket namespace by n. + */ + public Builder incrUsedNamespace(long n) { + this.usedNamespace += n; + return this; + } + @Override public Builder addMetadata(String key, String value) { super.addMetadata(key, value); @@ -386,18 +352,33 @@ public Builder addOzoneAcls(OzoneAcl acl) { } public Builder setRefCount(long refCount) { - Preconditions.checkState(refCount >= 0L, - "refCount should not be negative"); this.refCount = refCount; return this; } + /** + * Increase refCount by 1. + */ + public Builder incRefCount() { + refCount++; + return this; + } + + /** + * Decrease refCount by 1. + */ + public Builder decRefCount() { + refCount--; + return this; + } + @Override protected void validate() { super.validate(); Preconditions.checkNotNull(adminName); Preconditions.checkNotNull(ownerName); Preconditions.checkNotNull(volume); + Preconditions.checkState(refCount >= 0L, "refCount should not be negative, but was: " + refCount); } @Override @@ -461,19 +442,6 @@ public String getObjectInfo() { @Override public OmVolumeArgs copyObject() { - return new Builder(acls) - .setAdminName(adminName) - .setOwnerName(ownerName) - .setVolume(volume) - .setQuotaInBytes(quotaInBytes) - .setQuotaInNamespace(quotaInNamespace) - .setUsedNamespace(usedNamespace) - .addAllMetadata(getMetadata()) - .setCreationTime(creationTime) - .setModificationTime(modificationTime) - .setObjectID(getObjectID()) - .setUpdateID(getUpdateID()) - .setRefCount(refCount) - .build(); + return toBuilder().build(); } } 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 f375b18312ec..f790d65f084e 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 @@ -264,7 +264,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut checkQuotaInNamespace(omVolumeArgs, 1L); // update used namespace for volume - omVolumeArgs.incrUsedNamespace(1L); + omVolumeArgs = omVolumeArgs.toBuilder() + .incrUsedNamespace(1L) + .build(); // Update table cache. metadataManager.getVolumeTable().addCacheEntry(new CacheKey<>(volumeKey), 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 4d802f9078e1..3c5f028bb5d9 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 @@ -179,7 +179,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut throw new OMException("Volume " + volumeName + " is not found", OMException.ResultCodes.VOLUME_NOT_FOUND); } - omVolumeArgs.incrUsedNamespace(-1L); + omVolumeArgs = omVolumeArgs.toBuilder() + .incrUsedNamespace(-1L) + .build(); // Update table cache. omMetadataManager.getVolumeTable().addCacheEntry( new CacheKey<>(volumeKey), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java index a4aec2550aae..40352adb9d98 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java @@ -275,15 +275,14 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut PersistedUserVolumeInfo volumeList = null; if (!skipVolumeCreation) { // Create volume. TODO: dedup OMVolumeCreateRequest - omVolumeArgs = OmVolumeArgs.getFromProtobuf(volumeInfo); - omVolumeArgs.setQuotaInBytes(OzoneConsts.QUOTA_RESET); - omVolumeArgs.setQuotaInNamespace(OzoneConsts.QUOTA_RESET); - omVolumeArgs = omVolumeArgs.toBuilder() + omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo) + .setQuotaInBytes(OzoneConsts.QUOTA_RESET) + .setQuotaInNamespace(OzoneConsts.QUOTA_RESET) .setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex)) .setUpdateID(transactionLogIndex) + .incRefCount() .build(); - omVolumeArgs.incRefCount(); // Remove this check when vol ref count is also used by other features Preconditions.checkState(omVolumeArgs.getRefCount() == 1L, "refCount should have been set to 1"); @@ -298,15 +297,17 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut } else { LOG.info("Skipped volume '{}' creation. " + "Will only increment volume refCount", volumeName); - omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName); + omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName) + .toBuilder() + .incRefCount() + .build(); - omVolumeArgs.incRefCount(); // Remove this check when vol ref count is also used by other features Preconditions.checkState(omVolumeArgs.getRefCount() == 1L, "refCount should have been set to 1"); omMetadataManager.getVolumeTable().addCacheEntry( - new CacheKey<>(omMetadataManager.getVolumeKey(volumeName)), + new CacheKey<>(dbVolumeKey), CacheValue.get(transactionLogIndex, omVolumeArgs)); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java index bcb7e010bf8e..5e344718c98b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java @@ -174,9 +174,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut volumeName, null, null); } - omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName); - // Decrement volume ref count - omVolumeArgs.decRefCount(); + omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName) + .toBuilder() + .decRefCount() + .build(); // Update omVolumeArgs final String dbVolumeKey = omMetadataManager.getVolumeKey(volumeName); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java index 819edf6c01f5..2c8b85aec4ff 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java @@ -163,19 +163,21 @@ private Map updateOldVolumeQuotaSupport( VOLUME_LOCK, omVolumeArgs.getVolume())); boolean acquiredVolumeLock = getOmLockDetails().isLockAcquired(); try { + OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder(); boolean isQuotaReset = false; if (omVolumeArgs.getQuotaInBytes() == OLD_QUOTA_DEFAULT) { - omVolumeArgs.setQuotaInBytes(QUOTA_RESET); + builder.setQuotaInBytes(QUOTA_RESET); isQuotaReset = true; } if (omVolumeArgs.getQuotaInNamespace() == OLD_QUOTA_DEFAULT) { - omVolumeArgs.setQuotaInNamespace(QUOTA_RESET); + builder.setQuotaInNamespace(QUOTA_RESET); isQuotaReset = true; } if (isQuotaReset) { + OmVolumeArgs updated = builder.build(); metadataManager.getVolumeTable().addCacheEntry( - new CacheKey<>(entry.getKey()), CacheValue.get(transactionLogIndex, omVolumeArgs)); - volUpdateMap.put(entry.getKey(), omVolumeArgs); + new CacheKey<>(entry.getKey()), CacheValue.get(transactionLogIndex, updated)); + volUpdateMap.put(entry.getKey(), updated); } } finally { if (acquiredVolumeLock) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java index 46c60658350f..c52fcba0857d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java @@ -129,14 +129,13 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut boolean acquiredUserLock = false; Exception exception = null; OMClientResponse omClientResponse = null; - OmVolumeArgs omVolumeArgs = null; + final OmVolumeArgs omVolumeArgs; Map auditMap = null; try { - omVolumeArgs = OmVolumeArgs.getFromProtobuf(volumeInfo); // when you create a volume, we set both Object ID and update ID. // The Object ID will never change, but update // ID will be set to transactionID each time we update the object. - omVolumeArgs = omVolumeArgs.toBuilder() + omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo) .setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex)) .setUpdateID(transactionLogIndex) .build(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java index 011120c4cadd..70a27bfcaab2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java @@ -151,15 +151,12 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut maxUserVolumeCount, transactionLogIndex); // Set owner with new owner name. - omVolumeArgs.setOwnerName(newOwner); omVolumeArgs = omVolumeArgs.toBuilder() + .setOwnerName(newOwner) + .setModificationTime(setVolumePropertyRequest.getModificationTime()) .setUpdateID(transactionLogIndex) .build(); - // Update modificationTime. - omVolumeArgs.setModificationTime( - setVolumePropertyRequest.getModificationTime()); - // Update cache. omMetadataManager.getUserTable().addCacheEntry( new CacheKey<>(omMetadataManager.getUserKey(newOwner)), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java index 25c40fd54b54..5e4f93da14f8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java @@ -120,27 +120,22 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut VOLUME_LOCK, volume)); acquireVolumeLock = getOmLockDetails().isLockAcquired(); - OmVolumeArgs omVolumeArgs = getVolumeInfo(omMetadataManager, volume); + OmVolumeArgs.Builder builder = getVolumeInfo(omMetadataManager, volume).toBuilder(); if (checkQuotaBytesValid(omMetadataManager, setVolumePropertyRequest.getQuotaInBytes(), volume)) { - omVolumeArgs.setQuotaInBytes( + builder.setQuotaInBytes( setVolumePropertyRequest.getQuotaInBytes()); - } else { - omVolumeArgs.setQuotaInBytes(omVolumeArgs.getQuotaInBytes()); } if (checkQuotaNamespaceValid(omMetadataManager, setVolumePropertyRequest.getQuotaInNamespace(), volume)) { - omVolumeArgs.setQuotaInNamespace( + builder.setQuotaInNamespace( setVolumePropertyRequest.getQuotaInNamespace()); - } else { - omVolumeArgs.setQuotaInNamespace(omVolumeArgs.getQuotaInNamespace()); } - omVolumeArgs = omVolumeArgs.toBuilder() + OmVolumeArgs omVolumeArgs = builder + .setModificationTime(setVolumePropertyRequest.getModificationTime()) .setUpdateID(transactionLogIndex) .build(); - omVolumeArgs.setModificationTime( - setVolumePropertyRequest.getModificationTime()); // update cache. omMetadataManager.getVolumeTable().addCacheEntry( diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java index e257f3003137..7eb070bbcf50 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java @@ -94,21 +94,17 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut // Update only when if (applyAcl) { + OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder(); // Update the modification time when updating ACLs of Volume. - long modificationTime = omVolumeArgs.getModificationTime(); if (getOmRequest().getAddAclRequest().hasObj()) { - modificationTime = getOmRequest().getAddAclRequest() - .getModificationTime(); + builder.setModificationTime(getOmRequest().getAddAclRequest().getModificationTime()); } else if (getOmRequest().getSetAclRequest().hasObj()) { - modificationTime = getOmRequest().getSetAclRequest() - .getModificationTime(); + builder.setModificationTime(getOmRequest().getSetAclRequest().getModificationTime()); } else if (getOmRequest().getRemoveAclRequest().hasObj()) { - modificationTime = getOmRequest().getRemoveAclRequest() - .getModificationTime(); + builder.setModificationTime(getOmRequest().getRemoveAclRequest().getModificationTime()); } - omVolumeArgs.setModificationTime(modificationTime); - omVolumeArgs = omVolumeArgs.toBuilder() + omVolumeArgs = builder .setUpdateID(trxnLogIndex) .build();