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

ChenSammi 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 ed072a998f1 HDDS-15950. Fix NPE in S3 lifecycle GET for date-based 
expiration (#10850)
ed072a998f1 is described below

commit ed072a998f13816f3e421b09500b2a8f2dacd605
Author: Priyesh Karatha <[email protected]>
AuthorDate: Fri Jul 24 14:45:45 2026 +0530

    HDDS-15950. Fix NPE in S3 lifecycle GET for date-based expiration (#10850)
---
 .../s3/endpoint/S3LifecycleConfiguration.java      |  5 ++--
 .../endpoint/TestS3LifecycleConfigurationGet.java  | 32 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
index ff72a322dee..de1de9616a7 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/S3LifecycleConfiguration.java
@@ -479,7 +479,7 @@ private static Expiration convertFromOzoneExpiration(
     if (date != null && !date.isEmpty()) {
       expiration.setDate(date);
     }
-    if (ozoneExpiration.getDays() > 0) {
+    if (ozoneExpiration.getDays() != null && ozoneExpiration.getDays() > 0) {
       expiration.setDays(ozoneExpiration.getDays());
     }
 
@@ -497,7 +497,8 @@ private static AbortIncompleteMultipartUpload 
convertFromOzoneAbortIncompleteMul
 
     AbortIncompleteMultipartUpload abortIncompleteMultipartUpload = new 
AbortIncompleteMultipartUpload();
 
-    if (ozoneAbortIncompleteMultipartUpload.getDaysAfterInitiation() > 0) {
+    if (ozoneAbortIncompleteMultipartUpload.getDaysAfterInitiation() != null
+        && ozoneAbortIncompleteMultipartUpload.getDaysAfterInitiation() > 0) {
       abortIncompleteMultipartUpload.setDaysAfterInitiation(
           ozoneAbortIncompleteMultipartUpload.getDaysAfterInitiation());
     }
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestS3LifecycleConfigurationGet.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestS3LifecycleConfigurationGet.java
index 0558af9c1f8..8e4d0eb88ad 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestS3LifecycleConfigurationGet.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestS3LifecycleConfigurationGet.java
@@ -21,6 +21,7 @@
 import static java.net.HttpURLConnection.HTTP_OK;
 import static 
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_LIFECYCLE_CONFIGURATION;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.ByteArrayInputStream;
@@ -124,6 +125,24 @@ public void testGetLifecycleWithBothActions() throws 
Exception {
         .getDaysAfterInitiation().intValue());
   }
 
+  @Test
+  public void testGetLifecycleWithDateBasedExpiration() throws Exception {
+    String bucketName = "bucket1";
+    bucketEndpoint.put(bucketName, getBodyWithDateExpiration());
+    Response r = bucketEndpoint.get(bucketName);
+
+    assertEquals(HTTP_OK, r.getStatus());
+    S3LifecycleConfiguration lcc = (S3LifecycleConfiguration) r.getEntity();
+    assertEquals(1, lcc.getRules().size());
+    S3LifecycleConfiguration.Rule rule = lcc.getRules().get(0);
+
+    assertEquals("expire-on-date", rule.getId());
+    assertEquals("prefix/", rule.getPrefix());
+    assertEquals("Enabled", rule.getStatus());
+    assertEquals("2044-01-19T00:00:00+00:00", rule.getExpiration().getDate());
+    assertNull(rule.getExpiration().getDays());
+  }
+
   private static InputStream getBody() {
     String xml = ("<LifecycleConfiguration xmlns=\"http://s3.amazonaws"; +
         ".com/doc/2006-03-01/\">" +
@@ -153,6 +172,19 @@ private static InputStream getBodyWithAbortAction() {
     return new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
   }
 
+  private static InputStream getBodyWithDateExpiration() {
+    String xml = "<LifecycleConfiguration 
xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";>" +
+        "<Rule>" +
+        "<ID>expire-on-date</ID>" +
+        "<Prefix>prefix/</Prefix>" +
+        "<Status>Enabled</Status>" +
+        "<Expiration><Date>2044-01-19T00:00:00+00:00</Date></Expiration>" +
+        "</Rule>" +
+        "</LifecycleConfiguration>";
+
+    return new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
+  }
+
   private static InputStream getBodyWithBothActions() {
     String xml = "<LifecycleConfiguration 
xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\";>" +
         "<Rule>" +


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

Reply via email to