You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by iv...@apache.org on 2012/06/27 15:35:15 UTC

svn commit: r1354492 [1/3] - in /zookeeper/bookkeeper/trunk: ./ bookkeeper-server/ bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ bookkeeper-server/src/main/proto/ bookkeeper-s...

Author: ivank
Date: Wed Jun 27 13:35:11 2012
New Revision: 1354492

URL: http://svn.apache.org/viewvc?rev=1354492&view=rev
Log:
BOOKKEEPER-303: LedgerMetadata should serialized using protobufs (ivank)

Added:
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DataFormats.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/DataFormats.proto
Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/pom.xml
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/resources/LICENSE.bin.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/resources/NOTICE.bin.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookieRecoveryTest.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/TestBackwardCompat.java
    zookeeper/bookkeeper/trunk/hedwig-protocol/pom.xml
    zookeeper/bookkeeper/trunk/hedwig-protocol/src/main/java/org/apache/hedwig/protocol/PubSubProtocol.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Wed Jun 27 13:35:11 2012
@@ -8,6 +8,8 @@ Trunk (unreleased changes)
 
       BOOKKEEPER-203: improve ledger manager interface to remove zookeeper dependency on metadata operations. (sijie via ivank)
 
+      BOOKKEEPER-303: LedgerMetadata should serialized using protobufs (ivank)
+
   Backward compatible changes:
 
     BUGFIXES:

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/pom.xml
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/pom.xml?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/pom.xml (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/pom.xml Wed Jun 27 13:35:11 2012
@@ -34,7 +34,7 @@
     <dependency>
       <groupId>com.google.protobuf</groupId>
       <artifactId>protobuf-java</artifactId>
-      <version>2.3.0</version>
+      <version>2.4.1</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
@@ -165,4 +165,33 @@
       </plugin>
     </plugins>
   </build>
+  <profiles>
+    <profile>
+      <id>protobuf</id>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-antrun-plugin</artifactId>
+            <executions>
+              <execution>
+                <phase>generate-sources</phase>
+                <id>default-cli</id>
+                <configuration>
+                  <target>
+                    <exec executable="protoc" failonerror="true">
+                      <arg value="--java_out=src/main/java" />
+                      <arg value="src/main/proto/DataFormats.proto" />
+                    </exec>
+                  </target>
+                </configuration>
+                <goals>
+                  <goal>run</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
 </project>

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java Wed Jun 27 13:35:11 2012
@@ -90,7 +90,7 @@ class LedgerCreateOp implements GenericC
 
         ArrayList<InetSocketAddress> ensemble;
         try {
-            ensemble = bk.bookieWatcher.getNewBookies(metadata.ensembleSize);
+            ensemble = bk.bookieWatcher.getNewBookies(metadata.getEnsembleSize());
         } catch (BKNotEnoughBookiesException e) {
             LOG.error("Not enough bookies to create ledger");
             cb.createComplete(e.getCode(), null, this.ctx);

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java Wed Jun 27 13:35:11 2012
@@ -41,6 +41,7 @@ import org.apache.bookkeeper.client.Book
 import org.apache.bookkeeper.client.LedgerMetadata;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
 import org.apache.bookkeeper.proto.BookieProtocol;
+import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State;
 import org.apache.bookkeeper.util.SafeRunnable;
 
 import org.slf4j.Logger;
@@ -83,8 +84,8 @@ public class LedgerHandle {
         this.metadata = metadata;
 
         if (metadata.isClosed()) {
-            lastAddConfirmed = lastAddPushed = metadata.close;
-            length = metadata.length;
+            lastAddConfirmed = lastAddPushed = metadata.getLastEntryId();
+            length = metadata.getLength();
         } else {
             lastAddConfirmed = lastAddPushed = INVALID_ENTRY_ID;
             length = 0;
@@ -98,7 +99,7 @@ public class LedgerHandle {
         macManager = DigestManager.instantiate(ledgerId, password, digestType);
         this.ledgerKey = MacDigestManager.genDigest("ledger", password);
         distributionSchedule = new RoundRobinDistributionSchedule(
-            metadata.quorumSize, metadata.ensembleSize);
+                metadata.getQuorumSize(), metadata.getEnsembleSize());
     }
 
     /**
@@ -256,17 +257,19 @@ public class LedgerHandle {
         bk.mainWorkerPool.submitOrdered(ledgerId, new SafeRunnable() {
             @Override
             public void safeRun() {
-                final long prevClose;
+                final long prevLastEntryId;
                 final long prevLength;
+                final State prevState;
 
                 synchronized(LedgerHandle.this) {
-                    prevClose = metadata.close;
-                    prevLength = metadata.length;
+                    prevState = metadata.getState();
+                    prevLastEntryId = metadata.getLastEntryId();
+                    prevLength = metadata.getLength();
 
                     // synchronized on LedgerHandle.this to ensure that 
                     // lastAddPushed can not be updated after the metadata 
                     // is closed. 
-                    metadata.length = length;
+                    metadata.setLength(length);
 
                     // Close operation is idempotent, so no need to check if we are
                     // already closed
@@ -277,7 +280,7 @@ public class LedgerHandle {
 
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Closing ledger: " + ledgerId + " at entryId: "
-                              + metadata.close + " with this many bytes: " + metadata.length);
+                              + metadata.getLastEntryId() + " with this many bytes: " + metadata.getLength());
                 }
 
                 final class CloseCb implements GenericCallback<Void> {
@@ -292,15 +295,19 @@ public class LedgerHandle {
                                                   + " when closing, code=" + newrc);
                                         cb.closeComplete(rc, LedgerHandle.this, ctx);
                                     } else {
-                                        metadata.close(prevClose);
-                                        metadata.length = prevLength;
+                                        metadata.setState(prevState);
+                                        if (prevState.equals(State.CLOSED)) {
+                                            metadata.close(prevLastEntryId);
+                                        }
+
+                                        metadata.setLength(prevLength);
                                         if (metadata.resolveConflict(newMeta)) {
-                                            metadata.length = length;
+                                            metadata.setLength(length);
                                             metadata.close(lastAddConfirmed);
                                             writeLedgerConfig(new CloseCb());
                                             return;
                                         } else {
-                                            metadata.length = length;
+                                            metadata.setLength(length);
                                             metadata.close(lastAddConfirmed);
                                             LOG.warn("Conditional update ledger metadata for ledger " + ledgerId + " failed.");
                                             cb.closeComplete(rc, LedgerHandle.this, ctx);
@@ -735,8 +742,8 @@ public class LedgerHandle {
 
     synchronized void recover(final GenericCallback<Void> cb) {
         if (metadata.isClosed()) {
-            lastAddConfirmed = lastAddPushed = metadata.close;
-            length = metadata.length;
+            lastAddConfirmed = lastAddPushed = metadata.getLastEntryId();
+            length = metadata.getLength();
 
             // We are already closed, nothing to do
             cb.operationComplete(BKException.Code.OK, null);

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadata.java Wed Jun 27 13:35:11 2012
@@ -18,6 +18,8 @@ package org.apache.bookkeeper.client;
  * limitations under the License.
  */
 
+import java.io.BufferedReader;
+import java.io.StringReader;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
@@ -27,6 +29,8 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 
 import org.apache.bookkeeper.versioning.Version;
+import com.google.protobuf.TextFormat;
+import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat;
 import org.apache.bookkeeper.util.StringUtils;
 import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
@@ -46,19 +50,21 @@ public class LedgerMetadata {
 
     // can't use -1 for NOTCLOSED because that is reserved for a closed, empty
     // ledger
-    public static final int NOTCLOSED = -101;
-    public static final int IN_RECOVERY = -102;
+    private static final int NOTCLOSED = -101;
+    private static final int IN_RECOVERY = -102;
 
     public static final int LOWEST_COMPAT_METADATA_FORMAT_VERSION = 0;
-    public static final int CURRENT_METADATA_FORMAT_VERSION = 1;
+    public static final int CURRENT_METADATA_FORMAT_VERSION = 2;
     public static final String VERSION_KEY = "BookieMetadataFormatVersion";
 
-    int metadataFormatVersion = 0;
+    private int metadataFormatVersion = 0;
 
-    int ensembleSize;
-    int quorumSize;
-    long length;
-    long close;
+    private int ensembleSize;
+    private int quorumSize;
+    private long length;
+    private long lastEntryId;
+
+    private LedgerMetadataFormat.State state;
     private SortedMap<Long, ArrayList<InetSocketAddress>> ensembles = new TreeMap<Long, ArrayList<InetSocketAddress>>();
     ArrayList<InetSocketAddress> currentEnsemble;
     volatile Version version = null;
@@ -72,7 +78,8 @@ public class LedgerMetadata {
          * we read it in LedgerRecoveryOp.readComplete.
          */
         this.length = 0;
-        this.close = NOTCLOSED;
+        this.state = LedgerMetadataFormat.State.OPEN;
+        this.lastEntryId = LedgerHandle.INVALID_ENTRY_ID;
         this.metadataFormatVersion = CURRENT_METADATA_FORMAT_VERSION;
     };
 
@@ -91,21 +98,49 @@ public class LedgerMetadata {
         return ensembles;
     }
 
-    boolean isClosed() {
-        return close != NOTCLOSED 
-            && close != IN_RECOVERY;
+    public int getEnsembleSize() {
+        return ensembleSize;
+    }
+
+    public int getQuorumSize() {
+        return quorumSize;
+    }
+
+    public long getLastEntryId() {
+        return lastEntryId;
+    }
+
+    public long getLength() {
+        return length;
+    }
+
+    void setLength(long length) {
+        this.length = length;
+    }
+
+    public boolean isClosed() {
+        return state == LedgerMetadataFormat.State.CLOSED;
+    }
+
+    public boolean isInRecovery() {
+        return state == LedgerMetadataFormat.State.IN_RECOVERY;
     }
 
-    boolean isInRecovery() {
-        return IN_RECOVERY == close;
+    LedgerMetadataFormat.State getState() {
+        return state;
     }
-    
+
+    void setState(LedgerMetadataFormat.State state) {
+        this.state = state;
+    }
+
     void markLedgerInRecovery() {
-        close = IN_RECOVERY;
+        state = LedgerMetadataFormat.State.IN_RECOVERY;
     }
 
     void close(long entryId) {
-        close = entryId;
+        lastEntryId = entryId;
+        state = LedgerMetadataFormat.State.CLOSED;
     }
 
     void addEnsemble(long startEntryId, ArrayList<InetSocketAddress> ensemble) {
@@ -144,6 +179,31 @@ public class LedgerMetadata {
      * @return the metadata serialized into a byte array
      */
     public byte[] serialize() {
+        if (metadataFormatVersion == 1) {
+            return serializeVersion1();
+        }
+        LedgerMetadataFormat.Builder builder = LedgerMetadataFormat.newBuilder();
+        builder.setQuorumSize(quorumSize).setEnsembleSize(ensembleSize).setLength(length)
+            .setState(state).setLastEntryId(lastEntryId);
+        for (Map.Entry<Long, ArrayList<InetSocketAddress>> entry : ensembles.entrySet()) {
+            LedgerMetadataFormat.Segment.Builder segmentBuilder = LedgerMetadataFormat.Segment.newBuilder();
+            segmentBuilder.setFirstEntryId(entry.getKey());
+            for (InetSocketAddress addr : entry.getValue()) {
+                segmentBuilder.addEnsembleMember(addr.getAddress().getHostAddress() + ":" + addr.getPort());
+            }
+            builder.addSegment(segmentBuilder.build());
+        }
+
+        StringBuilder s = new StringBuilder();
+        s.append(VERSION_KEY).append(tSplitter).append(CURRENT_METADATA_FORMAT_VERSION).append(lSplitter);
+        s.append(TextFormat.printToString(builder.build()));
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Serialized config: " + s.toString());
+        }
+        return s.toString().getBytes();
+    }
+
+    private byte[] serializeVersion1() {
         StringBuilder s = new StringBuilder();
         s.append(VERSION_KEY).append(tSplitter).append(metadataFormatVersion).append(lSplitter);
         s.append(quorumSize).append(lSplitter).append(ensembleSize).append(lSplitter).append(length);
@@ -156,8 +216,10 @@ public class LedgerMetadata {
             }
         }
 
-        if (close != NOTCLOSED) {
-            s.append(lSplitter).append(close).append(tSplitter).append(closed);
+        if (state == LedgerMetadataFormat.State.IN_RECOVERY) {
+            s.append(lSplitter).append(IN_RECOVERY).append(tSplitter).append(closed);
+        } else if (state == LedgerMetadataFormat.State.CLOSED) {
+            s.append(lSplitter).append(getLastEntryId()).append(tSplitter).append(closed);
         }
 
         if (LOG.isDebugEnabled()) {
@@ -170,7 +232,7 @@ public class LedgerMetadata {
     /**
      * Parses a given byte array and transforms into a LedgerConfig object
      *
-     * @param array
+     * @param bytes
      *            byte array to parse
      * @param version
      *            version of the ledger metadata
@@ -179,47 +241,83 @@ public class LedgerMetadata {
      *             if the given byte[] cannot be parsed
      */
     public static LedgerMetadata parseConfig(byte[] bytes, Version version) throws IOException {
-
         LedgerMetadata lc = new LedgerMetadata();
+        lc.version = version;
+
         String config = new String(bytes);
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("Parsing Config: " + config);
         }
-        
-        String lines[] = config.split(lSplitter);
-        
-        try {
-            int i = 0;
-            if (lines[0].startsWith(VERSION_KEY)) {
-                String parts[] = lines[0].split(tSplitter);
-                lc.metadataFormatVersion = new Integer(parts[1]);
-                i++;
-            } else {
-                lc.metadataFormatVersion = 0;
-            }
-            
-            if (lc.metadataFormatVersion < LOWEST_COMPAT_METADATA_FORMAT_VERSION
-                || lc.metadataFormatVersion > CURRENT_METADATA_FORMAT_VERSION) {
-                throw new IOException("Metadata version not compatible. Expected between "
-                        + LOWEST_COMPAT_METADATA_FORMAT_VERSION + " and " + CURRENT_METADATA_FORMAT_VERSION
-                        + ", but got " + lc.metadataFormatVersion);
-            }
-            if ((lines.length+i) < 2) {
-                throw new IOException("Quorum size or ensemble size absent from config: " + config);
-            }
+        BufferedReader reader = new BufferedReader(new StringReader(config));
+        String versionLine = reader.readLine();
+
+        int i = 0;
+        if (versionLine.startsWith(VERSION_KEY)) {
+            String parts[] = versionLine.split(tSplitter);
+            lc.metadataFormatVersion = new Integer(parts[1]);
+        } else {
+            // if no version is set, take it to be version 1
+            // as the parsing is the same as what we had before
+            // we introduce versions
+            lc.metadataFormatVersion = 1;
+            // reset the reader
+            reader.close();
+            reader = new BufferedReader(new StringReader(config));
+        }
+
+        if (lc.metadataFormatVersion < LOWEST_COMPAT_METADATA_FORMAT_VERSION
+            || lc.metadataFormatVersion > CURRENT_METADATA_FORMAT_VERSION) {
+            throw new IOException("Metadata version not compatible. Expected between "
+                    + LOWEST_COMPAT_METADATA_FORMAT_VERSION + " and " + CURRENT_METADATA_FORMAT_VERSION
+                                  + ", but got " + lc.metadataFormatVersion);
+        }
 
-            lc.version = version;
-            lc.quorumSize = new Integer(lines[i++]);
-            lc.ensembleSize = new Integer(lines[i++]);
-            lc.length = new Long(lines[i++]);
+        if (lc.metadataFormatVersion == 1) {
+            return parseVersion1Config(lc, reader);
+        }
+
+        LedgerMetadataFormat.Builder builder = LedgerMetadataFormat.newBuilder();
+        TextFormat.merge(reader, builder);
+        LedgerMetadataFormat data = builder.build();
+        lc.quorumSize = data.getQuorumSize();
+        lc.ensembleSize = data.getEnsembleSize();
+        lc.length = data.getLength();
+        lc.state = data.getState();
+        lc.lastEntryId = data.getLastEntryId();
+
+        for (LedgerMetadataFormat.Segment s : data.getSegmentList()) {
+            ArrayList<InetSocketAddress> addrs = new ArrayList<InetSocketAddress>();
+            for (String member : s.getEnsembleMemberList()) {
+                addrs.add(StringUtils.parseAddr(member));
+            }
+            lc.addEnsemble(s.getFirstEntryId(), addrs);
+        }
+        return lc;
+    }
 
-            for (; i < lines.length; i++) {
-                String parts[] = lines[i].split(tSplitter);
+    static LedgerMetadata parseVersion1Config(LedgerMetadata lc,
+                                              BufferedReader reader) throws IOException {
+        try {
+            lc.quorumSize = new Integer(reader.readLine());
+            lc.ensembleSize = new Integer(reader.readLine());
+            lc.length = new Long(reader.readLine());
+
+            String line = reader.readLine();
+            while (line != null) {
+                String parts[] = line.split(tSplitter);
 
                 if (parts[1].equals(closed)) {
-                    lc.close = new Long(parts[0]);
+                    Long l = new Long(parts[0]);
+                    if (l == IN_RECOVERY) {
+                        lc.state = LedgerMetadataFormat.State.IN_RECOVERY;
+                    } else {
+                        lc.state = LedgerMetadataFormat.State.CLOSED;
+                        lc.lastEntryId = l;
+                    }
                     break;
+                } else {
+                    lc.state = LedgerMetadataFormat.State.OPEN;
                 }
 
                 ArrayList<InetSocketAddress> addrs = new ArrayList<InetSocketAddress>();
@@ -227,13 +325,13 @@ public class LedgerMetadata {
                     addrs.add(StringUtils.parseAddr(parts[j]));
                 }
                 lc.addEnsemble(new Long(parts[0]), addrs);
+                line = reader.readLine();
             }
         } catch (NumberFormatException e) {
             throw new IOException(e);
         }
         return lc;
     }
-    
 
     /**
      * Updates the version of this metadata.
@@ -270,7 +368,11 @@ public class LedgerMetadata {
             ensembleSize != newMeta.ensembleSize ||
             quorumSize != newMeta.quorumSize ||
             length != newMeta.length ||
-            close != newMeta.close) {
+            state != newMeta.state) {
+            return false;
+        }
+        if (state == LedgerMetadataFormat.State.CLOSED
+            && lastEntryId != newMeta.lastEntryId) {
             return false;
         }
         // new meta znode version should be larger than old one

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java Wed Jun 27 13:35:11 2012
@@ -57,7 +57,7 @@ class LedgerRecoveryOp implements ReadCa
     public LedgerRecoveryOp(LedgerHandle lh, GenericCallback<Void> cb) {
         this.cb = cb;
         this.lh = lh;
-        numResponsesPending = lh.metadata.ensembleSize;
+        numResponsesPending = lh.metadata.getEnsembleSize();
     }
 
     public void initiate() {

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java Wed Jun 27 13:35:11 2012
@@ -53,7 +53,7 @@ class PendingAddOp implements WriteCallb
         this.ctx = ctx;
         this.entryId = LedgerHandle.INVALID_ENTRY_ID;
         
-        successesSoFar = new boolean[lh.metadata.quorumSize];
+        successesSoFar = new boolean[lh.metadata.getQuorumSize()];
         numResponsesPending = successesSoFar.length;
     }
 

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java Wed Jun 27 13:35:11 2012
@@ -94,7 +94,7 @@ class PendingReadOp implements Enumerati
     }
 
     void sendRead(ArrayList<InetSocketAddress> ensemble, LedgerEntry entry, int lastErrorCode) {
-        if (entry.nextReplicaIndexToReadFrom >= lh.metadata.quorumSize) {
+        if (entry.nextReplicaIndexToReadFrom >= lh.metadata.getQuorumSize()) {
             // we are done, the read has failed from all replicas, just fail the
             // read
             lh.opCounterSem.release();

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java?rev=1354492&r1=1354491&r2=1354492&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java Wed Jun 27 13:35:11 2012
@@ -51,7 +51,7 @@ class ReadLastConfirmedOp implements Rea
         this.cb = cb;
         this.maxRecoveredData = new RecoveryData(LedgerHandle.INVALID_ENTRY_ID, 0);
         this.lh = lh;
-        this.numResponsesPending = lh.metadata.ensembleSize;
+        this.numResponsesPending = lh.metadata.getEnsembleSize();
         this.coverageSet = lh.distributionSchedule.getCoverageSet();
     }
 

Added: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DataFormats.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DataFormats.java?rev=1354492&view=auto
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DataFormats.java (added)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DataFormats.java Wed Jun 27 13:35:11 2012
@@ -0,0 +1,1493 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: src/main/proto/DataFormats.proto
+
+package org.apache.bookkeeper.proto;
+
+public final class DataFormats {
+  private DataFormats() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface LedgerMetadataFormatOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // required int32 quorumSize = 1;
+    boolean hasQuorumSize();
+    int getQuorumSize();
+    
+    // required int32 ensembleSize = 2;
+    boolean hasEnsembleSize();
+    int getEnsembleSize();
+    
+    // required int64 length = 3;
+    boolean hasLength();
+    long getLength();
+    
+    // optional int64 lastEntryId = 4;
+    boolean hasLastEntryId();
+    long getLastEntryId();
+    
+    // required .LedgerMetadataFormat.State state = 5 [default = OPEN];
+    boolean hasState();
+    org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State getState();
+    
+    // repeated .LedgerMetadataFormat.Segment segment = 6;
+    java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> 
+        getSegmentList();
+    org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment getSegment(int index);
+    int getSegmentCount();
+    java.util.List<? extends org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder> 
+        getSegmentOrBuilderList();
+    org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder getSegmentOrBuilder(
+        int index);
+  }
+  public static final class LedgerMetadataFormat extends
+      com.google.protobuf.GeneratedMessage
+      implements LedgerMetadataFormatOrBuilder {
+    // Use LedgerMetadataFormat.newBuilder() to construct.
+    private LedgerMetadataFormat(Builder builder) {
+      super(builder);
+    }
+    private LedgerMetadataFormat(boolean noInit) {}
+    
+    private static final LedgerMetadataFormat defaultInstance;
+    public static LedgerMetadataFormat getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public LedgerMetadataFormat getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_fieldAccessorTable;
+    }
+    
+    public enum State
+        implements com.google.protobuf.ProtocolMessageEnum {
+      OPEN(0, 1),
+      IN_RECOVERY(1, 2),
+      CLOSED(2, 3),
+      ;
+      
+      public static final int OPEN_VALUE = 1;
+      public static final int IN_RECOVERY_VALUE = 2;
+      public static final int CLOSED_VALUE = 3;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static State valueOf(int value) {
+        switch (value) {
+          case 1: return OPEN;
+          case 2: return IN_RECOVERY;
+          case 3: return CLOSED;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<State>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<State>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<State>() {
+              public State findValueByNumber(int number) {
+                return State.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final State[] VALUES = {
+        OPEN, IN_RECOVERY, CLOSED, 
+      };
+      
+      public static State valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private State(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:LedgerMetadataFormat.State)
+    }
+    
+    public interface SegmentOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // repeated string ensembleMember = 1;
+      java.util.List<String> getEnsembleMemberList();
+      int getEnsembleMemberCount();
+      String getEnsembleMember(int index);
+      
+      // required int64 firstEntryId = 2;
+      boolean hasFirstEntryId();
+      long getFirstEntryId();
+    }
+    public static final class Segment extends
+        com.google.protobuf.GeneratedMessage
+        implements SegmentOrBuilder {
+      // Use Segment.newBuilder() to construct.
+      private Segment(Builder builder) {
+        super(builder);
+      }
+      private Segment(boolean noInit) {}
+      
+      private static final Segment defaultInstance;
+      public static Segment getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public Segment getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_Segment_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_Segment_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // repeated string ensembleMember = 1;
+      public static final int ENSEMBLEMEMBER_FIELD_NUMBER = 1;
+      private com.google.protobuf.LazyStringList ensembleMember_;
+      public java.util.List<String>
+          getEnsembleMemberList() {
+        return ensembleMember_;
+      }
+      public int getEnsembleMemberCount() {
+        return ensembleMember_.size();
+      }
+      public String getEnsembleMember(int index) {
+        return ensembleMember_.get(index);
+      }
+      
+      // required int64 firstEntryId = 2;
+      public static final int FIRSTENTRYID_FIELD_NUMBER = 2;
+      private long firstEntryId_;
+      public boolean hasFirstEntryId() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public long getFirstEntryId() {
+        return firstEntryId_;
+      }
+      
+      private void initFields() {
+        ensembleMember_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        firstEntryId_ = 0L;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasFirstEntryId()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        for (int i = 0; i < ensembleMember_.size(); i++) {
+          output.writeBytes(1, ensembleMember_.getByteString(i));
+        }
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeInt64(2, firstEntryId_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        {
+          int dataSize = 0;
+          for (int i = 0; i < ensembleMember_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeBytesSizeNoTag(ensembleMember_.getByteString(i));
+          }
+          size += dataSize;
+          size += 1 * getEnsembleMemberList().size();
+        }
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt64Size(2, firstEntryId_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_Segment_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_Segment_fieldAccessorTable;
+        }
+        
+        // Construct using org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          ensembleMember_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          firstEntryId_ = 0L;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.getDescriptor();
+        }
+        
+        public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment getDefaultInstanceForType() {
+          return org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.getDefaultInstance();
+        }
+        
+        public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment build() {
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment buildPartial() {
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment result = new org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            ensembleMember_ = new com.google.protobuf.UnmodifiableLazyStringList(
+                ensembleMember_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.ensembleMember_ = ensembleMember_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.firstEntryId_ = firstEntryId_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment) {
+            return mergeFrom((org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment other) {
+          if (other == org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.getDefaultInstance()) return this;
+          if (!other.ensembleMember_.isEmpty()) {
+            if (ensembleMember_.isEmpty()) {
+              ensembleMember_ = other.ensembleMember_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureEnsembleMemberIsMutable();
+              ensembleMember_.addAll(other.ensembleMember_);
+            }
+            onChanged();
+          }
+          if (other.hasFirstEntryId()) {
+            setFirstEntryId(other.getFirstEntryId());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasFirstEntryId()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                ensureEnsembleMemberIsMutable();
+                ensembleMember_.add(input.readBytes());
+                break;
+              }
+              case 16: {
+                bitField0_ |= 0x00000002;
+                firstEntryId_ = input.readInt64();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // repeated string ensembleMember = 1;
+        private com.google.protobuf.LazyStringList ensembleMember_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        private void ensureEnsembleMemberIsMutable() {
+          if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+            ensembleMember_ = new com.google.protobuf.LazyStringArrayList(ensembleMember_);
+            bitField0_ |= 0x00000001;
+           }
+        }
+        public java.util.List<String>
+            getEnsembleMemberList() {
+          return java.util.Collections.unmodifiableList(ensembleMember_);
+        }
+        public int getEnsembleMemberCount() {
+          return ensembleMember_.size();
+        }
+        public String getEnsembleMember(int index) {
+          return ensembleMember_.get(index);
+        }
+        public Builder setEnsembleMember(
+            int index, String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureEnsembleMemberIsMutable();
+          ensembleMember_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addEnsembleMember(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureEnsembleMemberIsMutable();
+          ensembleMember_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllEnsembleMember(
+            java.lang.Iterable<String> values) {
+          ensureEnsembleMemberIsMutable();
+          super.addAll(values, ensembleMember_);
+          onChanged();
+          return this;
+        }
+        public Builder clearEnsembleMember() {
+          ensembleMember_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+          return this;
+        }
+        void addEnsembleMember(com.google.protobuf.ByteString value) {
+          ensureEnsembleMemberIsMutable();
+          ensembleMember_.add(value);
+          onChanged();
+        }
+        
+        // required int64 firstEntryId = 2;
+        private long firstEntryId_ ;
+        public boolean hasFirstEntryId() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public long getFirstEntryId() {
+          return firstEntryId_;
+        }
+        public Builder setFirstEntryId(long value) {
+          bitField0_ |= 0x00000002;
+          firstEntryId_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearFirstEntryId() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          firstEntryId_ = 0L;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:LedgerMetadataFormat.Segment)
+      }
+      
+      static {
+        defaultInstance = new Segment(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:LedgerMetadataFormat.Segment)
+    }
+    
+    private int bitField0_;
+    // required int32 quorumSize = 1;
+    public static final int QUORUMSIZE_FIELD_NUMBER = 1;
+    private int quorumSize_;
+    public boolean hasQuorumSize() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public int getQuorumSize() {
+      return quorumSize_;
+    }
+    
+    // required int32 ensembleSize = 2;
+    public static final int ENSEMBLESIZE_FIELD_NUMBER = 2;
+    private int ensembleSize_;
+    public boolean hasEnsembleSize() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public int getEnsembleSize() {
+      return ensembleSize_;
+    }
+    
+    // required int64 length = 3;
+    public static final int LENGTH_FIELD_NUMBER = 3;
+    private long length_;
+    public boolean hasLength() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public long getLength() {
+      return length_;
+    }
+    
+    // optional int64 lastEntryId = 4;
+    public static final int LASTENTRYID_FIELD_NUMBER = 4;
+    private long lastEntryId_;
+    public boolean hasLastEntryId() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public long getLastEntryId() {
+      return lastEntryId_;
+    }
+    
+    // required .LedgerMetadataFormat.State state = 5 [default = OPEN];
+    public static final int STATE_FIELD_NUMBER = 5;
+    private org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State state_;
+    public boolean hasState() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State getState() {
+      return state_;
+    }
+    
+    // repeated .LedgerMetadataFormat.Segment segment = 6;
+    public static final int SEGMENT_FIELD_NUMBER = 6;
+    private java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> segment_;
+    public java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> getSegmentList() {
+      return segment_;
+    }
+    public java.util.List<? extends org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder> 
+        getSegmentOrBuilderList() {
+      return segment_;
+    }
+    public int getSegmentCount() {
+      return segment_.size();
+    }
+    public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment getSegment(int index) {
+      return segment_.get(index);
+    }
+    public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder getSegmentOrBuilder(
+        int index) {
+      return segment_.get(index);
+    }
+    
+    private void initFields() {
+      quorumSize_ = 0;
+      ensembleSize_ = 0;
+      length_ = 0L;
+      lastEntryId_ = 0L;
+      state_ = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State.OPEN;
+      segment_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (!hasQuorumSize()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasEnsembleSize()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasLength()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasState()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      for (int i = 0; i < getSegmentCount(); i++) {
+        if (!getSegment(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt32(1, quorumSize_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeInt32(2, ensembleSize_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeInt64(3, length_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeInt64(4, lastEntryId_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeEnum(5, state_.getNumber());
+      }
+      for (int i = 0; i < segment_.size(); i++) {
+        output.writeMessage(6, segment_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, quorumSize_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, ensembleSize_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(3, length_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(4, lastEntryId_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(5, state_.getNumber());
+      }
+      for (int i = 0; i < segment_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, segment_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormatOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.bookkeeper.proto.DataFormats.internal_static_LedgerMetadataFormat_fieldAccessorTable;
+      }
+      
+      // Construct using org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getSegmentFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        quorumSize_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        ensembleSize_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        length_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        lastEntryId_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        state_ = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State.OPEN;
+        bitField0_ = (bitField0_ & ~0x00000010);
+        if (segmentBuilder_ == null) {
+          segment_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+        } else {
+          segmentBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.getDescriptor();
+      }
+      
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat getDefaultInstanceForType() {
+        return org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.getDefaultInstance();
+      }
+      
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat build() {
+        org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat buildPartial() {
+        org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat result = new org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.quorumSize_ = quorumSize_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.ensembleSize_ = ensembleSize_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.length_ = length_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.lastEntryId_ = lastEntryId_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.state_ = state_;
+        if (segmentBuilder_ == null) {
+          if (((bitField0_ & 0x00000020) == 0x00000020)) {
+            segment_ = java.util.Collections.unmodifiableList(segment_);
+            bitField0_ = (bitField0_ & ~0x00000020);
+          }
+          result.segment_ = segment_;
+        } else {
+          result.segment_ = segmentBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat) {
+          return mergeFrom((org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat other) {
+        if (other == org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.getDefaultInstance()) return this;
+        if (other.hasQuorumSize()) {
+          setQuorumSize(other.getQuorumSize());
+        }
+        if (other.hasEnsembleSize()) {
+          setEnsembleSize(other.getEnsembleSize());
+        }
+        if (other.hasLength()) {
+          setLength(other.getLength());
+        }
+        if (other.hasLastEntryId()) {
+          setLastEntryId(other.getLastEntryId());
+        }
+        if (other.hasState()) {
+          setState(other.getState());
+        }
+        if (segmentBuilder_ == null) {
+          if (!other.segment_.isEmpty()) {
+            if (segment_.isEmpty()) {
+              segment_ = other.segment_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+            } else {
+              ensureSegmentIsMutable();
+              segment_.addAll(other.segment_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.segment_.isEmpty()) {
+            if (segmentBuilder_.isEmpty()) {
+              segmentBuilder_.dispose();
+              segmentBuilder_ = null;
+              segment_ = other.segment_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+              segmentBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getSegmentFieldBuilder() : null;
+            } else {
+              segmentBuilder_.addAllMessages(other.segment_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (!hasQuorumSize()) {
+          
+          return false;
+        }
+        if (!hasEnsembleSize()) {
+          
+          return false;
+        }
+        if (!hasLength()) {
+          
+          return false;
+        }
+        if (!hasState()) {
+          
+          return false;
+        }
+        for (int i = 0; i < getSegmentCount(); i++) {
+          if (!getSegment(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              quorumSize_ = input.readInt32();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              ensembleSize_ = input.readInt32();
+              break;
+            }
+            case 24: {
+              bitField0_ |= 0x00000004;
+              length_ = input.readInt64();
+              break;
+            }
+            case 32: {
+              bitField0_ |= 0x00000008;
+              lastEntryId_ = input.readInt64();
+              break;
+            }
+            case 40: {
+              int rawValue = input.readEnum();
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State value = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(5, rawValue);
+              } else {
+                bitField0_ |= 0x00000010;
+                state_ = value;
+              }
+              break;
+            }
+            case 50: {
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder subBuilder = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addSegment(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // required int32 quorumSize = 1;
+      private int quorumSize_ ;
+      public boolean hasQuorumSize() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public int getQuorumSize() {
+        return quorumSize_;
+      }
+      public Builder setQuorumSize(int value) {
+        bitField0_ |= 0x00000001;
+        quorumSize_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearQuorumSize() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        quorumSize_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // required int32 ensembleSize = 2;
+      private int ensembleSize_ ;
+      public boolean hasEnsembleSize() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getEnsembleSize() {
+        return ensembleSize_;
+      }
+      public Builder setEnsembleSize(int value) {
+        bitField0_ |= 0x00000002;
+        ensembleSize_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearEnsembleSize() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        ensembleSize_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // required int64 length = 3;
+      private long length_ ;
+      public boolean hasLength() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public long getLength() {
+        return length_;
+      }
+      public Builder setLength(long value) {
+        bitField0_ |= 0x00000004;
+        length_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearLength() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        length_ = 0L;
+        onChanged();
+        return this;
+      }
+      
+      // optional int64 lastEntryId = 4;
+      private long lastEntryId_ ;
+      public boolean hasLastEntryId() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public long getLastEntryId() {
+        return lastEntryId_;
+      }
+      public Builder setLastEntryId(long value) {
+        bitField0_ |= 0x00000008;
+        lastEntryId_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearLastEntryId() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        lastEntryId_ = 0L;
+        onChanged();
+        return this;
+      }
+      
+      // required .LedgerMetadataFormat.State state = 5 [default = OPEN];
+      private org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State state_ = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State.OPEN;
+      public boolean hasState() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State getState() {
+        return state_;
+      }
+      public Builder setState(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000010;
+        state_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearState() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        state_ = org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.State.OPEN;
+        onChanged();
+        return this;
+      }
+      
+      // repeated .LedgerMetadataFormat.Segment segment = 6;
+      private java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> segment_ =
+        java.util.Collections.emptyList();
+      private void ensureSegmentIsMutable() {
+        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
+          segment_ = new java.util.ArrayList<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment>(segment_);
+          bitField0_ |= 0x00000020;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder> segmentBuilder_;
+      
+      public java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> getSegmentList() {
+        if (segmentBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(segment_);
+        } else {
+          return segmentBuilder_.getMessageList();
+        }
+      }
+      public int getSegmentCount() {
+        if (segmentBuilder_ == null) {
+          return segment_.size();
+        } else {
+          return segmentBuilder_.getCount();
+        }
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment getSegment(int index) {
+        if (segmentBuilder_ == null) {
+          return segment_.get(index);
+        } else {
+          return segmentBuilder_.getMessage(index);
+        }
+      }
+      public Builder setSegment(
+          int index, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment value) {
+        if (segmentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSegmentIsMutable();
+          segment_.set(index, value);
+          onChanged();
+        } else {
+          segmentBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setSegment(
+          int index, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder builderForValue) {
+        if (segmentBuilder_ == null) {
+          ensureSegmentIsMutable();
+          segment_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          segmentBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addSegment(org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment value) {
+        if (segmentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSegmentIsMutable();
+          segment_.add(value);
+          onChanged();
+        } else {
+          segmentBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addSegment(
+          int index, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment value) {
+        if (segmentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSegmentIsMutable();
+          segment_.add(index, value);
+          onChanged();
+        } else {
+          segmentBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addSegment(
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder builderForValue) {
+        if (segmentBuilder_ == null) {
+          ensureSegmentIsMutable();
+          segment_.add(builderForValue.build());
+          onChanged();
+        } else {
+          segmentBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addSegment(
+          int index, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder builderForValue) {
+        if (segmentBuilder_ == null) {
+          ensureSegmentIsMutable();
+          segment_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          segmentBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllSegment(
+          java.lang.Iterable<? extends org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment> values) {
+        if (segmentBuilder_ == null) {
+          ensureSegmentIsMutable();
+          super.addAll(values, segment_);
+          onChanged();
+        } else {
+          segmentBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearSegment() {
+        if (segmentBuilder_ == null) {
+          segment_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+          onChanged();
+        } else {
+          segmentBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeSegment(int index) {
+        if (segmentBuilder_ == null) {
+          ensureSegmentIsMutable();
+          segment_.remove(index);
+          onChanged();
+        } else {
+          segmentBuilder_.remove(index);
+        }
+        return this;
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder getSegmentBuilder(
+          int index) {
+        return getSegmentFieldBuilder().getBuilder(index);
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder getSegmentOrBuilder(
+          int index) {
+        if (segmentBuilder_ == null) {
+          return segment_.get(index);  } else {
+          return segmentBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder> 
+           getSegmentOrBuilderList() {
+        if (segmentBuilder_ != null) {
+          return segmentBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(segment_);
+        }
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder addSegmentBuilder() {
+        return getSegmentFieldBuilder().addBuilder(
+            org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.getDefaultInstance());
+      }
+      public org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder addSegmentBuilder(
+          int index) {
+        return getSegmentFieldBuilder().addBuilder(
+            index, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.getDefaultInstance());
+      }
+      public java.util.List<org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder> 
+           getSegmentBuilderList() {
+        return getSegmentFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder> 
+          getSegmentFieldBuilder() {
+        if (segmentBuilder_ == null) {
+          segmentBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder, org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.SegmentOrBuilder>(
+                  segment_,
+                  ((bitField0_ & 0x00000020) == 0x00000020),
+                  getParentForChildren(),
+                  isClean());
+          segment_ = null;
+        }
+        return segmentBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:LedgerMetadataFormat)
+    }
+    
+    static {
+      defaultInstance = new LedgerMetadataFormat(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:LedgerMetadataFormat)
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_LedgerMetadataFormat_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_LedgerMetadataFormat_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_LedgerMetadataFormat_Segment_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_LedgerMetadataFormat_Segment_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n src/main/proto/DataFormats.proto\"\260\002\n\024L" +
+      "edgerMetadataFormat\022\022\n\nquorumSize\030\001 \002(\005\022" +
+      "\024\n\014ensembleSize\030\002 \002(\005\022\016\n\006length\030\003 \002(\003\022\023\n" +
+      "\013lastEntryId\030\004 \001(\003\0220\n\005state\030\005 \002(\0162\033.Ledg" +
+      "erMetadataFormat.State:\004OPEN\022.\n\007segment\030" +
+      "\006 \003(\0132\035.LedgerMetadataFormat.Segment\0327\n\007" +
+      "Segment\022\026\n\016ensembleMember\030\001 \003(\t\022\024\n\014first" +
+      "EntryId\030\002 \002(\003\".\n\005State\022\010\n\004OPEN\020\001\022\017\n\013IN_R" +
+      "ECOVERY\020\002\022\n\n\006CLOSED\020\003B\037\n\033org.apache.book" +
+      "keeper.protoH\001"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_LedgerMetadataFormat_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_LedgerMetadataFormat_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_LedgerMetadataFormat_descriptor,
+              new java.lang.String[] { "QuorumSize", "EnsembleSize", "Length", "LastEntryId", "State", "Segment", },
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.class,
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Builder.class);
+          internal_static_LedgerMetadataFormat_Segment_descriptor =
+            internal_static_LedgerMetadataFormat_descriptor.getNestedTypes().get(0);
+          internal_static_LedgerMetadataFormat_Segment_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_LedgerMetadataFormat_Segment_descriptor,
+              new java.lang.String[] { "EnsembleMember", "FirstEntryId", },
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.class,
+              org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.Segment.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}

Added: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/DataFormats.proto
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/DataFormats.proto?rev=1354492&view=auto
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/DataFormats.proto (added)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/proto/DataFormats.proto Wed Jun 27 13:35:11 2012
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+option java_package = "org.apache.bookkeeper.proto";
+option optimize_for = SPEED;
+
+/**
+* Metadata format for storing ledger information
+*/
+message LedgerMetadataFormat {
+    required int32 quorumSize = 1;
+    required int32 ensembleSize = 2;
+    required int64 length = 3;
+    optional int64 lastEntryId = 4;
+
+    enum State {
+        OPEN = 1;
+        IN_RECOVERY = 2;
+        CLOSED = 3;
+    }
+    required State state = 5 [default = OPEN];
+
+    message Segment {
+        repeated string ensembleMember = 1;
+        required int64 firstEntryId = 2; 
+    }
+    repeated Segment segment = 6;
+}
\ No newline at end of file