| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
There was a problem hiding this comment.
This PR introduces a ZooKeeper-backed “ledger metadata bucket” watch/cache in LedgerManager and updates scan-and-compare GC to use that cache to avoid walking all metadata ranges, aiming to significantly reduce GC metadata overhead on large deployments.
Changes:
Copilot reviewed 15 out of 15 changed files in this pull request and generated 6 comments.
Show a summary per file| File | Description |
|---|---|
| bookkeeper-server/src/test/java/org/apache/bookkeeper/util/TestZkUtils.java | Adds ZooKeeper watch-path behavior tests. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/test/LedgerDeleteTest.java | Replaces fixed sleeps with Awaitility-based waiting for entry log deletion. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java | Updates GC tests for new GC signature/cache behavior; adds new cache-focused tests. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java | Adds unit tests for bucket-cache refresh/stale/absent/pruning behavior. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageTest.java | Adds tests for local-ledger notification behavior in Db storage. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/SortedLedgerStorageTest.java | Adds tests for local-ledger notification behavior in sorted storage. |
| bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CompactionTest.java | Makes compaction-time assertion less flaky (>= vs >). |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerManager.java | Adds metadata bucket cache API (default methods + result enum). |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/CleanupLedgerManager.java | Delegates new cache-related LedgerManager methods to the underlying manager. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java | Implements the ZooKeeper-backed bucket watch/cache and refresh logic. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java | Notifies ledger manager on first local setMasterKey per ledger. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java | Uses metadata bucket cache during scan-and-compare GC; adds force mode. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java | Notifies ledger manager on first local setMasterKey per ledger. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java | Plumbs “force GC” into the ledger GC step. |
| bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollector.java | Adds a default gc(..., boolean force) overload for backward compatibility. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Sorry, something went wrong.
| for (Long bkLid : bkActiveLedgers) { | ||
| ledgerManager.ensureLedgerMetadataBucketWatched(bkLid); | ||
| LedgerMetadataCacheResult cacheResult = ledgerManager.lookupLedgerMetadataInCache(bkLid); | ||
| if (cacheResult == LedgerMetadataCacheResult.UNKNOWN) { | ||
| continue; | ||
| } | ||
| if (cacheResult == LedgerMetadataCacheResult.PRESENT && !verifyMetadataOnGc) { | ||
| continue; | ||
| } | ||
| if (cacheResult == LedgerMetadataCacheResult.PRESENT && !isBookieMissingFromMetadata(bkLid, | ||
| zkOpTimeoutMs)) { | ||
| continue; | ||
| } | ||
| if (cacheResult == LedgerMetadataCacheResult.MISSING | ||
| && verifyMetadataOnGc && !isBookieMissingFromMetadata(bkLid, zkOpTimeoutMs)) { | ||
| continue; | ||
| } | ||
| if (cacheResult == LedgerMetadataCacheResult.MISSING || verifyMetadataOnGc) { | ||
| garbageCleaner.clean(bkLid); | ||
| } | ||
| } |
| protected final SnapshotMap<Long, Boolean> activeLedgers; | ||
| private LedgerManager ledgerManager; | ||
| private final Set<Long> notifiedLocalLedgers = ConcurrentHashMap.newKeySet(); |
| private final LedgerManager ledgerManager; | ||
| private final Set<Long> notifiedLocalLedgers = ConcurrentHashMap.newKeySet(); |
| zkc.getChildren(parentPath, new Watcher() { | ||
| @Override | ||
| public void process(WatchedEvent event) { | ||
| eventRef.set(event); | ||
| eventReceived.countDown(); | ||
| } | ||
| }); |
| zkc.exists(childPath, new Watcher() { | ||
| @Override | ||
| public void process(WatchedEvent event) { | ||
| eventRef.set(event); | ||
| eventReceived.countDown(); | ||
| } | ||
| }); |
| } finally { | ||
| dbStorage.shutdown(); | ||
| dbTmpDir.delete(); | ||
| } |
| Back | FazBrowse Home | New Git URL |
Descriptions of the changes in this PR:
Fixes: N/A
Main Issue: N/A
BP: N/A
Motivation
Scan-and-compare GC currently walks all ledger metadata ranges from ZooKeeper to decide whether locally active ledgers still exist in metadata. On deployments with many ledgers, fetching every ledger range can make ScanAndCompareGarbageCollector.gc() spend minutes in metadata operations even when the bookie only needs to check a small subset of local ledger buckets.
Changes
Verifications