Skip to content

Commit 9b4faf2

Browse files
HADOOP-17332. S3A MarkerTool -min and -max are inverted. (#2425)
This patch * fixes the inversion * adds a precondition check * if the commands are supplied inverted, swaps them with a warning. This is to stop breaking any tests written to cope with the existing behavior. Contributed by Steve Loughran
1 parent 07b7d07 commit 9b4faf2

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.hadoop.fs.s3a.impl.StoreContext;
5858
import org.apache.hadoop.fs.s3a.s3guard.S3GuardTool;
5959
import org.apache.hadoop.fs.shell.CommandFormat;
60+
import org.apache.hadoop.thirdparty.com.google.common.base.Preconditions;
6061
import org.apache.hadoop.util.DurationInfo;
6162
import org.apache.hadoop.util.ExitUtil;
6263

@@ -395,10 +396,22 @@ ScanResult execute(final ScanArgs scanArgs)
395396
} else {
396397
filterPolicy = null;
397398
}
399+
int minMarkerCount = scanArgs.getMinMarkerCount();
400+
int maxMarkerCount = scanArgs.getMaxMarkerCount();
401+
if (minMarkerCount > maxMarkerCount) {
402+
// swap min and max if they are wrong.
403+
// this is to ensure any test scripts written to work around
404+
// HADOOP-17332 and min/max swapping continue to work.
405+
println(out, "Swapping -min (%d) and -max (%d) values",
406+
minMarkerCount, maxMarkerCount);
407+
int m = minMarkerCount;
408+
minMarkerCount = maxMarkerCount;
409+
maxMarkerCount = m;
410+
}
398411
ScanResult result = scan(target,
399412
scanArgs.isDoPurge(),
400-
scanArgs.getMaxMarkerCount(),
401-
scanArgs.getMinMarkerCount(),
413+
minMarkerCount,
414+
maxMarkerCount,
402415
scanArgs.getLimit(),
403416
filterPolicy);
404417
return result;
@@ -513,6 +526,11 @@ private ScanResult scan(
513526
final DirectoryPolicy filterPolicy)
514527
throws IOException, ExitUtil.ExitException {
515528

529+
// safety check: min and max are correctly ordered at this point.
530+
Preconditions.checkArgument(minMarkerCount <= maxMarkerCount,
531+
"The min marker count of %d is greater than the max value of %d",
532+
minMarkerCount, maxMarkerCount);
533+
516534
ScanResult result = new ScanResult();
517535

518536
// Mission Accomplished

hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,25 @@ public void testRunAuditWithExpectedMarkers() throws Throwable {
259259
AUDIT,
260260
m(OPT_LIMIT), 0,
261261
m(OPT_OUT), audit,
262-
m(OPT_MIN), expectedMarkersWithBaseDir,
263-
m(OPT_MAX), expectedMarkersWithBaseDir,
262+
m(OPT_MIN), expectedMarkersWithBaseDir - 1,
263+
m(OPT_MAX), expectedMarkersWithBaseDir + 1,
264+
createdPaths.base);
265+
expectMarkersInOutput(audit, expectedMarkersWithBaseDir);
266+
}
267+
268+
@Test
269+
public void testRunAuditWithExpectedMarkersSwappedMinMax() throws Throwable {
270+
describe("Run a verbose audit with the min/max ranges swapped;"
271+
+ " see HADOOP-17332");
272+
// a run under the keeping FS will create paths
273+
CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath());
274+
final File audit = tempAuditFile();
275+
run(MARKERS, V,
276+
AUDIT,
277+
m(OPT_LIMIT), 0,
278+
m(OPT_OUT), audit,
279+
m(OPT_MIN), expectedMarkersWithBaseDir + 1,
280+
m(OPT_MAX), expectedMarkersWithBaseDir - 1,
264281
createdPaths.base);
265282
expectMarkersInOutput(audit, expectedMarkersWithBaseDir);
266283
}

0 commit comments

Comments
 (0)