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]