diff --git a/src/main/java/it/cavallium/dbengine/database/disk/RocksDBFile.java b/src/main/java/it/cavallium/dbengine/database/disk/RocksDBFile.java index c335f14..1596f49 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/RocksDBFile.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/RocksDBFile.java @@ -135,10 +135,9 @@ public class RocksDBFile implements Comparable { ro.setIterateLowerBound(rangePartial.getMin() != null ? requireNonNull(LLUtils.asArray(rangePartial.getMin())) : null); ro.setIterateUpperBound(rangePartial.getMax() != null ? requireNonNull(LLUtils.asArray(rangePartial.getMax())) : null); ro.setFillCache(false); + ro.setIgnoreRangeDeletions(true); if (!rangePartial.isSingle()) { - if (LLUtils.MANUAL_READAHEAD) { - ro.setReadaheadSize(32 * 1024); - } + ro.setReadaheadSize(256 * 1024 * 1024); } ro.setVerifyChecksums(true); return resourceStream(() -> ro.newIterator(db, cfh, IteratorMetrics.NO_OP), rocksIterator -> StreamUtils diff --git a/src/repair/java/it/cavallium/dbengine/repair/Repair.java b/src/repair/java/it/cavallium/dbengine/repair/Repair.java index 45dde05..f796a00 100644 --- a/src/repair/java/it/cavallium/dbengine/repair/Repair.java +++ b/src/repair/java/it/cavallium/dbengine/repair/Repair.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Stream; import org.apache.commons.lang3.exception.ExceptionUtils; import org.rocksdb.InfoLogLevel; @@ -111,7 +112,8 @@ public class Repair { } Path path = Path.of(args.get(0)).toAbsolutePath(); String dbName = args.get(1); - List fileNames = args.subList(2, args.size()); + boolean skip = args.get(2).equals("--skip"); + List fileNames = args.subList(skip ? 3 : 2, args.size()).stream().map(f -> f.startsWith("/") ? f : ("/" + f)).toList(); List columnNames = getColumnFamilyNames(path, dbName).toList(); System.err.printf("Scanning database \"%s\" at \"%s\", files:%n%s%n", dbName, path, String.join("\n", fileNames)); var conn = new LLLocalDatabaseConnection(METER, path, false); @@ -132,16 +134,27 @@ public class Repair { StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.DSYNC )) { - consumeVerification(os, db.getAllLiveFiles() + AtomicLong ignoredFiles = new AtomicLong(); + var fileList = db.getAllLiveFiles() .filter(file -> { - if (fileNames.contains(file.getMetadata().fileName())) { - return true; - } else { + if (!skip && !fileNames.contains(file.getMetadata().fileName())) { + ignoredFiles.incrementAndGet(); System.err.printf("Ignoring file: \"%s\"%n", file.getMetadata().fileName()); return false; + } else if (skip && fileNames.contains(file.getMetadata().fileName())) { + ignoredFiles.incrementAndGet(); + System.err.printf("Ignoring file: \"%s\"%n", file.getMetadata().fileName()); + return false; + } else { + return true; } - }) - .flatMap(file -> file.verify(dbName, "any", LLRange.all()))); + }).toList(); + AtomicLong progress = new AtomicLong(); + consumeVerification(os, fileList.stream() + .flatMap(file -> { + System.err.printf("Processing file [%d/%d (+%d ignored)]: %s%n", progress.incrementAndGet(), fileList.size(), ignoredFiles.get(), file.getMetadata().fileName()); + return file.verify(dbName, "any", LLRange.all()); + })); } } case "list-files" -> { @@ -295,11 +308,11 @@ public class Repair { .openAsSecondary(true) .absoluteConsistency(true) .allowMemoryMapping(true) - .blockCache(Nullablelong.empty()) + .blockCache(Nullablelong.of(3L * 1024 * 1024 * 1024)) .lowMemory(false) .maxOpenFiles(Nullableint.of(-1)) .optimistic(false) - .spinning(false) + .spinning(true) .useDirectIO(false) .extraFlags(Map.of()) .logPath(NullableString.empty()) @@ -314,8 +327,8 @@ public class Repair { ).filter(x -> Files.exists(x.volumePath())).toList()) .defaultColumnOptions(DefaultColumnOptions.of( List.of(), - Nullablelong.empty(), - Nullableboolean.empty(), + Nullablelong.of(512 * 1024 * 1024), + Nullableboolean.of(true), Nullableboolean.empty(), NullableFilter.empty(), Nullableint.empty(), @@ -329,8 +342,8 @@ public class Repair { .columnOptions(columnNames.stream() .map(columnName -> NamedColumnOptions.of(columnName, List.of(), - Nullablelong.empty(), - Nullableboolean.empty(), + Nullablelong.of(512 * 1024 * 1024), + Nullableboolean.of(true), Nullableboolean.empty(), NullableFilter.empty(), Nullableint.empty(), @@ -351,7 +364,7 @@ public class Repair { or: repair dump-all DIRECTORY DB_NAME COLUMN_NAME... or: repair verify-checksum DIRECTORY DB_NAME or: repair list-column-families DIRECTORY DB_NAME - or: repair scan-files DIRECTORY DB_NAME FILE-NAME... + or: repair scan-files DIRECTORY DB_NAME [--skip] FILE-NAME... or: repair list-files DIRECTORY DB_NAME """); System.exit(1);