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

Reply via email to