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]