diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java index f8172233b6..c1e4c8a410 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java @@ -36,6 +36,7 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.MultiObjectDeleteException; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -395,10 +396,22 @@ public final class MarkerTool extends S3GuardTool { } else { filterPolicy = null; } + int minMarkerCount = scanArgs.getMinMarkerCount(); + int maxMarkerCount = scanArgs.getMaxMarkerCount(); + if (minMarkerCount > maxMarkerCount) { + // swap min and max if they are wrong. + // this is to ensure any test scripts written to work around + // HADOOP-17332 and min/max swapping continue to work. + println(out, "Swapping -min (%d) and -max (%d) values", + minMarkerCount, maxMarkerCount); + int m = minMarkerCount; + minMarkerCount = maxMarkerCount; + maxMarkerCount = m; + } ScanResult result = scan(target, scanArgs.isDoPurge(), - scanArgs.getMaxMarkerCount(), - scanArgs.getMinMarkerCount(), + minMarkerCount, + maxMarkerCount, scanArgs.getLimit(), filterPolicy); return result; @@ -513,6 +526,11 @@ public final class MarkerTool extends S3GuardTool { final DirectoryPolicy filterPolicy) throws IOException, ExitUtil.ExitException { + // safety check: min and max are correctly ordered at this point. + Preconditions.checkArgument(minMarkerCount <= maxMarkerCount, + "The min marker count of %d is greater than the max value of %d", + minMarkerCount, maxMarkerCount); + ScanResult result = new ScanResult(); // Mission Accomplished diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java index 4c11a3389f..fc1abc19dd 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java @@ -259,8 +259,25 @@ public class ITestMarkerTool extends AbstractMarkerToolTest { AUDIT, m(OPT_LIMIT), 0, m(OPT_OUT), audit, - m(OPT_MIN), expectedMarkersWithBaseDir, - m(OPT_MAX), expectedMarkersWithBaseDir, + m(OPT_MIN), expectedMarkersWithBaseDir - 1, + m(OPT_MAX), expectedMarkersWithBaseDir + 1, + createdPaths.base); + expectMarkersInOutput(audit, expectedMarkersWithBaseDir); + } + + @Test + public void testRunAuditWithExpectedMarkersSwappedMinMax() throws Throwable { + describe("Run a verbose audit with the min/max ranges swapped;" + + " see HADOOP-17332"); + // a run under the keeping FS will create paths + CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); + final File audit = tempAuditFile(); + run(MARKERS, V, + AUDIT, + m(OPT_LIMIT), 0, + m(OPT_OUT), audit, + m(OPT_MIN), expectedMarkersWithBaseDir + 1, + m(OPT_MAX), expectedMarkersWithBaseDir - 1, createdPaths.base); expectMarkersInOutput(audit, expectedMarkersWithBaseDir); }