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

peterxcli 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 aa76a5dc936 HDDS-15184. Atomic Create-If-Absent Should Use 0 for 
Generation Match (#10201)
aa76a5dc936 is described below

commit aa76a5dc93623e770a5b8722ec472853024da420
Author: Peter Lee <[email protected]>
AuthorDate: Wed May 6 23:16:10 2026 +0800

    HDDS-15184. Atomic Create-If-Absent Should Use 0 for Generation Match 
(#10201)
---
 .../common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java | 2 +-
 hadoop-hdds/docs/content/design/s3-conditional-requests.md        | 2 +-
 .../main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java   | 4 ++--
 .../org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java   | 8 ++++----
 .../apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java    | 4 ++--
 .../apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java    | 2 +-
 .../java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java | 2 +-
 .../hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java       | 4 ++--
 .../hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java       | 6 +++---
 .../java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java  | 2 +-
 .../test/java/org/apache/hadoop/ozone/client/OzoneBucketStub.java | 6 +++---
 11 files changed, 21 insertions(+), 21 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 151022823a1..bce241f0ded 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
@@ -319,7 +319,7 @@ public final class OzoneConsts {
   public static final String USER_PREFIX = "userPrefix";
   public static final String REWRITE_GENERATION = "rewriteGeneration";
   /** Sentinel generation used to request atomic create-if-not-exists(put if 
absent) semantics. */
-  public static final long EXPECTED_GEN_CREATE_IF_NOT_EXISTS = -1L;
+  public static final long EXPECTED_GEN_CREATE_IF_ABSENT = 0L;
   public static final String FROM_SNAPSHOT = "fromSnapshot";
   public static final String TO_SNAPSHOT = "toSnapshot";
   public static final String TOKEN = "token";
diff --git a/hadoop-hdds/docs/content/design/s3-conditional-requests.md 
b/hadoop-hdds/docs/content/design/s3-conditional-requests.md
index 6e2d1d0eca0..df827ad4d02 100644
--- a/hadoop-hdds/docs/content/design/s3-conditional-requests.md
+++ b/hadoop-hdds/docs/content/design/s3-conditional-requests.md
@@ -253,7 +253,7 @@ sequenceDiagram
 
     User->>GW: PUT object with If-None-Match:* or If-Match:etag
     alt If-None-Match: *
-        GW->>OM: createKey(expectedDataGeneration = -1)
+        GW->>OM: createKey(expectedDataGeneration = 0)
         OM->>OM: Reject if key already exists
         OM-->>GW: Open key or KEY_ALREADY_EXISTS
         opt Open key created
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 6fe64a26376..0b058362a30 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
@@ -1439,7 +1439,7 @@ public OzoneOutputStream createKeyIfNotExists(String 
volumeName,
     OmKeyArgs.Builder builder = createWriteKeyArgsBuilder(volumeName,
         bucketName, keyName, size, replicationConfig, metadata, tags);
     builder.setExpectedDataGeneration(
-        OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS);
+        OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT);
     return openOutputStream(builder.build(), size);
   }
 
@@ -1550,7 +1550,7 @@ public OzoneDataStreamOutput 
createStreamKeyIfNotExists(String volumeName,
         volumeName, bucketName, keyName, size, replicationConfig, metadata,
         tags);
     builder.setExpectedDataGeneration(
-        OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS);
+        OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT);
     return openDataStreamOutput(builder.build());
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
index d9e04e5eed3..494ec2473cd 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
@@ -36,7 +36,7 @@
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SNAPSHOT_DELETING_SERVICE_INTERVAL;
 import static org.apache.hadoop.ozone.OzoneConsts.DEFAULT_OM_UPDATE_ID;
 import static org.apache.hadoop.ozone.OzoneConsts.ETAG;
-import static 
org.apache.hadoop.ozone.OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS;
+import static 
org.apache.hadoop.ozone.OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT;
 import static org.apache.hadoop.ozone.OzoneConsts.GB;
 import static org.apache.hadoop.ozone.OzoneConsts.MD5_HASH;
 import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER;
@@ -1450,7 +1450,7 @@ void rewriteRejectsNonPositiveGeneration(BucketLayout 
layout)
         () -> {
         bucket.rewriteKey("key2",
             1024,
-            EXPECTED_GEN_CREATE_IF_NOT_EXISTS,
+            EXPECTED_GEN_CREATE_IF_ABSENT,
             
RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.ONE),
             singletonMap("key", "value"));
         });
@@ -3957,7 +3957,7 @@ public void 
testConditionalCompleteMultipartUploadIfNoneMatch() throws Exception
     // Complete with If-None-Match semantics (key doesn't exist, should 
succeed)
     OmMultipartUploadCompleteInfo result = bucket.completeMultipartUpload(
         keyName, uploadID, partsMap,
-        EXPECTED_GEN_CREATE_IF_NOT_EXISTS, null);
+        EXPECTED_GEN_CREATE_IF_ABSENT, null);
 
     assertNotNull(result);
     assertEquals(keyName, result.getKey());
@@ -3993,7 +3993,7 @@ public void 
testConditionalCompleteMultipartUploadIfNoneMatchFail() throws Excep
     // Complete with If-None-Match semantics (key exists, should fail)
     OMException omEx = assertThrows(OMException.class,
         () -> bucket.completeMultipartUpload(keyName, uploadID, partsMap,
-            EXPECTED_GEN_CREATE_IF_NOT_EXISTS, null));
+            EXPECTED_GEN_CREATE_IF_ABSENT, null));
 
     assertEquals(KEY_ALREADY_EXISTS, omEx.getResult());
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
index 752397efc7d..4e1d3603d73 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
@@ -95,7 +95,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws 
IOException {
 
     if (keyArgs.hasExpectedDataGeneration()) {
       if (keyArgs.getExpectedDataGeneration()
-          == OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS) {
+          == OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT) {
         ozoneManager.checkFeatureEnabled(
             OzoneManagerVersion.ATOMIC_CREATE_IF_NOT_EXISTS);
       } else {
@@ -625,7 +625,7 @@ protected void validateAtomicRewrite(OmKeyInfo existing, 
OmKeyInfo toCommit, Map
       Long expectedGen = toCommit.getExpectedDataGeneration();
       auditMap.put(OzoneConsts.REWRITE_GENERATION, 
String.valueOf(expectedGen));
 
-      if (expectedGen == OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS) {
+      if (expectedGen == OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT) {
         if (existing != null) {
           throw new OMException("Atomic create-if-not-exists conflicted with 
an existing key",
               OMException.ResultCodes.ATOMIC_WRITE_CONFLICT);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
index b82541791b7..d7b14455369 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
@@ -97,7 +97,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws 
IOException {
 
     if (keyArgs.hasExpectedDataGeneration()) {
       if (keyArgs.getExpectedDataGeneration()
-          == OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS) {
+          == OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT) {
         ozoneManager.checkFeatureEnabled(
             OzoneManagerVersion.ATOMIC_CREATE_IF_NOT_EXISTS);
       } else {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
index 5bab4de3a4f..7967007263e 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
@@ -1324,7 +1324,7 @@ protected void validateAtomicRewrite(OmKeyInfo dbKeyInfo, 
KeyArgs keyArgs)
     if (keyArgs.hasExpectedDataGeneration()) {
       long expectedGen = keyArgs.getExpectedDataGeneration();
       // If expectedGen is EXPECTED_GEN_CREATE_IF_NOT_EXISTS, it means the key 
MUST NOT exist (If-None-Match)
-      if (expectedGen == OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS) {
+      if (expectedGen == OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT) {
         if (dbKeyInfo != null) {
           throw new OMException("Key already exists",
               OMException.ResultCodes.KEY_ALREADY_EXISTS);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
index 41b81471ff9..61852561ac9 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
@@ -300,7 +300,7 @@ public void testAtomicCreateIfNotExistsCommitKeyAbsent() 
throws Exception {
     OmKeyInfo.Builder omKeyInfoBuilder = OMRequestTestUtils.createOmKeyInfo(
         volumeName, bucketName, keyName, replicationConfig,
         new OmKeyLocationInfoGroup(version, new ArrayList<>()));
-    
omKeyInfoBuilder.setExpectedDataGeneration(OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS);
+    
omKeyInfoBuilder.setExpectedDataGeneration(OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT);
 
     String openKey = addKeyToOpenKeyTable(allocatedLocationList, 
omKeyInfoBuilder);
     assertNotNull(openKeyTable.get(openKey));
@@ -335,7 +335,7 @@ public void 
testAtomicCreateIfNotExistsCommitKeyAlreadyExists() throws Exception
     OmKeyInfo.Builder omKeyInfoBuilder = OMRequestTestUtils.createOmKeyInfo(
         volumeName, bucketName, keyName, replicationConfig,
         new OmKeyLocationInfoGroup(version, new ArrayList<>()));
-    
omKeyInfoBuilder.setExpectedDataGeneration(OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS);
+    
omKeyInfoBuilder.setExpectedDataGeneration(OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT);
 
     String openKey = addKeyToOpenKeyTable(allocatedLocationList, 
omKeyInfoBuilder);
     assertNotNull(openKeyTable.get(openKey));
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
index ff5691a5612..aec1c720a05 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
@@ -156,7 +156,7 @@ public void 
testCreateKeyExpectedGenCreateIfNotExistsKeyMissing(
 
     OMRequest modifiedOmRequest = doPreExecute(createKeyRequest(
         false, 0, 100L, replicationConfig,
-        OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS));
+        OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT));
     OMKeyCreateRequest omKeyCreateRequest = 
getOMKeyCreateRequest(modifiedOmRequest);
 
     addVolumeAndBucketToDB(volumeName, bucketName, omMetadataManager, 
getBucketLayout());
@@ -170,7 +170,7 @@ public void 
testCreateKeyExpectedGenCreateIfNotExistsKeyMissing(
     OmKeyInfo openKeyInfo = 
omMetadataManager.getOpenKeyTable(getBucketLayout())
         .get(getOpenKey(id));
     assertNotNull(openKeyInfo);
-    assertEquals(OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS,
+    assertEquals(OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT,
         openKeyInfo.getExpectedDataGeneration());
   }
 
@@ -183,7 +183,7 @@ public void 
testCreateKeyExpectedGenCreateIfNotExistsKeyAlreadyExists(
 
     OMRequest modifiedOmRequest = doPreExecute(createKeyRequest(
         false, 0, 100L, replicationConfig,
-        OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS));
+        OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT));
     OMKeyCreateRequest omKeyCreateRequest = 
getOMKeyCreateRequest(modifiedOmRequest);
 
     addVolumeAndBucketToDB(volumeName, bucketName, omMetadataManager, 
getBucketLayout());
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
index b74a7d52186..5e301950465 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
@@ -744,7 +744,7 @@ public Response completeMultipartUpload(
       Long expectedDataGeneration = null;
       String expectedETag = null;
       if (writeConditions.hasIfNoneMatch()) {
-        expectedDataGeneration = OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS;
+        expectedDataGeneration = OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT;
       } else if (writeConditions.hasIfMatch()) {
         expectedETag = writeConditions.getExpectedETag();
       }
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/OzoneBucketStub.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/OzoneBucketStub.java
index f9b86f1cd67..8a8864c398b 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/OzoneBucketStub.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/OzoneBucketStub.java
@@ -18,7 +18,7 @@
 package org.apache.hadoop.ozone.client;
 
 import static org.apache.hadoop.ozone.OzoneConsts.ETAG;
-import static 
org.apache.hadoop.ozone.OzoneConsts.EXPECTED_GEN_CREATE_IF_NOT_EXISTS;
+import static 
org.apache.hadoop.ozone.OzoneConsts.EXPECTED_GEN_CREATE_IF_ABSENT;
 import static org.apache.hadoop.ozone.OzoneConsts.MD5_HASH;
 import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER;
 
@@ -587,9 +587,9 @@ public OmMultipartUploadCompleteInfo 
completeMultipartUpload(String key,
   public OmMultipartUploadCompleteInfo completeMultipartUpload(String key,
       String uploadID, Map<Integer, String> partsMap,
       Long expectedDataGeneration, String expectedETag) throws IOException {
-    // Handle If-None-Match: * (expectedDataGeneration == -1 means 
create-if-absent)
+    // Handle If-None-Match: * (expectedDataGeneration == 0 means 
create-if-absent)
     if (expectedDataGeneration != null &&
-        expectedDataGeneration == EXPECTED_GEN_CREATE_IF_NOT_EXISTS) {
+        expectedDataGeneration == EXPECTED_GEN_CREATE_IF_ABSENT) {
       if (keyContents.containsKey(key)) {
         throw new OMException("Key already exists", 
ResultCodes.KEY_ALREADY_EXISTS);
       }


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

Reply via email to