Skip to content

Commit 0df3caf

Browse files
authored
fix pendingDeletedLedgers do not remove ledger error (#4525)
* fix pendingDeletedLedgers not remove ledger
1 parent b71446f commit 0df3caf

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgerMetadataIndex.java

+1
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ public void removeDeletedLedgers() throws IOException {
339339
key.set(ledgerId);
340340
ledgersDb.delete(key.array);
341341
++deletedLedgers;
342+
pendingDeletedLedgers.remove(ledgerId);
342343
}
343344

344345
if (log.isDebugEnabled()) {

bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageTest.java

+59
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import java.io.File;
3434
import java.io.FileInputStream;
3535
import java.io.IOException;
36+
import java.lang.reflect.Field;
3637
import java.nio.ByteBuffer;
3738
import java.util.List;
39+
import java.util.Set;
3840
import org.apache.bookkeeper.bookie.Bookie;
3941
import org.apache.bookkeeper.bookie.Bookie.NoEntryException;
4042
import org.apache.bookkeeper.bookie.BookieException;
@@ -52,6 +54,7 @@
5254
import org.apache.bookkeeper.conf.TestBKConfiguration;
5355
import org.apache.bookkeeper.proto.BookieProtocol;
5456
import org.junit.After;
57+
import org.junit.Assert;
5558
import org.junit.Before;
5659
import org.junit.Test;
5760
import org.slf4j.Logger;
@@ -822,4 +825,60 @@ public void testSingleLedgerDirectoryCheckpoint() throws Exception {
822825
assertEquals(7, logMark.getLogFileId());
823826
assertEquals(8, logMark.getLogFileOffset());
824827
}
828+
829+
@Test
830+
public void testSingleLedgerDirectoryCheckpointTriggerRemovePendingDeletedLedgers()
831+
throws Exception {
832+
int gcWaitTime = 1000;
833+
File ledgerDir = new File(tmpDir, "dir");
834+
ServerConfiguration conf = TestBKConfiguration.newServerConfiguration();
835+
conf.setGcWaitTime(gcWaitTime);
836+
conf.setProperty(DbLedgerStorage.WRITE_CACHE_MAX_SIZE_MB, 4);
837+
conf.setProperty(DbLedgerStorage.READ_AHEAD_CACHE_MAX_SIZE_MB, 4);
838+
conf.setLedgerStorageClass(DbLedgerStorage.class.getName());
839+
conf.setLedgerDirNames(new String[] { ledgerDir.getCanonicalPath() });
840+
841+
BookieImpl bookie = new TestBookieImpl(conf);
842+
ByteBuf entry1 = Unpooled.buffer(1024);
843+
entry1.writeLong(1); // ledger id
844+
entry1.writeLong(2); // entry id
845+
entry1.writeBytes("entry-1".getBytes());
846+
bookie.getLedgerStorage().addEntry(entry1);
847+
848+
bookie.getJournals().get(0).getLastLogMark().getCurMark().setLogMark(1, 2);
849+
((DbLedgerStorage) bookie.getLedgerStorage()).getLedgerStorageList().get(0).flush();
850+
851+
File ledgerDirMark = new File(ledgerDir + "/current", "lastMark");
852+
try {
853+
LogMark logMark = readLogMark(ledgerDirMark);
854+
assertEquals(1, logMark.getLogFileId());
855+
assertEquals(2, logMark.getLogFileOffset());
856+
} catch (Exception e) {
857+
fail();
858+
}
859+
860+
ByteBuf entry2 = Unpooled.buffer(1024);
861+
entry2.writeLong(2); // ledger id
862+
entry2.writeLong(1); // entry id
863+
entry2.writeBytes("entry-2".getBytes());
864+
865+
bookie.getLedgerStorage().addEntry(entry2);
866+
// write one entry to first ledger directory and flush with logMark(1, 2),
867+
// only the first ledger directory should have lastMark
868+
bookie.getJournals().get(0).getLastLogMark().getCurMark().setLogMark(4, 5);
869+
870+
SingleDirectoryDbLedgerStorage storage1 =
871+
((DbLedgerStorage) bookie.getLedgerStorage()).getLedgerStorageList().get(0);
872+
Field field = SingleDirectoryDbLedgerStorage.class.getDeclaredField("ledgerIndex");
873+
field.setAccessible(true);
874+
LedgerMetadataIndex ledgerMetadataIndex = (LedgerMetadataIndex) field.get(storage1);
875+
Field field1 = LedgerMetadataIndex.class.getDeclaredField("pendingDeletedLedgers");
876+
field1.setAccessible(true);
877+
Set<Long> pendingDeletedLedgers = (Set<Long>) field1.get(ledgerMetadataIndex);
878+
879+
Assert.assertEquals(pendingDeletedLedgers.size(), 0);
880+
pendingDeletedLedgers.add(2L);
881+
bookie.getLedgerStorage().flush();
882+
Assert.assertEquals(pendingDeletedLedgers.size(), 0);
883+
}
825884
}

0 commit comments

Comments
 (0)