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]

Reply via email to