This is an automated email from the ASF dual-hosted git repository.
adoroszlai 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 4317f21bc85 HDDS-16603. Remove redundant infoBucket RPC call in S3
tagging APIs (#11339)
4317f21bc85 is described below
commit 4317f21bc8512b73b8c5801592dcd4c7ea67018e
Author: Andy Huang <[email protected]>
AuthorDate: Wed Sep 30 17:45:04 2026 +0800
HDDS-16603. Remove redundant infoBucket RPC call in S3 tagging APIs (#11339)
---
.../ozone/s3/endpoint/ObjectTaggingHandler.java | 7 +++---
.../ozone/s3/endpoint/EndpointTestUtils.java | 20 ++++++++++++++++
.../ozone/s3/endpoint/TestObjectTaggingDelete.java | 27 ++++++++++++++++++----
.../ozone/s3/endpoint/TestObjectTaggingGet.java | 20 ++++++++++++++++
.../ozone/s3/endpoint/TestObjectTaggingPut.java | 27 ++++++++++++++++++----
.../ozone/s3/endpoint/TestPermissionCheck.java | 7 +++---
6 files changed, 91 insertions(+), 17 deletions(-)
diff --git
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectTaggingHandler.java
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectTaggingHandler.java
index 3c5e756ed5b..c2afc0135a9 100644
---
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectTaggingHandler.java
+++
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectTaggingHandler.java
@@ -62,7 +62,7 @@ Response handlePutRequest(ObjectRequestContext context,
String keyName, InputStr
S3Tagging.Tag::getValue
);
- context.getBucket().putObjectTagging(keyName, tags);
+ getClientProtocol().putObjectTagging(context.getVolume().getName(),
context.getBucketName(), keyName, tags);
getMetrics().updatePutObjectTaggingSuccessStats(context.getStartNanos());
@@ -80,7 +80,7 @@ Response handleDeleteRequest(ObjectRequestContext context,
String keyName)
return null;
}
try {
- context.getBucket().deleteObjectTagging(keyName);
+ getClientProtocol().deleteObjectTagging(context.getVolume().getName(),
context.getBucketName(), keyName);
getMetrics().updateDeleteObjectTaggingSuccessStats(context.getStartNanos());
return Response.noContent().build();
} catch (OMException ex) {
@@ -105,7 +105,8 @@ Response handleGetRequest(ObjectRequestContext context,
String keyName)
return null;
}
try {
- Map<String, String> tagMap =
context.getBucket().getObjectTagging(keyName);
+ Map<String, String> tagMap = getClientProtocol().getObjectTagging(
+ context.getVolume().getName(), context.getBucketName(), keyName);
getMetrics().updateGetObjectTaggingSuccessStats(context.getStartNanos());
return Response.ok(S3Tagging.fromMap(tagMap),
MediaType.APPLICATION_XML_TYPE).build();
} catch (Exception e) {
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
index c1210ceb8b0..d9d529b800b 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
@@ -21,6 +21,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.ByteArrayInputStream;
@@ -31,6 +32,11 @@
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.client.ObjectStore;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.client.OzoneClient;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
import org.apache.hadoop.ozone.s3.exception.OS3Exception;
import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
import org.apache.hadoop.ozone.s3.util.S3Consts;
@@ -41,6 +47,20 @@
/** Utilities for unit-testing S3 endpoints. */
public final class EndpointTestUtils {
+ /** Create an object endpoint backed by the supplied protocol and volume
mocks. */
+ static ObjectEndpoint createObjectEndpoint(ClientProtocol protocol,
OzoneVolume volume, String bucketName)
+ throws IOException {
+ OzoneClient mockClient = mock(OzoneClient.class);
+ ObjectStore objectStore = mock(ObjectStore.class);
+ when(mockClient.getObjectStore()).thenReturn(objectStore);
+ when(mockClient.getProxy()).thenReturn(protocol);
+ when(objectStore.getClientProxy()).thenReturn(protocol);
+ when(objectStore.getS3Volume()).thenReturn(volume);
+ when(volume.getName()).thenReturn("s3Volume");
+ when(volume.getBucket(bucketName)).thenReturn(mock(OzoneBucket.class));
+ return
EndpointBuilder.newObjectEndpointBuilder().setClient(mockClient).build();
+ }
+
/** Get key content. */
public static Response get(
ObjectEndpoint subject,
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingDelete.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingDelete.java
index d60752dfedd..792e193da44 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingDelete.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingDelete.java
@@ -19,6 +19,7 @@
import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
+import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.createObjectEndpoint;
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.deleteTagging;
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
import static
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NOT_IMPLEMENTED;
@@ -28,15 +29,17 @@
import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import org.apache.hadoop.ozone.client.ObjectStore;
-import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientStub;
import org.apache.hadoop.ozone.client.OzoneVolume;
@@ -78,6 +81,19 @@ public void init() throws OS3Exception, IOException {
put(rest, BUCKET_NAME, KEY_WITH_TAG, CONTENT);
}
+ @Test
+ public void testDeleteTaggingWithoutBucketLookup() throws Exception {
+ OzoneVolume volume = mock(OzoneVolume.class);
+ ClientProtocol protocol = mock(ClientProtocol.class);
+ ObjectEndpoint endpoint = createObjectEndpoint(protocol, volume,
BUCKET_NAME);
+
+ deleteTagging(endpoint, BUCKET_NAME, KEY_WITH_TAG);
+
+ verify(volume, never()).getBucket(anyString());
+ verify(protocol, never()).getBucketDetails(anyString(), anyString());
+ verify(protocol).deleteObjectTagging("s3Volume", BUCKET_NAME,
KEY_WITH_TAG);
+ }
+
@Test
public void testDeleteTagging() throws IOException, OS3Exception {
Response response = deleteTagging(rest, BUCKET_NAME, KEY_WITH_TAG);
@@ -102,18 +118,19 @@ public void testDeleteObjectTaggingNotImplemented()
throws Exception {
OzoneClient mockClient = mock(OzoneClient.class);
ObjectStore mockObjectStore = mock(ObjectStore.class);
OzoneVolume mockVolume = mock(OzoneVolume.class);
- OzoneBucket mockBucket = mock(OzoneBucket.class);
+ ClientProtocol protocol = mock(ClientProtocol.class);
when(mockClient.getObjectStore()).thenReturn(mockObjectStore);
when(mockObjectStore.getS3Volume()).thenReturn(mockVolume);
-
when(mockObjectStore.getClientProxy()).thenReturn(mock(ClientProtocol.class));
- when(mockVolume.getBucket("fsoBucket")).thenReturn(mockBucket);
+ when(mockObjectStore.getClientProxy()).thenReturn(protocol);
+ when(mockClient.getProxy()).thenReturn(protocol);
+ when(mockVolume.getName()).thenReturn("s3Volume");
ObjectEndpoint endpoint = EndpointBuilder.newObjectEndpointBuilder()
.setClient(mockClient)
.build();
doThrow(new OMException("DeleteObjectTagging is not currently supported
for FSO directory",
-
ResultCodes.NOT_SUPPORTED_OPERATION)).when(mockBucket).deleteObjectTagging("dir/");
+
ResultCodes.NOT_SUPPORTED_OPERATION)).when(protocol).deleteObjectTagging("s3Volume",
"fsoBucket", "dir/");
assertErrorResponse(NOT_IMPLEMENTED, () -> deleteTagging(endpoint,
"fsoBucket", "dir/"));
}
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingGet.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingGet.java
index 1f0f0d7b471..e9c4be57206 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingGet.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingGet.java
@@ -20,6 +20,7 @@
import static java.net.HttpURLConnection.HTTP_OK;
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.createObjectEndpoint;
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.getTagging;
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_BUCKET;
@@ -29,6 +30,10 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.util.List;
@@ -36,6 +41,8 @@
import javax.ws.rs.core.Response;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientStub;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
import org.apache.hadoop.ozone.s3.endpoint.S3Tagging.Tag;
import org.apache.hadoop.ozone.s3.exception.OS3Exception;
import org.junit.jupiter.api.BeforeEach;
@@ -69,6 +76,19 @@ public void init() throws Exception {
.build();
}
+ @Test
+ public void testGetTaggingWithoutBucketLookup() throws Exception {
+ OzoneVolume volume = mock(OzoneVolume.class);
+ ClientProtocol protocol = mock(ClientProtocol.class);
+ ObjectEndpoint endpoint = createObjectEndpoint(protocol, volume,
BUCKET_NAME);
+
+ getTagging(endpoint, BUCKET_NAME, KEY_WITH_TAG);
+
+ verify(volume, never()).getBucket(anyString());
+ verify(protocol, never()).getBucketDetails(anyString(), anyString());
+ verify(protocol).getObjectTagging("s3Volume", BUCKET_NAME, KEY_WITH_TAG);
+ }
+
@Test
public void testGetTagging() throws IOException, OS3Exception {
Mockito.when(headers.getHeaderString(TAG_HEADER)).thenReturn("tag1=value1&tag2=value2");
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingPut.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingPut.java
index 75ddd97bd24..b09e9bee1d4 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingPut.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectTaggingPut.java
@@ -19,6 +19,7 @@
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.createObjectEndpoint;
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.putTagging;
import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.MALFORMED_XML;
@@ -27,15 +28,17 @@
import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_KEY;
import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import javax.ws.rs.core.HttpHeaders;
import org.apache.hadoop.ozone.client.ObjectStore;
-import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientStub;
import org.apache.hadoop.ozone.client.OzoneKeyDetails;
@@ -76,6 +79,19 @@ void setup() throws Exception {
assertSucceeds(() -> put(objectEndpoint, BUCKET_NAME, KEY_NAME, ""));
}
+ @Test
+ public void testPutTaggingWithoutBucketLookup() throws Exception {
+ OzoneVolume volume = mock(OzoneVolume.class);
+ ClientProtocol protocol = mock(ClientProtocol.class);
+ ObjectEndpoint endpoint = createObjectEndpoint(protocol, volume,
BUCKET_NAME);
+
+ putTagging(endpoint, BUCKET_NAME, KEY_NAME, twoTags());
+
+ verify(volume, never()).getBucket(anyString());
+ verify(protocol, never()).getBucketDetails(anyString(), anyString());
+ verify(protocol).putObjectTagging("s3Volume", BUCKET_NAME, KEY_NAME, TAGS);
+ }
+
@Test
public void testPutObjectTaggingWithEmptyBody() {
assertErrorResponse(MALFORMED_XML, () -> putTagging(objectEndpoint,
BUCKET_NAME, KEY_NAME, ""));
@@ -115,19 +131,20 @@ public void testPutObjectTaggingNotImplemented() throws
Exception {
OzoneClient mockClient = mock(OzoneClient.class);
ObjectStore mockObjectStore = mock(ObjectStore.class);
OzoneVolume mockVolume = mock(OzoneVolume.class);
- OzoneBucket mockBucket = mock(OzoneBucket.class);
+ ClientProtocol protocol = mock(ClientProtocol.class);
when(mockClient.getObjectStore()).thenReturn(mockObjectStore);
when(mockObjectStore.getS3Volume()).thenReturn(mockVolume);
-
when(mockObjectStore.getClientProxy()).thenReturn(mock(ClientProtocol.class));
- when(mockVolume.getBucket("fsoBucket")).thenReturn(mockBucket);
+ when(mockObjectStore.getClientProxy()).thenReturn(protocol);
+ when(mockClient.getProxy()).thenReturn(protocol);
+ when(mockVolume.getName()).thenReturn("s3Volume");
ObjectEndpoint endpoint = EndpointBuilder.newObjectEndpointBuilder()
.setClient(mockClient)
.build();
doThrow(new OMException("PutObjectTagging is not currently supported for
FSO directory",
-
ResultCodes.NOT_SUPPORTED_OPERATION)).when(mockBucket).putObjectTagging("dir/",
TAGS);
+
ResultCodes.NOT_SUPPORTED_OPERATION)).when(protocol).putObjectTagging("s3Volume",
"fsoBucket", "dir/", TAGS);
assertErrorResponse(NOT_IMPLEMENTED, () -> putTagging(endpoint,
"fsoBucket", "dir/", twoTags()));
}
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
index 291e93bb9eb..6fff7466d5d 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
@@ -330,10 +330,9 @@ public void testMultiUploadKey() throws IOException {
public void testObjectTagging() throws Exception {
when(objectStore.getVolume(anyString())).thenReturn(volume);
when(objectStore.getS3Volume()).thenReturn(volume);
- when(volume.getBucket("bucketName")).thenReturn(bucket);
- when(bucket.getObjectTagging(anyString())).thenThrow(exception);
- doThrow(exception).when(bucket).putObjectTagging(anyString(), anyMap());
- doThrow(exception).when(bucket).deleteObjectTagging(anyString());
+ when(clientProtocol.getObjectTagging(anyString(), anyString(),
anyString())).thenThrow(exception);
+ doThrow(exception).when(clientProtocol).putObjectTagging(anyString(),
anyString(), anyString(), anyMap());
+ doThrow(exception).when(clientProtocol).deleteObjectTagging(anyString(),
anyString(), anyString());
ObjectEndpoint objectEndpoint = EndpointBuilder.newObjectEndpointBuilder()
.setClient(client)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]