Skip to content

Commit 752ac55

Browse files
FDBCORE-3674 adding delta file count before resnapshot to minimize impact of small… (apple#355)
2 parents b4d4c3f + 57a1031 commit 752ac55

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

fdbserver/BlobWorker.actor.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,7 @@ Version doGranuleRollback(Reference<GranuleMetadata> metadata,
18471847
int toPop = 0;
18481848
// keep bytes in delta files pending here, then add back already durable delta files at end
18491849
metadata->bytesInNewDeltaFiles = 0;
1850+
metadata->newDeltaFileCount = 0;
18501851

18511852
for (auto& f : inFlightFiles) {
18521853
if (f.snapshot) {
@@ -1863,6 +1864,7 @@ Version doGranuleRollback(Reference<GranuleMetadata> metadata,
18631864
} else {
18641865
metadata->pendingSnapshotVersion = f.version;
18651866
metadata->bytesInNewDeltaFiles = 0;
1867+
metadata->newDeltaFileCount = 0;
18661868
}
18671869
} else {
18681870
if (f.version > rollbackVersion) {
@@ -1879,6 +1881,7 @@ Version doGranuleRollback(Reference<GranuleMetadata> metadata,
18791881
ASSERT(f.version > cfRollbackVersion);
18801882
cfRollbackVersion = f.version;
18811883
metadata->bytesInNewDeltaFiles += f.bytes;
1884+
metadata->newDeltaFileCount++;
18821885
}
18831886
}
18841887
}
@@ -1911,6 +1914,7 @@ Version doGranuleRollback(Reference<GranuleMetadata> metadata,
19111914
i >= 0 && metadata->files.deltaFiles[i].version > metadata->pendingSnapshotVersion;
19121915
i--) {
19131916
metadata->bytesInNewDeltaFiles += metadata->files.deltaFiles[i].logicalSize;
1917+
metadata->newDeltaFileCount++;
19141918
}
19151919

19161920
// Track that this rollback happened, since we have to re-read mutations up to the rollback
@@ -2196,6 +2200,7 @@ ACTOR Future<Void> blobGranuleUpdateFiles(Reference<BlobWorkerData> bwData,
21962200
for (int i = files.deltaFiles.size() - 1; i >= 0; i--) {
21972201
if (files.deltaFiles[i].version > snapshotVersion) {
21982202
metadata->bytesInNewDeltaFiles += files.deltaFiles[i].logicalSize;
2203+
metadata->newDeltaFileCount++;
21992204
}
22002205
}
22012206
}
@@ -2803,6 +2808,7 @@ ACTOR Future<Void> blobGranuleUpdateFiles(Reference<BlobWorkerData> bwData,
28032808
ASSERT(metadata->bufferedDeltaVersion <= lastDeltaVersion);
28042809
metadata->bufferedDeltaVersion = lastDeltaVersion; // In case flush was forced at non-mutation version
28052810
metadata->bytesInNewDeltaFiles += metadata->bufferedDeltaBytes;
2811+
metadata->newDeltaFileCount++;
28062812

28072813
bwData->stats.mutationBytesBuffered -= metadata->bufferedDeltaBytes;
28082814

@@ -2838,11 +2844,11 @@ ACTOR Future<Void> blobGranuleUpdateFiles(Reference<BlobWorkerData> bwData,
28382844
// making a bunch of extra delta files at some point, even if we don't consider it for a split
28392845
// yet
28402846

2841-
// If we have enough delta files, try to re-snapshot
2842-
// FIXME: have max file count in addition to bytes count
2847+
// If we have enough delta file data, try to re-snapshot
28432848
if (snapshotEligible &&
28442849
(metadata->doEarlyReSnapshot() ||
2845-
metadata->bytesInNewDeltaFiles >= metadata->writeAmpTarget.getBytesBeforeCompact())) {
2850+
metadata->bytesInNewDeltaFiles >= metadata->writeAmpTarget.getBytesBeforeCompact() ||
2851+
metadata->newDeltaFileCount >= 20)) {
28462852
if (BW_DEBUG && !inFlightFiles.empty()) {
28472853
fmt::print("Granule [{0} - {1}) ready to re-snapshot at {2} after {3} > {4} bytes, "
28482854
"waiting for outstanding {5} files to finish\n",
@@ -2854,6 +2860,9 @@ ACTOR Future<Void> blobGranuleUpdateFiles(Reference<BlobWorkerData> bwData,
28542860
inFlightFiles.size());
28552861
}
28562862

2863+
CODE_PROBE(metadata->doEarlyReSnapshot(), "granule snapshotting early");
2864+
CODE_PROBE(metadata->newDeltaFileCount >= 20, "granule snapshotting due to many small delta files");
2865+
28572866
// cancel previous candidate checker
28582867
checkMergeCandidate.cancel();
28592868

@@ -2892,6 +2901,7 @@ ACTOR Future<Void> blobGranuleUpdateFiles(Reference<BlobWorkerData> bwData,
28922901

28932902
// reset metadata
28942903
metadata->bytesInNewDeltaFiles = 0;
2904+
metadata->newDeltaFileCount = 0;
28952905
metadata->resetReadStats();
28962906

28972907
// If we have more than one snapshot file and that file is unblocked (committedVersion >=

fdbserver/include/fdbserver/BlobWorker.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ struct GranuleMetadata : NonCopyable, ReferenceCounted<GranuleMetadata> {
8888

8989
uint64_t bytesInNewDeltaFiles = 0;
9090
uint64_t bufferedDeltaBytes = 0;
91+
uint16_t newDeltaFileCount = 0;
9192

9293
// for client to know when it is safe to read a certain version and from where (check waitForVersion)
9394
Version bufferedDeltaVersion; // largest delta version in currentDeltas (including empty versions)

0 commit comments

Comments
 (0)