Repository: bookkeeper
Updated Branches:
  refs/heads/master 7b1eec470 -> 64bedc2f9


BOOKKEEPER-1075: BK LedgerMetadata: more memory-efficient parsing of configs

It is the contribution from Alex Yarmula

commit 9d9d7dd26235a9beda4421b7bed750fea1789076
Author: Alex Yarmula <aktwitter.com>
Date: Wed Sep 23 05:57:30 2015 -0700

BK LedgerMetadata: more memory-efficient parsing of configs
Looking at the most prevalent client-side memory allocations, I noticed that we 
allocate 4KB every time we open a ledger. This is caused by allocating a 4KB 
buffer (in TextFormat.toStringBuilder) to account for the maximum possible 
Protobufs message, which is unnecessary in our case: we know the exact size of 
the metadata ( << 500 B) and don't need to allocate more.
TextFormat.merge(Readable, Message.Builder) is the current method we use. This 
changes to use TextFormat.merge(CharSequence, Message.Builder), which avoids 
the extra 4K allocation conversion + an extra StringBuilder.

RB_ID=745700

Author: Alex Yarmula <[email protected]>
Author: Sijie Guo <[email protected]>

Reviewers: Enrico Olivelli, Sijie Guo

Closes #162 from sijie/bk_ledger_metadata_efficiency


Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/64bedc2f
Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/64bedc2f
Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/64bedc2f

Branch: refs/heads/master
Commit: 64bedc2f92d5bb17783c6ea2a2db7ea29170f264
Parents: 7b1eec4
Author: Alex Yarmula <[email protected]>
Authored: Thu May 25 14:31:57 2017 +0200
Committer: eolivelli <[email protected]>
Committed: Thu May 25 14:31:57 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/bookkeeper/client/LedgerMetadata.java | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/64bedc2f/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
----------------------------------------------------------------------
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
index f539186..b752148 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
+import java.nio.CharBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
@@ -393,8 +394,15 @@ public class LedgerMetadata {
             return parseVersion1Config(lc, reader);
         }
 
+        // remaining size is total minus the length of the version line and 
'\n'
+        char[] configBuffer = new char[config.length() - (versionLine.length() 
+ 1)];
+        if (configBuffer.length != reader.read(configBuffer, 0, 
configBuffer.length)) {
+            throw new IOException("Invalid metadata buffer");
+        }
+
         LedgerMetadataFormat.Builder builder = 
LedgerMetadataFormat.newBuilder();
-        TextFormat.merge(reader, builder);
+
+        TextFormat.merge((CharSequence) CharBuffer.wrap(configBuffer), 
builder);
         LedgerMetadataFormat data = builder.build();
         lc.writeQuorumSize = data.getQuorumSize();        
         if (data.hasCtime()) {

Reply via email to