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

sammichen pushed a commit to branch HDDS-8342
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-8342 by this push:
     new 3b5cb65c82a HDDS-12784. Add bucket object ID to lifecycle 
configuration proto definition (#9255)
3b5cb65c82a is described below

commit 3b5cb65c82a1b1c1307660b01765bf876c3199c0
Author: Sammi Chen <[email protected]>
AuthorDate: Mon Nov 17 12:04:06 2025 +0800

    HDDS-12784. Add bucket object ID to lifecycle configuration proto 
definition (#9255)
---
 .../ozone/om/helpers/OmLifecycleConfiguration.java | 38 ++++++++++++++++++++--
 .../src/main/proto/OmClientProtocol.proto          |  1 +
 .../OMLifecycleConfigurationSetRequest.java        | 21 +++++++-----
 .../om/response/bucket/OMBucketDeleteResponse.java |  3 +-
 .../OMLifecycleConfigurationSetResponse.java       |  4 +++
 .../ozone/om/service/KeyLifecycleService.java      |  6 ++++
 .../TestOMLifecycleConfigurationSetRequest.java    |  5 ++-
 .../ozone/om/service/TestKeyLifecycleService.java  |  6 +++-
 .../s3/endpoint/S3LifecycleConfiguration.java      |  1 +
 9 files changed, 70 insertions(+), 15 deletions(-)

diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmLifecycleConfiguration.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmLifecycleConfiguration.java
index ad6d31d7cf1..b19a0c5e713 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmLifecycleConfiguration.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmLifecycleConfiguration.java
@@ -56,6 +56,7 @@ public static Codec<OmLifecycleConfiguration> getCodec() {
   public static final int LC_MAX_RULES = 1000;
   private final String volume;
   private final String bucket;
+  private final Long bucketObjectID;
   private final BucketLayout bucketLayout;
   private final long creationTime;
   private final List<OmLCRule> rules;
@@ -68,6 +69,7 @@ private OmLifecycleConfiguration() {
     super(builder);
     this.volume = builder.volume;
     this.bucket = builder.bucket;
+    this.bucketObjectID = builder.bucketObjectID;
     this.rules = Collections.unmodifiableList(builder.rules);
     this.creationTime = builder.creationTime;
     this.bucketLayout = builder.bucketLayout;
@@ -85,6 +87,10 @@ public String getVolume() {
     return volume;
   }
 
+  public Long getBucketObjectID() {
+    return bucketObjectID;
+  }
+
   public long getCreationTime() {
     return creationTime;
   }
@@ -142,12 +148,16 @@ private boolean hasNoDuplicateID() {
   }
 
   public Builder toBuilder() {
-    return new Builder(this)
-        .setVolume(this.volume)
+    Builder builder = new Builder(this);
+    builder.setVolume(this.volume)
         .setBucket(this.bucket)
         .setBucketLayout(bucketLayout)
         .setCreationTime(this.creationTime)
         .setRules(this.rules);
+    if (bucketObjectID != null) {
+      builder.setBucketObjectID(bucketObjectID);
+    }
+    return builder;
   }
 
   @Override
@@ -155,6 +165,7 @@ public String toString() {
     return "OmLifecycleConfiguration{" +
         "volume='" + volume + '\'' +
         ", bucket='" + bucket + '\'' +
+        ", bucketObjectID='" + bucketObjectID + '\'' +
         ", creationTime=" + creationTime +
         ", rulesCount=" + rules.size() +
         ", objectID=" + getObjectID() +
@@ -167,6 +178,9 @@ public Map<String, String> toAuditMap() {
     Map<String, String> auditMap = new LinkedHashMap<>();
     auditMap.put(OzoneConsts.VOLUME, this.volume);
     auditMap.put(OzoneConsts.BUCKET, this.bucket);
+    if (this.bucketObjectID != null) {
+      auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.bucketObjectID));
+    }
     auditMap.put(OzoneConsts.CREATION_TIME, String.valueOf(this.creationTime));
 
     return auditMap;
@@ -195,11 +209,20 @@ public LifecycleConfiguration getProtobuf() {
         .setObjectID(getObjectID())
         .setUpdateID(getUpdateID());
 
+    if (bucketObjectID != null) {
+      b.setBucketObjectID(bucketObjectID);
+    }
+
     return b.build();
   }
 
   public static OmLifecycleConfiguration getFromProtobuf(
       LifecycleConfiguration lifecycleConfiguration) throws OMException {
+    return getBuilderFromProtobuf(lifecycleConfiguration).build();
+  }
+
+  public static OmLifecycleConfiguration.Builder getBuilderFromProtobuf(
+      LifecycleConfiguration lifecycleConfiguration) throws OMException {
     List<OmLCRule> rulesList = new ArrayList<>();
     BucketLayout layout = 
BucketLayout.fromProto(lifecycleConfiguration.getBucketLayout());
     for (LifecycleRule lifecycleRule : lifecycleConfiguration.getRulesList()) {
@@ -220,8 +243,11 @@ public static OmLifecycleConfiguration getFromProtobuf(
     if (lifecycleConfiguration.hasUpdateID()) {
       builder.setUpdateID(lifecycleConfiguration.getUpdateID());
     }
+    if (lifecycleConfiguration.hasBucketObjectID()) {
+      builder.setBucketObjectID(lifecycleConfiguration.getBucketObjectID());
+    }
 
-    return builder.build();
+    return builder;
   }
 
   /**
@@ -230,6 +256,7 @@ public static OmLifecycleConfiguration getFromProtobuf(
   public static class Builder extends WithObjectID.Builder {
     private String volume = "";
     private String bucket = "";
+    private Long bucketObjectID;
     private BucketLayout bucketLayout;
     private long creationTime;
     private List<OmLCRule> rules = new ArrayList<>();
@@ -251,6 +278,11 @@ public Builder setBucket(String bucketName) {
       return this;
     }
 
+    public Builder setBucketObjectID(long bucketID) {
+      this.bucketObjectID = bucketID;
+      return this;
+    }
+
     public Builder setBucketLayout(BucketLayout layout) {
       this.bucketLayout = layout;
       return this;
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 027f03a4ad7..ba35dab8470 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -2395,6 +2395,7 @@ message LifecycleConfiguration {
   repeated LifecycleRule rules = 5;
   optional uint64 objectID = 6;
   optional uint64 updateID = 7;
+  optional uint64 bucketObjectID = 8;
 }
 
 message SetLifecycleConfigurationRequest {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/lifecycle/OMLifecycleConfigurationSetRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/lifecycle/OMLifecycleConfigurationSetRequest.java
index da395fa30c1..27f797eb1e8 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/lifecycle/OMLifecycleConfigurationSetRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/lifecycle/OMLifecycleConfigurationSetRequest.java
@@ -34,6 +34,7 @@
 import org.apache.hadoop.ozone.om.ResolvedBucket;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmLifecycleConfiguration;
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
 import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
@@ -127,29 +128,31 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
     AuditLogger auditLogger = ozoneManager.getAuditLogger();
     UserInfo userInfo = getOmRequest().getUserInfo();
 
-    String bucketKey = metadataManager.getBucketKey(volumeName, bucketName);
     IOException exception = null;
     boolean acquiredBucketLock = false;
     OMClientResponse omClientResponse = null;
     Map<String, String> auditMap = new HashMap<>();
-
     try {
-      OmLifecycleConfiguration omLifecycleConfiguration =
-          OmLifecycleConfiguration.getFromProtobuf(lifecycleConfiguration);
-      auditMap = omLifecycleConfiguration.toAuditMap();
-
       mergeOmLockDetails(metadataManager.getLock()
           .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName));
       acquiredBucketLock = getOmLockDetails().isLockAcquired();
-      omLifecycleConfiguration.valid();
 
-      if (!metadataManager.getBucketTable().isExist(bucketKey)) {
+      String bucketKey = metadataManager.getBucketKey(volumeName, bucketName);
+      OmBucketInfo bucketInfo = 
metadataManager.getBucketTable().get(bucketKey);
+      if (bucketInfo == null) {
         LOG.debug("bucket: {} in volume: {} doesn't exist", bucketName,
             volumeName);
         throw new OMException("Bucket doesn't exist", BUCKET_NOT_FOUND);
       }
-      omLifecycleConfiguration.setUpdateID(transactionLogIndex);
 
+      OmLifecycleConfiguration.Builder lcBuilder =
+          
OmLifecycleConfiguration.getBuilderFromProtobuf(lifecycleConfiguration);
+      OmLifecycleConfiguration omLifecycleConfiguration =
+          lcBuilder.setBucketObjectID(bucketInfo.getObjectID()).build();
+      omLifecycleConfiguration.valid();
+      auditMap = omLifecycleConfiguration.toAuditMap();
+
+      omLifecycleConfiguration.setUpdateID(transactionLogIndex);
       metadataManager.getLifecycleConfigurationTable().addCacheEntry(
           new CacheKey<>(bucketKey),
           CacheValue.get(transactionLogIndex, omLifecycleConfiguration));
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 b6bd1cf0373..fd7c27defee 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
@@ -18,6 +18,7 @@
 package org.apache.hadoop.ozone.om.response.bucket;
 
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.LIFECYCLE_CONFIGURATION_TABLE;
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.VOLUME_TABLE;
 
 import jakarta.annotation.Nonnull;
@@ -32,7 +33,7 @@
 /**
  * Response for DeleteBucket request.
  */
-@CleanupTableInfo(cleanupTables = {BUCKET_TABLE, VOLUME_TABLE})
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE, VOLUME_TABLE, 
LIFECYCLE_CONFIGURATION_TABLE})
 public final class OMBucketDeleteResponse extends OMClientResponse {
 
   private String volumeName;
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/lifecycle/OMLifecycleConfigurationSetResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/lifecycle/OMLifecycleConfigurationSetResponse.java
index fcfbaa761ea..bed7cf21789 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/lifecycle/OMLifecycleConfigurationSetResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/lifecycle/OMLifecycleConfigurationSetResponse.java
@@ -61,4 +61,8 @@ protected void addToDBBatch(OMMetadataManager 
omMetadataManager,
     omMetadataManager.getLifecycleConfigurationTable().putWithBatch(
         batchOperation, dbLifecycleKey, omLifecycleConfiguration);
   }
+
+  public OmLifecycleConfiguration getOmLifecycleConfiguration() {
+    return omLifecycleConfiguration;
+  }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
index 9e7112f1b31..680ba2bdbb0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
@@ -270,6 +270,12 @@ public BackgroundTaskResult call() {
             onFailure(bucketKey);
             return result;
           }
+          if (bucket.getObjectID() != policy.getBucketObjectID()) {
+            LOG.warn("Bucket object ID doesn't match. ID in bucket is {}, ID 
in LifecycleConfiguration is {}.",
+                bucket.getObjectID(), policy.getBucketObjectID());
+            onFailure(bucketKey);
+            return result;
+          }
         } catch (IOException e) {
           LOG.warn("Failed to get Bucket {}", bucketKey, e);
           onFailure(bucketKey);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/lifecycle/TestOMLifecycleConfigurationSetRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/lifecycle/TestOMLifecycleConfigurationSetRequest.java
index 75de1eee84d..3aac4a8f573 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/lifecycle/TestOMLifecycleConfigurationSetRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/lifecycle/TestOMLifecycleConfigurationSetRequest.java
@@ -35,6 +35,7 @@
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
 import org.apache.hadoop.ozone.om.response.OMClientResponse;
+import 
org.apache.hadoop.ozone.om.response.lifecycle.OMLifecycleConfigurationSetResponse;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.LifecycleConfiguration;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
@@ -108,7 +109,8 @@ public void testValidateAndUpdateCacheSuccess() throws 
Exception {
 
     OMClientResponse omClientResponse = 
request.validateAndUpdateCache(ozoneManager, txLogIndex);
     OMResponse omResponse = omClientResponse.getOMResponse();
-
+    OMLifecycleConfigurationSetResponse response = 
(OMLifecycleConfigurationSetResponse) omClientResponse;
+    assertNotNull(response.getOmLifecycleConfiguration().getBucketObjectID());
     assertNotNull(omResponse.getSetLifecycleConfigurationResponse());
     assertEquals(OzoneManagerProtocolProtos.Status.OK,
         omResponse.getStatus());
@@ -177,6 +179,7 @@ public void testValidateAndUpdateInvalidLCC() throws 
Exception {
     String ownerName = "ownerName";
 
     OMRequestTestUtils.addVolumeToDB(volumeName, ownerName, omMetadataManager);
+    OMRequestTestUtils.addBucketToDB(volumeName, bucketName, 
omMetadataManager);
 
     OMRequest originalRequest = setLifecycleConfigurationRequest(volumeName,
         bucketName, ownerName, false);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyLifecycleService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyLifecycleService.java
index cb54173266b..8d9d457ef61 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyLifecycleService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyLifecycleService.java
@@ -158,6 +158,7 @@ class TestKeyLifecycleService extends OzoneTestBase {
   private DirectoryDeletingService directoryDeletingService;
   private ScmBlockLocationTestingClient scmBlockTestingClient;
   private KeyLifecycleServiceMetrics metrics;
+  private long bucketObjectID;
 
   @BeforeAll
   void setup() {
@@ -1779,6 +1780,7 @@ private void createLifecyclePolicy(String volume, String 
bucket, BucketLayout la
         .setVolume(volume)
         .setBucket(bucket)
         .setBucketLayout(layout)
+        .setBucketObjectID(bucketObjectID)
         .setRules(Collections.singletonList(new OmLCRule.Builder()
             .setId(String.valueOf(OBJECT_ID_COUNTER.getAndIncrement()))
             .setEnabled(enabled)
@@ -1803,6 +1805,7 @@ private void createLifecyclePolicy(String volume, String 
bucket, BucketLayout la
     OmLifecycleConfiguration lcc = new OmLifecycleConfiguration.Builder()
         .setVolume(volume)
         .setBucket(bucket)
+        .setBucketObjectID(bucketObjectID)
         .setBucketLayout(layout)
         .setRules(ruleList)
         .build();
@@ -1835,12 +1838,13 @@ private void createVolumeAndBucket(String volumeName,
             .setObjectID(OBJECT_ID_COUNTER.incrementAndGet())
             .build());
 
+    bucketObjectID = OBJECT_ID_COUNTER.incrementAndGet();
     OMRequestTestUtils.addBucketToOM(keyManager.getMetadataManager(),
         OmBucketInfo.newBuilder().setVolumeName(volumeName)
             .setBucketName(bucketName)
             .setBucketLayout(bucketLayout)
             .setOwner(owner)
-            .setObjectID(OBJECT_ID_COUNTER.incrementAndGet())
+            .setObjectID(bucketObjectID)
             .build());
   }
 
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
index 8aa3e52f433..8e459281965 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
@@ -251,6 +251,7 @@ public void setAndOperator(AndOperator andOperator) {
     }
   }
 
+  // OzoneBucket doesn't have objectID info.
   public OmLifecycleConfiguration toOmLifecycleConfiguration(OzoneBucket 
ozoneBucket)
       throws OS3Exception, OMException {
     try {


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

Reply via email to