From f2c511141f1602a57fb83d80bef97858d4f66058 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Tue, 5 May 2026 17:29:42 +0800 Subject: [PATCH 1/4] HDDS-15172. Add validation tests and logging cleanup for Ozone Iceberg RewriteTablePath action. --- .../iceberg/RewriteTablePathOzoneAction.java | 10 ++++- .../TestRewriteTablePathOzoneAction.java | 45 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java b/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java index 2e8b930bf265..e415422518db 100644 --- a/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java +++ b/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java @@ -50,6 +50,8 @@ import org.apache.iceberg.actions.RewriteTablePath; import org.apache.iceberg.io.CloseableIterable; import org.apache.iceberg.util.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * An implementation of {@link RewriteTablePath} for Apache Ozone backed Iceberg tables. @@ -62,6 +64,9 @@ */ public class RewriteTablePathOzoneAction implements RewriteTablePath { + private static final Logger LOG = + LoggerFactory.getLogger(RewriteTablePathOzoneAction.class); + private String sourcePrefix; private String targetPrefix; private String startVersionName; @@ -144,6 +149,9 @@ private Result doExecute() { } private void validateInputs() { + RewriteTablePathOzoneUtils.checkNonNullNonEmpty(sourcePrefix, "Source prefix"); + RewriteTablePathOzoneUtils.checkNonNullNonEmpty(targetPrefix, "Target prefix"); + if (sourcePrefix.equals(targetPrefix)) { throw new IllegalArgumentException( String.format( @@ -268,7 +276,7 @@ private Set> rewriteVersionFile(TableMetadata metadata, Str Set> result = new HashSet<>(); String stagingPath = RewriteTablePathUtil.stagingPath(versionFilePath, sourcePrefix, stagingDir); - System.out.println("Processing version file " + versionFilePath); + LOG.info("Processing version file {}", versionFilePath); TableMetadata newTableMetadata = RewriteTablePathUtil.replacePaths(metadata, sourcePrefix, targetPrefix); TableMetadataParser.overwrite(newTableMetadata, table.io().newOutputFile(stagingPath)); diff --git a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java index 35bab0df55a0..0ec5a345579d 100644 --- a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java +++ b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java @@ -206,6 +206,51 @@ void tablePathRewriteForStartAndEndVersionProvided() throws Exception { assertAllInternalPathsRewritten(csvPairs, targetPrefix); } + @Test + void executeRejectsMissingLocationPrefix() { + NullPointerException exception = assertThrows(NullPointerException.class, + () -> new RewriteTablePathOzoneAction(table) + .stagingLocation(stagingDir.toString() + "/") + .execute()); + + assertEquals("Source prefix is null", exception.getMessage()); + } + + @Test + void rewriteLocationPrefixRejectsSameSourceAndTarget() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, sourcePrefix) + .execute()); + + assertEquals("Source prefix cannot be the same as target prefix (" + + sourcePrefix + ")", exception.getMessage()); + } + + @Test + void startVersionRejectsUnknownVersion() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, targetPrefix) + .startVersion("missing.metadata.json") + .execute()); + + assertEquals("Cannot find provided version file missing.metadata.json " + + "in metadata log.", exception.getMessage()); + } + + @Test + void endVersionRejectsUnknownVersion() { + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, targetPrefix) + .endVersion("missing.metadata.json") + .execute()); + + assertEquals("Cannot find provided version file missing.metadata.json " + + "in metadata log.", exception.getMessage()); + } + @Test void statsFileCopyPlanReturnsEmptySetForEmptyStats() { Set> copyPlan = From bb6d12ec887bc20f3385544a552e603aa58e9b1a Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Wed, 6 May 2026 11:01:16 +0800 Subject: [PATCH 2/4] HDDS-15172. Add validation tests and logging cleanup for Ozone Iceberg RewriteTablePath action. --- .../hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java b/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java index e415422518db..b9813285de54 100644 --- a/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java +++ b/hadoop-ozone/iceberg/src/main/java/org/apache/hadoop/ozone/iceberg/RewriteTablePathOzoneAction.java @@ -276,7 +276,7 @@ private Set> rewriteVersionFile(TableMetadata metadata, Str Set> result = new HashSet<>(); String stagingPath = RewriteTablePathUtil.stagingPath(versionFilePath, sourcePrefix, stagingDir); - LOG.info("Processing version file {}", versionFilePath); + LOG.debug("Processing version file {}", versionFilePath); TableMetadata newTableMetadata = RewriteTablePathUtil.replacePaths(metadata, sourcePrefix, targetPrefix); TableMetadataParser.overwrite(newTableMetadata, table.io().newOutputFile(stagingPath)); From cb99c0d2e3d3c8a91ccdbc108debe8bfbc9239f9 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Tue, 12 May 2026 15:42:54 +0800 Subject: [PATCH 3/4] HDDS-15172. Add validation tests and logging cleanup for Ozone Iceberg RewriteTablePath action. --- .../TestRewriteTablePathOzoneAction.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java index 0ec5a345579d..cbb7ffb388f0 100644 --- a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java +++ b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java @@ -216,6 +216,15 @@ void executeRejectsMissingLocationPrefix() { assertEquals("Source prefix is null", exception.getMessage()); } + @Test + void executeRejectsMissingTargetPrefix() { + NullPointerException exception = assertThrows(NullPointerException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, null)); + + assertEquals("Target prefix is null", exception.getMessage()); + } + @Test void rewriteLocationPrefixRejectsSameSourceAndTarget() { IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, @@ -239,6 +248,21 @@ void startVersionRejectsUnknownVersion() { "in metadata log.", exception.getMessage()); } + @Test + void startVersionRejectsDeletedVersionFile() { + List metadataPaths = metadataLogEntryPaths(table); + String existingName = RewriteTablePathUtil.fileName(metadataPaths.get(0)); + table.io().deleteFile(metadataPaths.get(0)); + + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, targetPrefix) + .startVersion(existingName) + .execute()); + + assertThat(exception).hasMessageContaining("does not exist"); + } + @Test void endVersionRejectsUnknownVersion() { IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, From a30d2975b9486e59acc6a7f797779fd28735b214 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Wed, 13 May 2026 09:50:06 +0800 Subject: [PATCH 4/4] HDDS-15172. Add validation tests and logging cleanup for Ozone Iceberg RewriteTablePath action. --- .../iceberg/TestRewriteTablePathOzoneAction.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java index cbb7ffb388f0..7559b5ef9d83 100644 --- a/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java +++ b/hadoop-ozone/iceberg/src/test/java/org/apache/hadoop/ozone/iceberg/TestRewriteTablePathOzoneAction.java @@ -275,6 +275,21 @@ void endVersionRejectsUnknownVersion() { "in metadata log.", exception.getMessage()); } + @Test + void endVersionRejectsDeletedVersionFile() { + List metadataPaths = metadataLogEntryPaths(table); + String existingName = RewriteTablePathUtil.fileName(metadataPaths.get(0)); + table.io().deleteFile(metadataPaths.get(0)); + + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> new RewriteTablePathOzoneAction(table) + .rewriteLocationPrefix(sourcePrefix, targetPrefix) + .endVersion(existingName) + .execute()); + + assertThat(exception).hasMessageContaining("does not exist"); + } + @Test void statsFileCopyPlanReturnsEmptySetForEmptyStats() { Set> copyPlan =