From 106c1583ac9ba974d5df05288c696d21a8eda9f7 Mon Sep 17 00:00:00 2001 From: Gargi Jaiswal Date: Thu, 16 Jul 2026 17:59:14 +0530 Subject: [PATCH] Return x-amz-meta-* user-defined object metadata on S3 GetObject --- .../ozone/s3/endpoint/ObjectEndpoint.java | 1 + .../hadoop/ozone/s3/endpoint/TestObjectGet.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) 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 f943042a0b71..7352f72fd938 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 @@ -487,6 +487,7 @@ Response handleGetRequest(ObjectRequestContext context, String keyPath) addLastModifiedDate(responseBuilder, keyDetails); addTagCountIfAny(responseBuilder, keyDetails); + addCustomMetadataHeaders(responseBuilder, keyDetails); long metadataLatencyNs = getMetrics().updateGetKeyMetadataStats(startNanos); perf.appendMetaLatencyNanos(metadataLatencyNs); diff --git a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java index 54d28c08b8b3..2ad7d682dd36 100644 --- a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java +++ b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java @@ -24,6 +24,7 @@ import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put; import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_KEY; import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.PRECOND_FAILED; +import static org.apache.hadoop.ozone.s3.util.S3Consts.CUSTOM_METADATA_HEADER_PREFIX; import static org.apache.hadoop.ozone.s3.util.S3Consts.IF_MATCH_HEADER; import static org.apache.hadoop.ozone.s3.util.S3Consts.IF_MODIFIED_SINCE_HEADER; import static org.apache.hadoop.ozone.s3.util.S3Consts.IF_NONE_MATCH_HEADER; @@ -44,6 +45,7 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import org.apache.hadoop.hdds.conf.OzoneConfiguration; @@ -196,6 +198,21 @@ public void testGetIgnoresIfModifiedSinceWhenIfNoneMatchPresent() assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); } + @Test + public void getKeyWithCustomMetadata() throws IOException, OS3Exception { + final String keyName = "key-with-meta"; + final String metaValue = "mymeta"; + MultivaluedMap requestHeaders = new MultivaluedHashMap<>(); + requestHeaders.putSingle(CUSTOM_METADATA_HEADER_PREFIX + "meta1", metaValue); + when(headers.getRequestHeaders()).thenReturn(requestHeaders); + + assertSucceeds(() -> put(rest, BUCKET_NAME, keyName, CONTENT)); + + Response response = get(rest, BUCKET_NAME, keyName); + assertEquals(metaValue, + response.getHeaderString(CUSTOM_METADATA_HEADER_PREFIX + "meta1")); + } + @Test public void getKeyWithTag() throws IOException, OS3Exception { //WHEN