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 2bda160e32ea..0327b7a5fd66 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 @@ -158,6 +158,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( @@ -289,7 +292,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.debug("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 405740ab6eeb..87c9c665ff8a 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 @@ -222,6 +222,89 @@ void tablePathRewriteForStartAndEndVersionProvided() throws Exception { } @Test + void executeRejectsMissingLocationPrefix() { + NullPointerException exception = assertThrows(NullPointerException.class, + () -> new RewriteTablePathOzoneAction(table) + .stagingLocation(stagingDir.toString() + "/") + .execute()); + + 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, + () -> 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 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, + () -> 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 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"); + } + void defaultStagingDirIsUnderTableMetadataLocation() { String metadataLocation = RewriteTablePathOzoneUtils.getMetadataLocation(table);