sijie closed pull request #1180: V2 decoder marks the reads index of the payload on write URL: https://github.com/apache/bookkeeper/pull/1180
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java index ec7a3b7f5..59d2b1b97 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java @@ -308,9 +308,8 @@ public void setMasterKey(long ledgerId, byte[] masterKey) throws IOException { public long addEntry(ByteBuf entry) throws IOException { long startTime = MathUtils.nowInNano(); - long ledgerId = entry.readLong(); - long entryId = entry.readLong(); - entry.resetReaderIndex(); + long ledgerId = entry.getLong(entry.readerIndex()); + long entryId = entry.getLong(entry.readerIndex() + 8); if (log.isDebugEnabled()) { log.debug("Add entry. {}@{}", ledgerId, entryId); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java index 24ef1172a..375cabaa4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java @@ -167,6 +167,9 @@ public Object decode(ByteBuf packet) // Read ledger and entry id without advancing the reader index ledgerId = packet.getLong(packet.readerIndex()); entryId = packet.getLong(packet.readerIndex() + 8); + // mark the reader index so that any resets will return to the + // start of the payload + packet.markReaderIndex(); return BookieProtocol.ParsedAddRequest.create( version, ledgerId, entryId, flags, masterKey, packet.retain()); diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageBookieTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageBookieTest.java index da7f32a8d..a2162bf55 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageBookieTest.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorageBookieTest.java @@ -22,15 +22,21 @@ import static org.junit.Assert.assertEquals; +import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookKeeper.DigestType; import org.apache.bookkeeper.client.LedgerHandle; +import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.test.BookKeeperClusterTestCase; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Unit test for {@link DbLedgerStorageBookieTest}. */ public class DbLedgerStorageBookieTest extends BookKeeperClusterTestCase { + static final Logger LOG = LoggerFactory.getLogger(DbLedgerStorageBookieTest.class); public DbLedgerStorageBookieTest() { super(1); @@ -49,4 +55,21 @@ public void testRecoveryEmptyLedger() throws Exception { assertEquals(0, lh2.getLength()); assertEquals(-1, lh2.getLastAddConfirmed()); } + + @Test + public void testV2ReadWrite() throws Exception { + ClientConfiguration conf = new ClientConfiguration(); + conf.setUseV2WireProtocol(true); + conf.setZkServers(zkUtil.getZooKeeperConnectString()); + + BookKeeper bkc = new BookKeeper(conf); + LedgerHandle lh1 = bkc.createLedger(1, 1, DigestType.CRC32, new byte[0]); + lh1.addEntry("Foobar".getBytes()); + lh1.close(); + + LedgerHandle lh2 = bkc.openLedger(lh1.getId(), DigestType.CRC32, new byte[0]); + assertEquals(0, lh2.getLastAddConfirmed()); + assertEquals(new String(lh2.readEntries(0, 0).nextElement().getEntry()), + "Foobar"); + } } ---------------------------------------------------------------- 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: us...@infra.apache.org With regards, Apache Git Services