athanatos commented on a change in pull request #876: Issue 870:
ScanAndCompareGarbageCollector: harden against LM bugs
URL: https://github.com/apache/bookkeeper/pull/876#discussion_r157835118
##########
File path:
bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java
##########
@@ -315,6 +319,228 @@ public void clean(long ledgerId) {
assertEquals("Should have cleaned first ledger" + first, (long) first,
(long) cleaned.get(0));
}
+ /*
+ * in this scenario no ledger is created, so ledgeriterator's hasNext call
would return false and next would be
+ * null. GarbageCollector.gc is expected to behave normally
+ */
+ @Test(timeout = 60000)
+ public void testGcLedgersWithNoLedgers() throws Exception {
+ final SortedSet<Long> createdLedgers =
Collections.synchronizedSortedSet(new TreeSet<Long>());
+ final List<Long> cleaned = new ArrayList<Long>();
+
+ // no ledger created
+
+ final GarbageCollector garbageCollector = new
ScanAndCompareGarbageCollector(getLedgerManager(),
+ new MockLedgerStorage(), baseConf);
+ AtomicBoolean cleanerCalled = new AtomicBoolean(false);
+
+ GarbageCollector.GarbageCleaner cleaner = new
GarbageCollector.GarbageCleaner() {
+ @Override
+ public void clean(long ledgerId) {
+ LOG.info("Cleaned {}", ledgerId);
+ cleanerCalled.set(true);
+ }
+ };
+
+ validateLedgerRangeIterator(createdLedgers);
+
+ garbageCollector.gc(cleaner);
+ assertFalse("Should have cleaned nothing, since no ledger is created",
cleanerCalled.get());
+ }
+
+ // in this scenario all the created ledgers are in one single ledger range.
+ @Test(timeout = 60000)
+ public void testGcLedgersWithLedgersInSameLedgerRange() throws Exception {
+ final SortedSet<Long> createdLedgers =
Collections.synchronizedSortedSet(new TreeSet<Long>());
+ final SortedSet<Long> cleaned = Collections.synchronizedSortedSet(new
TreeSet<Long>());
+
+ // Create few ledgers which span over just one ledger range in the
hierarchical ledger manager implementation
+ final int numLedgers = 5;
+
+ createLedgers(numLedgers, createdLedgers);
+
+ final GarbageCollector garbageCollector = new
ScanAndCompareGarbageCollector(getLedgerManager(),
+ new MockLedgerStorage(), baseConf);
+ GarbageCollector.GarbageCleaner cleaner = new
GarbageCollector.GarbageCleaner() {
+ @Override
+ public void clean(long ledgerId) {
+ LOG.info("Cleaned {}", ledgerId);
+ cleaned.add(ledgerId);
+ }
+ };
+
+ validateLedgerRangeIterator(createdLedgers);
+
+ garbageCollector.gc(cleaner);
+ assertTrue("Should have cleaned nothing", cleaned.isEmpty());
+
+ for (long ledgerId : createdLedgers) {
+ removeLedger(ledgerId);
+ }
+
+ garbageCollector.gc(cleaner);
+ assertEquals("Should have cleaned all the created ledgers",
createdLedgers, cleaned);
+ }
+
+ /*
+ * in this test scenario no created ledger is deleted, but ledgeriterator
is screwed up and returns hasNext to be
+ * false and next to be null. So even in this case it is expected not to
clean any ledger's data.
+ *
+ * This testcase is needed for validating fix of bug - W-4292747.
+ *
+ * ScanAndCompareGarbageCollector/GC should clean data of ledger only if
both the LedgerManager.getLedgerRanges says
+ * that ledger is not existing and also ledgerManager.readLedgerMetadata
fails with error
+ * NoSuchLedgerExistsException.
+ *
+ */
+ @Test(timeout = 60000)
Review comment:
ok
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services