http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperOverview.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperOverview.html 
b/content/doc/r3.5.4-beta/bookkeeperOverview.html
new file mode 100644
index 0000000..645f651
--- /dev/null
+++ b/content/doc/r3.5.4-beta/bookkeeperOverview.html
@@ -0,0 +1,694 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>BookKeeper overview</title>
+<link type="text/css" href="skin/basic.css" rel="stylesheet">
+<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
+<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
+<link type="text/css" href="skin/profile.css" rel="stylesheet">
+<script src="skin/getBlank.js" language="javascript" 
type="text/javascript"></script><script src="skin/getMenu.js" 
language="javascript" type="text/javascript"></script><script 
src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
+<link rel="shortcut icon" href="images/favicon.ico">
+</head>
+<body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<div id="top">
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+<a href="http://www.apache.org/";>Apache</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a><script 
src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
+</div>
+<!--+
+    |header
+    +-->
+<div class="header">
+<!--+
+    |start group logo
+    +-->
+<div class="grouplogo">
+<a href="http://hadoop.apache.org/";><img class="logoImage" alt="Hadoop" 
src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
+</div>
+<!--+
+    |end group logo
+    +-->
+<!--+
+    |start Project Logo
+    +-->
+<div class="projectlogo">
+<a href="http://zookeeper.apache.org/";><img class="logoImage" alt="ZooKeeper" 
src="images/zookeeper_small.gif" title="ZooKeeper: distributed 
coordination"></a>
+</div>
+<!--+
+    |end Project Logo
+    +-->
+<!--+
+    |start Search
+    +-->
+<div class="searchbox">
+<form action="http://www.google.com/search"; method="get" class="roundtopsmall">
+<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input 
onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" 
id="query" type="text" value="Search the site with google">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="unselected" href="http://zookeeper.apache.org/";>Project</a>
+</li>
+<li>
+<a class="unselected" 
href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/";>Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" 
class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" 
class="menutitle">Developer</div>
+<div id="menu_1.2" class="menuitemgroup">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.3', 'skin/')" 
id="menu_selected_1.3Title" class="menutitle" style="background-image: 
url('skin/images/chapter_open.gif');">BookKeeper</div>
+<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: 
block;">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menupage">
+<div class="menupagetitle">Overview</div>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" 
class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" 
class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" 
class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER";>Wiki</a>
+</div>
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ";>FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://zookeeper.apache.org/mailing_lists.html";>Mailing Lists</a>
+</div>
+</div>
+<div id="credit"></div>
+<div id="roundbottom">
+<img style="display: none" class="corner" height="15" width="15" alt="" 
src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
+<!--+
+  |alternative credits
+  +-->
+<div id="credit2"></div>
+</div>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="bookkeeperOverview.pdf"><img alt="PDF -icon" 
src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>BookKeeper overview</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_Overview">BookKeeper overview</a>
+<ul class="minitoc">
+<li>
+<a href="#bk_Intro">BookKeeper introduction</a>
+</li>
+<li>
+<a href="#bk_moreDetail">In slightly more detail...</a>
+</li>
+<li>
+<a href="#bk_basicComponents">Bookkeeper elements and concepts</a>
+</li>
+<li>
+<a href="#bk_initialDesign">Bookkeeper initial design</a>
+</li>
+<li>
+<a href="#bk_metadata">Bookkeeper metadata management</a>
+</li>
+<li>
+<a href="#bk_closingOut">Closing out ledgers</a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+  
+<a name="bk_Overview"></a>
+<h2 class="h3">BookKeeper overview</h2>
+<div class="section">
+<a name="bk_Intro"></a>
+<h3 class="h4">BookKeeper introduction</h3>
+<p>
+       BookKeeper is a replicated service to reliably log streams of records. 
In BookKeeper, 
+       servers are "bookies", log streams are "ledgers", and each unit of a 
log (aka record) is a 
+       "ledger entry". BookKeeper is designed to be reliable; bookies, the 
servers that store 
+       ledgers, can crash, corrupt data, discard data, but as long as there 
are enough bookies 
+       behaving correctly the service as a whole behaves correctly.
+       </p>
+<p>
+    The initial motivation for BookKeeper comes from the namenode of HDFS. 
Namenodes have to 
+    log operations in a reliable fashion so that recovery is possible in the 
case of crashes. 
+    We have found the applications for BookKeeper extend far beyond HDFS, 
however. Essentially, 
+    any application that requires an append storage can replace their 
implementations with
+    BookKeeper. BookKeeper has the advantage of scaling throughput with the 
number of servers. 
+    </p>
+<p>
+    At a high level, a bookkeeper client receives entries from a client 
application and stores it to
+    sets of bookies, and there are a few advantages in having such a service:
+       </p>
+<ul>
+    
+<li>
+    
+<p>
+       We can use hardware that is optimized for such a service. We currently 
believe that such a
+       system has to be optimized only for disk I/O;
+    </p>
+    
+</li>
+    
+    
+<li>
+    
+<p>
+       We can have a pool of servers implementing such a log system, and 
shared among a number of servers;
+    </p>
+    
+</li>
+    
+    
+<li>
+    
+<p>
+       We can have a higher degree of replication with such a pool, which 
makes sense if the hardware necessary for it is cheaper compared to the one the 
application uses. 
+       </p>
+       
+</li>
+       
+</ul>
+<a name="bk_moreDetail"></a>
+<h3 class="h4">In slightly more detail...</h3>
+<p> BookKeeper implements highly available logs, and it has been designed with 
write-ahead logging in mind. Besides high availability
+    due to the replicated nature of the service, it provides high throughput 
due to striping. As we write entries in a subset of bookies of an
+    ensemble and rotate writes across available quorums, we are able to 
increase throughput with the number of servers for both reads and writes. 
+    Scalability is a property that is possible to achieve in this case due to 
the use of quorums. Other replication techniques, such as 
+    state-machine replication, do not enable such a property. 
+    </p>
+<p> An application first creates a ledger before writing to bookies through a 
local BookKeeper client instance.   
+       Upon creating a ledger, a BookKeeper client writes metadata about the 
ledger to ZooKeeper. Each ledger currently 
+       has a single writer. This writer has to execute a close ledger 
operation before any other client can read from it. 
+       If the writer of a ledger does not close a ledger properly because, for 
example, it has crashed before having the 
+       opportunity of closing the ledger, then the next client that tries to 
open a ledger executes a procedure to recover
+       it. As closing a ledger consists essentially of writing the last entry 
written to a ledger to ZooKeeper, the recovery
+       procedure simply finds the last entry written correctly and writes it 
to ZooKeeper.     
+       </p>
+<p>
+       Note that currently this recovery procedure is executed automatically 
upon trying to open a ledger and no explicit action is necessary. 
+       Although two clients may try to recover a ledger concurrently, only one 
will succeed, the first one that is able to create the close znode
+       for the ledger.
+       </p>
+<a name="bk_basicComponents"></a>
+<h3 class="h4">Bookkeeper elements and concepts</h3>
+<p> 
+       BookKeeper uses four basic elements:
+       </p>
+<ul>
+      
+<li>
+      
+<p> 
+               
+<strong>Ledger</strong>: A ledger is a sequence of entries, and each entry is 
a sequence of bytes. Entries are
+               written sequentially to a ledger and at most once. 
Consequently, ledgers have an append-only semantics;
+         </p>
+         
+</li>
+       
+         
+<li>
+         
+<p> 
+               
+<strong>BookKeeper client</strong>: A client runs along with a BookKeeper 
application, and it enables applications
+               to execute operations on ledgers, such as creating a ledger and 
writing to it; 
+         </p>
+         
+</li> 
+       
+         
+<li>
+         
+<p>
+               
+<strong>Bookie</strong>: A bookie is a BookKeeper storage server. Bookies 
store the content of ledgers. For any given
+               ledger L, we call an <em>ensemble</em> the group of bookies 
storing the content of L. For performance, we store on
+               each bookie of an ensemble only a fragment of a ledger. That 
is, we stripe when writing entries to a ledger such that
+               each entry is written to sub-group of bookies of the ensemble.
+         </p>
+         
+</li>
+
+         
+<li>
+         
+<p>    
+               
+<strong>Metadata storage service</strong>: BookKeeper requires a metadata 
storage service to store information related 
+               to ledgers and available bookies. We currently use ZooKeeper 
for such a task.     
+         </p>
+         
+</li>
+    
+</ul>
+<a name="bk_initialDesign"></a>
+<h3 class="h4">Bookkeeper initial design</h3>
+<p>
+    A set of bookies implements BookKeeper, and we use a quorum-based protocol 
to replicate data across the bookies. 
+    There are basically two operations to an existing ledger: read and append. 
Here is the complete API list 
+    (mode detail <a href="bookkeeperProgrammer.html">
+             here</a>):
+       </p>
+<ul>
+       
+<li>
+       
+<p>
+       Create ledger: creates a new empty ledger; 
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+       Open ledger: opens an existing ledger for reading;
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+       Add entry: adds a record to a ledger either synchronously or 
asynchronously;
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+    Read entries: reads a sequence of entries from a ledger either 
synchronously or asynchronously 
+       </p>
+    
+</li>
+       
+</ul>
+<p>
+       There is only a single client that can write to a ledger. Once that 
ledger is closed or the client fails, 
+       no more entries can be added. (We take advantage of this behavior to 
provide our strong guarantees.) 
+       There will not be gaps in the ledger. Fingers get broken, people get 
roughed up or end up in prison when
+       books are manipulated, so there is no deleting or changing of entries.
+       </p>
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+<tr>
+<td>BookKeeper Overview</td>
+</tr>
+<tr>
+<td>
+        
+            <img alt="" src="images/bk-overview.jpg">
+        
+        </td>
+</tr>
+</table>
+<p>
+    A simple use of BooKeeper is to implement a write-ahead transaction log. A 
server maintains an in-memory data structure
+    (with periodic snapshots for example) and logs changes to that structure 
before it applies the change. The application 
+    server creates a ledger at startup and store the ledger id and password in 
a well known place (ZooKeeper maybe). When 
+    it needs to make a change, the server adds an entry with the change 
information to a ledger and apply the change when 
+    BookKeeper adds the entry successfully. The server can even use 
asyncAddEntry to queue up many changes for high change
+    throughput. BooKeeper meticulously logs the changes in order and call the 
completion functions in order.
+       </p>
+<p>
+    When the application server dies, a backup server will come online, get 
the last snapshot and then it will open the 
+    ledger of the old server and read all the entries from the time the 
snapshot was taken. (Since it doesn't know the 
+    last entry number it will use MAX_INTEGER). Once all the entries have been 
processed, it will close the ledger and 
+    start a new one for its use. 
+       </p>
+<p>
+       A client library takes care of communicating with bookies and managing 
entry numbers. An entry has the following fields:
+       </p>
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+<caption>Entry fields</caption>
+<title>Entry fields</title>
+       
+       
+<tr>
+       
+<th>Field</th>
+       <th>Type</th>
+       <th>Description</th>
+       
+</tr>
+       
+       
+<tr>
+       
+<td>Ledger number</td>
+       <td>long</td>
+       <td>The id of the ledger of this entry</td>
+       
+</tr>
+       
+<tr>
+       
+<td>Entry number</td>
+       <td>long</td>
+       <td>The id of this entry</td>
+       
+</tr>
+       
+       
+<tr>
+       
+<td>last confirmed (<em>LC</em>)</td>
+       <td>long</td>
+       <td>id of the last recorded entry</td>
+       
+</tr>
+       
+<tr>
+       
+<td>data</td>
+       <td>byte[]</td>
+       <td>the entry data (supplied by application)</td>
+       
+</tr>
+       
+<tr>
+       
+<td>authentication code</td>
+       <td>byte[]</td>
+       <td>Message authentication code that includes all other fields of the 
entry</td>
+       
+</tr>
+       
+       
+       
+</table>
+<p>
+       The client library generates a ledger entry. None of the fields are 
modified by the bookies and only the first three 
+       fields are interpreted by the bookies.
+       </p>
+<p>
+       To add to a ledger, the client generates the entry above using the 
ledger number. The entry number will be one more 
+       than the last entry generated. The <em>LC</em> field contains the last 
entry that has been successfully recorded by BookKeeper. 
+       If the client writes entries one at a time, <em>LC</em> is the last 
entry id. But, if the client is using asyncAddEntry, there 
+       may be many entries in flight. An entry is considered recorded when 
both of the following conditions are met:
+       </p>
+<ul>
+       
+<li>
+    
+<p>
+       the entry has been accepted by a quorum of bookies
+    </p>
+    
+</li>
+    
+    
+<li>
+    
+<p>
+       all entries with a lower entry id have been accepted by a quorum of 
bookies 
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+       
+<em>LC</em> seems mysterious right now, but it is too early to explain how we 
use it; just smile and move on.
+       </p>
+<p>
+       Once all the other fields have been field in, the client generates an 
authentication code with all of the previous fields. 
+       The entry is then sent to a quorum of bookies to be recorded. Any 
failures will result in the entry being sent to a new
+       quorum of bookies.
+       </p>
+<p>
+       To read, the client library initially contacts a bookie and starts 
requesting entries. If an entry is missing or 
+       invalid (a bad MAC for example), the client will make a request to a 
different bookie. By using quorum writes, 
+       as long as enough bookies are up we are guaranteed to eventually be 
able to read an entry.
+       </p>
+<a name="bk_metadata"></a>
+<h3 class="h4">Bookkeeper metadata management</h3>
+<p>
+       There are some meta data that needs to be made available to BookKeeper 
clients:
+       </p>
+<ul>
+       
+<li>
+       
+<p>
+               The available bookies;
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p>
+       The list of ledgers;
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+       The list of bookies that have been used for a given ledger;
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+       The last entry of a ledger; 
+       </p>
+       
+</li>
+       
+</ul>
+<p>
+       We maintain this information in ZooKeeper. Bookies use ephemeral nodes 
to indicate their availability. Clients 
+       use znodes to track ledger creation and deletion and also to know the 
end of the ledger and the bookies that 
+       were used to store the ledger. Bookies also watch the ledger list so 
that they can cleanup ledgers that get deleted.
+       </p>
+<a name="bk_closingOut"></a>
+<h3 class="h4">Closing out ledgers</h3>
+<p>
+       The process of closing out the ledger and finding the last ledger is 
difficult due to the durability guarantees of BookKeeper:
+       </p>
+<ul>
+       
+<li>
+       
+<p>
+       If an entry has been successfully recorded, it must be readable.
+    </p>
+    
+</li>
+    
+    
+<li>
+       
+<p>
+       If an entry is read once, it must always be available to be read. 
+       </p>
+       
+</li>
+       
+</ul>
+<p>
+       If the ledger was closed gracefully, ZooKeeper will have the last entry 
and everything will work well. But, if the 
+       BookKeeper client that was writing the ledger dies, there is some 
recovery that needs to take place.
+       </p>
+<p>
+       The problematic entries are the ones at the end of the ledger. There 
can be entries in flight when a BookKeeper client 
+       dies. If the entry only gets to one bookie, the entry should not be 
readable since the entry will disappear if that bookie
+       fails. If the entry is only on one bookie, that doesn't mean that the 
entry has not been recorded successfully; the other
+       bookies that recorded the entry might have failed.
+       </p>
+<p>
+       The trick to making everything work is to have a correct idea of a last 
entry. We do it in roughly three steps:
+       </p>
+<ol>
+       
+<li>
+       
+<p>
+               Find the entry with the highest last recorded entry, 
<em>LC</em>;
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p>
+               Find the highest consecutively recorded entry, <em>LR</em>;
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p>
+               Make sure that all entries between <em>LC</em> and <em>LR</em> 
are on a quorum of bookies; 
+       </p>
+       
+</li>
+       
+       
+</ol>
+</div>  
+
+<p align="right">
+<font size="-2"></font>
+</p>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</div>
+</div>
+<div id="footer">
+<!--+
+    |start bottomstrip
+    +-->
+<div class="lastmodified">
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<div class="copyright">
+        Copyright &copy;
+         2008 <a href="http://www.apache.org/licenses/";>The Apache Software 
Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperOverview.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperOverview.pdf 
b/content/doc/r3.5.4-beta/bookkeeperOverview.pdf
new file mode 100644
index 0000000..80aff7f
Binary files /dev/null and b/content/doc/r3.5.4-beta/bookkeeperOverview.pdf 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperProgrammer.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperProgrammer.html 
b/content/doc/r3.5.4-beta/bookkeeperProgrammer.html
new file mode 100644
index 0000000..acb0b2b
--- /dev/null
+++ b/content/doc/r3.5.4-beta/bookkeeperProgrammer.html
@@ -0,0 +1,1083 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>BookKeeper Getting Started Guide</title>
+<link type="text/css" href="skin/basic.css" rel="stylesheet">
+<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
+<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
+<link type="text/css" href="skin/profile.css" rel="stylesheet">
+<script src="skin/getBlank.js" language="javascript" 
type="text/javascript"></script><script src="skin/getMenu.js" 
language="javascript" type="text/javascript"></script><script 
src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
+<link rel="shortcut icon" href="images/favicon.ico">
+</head>
+<body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<div id="top">
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+<a href="http://www.apache.org/";>Apache</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a><script 
src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
+</div>
+<!--+
+    |header
+    +-->
+<div class="header">
+<!--+
+    |start group logo
+    +-->
+<div class="grouplogo">
+<a href="http://hadoop.apache.org/";><img class="logoImage" alt="Hadoop" 
src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
+</div>
+<!--+
+    |end group logo
+    +-->
+<!--+
+    |start Project Logo
+    +-->
+<div class="projectlogo">
+<a href="http://zookeeper.apache.org/";><img class="logoImage" alt="ZooKeeper" 
src="images/zookeeper_small.gif" title="ZooKeeper: distributed 
coordination"></a>
+</div>
+<!--+
+    |end Project Logo
+    +-->
+<!--+
+    |start Search
+    +-->
+<div class="searchbox">
+<form action="http://www.google.com/search"; method="get" class="roundtopsmall">
+<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input 
onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" 
id="query" type="text" value="Search the site with google">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="unselected" href="http://zookeeper.apache.org/";>Project</a>
+</li>
+<li>
+<a class="unselected" 
href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/";>Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" 
class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" 
class="menutitle">Developer</div>
+<div id="menu_1.2" class="menuitemgroup">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.3', 'skin/')" 
id="menu_selected_1.3Title" class="menutitle" style="background-image: 
url('skin/images/chapter_open.gif');">BookKeeper</div>
+<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: 
block;">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menupage">
+<div class="menupagetitle">Programmer's guide</div>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" 
class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" 
class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" 
class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER";>Wiki</a>
+</div>
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ";>FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://zookeeper.apache.org/mailing_lists.html";>Mailing Lists</a>
+</div>
+</div>
+<div id="credit"></div>
+<div id="roundbottom">
+<img style="display: none" class="corner" height="15" width="15" alt="" 
src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
+<!--+
+  |alternative credits
+  +-->
+<div id="credit2"></div>
+</div>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="bookkeeperProgrammer.pdf"><img alt="PDF -icon" 
src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>BookKeeper Getting Started Guide</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_GettingStarted">Programming with BookKeeper</a>
+<ul class="minitoc">
+<li>
+<a href="#bk_instance"> Instantiating BookKeeper.</a>
+</li>
+<li>
+<a href="#bk_createLedger"> Creating a ledger. </a>
+</li>
+<li>
+<a href="#bk_writeLedger"> Adding entries to a ledger. </a>
+</li>
+<li>
+<a href="#bk_closeLedger"> Closing a ledger. </a>
+</li>
+<li>
+<a href="#bk_openLedger"> Opening a ledger. </a>
+</li>
+<li>
+<a href="#bk_readLedger"> Reading from ledger </a>
+</li>
+<li>
+<a href="#bk_deleteLedger"> Deleting a ledger </a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+  
+<a name="bk_GettingStarted"></a>
+<h2 class="h3">Programming with BookKeeper</h2>
+<div class="section">
+<ul>
+      
+<li>
+        
+<p>
+<a href="#bk_instance"> Instantiating BookKeeper.</a>
+</p>
+      
+</li>
+
+      
+<li>
+        
+<p>
+<a href="#bk_createLedger"> Creating a ledger. </a>
+</p>
+      
+</li>
+
+      
+<li>
+        
+<p>
+<a href="#bk_writeLedger"> Adding entries to a ledger. </a>
+</p>
+      
+</li>
+
+      
+<li>
+        
+<p>
+<a href="#bk_closeLedger"> Closing a ledger. </a>
+</p>
+      
+</li>
+      
+         
+<li>
+        
+<p>
+<a href="#bk_openLedger"> Opening a ledger. </a>
+</p>
+      
+</li>
+      
+      
+<li>
+        
+<p>
+<a href="#bk_readLedger"> Reading from ledger </a>
+</p>
+      
+</li>
+      
+      
+<li>
+        
+<p>
+<a href="#bk_deleteLedger"> Deleting a ledger </a>
+</p>
+      
+</li>
+      
+    
+</ul>
+<a name="bk_instance"></a>
+<h3 class="h4"> Instantiating BookKeeper.</h3>
+<p>
+    The first step to use BookKeeper is to instantiate a BookKeeper object:
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+    org.apache.bookkeeper.BookKeeper
+    </span>
+    
+</p>
+<p>
+    There are three BookKeeper constructors:
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public BookKeeper(String servers) 
+       throws KeeperException, IOException    
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">servers</span> is a comma-separated list 
of ZooKeeper servers.
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public BookKeeper(ZooKeeper zk) 
+       throws InterruptedException, KeeperException    
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">zk</span> is a ZooKeeper object. This 
constructor is useful when
+        the application also using ZooKeeper and wants to have a single 
instance of ZooKeeper.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public BookKeeper(ZooKeeper zk, ClientSocketChannelFactory 
channelFactory) 
+       throws InterruptedException, KeeperException    
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">zk</span> is a ZooKeeper object. This 
constructor is useful when
+        the application also using ZooKeeper and wants to have a single 
instance of ZooKeeper.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">channelFactory</span> is a netty channel 
object 
+        (<span class="codefrag 
computeroutput">org.jboss.netty.channel.socket</span>).  
+       </p>
+       
+</li>
+    
+</ul>
+<a name="bk_createLedger"></a>
+<h3 class="h4"> Creating a ledger. </h3>
+<p> Before writing entries to BookKeeper, it is necessary to create a ledger. 
+    With the current BookKeeper API, it is possible to create a ledger both 
synchronously
+    or asynchronously. The following methods belong
+    to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.BookKeeper</span>.
+    </p>
+<p>
+       
+<strong>Synchronous call:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+    public LedgerHandle createLedger(int ensSize, int qSize, DigestType type,  
byte passwd[])
+        throws KeeperException, InterruptedException, 
+        IOException, BKException
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+       
+<span class="codefrag computeroutput">ensSize</span> is the number of bookies 
(ensemble size);
+       </p>
+       
+</li>
+    
+       
+<li> 
+       
+<p>
+       
+<span class="codefrag computeroutput">qSize</span> is the write quorum size;
+       </p>
+       
+</li>
+    
+       
+<li> 
+       
+<p>
+       
+<span class="codefrag computeroutput">type</span> is the type of digest used 
with entries: either MAC or CRC32.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">passwd</span> is a password that 
authorizes the client to write to the
+       ledger being created.
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    All further operations on a ledger are invoked through the <span 
class="codefrag computeroutput">LedgerHandle</span>
+    object returned.
+    </p>
+<p>
+    As a convenience, we provide a <span class="codefrag 
computeroutput">createLedger</span> with default parameters (3,2,VERIFIABLE), 
+    and the only two input parameters it requires are a digest type and a 
password.
+    </p>
+<p>
+       
+<strong>Asynchronous call:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+    public void asyncCreateLedger(int ensSize, 
+            int qSize, 
+            DigestType type,  
+            byte passwd[],
+            CreateCallback cb,
+            Object ctx
+            )
+    </span>
+       
+</p>
+<p>
+       The parameters are the same of the synchronous version, with the
+       exception of <span class="codefrag computeroutput">cb</span> and <span 
class="codefrag computeroutput">ctx</span>. <span class="codefrag 
computeroutput">CreateCallback</span>
+       is an interface in <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">createComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       void createComplete(int rc, LedgerHandle lh, Object ctx);
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKException</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">lh</span> is a <span class="codefrag 
computeroutput">LedgerHandle</span> object to manipulate a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is a control object for 
accountability purposes. It can be essentially any object the application is 
happy with.
+               </p>
+               
+</li>
+       
+</ul>
+<p>
+       The <span class="codefrag computeroutput">ctx</span> object passed as a 
parameter to the call to create a ledger
+       is the one same returned in the callback.
+    </p>
+<a name="bk_writeLedger"></a>
+<h3 class="h4"> Adding entries to a ledger. </h3>
+<p>
+    Once we have a ledger handle <span class="codefrag 
computeroutput">lh</span> obtained through a call to create a ledger, we
+    can start writing entries. As with creating ledgers, we can write both 
synchronously and 
+    asynchronously. The following methods belong
+    to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.LedgerHandle</span>.
+    </p>
+<p>
+       
+<strong>Synchronous call:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public long addEntry(byte[] data)
+       throws InterruptedException
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+       
+<span class="codefrag computeroutput">data</span> is a byte array;
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+       A call to <span class="codefrag computeroutput">addEntry</span> returns 
the status of the operation (please refer to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+    </p>
+<p>
+       
+<strong>Asynchronous call:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void asyncAddEntry(byte[] data, AddCallback cb, Object ctx)
+    </span>
+       
+</p>
+<p>
+    It also takes a byte array as the sequence of bytes to be stored as an 
entry. Additionaly, it takes
+    a callback object <span class="codefrag computeroutput">cb</span> and a 
control object <span class="codefrag computeroutput">ctx</span>. The callback 
object must implement
+    the <span class="codefrag computeroutput">AddCallback</span> interface in 
<span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">addComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       void addComplete(int rc, LedgerHandle lh, long entryId, Object ctx);
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">lh</span> is a <span class="codefrag 
computeroutput">LedgerHandle</span> object to manipulate a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">entryId</span> is the identifier of 
entry associated with this request;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is control object used for 
accountability purposes. It can be any object the application is happy with.
+               </p>
+               
+</li>
+       
+</ul>
+<a name="bk_closeLedger"></a>
+<h3 class="h4"> Closing a ledger. </h3>
+<p>
+    Once a client is done writing, it closes the ledger. The following methods 
belong
+    to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.LedgerHandle</span>.
+    </p>
+<p>
+       
+<strong>Synchronous close:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void close() 
+    throws InterruptedException
+    </span>
+       
+</p>
+<p>
+    It takes no input parameters.
+    </p>
+<p>
+       
+<strong>Asynchronous close:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void asyncClose(CloseCallback cb, Object ctx)
+    throws InterruptedException
+    </span>
+       
+</p>
+<p>
+    It takes a callback object <span class="codefrag computeroutput">cb</span> 
and a control object <span class="codefrag computeroutput">ctx</span>. The 
callback object must implement
+    the <span class="codefrag computeroutput">CloseCallback</span> interface 
in <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">closeComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       void closeComplete(int rc, LedgerHandle lh, Object ctx)
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">lh</span> is a <span class="codefrag 
computeroutput">LedgerHandle</span> object to manipulate a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is control object used for 
accountability purposes. 
+               </p>
+               
+</li>
+       
+</ul>
+<a name="bk_openLedger"></a>
+<h3 class="h4"> Opening a ledger. </h3>
+<p>
+    To read from a ledger, a client must open it first. The following methods 
belong
+    to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.BookKeeper</span>.
+    </p>
+<p>
+       
+<strong>Synchronous open:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public LedgerHandle openLedger(long lId, DigestType type, byte passwd[])
+    throws InterruptedException, BKException
+    </span>
+       
+</p>
+<ul>
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">ledgerId</span> is the ledger identifier;
+       </p>
+       
+</li>
+       
+       
+<li> 
+    
+<p>
+    
+<span class="codefrag computeroutput">type</span> is the type of digest used 
with entries: either MAC or CRC32.  
+    </p>
+    
+</li>
+       
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">passwd</span> is a password to access 
the ledger (used only in the case of <span class="codefrag 
computeroutput">VERIFIABLE</span> ledgers);
+       </p>
+       
+</li>
+       
+</ul>
+<p>
+       
+<strong>Asynchronous open:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void asyncOpenLedger(long lId, DigestType type, byte passwd[], 
OpenCallback cb, Object ctx)
+    </span>
+       
+</p>
+<p>
+    It also takes a a ledger identifier and a password. Additionaly, it takes 
a callback object 
+    <span class="codefrag computeroutput">cb</span> and a control object <span 
class="codefrag computeroutput">ctx</span>. The callback object must implement
+    the <span class="codefrag computeroutput">OpenCallback</span> interface in 
<span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">openComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       public void openComplete(int rc, LedgerHandle lh, Object ctx)
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">lh</span> is a <span class="codefrag 
computeroutput">LedgerHandle</span> object to manipulate a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is control object used for 
accountability purposes. 
+               </p>
+               
+</li>
+       
+</ul>
+<a name="bk_readLedger"></a>
+<h3 class="h4"> Reading from ledger </h3>
+<p>
+    Read calls may request one or more consecutive entries. The following 
methods belong
+    to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.LedgerHandle</span>.
+    </p>
+<p>
+       
+<strong>Synchronous read:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public Enumeration&lt;LedgerEntry&gt; readEntries(long firstEntry, long 
lastEntry) 
+    throws InterruptedException, BKException
+    </span>
+       
+</p>
+<ul>
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">firstEntry</span> is the identifier of 
the first entry in the sequence of entries to read;
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">lastEntry</span> is the identifier of 
the last entry in the sequence of entries to read.
+       </p>
+       
+</li>
+       
+</ul>
+<p>
+       
+<strong>Asynchronous read:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void asyncReadEntries(long firstEntry, 
+            long lastEntry, ReadCallback cb, Object ctx)
+    throws BKException, InterruptedException
+    </span>
+       
+</p>
+<p>
+    It also takes a first and a last entry identifiers. Additionaly, it takes 
a callback object 
+    <span class="codefrag computeroutput">cb</span> and a control object <span 
class="codefrag computeroutput">ctx</span>. The callback object must implement
+    the <span class="codefrag computeroutput">ReadCallback</span> interface in 
<span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">readComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       void readComplete(int rc, LedgerHandle lh, 
Enumeration&lt;LedgerEntry&gt; seq, Object ctx)
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">lh</span> is a <span class="codefrag 
computeroutput">LedgerHandle</span> object to manipulate a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">seq</span> is a <span class="codefrag 
computeroutput">Enumeration&lt;LedgerEntry&gt; </span> object to containing the 
list of entries requested;
+               </p>
+               
+</li>
+
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is control object used for 
accountability purposes. 
+               </p>
+               
+</li>
+       
+</ul>
+<a name="bk_deleteLedger"></a>
+<h3 class="h4"> Deleting a ledger </h3>
+<p>
+    Once a client is done with a ledger and is sure that nobody will ever need 
to read from it again, they can delete the ledger.
+    The following methods belong to <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.BookKeeper</span>.
+    </p>
+<p>
+       
+<strong>Synchronous delete:</strong>
+       
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+        public void deleteLedger(long lId) throws InterruptedException, 
BKException
+    </span>
+    
+</p>
+<ul>
+       
+<li>
+       
+<p>
+       
+<span class="codefrag computeroutput">lId</span> is the ledger identifier;
+       </p>
+       
+</li>
+       
+</ul>
+<p>
+       
+<strong>Asynchronous delete:</strong>
+    
+</p>
+<p>
+      
+<span class="codefrag computeroutput">
+        public void asyncDeleteLedger(long lId, DeleteCallback cb, Object ctx) 
+      </span>
+    
+</p>
+<p>
+    It takes a ledger identifier. Additionally, it takes a callback object 
+    <span class="codefrag computeroutput">cb</span> and a control object <span 
class="codefrag computeroutput">ctx</span>. The callback object must implement
+    the <span class="codefrag computeroutput">DeleteCallback</span> interface 
in <span class="codefrag 
computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+       a class implementing it has to implement a method called <span 
class="codefrag computeroutput">deleteComplete</span>
+       that has the following signature: 
+    </p>
+<p>
+       
+<span class="codefrag computeroutput">
+       void deleteComplete(int rc, Object ctx)
+       </span>    
+       
+</p>
+<p>
+       where:
+       </p>
+<ul>
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">rc</span> is a return code (please refer 
to <span class="codefrag 
computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+               </p>
+               
+</li>
+       
+               
+<li>
+               
+<p>
+               
+<span class="codefrag computeroutput">ctx</span> is control object used for 
accountability purposes. 
+               </p>
+               
+</li>
+       
+</ul>
+</div>
+
+<p align="right">
+<font size="-2"></font>
+</p>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</div>
+</div>
+<div id="footer">
+<!--+
+    |start bottomstrip
+    +-->
+<div class="lastmodified">
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<div class="copyright">
+        Copyright &copy;
+         2008 <a href="http://www.apache.org/licenses/";>The Apache Software 
Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperProgrammer.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperProgrammer.pdf 
b/content/doc/r3.5.4-beta/bookkeeperProgrammer.pdf
new file mode 100644
index 0000000..8756828
Binary files /dev/null and b/content/doc/r3.5.4-beta/bookkeeperProgrammer.pdf 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperStarted.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperStarted.html 
b/content/doc/r3.5.4-beta/bookkeeperStarted.html
new file mode 100644
index 0000000..d039ef4
--- /dev/null
+++ b/content/doc/r3.5.4-beta/bookkeeperStarted.html
@@ -0,0 +1,448 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>BookKeeper Getting Started Guide</title>
+<link type="text/css" href="skin/basic.css" rel="stylesheet">
+<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
+<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
+<link type="text/css" href="skin/profile.css" rel="stylesheet">
+<script src="skin/getBlank.js" language="javascript" 
type="text/javascript"></script><script src="skin/getMenu.js" 
language="javascript" type="text/javascript"></script><script 
src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
+<link rel="shortcut icon" href="images/favicon.ico">
+</head>
+<body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<div id="top">
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+<a href="http://www.apache.org/";>Apache</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a><script 
src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
+</div>
+<!--+
+    |header
+    +-->
+<div class="header">
+<!--+
+    |start group logo
+    +-->
+<div class="grouplogo">
+<a href="http://hadoop.apache.org/";><img class="logoImage" alt="Hadoop" 
src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
+</div>
+<!--+
+    |end group logo
+    +-->
+<!--+
+    |start Project Logo
+    +-->
+<div class="projectlogo">
+<a href="http://zookeeper.apache.org/";><img class="logoImage" alt="ZooKeeper" 
src="images/zookeeper_small.gif" title="ZooKeeper: distributed 
coordination"></a>
+</div>
+<!--+
+    |end Project Logo
+    +-->
+<!--+
+    |start Search
+    +-->
+<div class="searchbox">
+<form action="http://www.google.com/search"; method="get" class="roundtopsmall">
+<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input 
onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" 
id="query" type="text" value="Search the site with google">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="unselected" href="http://zookeeper.apache.org/";>Project</a>
+</li>
+<li>
+<a class="unselected" 
href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/";>Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" 
class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" 
class="menutitle">Developer</div>
+<div id="menu_1.2" class="menuitemgroup">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.3', 'skin/')" 
id="menu_selected_1.3Title" class="menutitle" style="background-image: 
url('skin/images/chapter_open.gif');">BookKeeper</div>
+<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: 
block;">
+<div class="menupage">
+<div class="menupagetitle">Getting started</div>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" 
class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" 
class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" 
class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER";>Wiki</a>
+</div>
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ";>FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://zookeeper.apache.org/mailing_lists.html";>Mailing Lists</a>
+</div>
+</div>
+<div id="credit"></div>
+<div id="roundbottom">
+<img style="display: none" class="corner" height="15" width="15" alt="" 
src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
+<!--+
+  |alternative credits
+  +-->
+<div id="credit2"></div>
+</div>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="bookkeeperStarted.pdf"><img alt="PDF -icon" 
src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>BookKeeper Getting Started Guide</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_GettingStarted">Getting Started: Setting up BookKeeper to write 
logs.</a>
+<ul class="minitoc">
+<li>
+<a href="#bk_Prerequisites">Pre-requisites</a>
+</li>
+<li>
+<a href="#bk_Download">Download</a>
+</li>
+<li>
+<a href="#bk_localBK">LocalBookKeeper</a>
+</li>
+<li>
+<a href="#bk_setupBookies">Setting up bookies</a>
+</li>
+<li>
+<a href="#bk_setupZK">Setting up ZooKeeper</a>
+</li>
+<li>
+<a href="#bk_example">Example</a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+  
+<a name="bk_GettingStarted"></a>
+<h2 class="h3">Getting Started: Setting up BookKeeper to write logs.</h2>
+<div class="section">
+<p>This document contains information to get you started quickly with
+    BookKeeper. It is aimed primarily at developers willing to try it out, and
+    contains simple installation instructions for a simple BookKeeper 
installation
+    and a simple programming example. For further programming detail, please 
refer to 
+    <a href="bookkeeperProgrammer.html">BookKeeper Programmer's Guide</a>.
+    </p>
+<a name="bk_Prerequisites"></a>
+<h3 class="h4">Pre-requisites</h3>
+<p>See <a href="bookkeeperConfig.html#bk_sysReq">
+             System Requirements</a> in the Admin guide.</p>
+<a name="bk_Download"></a>
+<h3 class="h4">Download</h3>
+<p> BookKeeper is distributed along with ZooKeeper. To get a ZooKeeper 
distribution, 
+                          download a recent
+           <a href="http://zookeeper.apache.org/releases.html";>
+                 stable</a> release from one of the Apache Download
+                Mirrors.</p>
+<a name="bk_localBK"></a>
+<h3 class="h4">LocalBookKeeper</h3>
+<p> Under org.apache.bookkeeper.util, you'll find a java program
+               called LocalBookKeeper.java that sets you up to run BookKeeper 
on a 
+               single machine. This is far from ideal from a performance 
perspective,
+               but the program is useful for both test and educational 
purposes.
+               </p>
+<a name="bk_setupBookies"></a>
+<h3 class="h4">Setting up bookies</h3>
+<p> If you're bold and you want more than just running things locally, then
+               you'll need to run bookies in different servers. You'll need at 
least three bookies
+               to start with.  
+               </p>
+<p>
+               For each bookie, we need to execute a command like the 
following:
+               </p>
+<p>
+<span class="codefrag computeroutput">
+               java -cp 
.:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar\
+               
:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar 
-Dlog4j.configuration=log4j.properties\ 
+               org.apache.bookkeeper.proto.BookieServer 3181 127.0.0.1:2181 
/path_to_log_device/\
+               /path_to_ledger_device/
+               </span>
+</p>
+<p> "/path_to_log_device/" and "/path_to_ledger_device/" are different paths. 
Also, port 3181
+               is the port that a bookie listens on for connection requests 
from clients. 127.0.0.1:2181 is the hostname:port 
+               for the ZooKeeper server. In this example, the standalone 
ZooKeeper server is running locally on port 2181.
+               If we had multiple ZooKeeper servers, this parameter would be a 
comma separated list of all the hostname:port
+               values corresponding to them.
+               </p>
+<a name="bk_setupZK"></a>
+<h3 class="h4">Setting up ZooKeeper</h3>
+<p> ZooKeeper stores metadata on behalf of BookKeeper clients and bookies. To 
get a minimal 
+               ZooKeeper installation to work with BookKeeper, we can set up 
one server running in
+               standalone mode. Once we have the server running, we need to 
create a few znodes:
+               </p>
+<ol>
+               
+<li>
+               
+<p>
+<span class="codefrag computeroutput">
+               /ledgers        
+               </span>
+</p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+<span class="codefrag computeroutput">
+               /ledgers/available
+               </span>
+</p>
+               
+</li>
+               
+               
+<li>
+               
+<p> For each bookie, we add one znode such that the name of the znode is the
+               concatenation of the machine name and the port number that the 
bookie is 
+               listening on. For example, if a bookie is running on 
bookie.foo.com an is listening 
+               on port 3181, we add a znode 
+               <span class="codefrag 
computeroutput">/ledgers/available/bookie.foo.com:3181</span>.  
+               </p>
+               
+</li>
+               
+</ol>
+<a name="bk_example"></a>
+<h3 class="h4">Example</h3>
+<p>
+           In the following excerpt of code, we:
+           </p>
+<ol>
+               
+<li>
+               
+<p>
+               Create a ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               Write to the ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               Close the ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               Open the same ledger for reading;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               Read from the ledger;
+               </p>
+               
+</li>
+               
+               
+<li>
+               
+<p>
+               Close the ledger again;
+               </p>
+               
+</li>
+           
+</ol>
+<pre class="code">
+LedgerHandle lh = bkc.createLedger(ledgerPassword);
+ledgerId = lh.getId();
+ByteBuffer entry = ByteBuffer.allocate(4);
+
+for(int i = 0; i &lt; 10; i++){
+       entry.putInt(i);
+       entry.position(0);
+       entries.add(entry.array());                             
+       lh.addEntry(entry.array());
+}
+lh.close();
+lh = bkc.openLedger(ledgerId, ledgerPassword);         
+                       
+Enumeration&lt;LedgerEntry&gt; ls = lh.readEntries(0, 9);
+int i = 0;
+while(ls.hasMoreElements()){
+       ByteBuffer origbb = ByteBuffer.wrap(
+                               entries.get(i++));
+       Integer origEntry = origbb.getInt();
+       ByteBuffer result = ByteBuffer.wrap(
+                               ls.nextElement().getEntry());
+
+       Integer retrEntry = result.getInt();
+}
+lh.close();
+           </pre>
+</div>
+
+<p align="right">
+<font size="-2"></font>
+</p>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</div>
+</div>
+<div id="footer">
+<!--+
+    |start bottomstrip
+    +-->
+<div class="lastmodified">
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<div class="copyright">
+        Copyright &copy;
+         2008 <a href="http://www.apache.org/licenses/";>The Apache Software 
Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperStarted.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperStarted.pdf 
b/content/doc/r3.5.4-beta/bookkeeperStarted.pdf
new file mode 100644
index 0000000..42e4987
Binary files /dev/null and b/content/doc/r3.5.4-beta/bookkeeperStarted.pdf 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperStream.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperStream.html 
b/content/doc/r3.5.4-beta/bookkeeperStream.html
new file mode 100644
index 0000000..0566340
--- /dev/null
+++ b/content/doc/r3.5.4-beta/bookkeeperStream.html
@@ -0,0 +1,612 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>Streaming with BookKeeper</title>
+<link type="text/css" href="skin/basic.css" rel="stylesheet">
+<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
+<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
+<link type="text/css" href="skin/profile.css" rel="stylesheet">
+<script src="skin/getBlank.js" language="javascript" 
type="text/javascript"></script><script src="skin/getMenu.js" 
language="javascript" type="text/javascript"></script><script 
src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
+<link rel="shortcut icon" href="images/favicon.ico">
+</head>
+<body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<div id="top">
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+<a href="http://www.apache.org/";>Apache</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a> &gt; <a 
href="http://zookeeper.apache.org/";>ZooKeeper</a><script 
src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
+</div>
+<!--+
+    |header
+    +-->
+<div class="header">
+<!--+
+    |start group logo
+    +-->
+<div class="grouplogo">
+<a href="http://hadoop.apache.org/";><img class="logoImage" alt="Hadoop" 
src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
+</div>
+<!--+
+    |end group logo
+    +-->
+<!--+
+    |start Project Logo
+    +-->
+<div class="projectlogo">
+<a href="http://zookeeper.apache.org/";><img class="logoImage" alt="ZooKeeper" 
src="images/zookeeper_small.gif" title="ZooKeeper: distributed 
coordination"></a>
+</div>
+<!--+
+    |end Project Logo
+    +-->
+<!--+
+    |start Search
+    +-->
+<div class="searchbox">
+<form action="http://www.google.com/search"; method="get" class="roundtopsmall">
+<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input 
onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" 
id="query" type="text" value="Search the site with google">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="unselected" href="http://zookeeper.apache.org/";>Project</a>
+</li>
+<li>
+<a class="unselected" 
href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/";>Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" 
class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" 
class="menutitle">Developer</div>
+<div id="menu_1.2" class="menuitemgroup">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" 
class="menutitle">BookKeeper</div>
+<div id="menu_1.3" class="menuitemgroup">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" 
class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" 
class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" 
class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER";>Wiki</a>
+</div>
+<div class="menuitem">
+<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ";>FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://zookeeper.apache.org/mailing_lists.html";>Mailing Lists</a>
+</div>
+</div>
+<div id="credit"></div>
+<div id="roundbottom">
+<img style="display: none" class="corner" height="15" width="15" alt="" 
src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
+<!--+
+  |alternative credits
+  +-->
+<div id="credit2"></div>
+</div>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="bookkeeperStream.pdf"><img alt="PDF -icon" 
src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>Streaming with BookKeeper</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_StreamSummary">Summary</a>
+</li>
+<li>
+<a href="#bk_LedgerOutputStream">Writing a stream of bytes</a>
+</li>
+<li>
+<a href="#bk_LedgerInputStream">Reading a stream of bytes</a>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+       
+<a name="bk_StreamSummary"></a>
+<h2 class="h3">Summary</h2>
+<div class="section">
+<p>
+    When using the BookKeeper API, an application has to split the data to 
write into entries, each
+    entry being a byte array. This is natural for many applications. For 
example, when using BookKeeper
+    for write-ahead logging, an application typically wants to write the 
modifications corresponding
+    to a command or a transaction. Some other applications, however, might not 
have a natural boundary
+    for entries, and may prefer to write and read streams of bytes. This is 
exactly the purpose of the
+    stream API we have implemented on top of BookKeeper.
+    </p>
+<p>
+    The stream API is implemented in the package <span class="codefrag 
computeroutput">Streaming</span>, and it contains two main classes: <span 
class="codefrag computeroutput">LedgerOutputStream</span> and 
+    <span class="codefrag computeroutput">LedgerInputStream</span>. The class 
names are indicative of what they do.
+    </p>
+</div>
+    
+    
+<a name="bk_LedgerOutputStream"></a>
+<h2 class="h3">Writing a stream of bytes</h2>
+<div class="section">
+<p>
+    Class <span class="codefrag computeroutput">LedgerOutputStream</span> 
implements two constructors and five public methods:
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public LedgerOutputStream(LedgerHandle lh) 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">lh</span> is a ledger handle for a 
previously created and open ledger.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public LedgerOutputStream(LedgerHandle lh, int size) 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">lh</span> is a ledger handle for a 
previously created and open ledger.  
+       </p>
+       
+</li>
+
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">size</span> is the size of the byte 
buffer to store written bytes before flushing.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+       
+<strong>Closing a stream.</strong> This call closes the stream by flushing the 
write buffer.
+       </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void close() 
+    </span>
+       
+</p>
+<p>
+    which has no parameters.
+    </p>
+<p>
+       
+<strong>Flushing a stream.</strong> This call essentially flushes the write 
buffer.
+       </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized void flush() 
+    </span>
+       
+</p>
+<p>
+    which has no parameters.
+    </p>
+<p>
+       
+<strong>Writing bytes.</strong> There are three calls for writing bytes to a 
stream.
+       </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized void write(byte[] b) 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">b</span> is an array of bytes to write.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized void write(byte[] b, int off, int len) 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">b</span> is an array of bytes to write.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">off</span> is a buffer offset.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">len</span> is the length to write.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized void write(int b) 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">b</span> contains a byte to write. The 
method writes the least significant byte of the integer four bytes.    
+       </p>
+       
+</li>
+    
+</ul>
+</div>
+    
+    
+<a name="bk_LedgerInputStream"></a>
+<h2 class="h3">Reading a stream of bytes</h2>
+<div class="section">
+<p>
+    Class <span class="codefrag computeroutput">LedgerOutputStream</span> 
implements two constructors and four public methods:
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public LedgerInputStream(LedgerHandle lh)
+       throws BKException, InterruptedException 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">lh</span> is a ledger handle for a 
previously created and open ledger.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public LedgerInputStream(LedgerHandle lh, int size) 
+    throws BKException, InterruptedException
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">lh</span> is a ledger handle for a 
previously created and open ledger.  
+       </p>
+       
+</li>
+
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">size</span> is the size of the byte 
buffer to store bytes that the application
+        will eventually read.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+       
+<strong>Closing.</strong> There is one call to close an input stream, but the 
call
+       is currently empty and the application is responsible for closing the 
ledger handle. 
+       </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public void close()
+    </span>
+       
+</p>
+<p>
+    which has no parameters.
+    </p>
+<p>
+       
+<strong>Reading.</strong> There are three calls to read from the stream.
+       </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized int read()
+       throws IOException 
+    </span>
+       
+</p>
+<p>
+    which has no parameters.
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized int read(byte[] b)
+       throws IOException 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">b</span> is a byte array to write to.  
+       </p>
+       
+</li>
+    
+</ul>
+<p>
+    
+<span class="codefrag computeroutput">
+       public synchronized int read(byte[] b, int off, int len)
+       throws IOException 
+    </span>
+       
+</p>
+<p>
+    where:
+    </p>
+<ul>
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">b</span> is a byte array to write to.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">off</span> is an offset for byte array 
<span class="codefrag computeroutput">b</span>.  
+       </p>
+       
+</li>
+       
+       
+<li>
+       
+<p> 
+        
+<span class="codefrag computeroutput">len</span> is the length in bytes to 
write to <span class="codefrag computeroutput">b</span>.  
+       </p>
+       
+</li>
+    
+</ul>
+</div>
+  
+<p align="right">
+<font size="-2"></font>
+</p>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</div>
+</div>
+<div id="footer">
+<!--+
+    |start bottomstrip
+    +-->
+<div class="lastmodified">
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<div class="copyright">
+        Copyright &copy;
+         2008 <a href="http://www.apache.org/licenses/";>The Apache Software 
Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/bookkeeperStream.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/bookkeeperStream.pdf 
b/content/doc/r3.5.4-beta/bookkeeperStream.pdf
new file mode 100644
index 0000000..87aad97
Binary files /dev/null and b/content/doc/r3.5.4-beta/bookkeeperStream.pdf differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/broken-links.xml
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/broken-links.xml 
b/content/doc/r3.5.4-beta/broken-links.xml
new file mode 100644
index 0000000..f95aa9b
--- /dev/null
+++ b/content/doc/r3.5.4-beta/broken-links.xml
@@ -0,0 +1,2 @@
+<broken-links>
+</broken-links>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/2pc.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/2pc.jpg 
b/content/doc/r3.5.4-beta/images/2pc.jpg
new file mode 100644
index 0000000..fe4488f
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/2pc.jpg differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/bk-overview.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/bk-overview.jpg 
b/content/doc/r3.5.4-beta/images/bk-overview.jpg
new file mode 100644
index 0000000..6e12fb4
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/bk-overview.jpg 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/built-with-forrest-button.png
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/built-with-forrest-button.png 
b/content/doc/r3.5.4-beta/images/built-with-forrest-button.png
new file mode 100644
index 0000000..4a787ab
Binary files /dev/null and 
b/content/doc/r3.5.4-beta/images/built-with-forrest-button.png differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/favicon.ico
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/favicon.ico 
b/content/doc/r3.5.4-beta/images/favicon.ico
new file mode 100644
index 0000000..161bcf7
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/hadoop-logo.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/hadoop-logo.jpg 
b/content/doc/r3.5.4-beta/images/hadoop-logo.jpg
new file mode 100644
index 0000000..809525d
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/hadoop-logo.jpg 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/instruction_arrow.png
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/instruction_arrow.png 
b/content/doc/r3.5.4-beta/images/instruction_arrow.png
new file mode 100644
index 0000000..0fbc724
Binary files /dev/null and 
b/content/doc/r3.5.4-beta/images/instruction_arrow.png differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/state_dia.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/state_dia.jpg 
b/content/doc/r3.5.4-beta/images/state_dia.jpg
new file mode 100644
index 0000000..b6f4a8b
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/state_dia.jpg differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zkcomponents.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zkcomponents.jpg 
b/content/doc/r3.5.4-beta/images/zkcomponents.jpg
new file mode 100644
index 0000000..7690578
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zkcomponents.jpg 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zknamespace.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zknamespace.jpg 
b/content/doc/r3.5.4-beta/images/zknamespace.jpg
new file mode 100644
index 0000000..05534bc
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zknamespace.jpg 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zkperfRW-3.2.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zkperfRW-3.2.jpg 
b/content/doc/r3.5.4-beta/images/zkperfRW-3.2.jpg
new file mode 100644
index 0000000..594b50b
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zkperfRW-3.2.jpg 
differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zkperfRW.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zkperfRW.jpg 
b/content/doc/r3.5.4-beta/images/zkperfRW.jpg
new file mode 100644
index 0000000..ad3019f
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zkperfRW.jpg differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zkperfreliability.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zkperfreliability.jpg 
b/content/doc/r3.5.4-beta/images/zkperfreliability.jpg
new file mode 100644
index 0000000..232bba8
Binary files /dev/null and 
b/content/doc/r3.5.4-beta/images/zkperfreliability.jpg differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zkservice.jpg
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zkservice.jpg 
b/content/doc/r3.5.4-beta/images/zkservice.jpg
new file mode 100644
index 0000000..1ec9154
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zkservice.jpg differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ec4ec140/content/doc/r3.5.4-beta/images/zookeeper_small.gif
----------------------------------------------------------------------
diff --git a/content/doc/r3.5.4-beta/images/zookeeper_small.gif 
b/content/doc/r3.5.4-beta/images/zookeeper_small.gif
new file mode 100644
index 0000000..4e8014f
Binary files /dev/null and b/content/doc/r3.5.4-beta/images/zookeeper_small.gif 
differ

Reply via email to