Bläddra i källkod

ZOOKEEPER-315. add forrest docs for bookkeeper. (flavio via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/zookeeper/trunk@787780 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar 16 år sedan
förälder
incheckning
9f27c0f760

+ 2 - 0
CHANGES.txt

@@ -227,6 +227,8 @@ NIOServerCnxn. (phunt via mahadev)
 
   ZOOKEEPER-422. Java CLI should support ephemeral and sequential node creation (henry via breed)
 
+  ZOOKEEPER-315. add forrest docs for bookkeeper. (flavio via mahadev)
+
 NEW FEATURES:
 
   ZOOKEEPER-371. jdiff documentation included in build/release (giri via phunt)

+ 369 - 0
docs/bookkeeperConfig.html

@@ -0,0 +1,369 @@
+<!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.8">
+<meta name="Forrest-skin-name" content="pelt">
+<title>BookKeeper Administrator's 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://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">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://hadoop.apache.org/zookeeper/"><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="hadoop.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://hadoop.apache.org/zookeeper/">Project</a>
+</li>
+<li>
+<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.2 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="menupage">
+<div class="menupagetitle">Setup guide</div>
+</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>
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</div>
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://hadoop.apache.org/zookeeper/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="bookkeeperConfig.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>BookKeeper Administrator's Guide</h1>
+<h3>Setup Guide</h3>
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_deployment">Deployment</a>
+<ul class="minitoc">
+<li>
+<a href="#bk_sysReq">System requirements</a>
+</li>
+<li>
+<a href="#bk_runningBookies">Running bookies</a>
+</li>
+<li>
+<a href="#bk_zkMetadata">ZooKeeper Metadata</a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+  
+
+  
+
+  
+
+  
+<a name="N1000B"></a><a name="bk_deployment"></a>
+<h2 class="h3">Deployment</h2>
+<div class="section">
+<p>This section contains information about deploying BookKeeper and
+    covers these topics:</p>
+<ul>
+      
+<li>
+        
+<p>
+<a href="#bk_sysReq">System requirements</a>
+</p>
+      
+</li>
+
+      
+<li>
+        
+<p>
+<a href="#bk_runningBookies">Running bookies</a>
+</p>
+      
+</li>
+
+      
+<li>
+        
+<p>
+<a href="#bk_zkMetadata">ZooKeeper Metadata</a>
+</p>
+      
+</li>
+    
+</ul>
+<p> The first section tells you how many machines you need. The second explains how to bootstrap bookies
+     (BookKeeper storage servers). The third section explains how we use ZooKeeper and our requirements with
+     respect to ZooKeeper.
+    </p>
+<a name="N10032"></a><a name="bk_sysReq"></a>
+<h3 class="h4">System requirements</h3>
+<p> A typical BookKeeper installation comprises a set of bookies and a set of ZooKeeper replicas. The exact number of bookies
+ 	   depends on the quorum mode, desired throughput, and number of clients using this installation simultaneously. The minimum number of
+ 	   bookies is three for self-verifying (stores a message authentication code along with each entry) and four for generic (does not
+ 	   store a message authentication codewith each entry), and there is no upper limit on the number of bookies. Increasing the number of 
+ 	   bookies, in fact, enables higher throughput.
+ 	   </p>
+<p> For performance, we require each server to have at least two disks. It is possible to run a bookie with a single disk, but 
+ 	   performance will be significantly lower in this case. Of course, it works with one disk, but performance is significantly lower. 
+ 	   </p>
+<p> For ZooKeeper, there is no constraint with respect to the number of replicas. Having a single machine running ZooKeeper
+ 	   in standalone mode is sufficient for BookKeeper. For resilience purposes, it might be a good idea to run ZooKeeper in quorum 
+ 	   mode with multiple servers. Please refer to the ZooKeeper documentation for detail on how to configure ZooKeeper with multiple
+ 	   replicas
+ 	   </p>
+<a name="N10042"></a><a name="bk_runningBookies"></a>
+<h3 class="h4">Running bookies</h3>
+<p>
+ 	   To run a bookie, we execute the following command:
+ 	   </p>
+<p>
+<span class="codefrag computeroutput">
+		java -cp .:./zookeeper-dev-bookkeeper.jar:./zookeeper-dev.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
+		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\
+		/path_to_ledger_device/
+	   </span>
+</p>
+<p>
+ 	   The parameters are:
+ 	   </p>
+<ul>
+ 	   	
+<li>
+ 	   	
+<p>
+ 	   		Port number that the bookie listens on;
+ 	   	</p>
+ 	   	
+</li>
+ 	   	
+ 	   	
+<li>
+ 	   	
+<p>
+ 	   		Path for Log Device (stores bookie write-ahead log);
+ 	   	</p>
+ 	   	
+</li>
+ 	   	
+ 	   	
+<li>
+ 	   	
+<p>
+ 	   		Path for Ledger Device (stores ledger entries);
+ 	   	</p>
+ 	   	
+</li>
+ 	   
+</ul>
+<p>
+ 	   Ideally, <span class="codefrag computeroutput">/path_to_log_device/ </span> and <span class="codefrag computeroutput">/path_to_ledger_device/ </span> are each
+ 	   in a different device. 
+ 	   </p>
+<a name="N10074"></a><a name="bk_zkMetadata"></a>
+<h3 class="h4">ZooKeeper Metadata</h3>
+<p>
+ 	   For BookKeeper, we require a ZooKeeper installation to store metadata, and to pass the list
+ 	   of ZooKeeper servers as parameter to the constructor of the BookKeeper class (<span class="codefrag computeroutput">
+ 	   org.apache.bookkeeper.client,BookKeeper</span>).
+ 	   To setup ZooKeeper, please check the <a href="index.html">
+          ZooKeeper documentation</a>.
+ 	   </p>
+</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>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 74 - 0
docs/bookkeeperConfig.pdf


+ 341 - 0
docs/bookkeeperOverview.html

@@ -0,0 +1,341 @@
+<!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.8">
+<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://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">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://hadoop.apache.org/zookeeper/"><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="hadoop.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://hadoop.apache.org/zookeeper/">Project</a>
+</li>
+<li>
+<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.2 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>
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</div>
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://hadoop.apache.org/zookeeper/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="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#bk_Overview">BookKeeper overview</a>
+<ul class="minitoc">
+<li>
+<a href="#bk_basicComponents">Basic elements</a>
+</li>
+<li>
+<a href="#bk_moreDetail">In slightly more detail...</a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+  
+
+  
+  
+<a name="N10009"></a><a name="bk_Overview"></a>
+<h2 class="h3">BookKeeper overview</h2>
+<div class="section">
+<p>This document explains basic concepts of BookKeeper. We start by discussing
+    the basic elements of BookKeeper, and next we discuss how they work together. 
+    </p>
+<a name="N10012"></a><a name="bk_basicComponents"></a>
+<h3 class="h4">Basic elements</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="N10046"></a><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. To 
+	create a ledger, an application has to specify which kind of ledger it wants to use: self-verifying or generic. Self-verifying
+	includes a digest on every entry, which enables a reduction on the degree of replication. Generic ledgers do not store a digest
+	along with entries at the cost of using more bookies.   
+	</p>
+<p> Upon creating a ledger, a BookKeeper clients writes metadata about the ledger to ZooKeeper. A given client first creates
+	a znode named "L" as a child of "/ledger" with the SEQUENCE flag. ZooKeeper consequently assigns a unique sequence number to the 
+	node, naming the node "/Lx", where x is the sequence number assigned. We use this sequence number as the identifier of the ledger. 
+	This identifier is necessary when opening a ledger. We also store the ensemble composition so that readers know which set of bookies
+	of access for a given ledger. 	
+	</p>
+<p>
+	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 an 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 in the form of a close znode as a child of "/Lx", where x is the identifier of the ledger.     
+	</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>
+</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>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 63 - 0
docs/bookkeeperOverview.pdf


+ 911 - 0
docs/bookkeeperProgrammer.html

@@ -0,0 +1,911 @@
+<!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.8">
+<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://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">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://hadoop.apache.org/zookeeper/"><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="hadoop.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://hadoop.apache.org/zookeeper/">Project</a>
+</li>
+<li>
+<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.2 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>
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</div>
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://hadoop.apache.org/zookeeper/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="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>
+</ul>
+</li>
+</ul>
+</div>
+  
+
+  
+  
+<a name="N10009"></a><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>
+      
+    
+</ul>
+<a name="N10042"></a><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 is one BookKeeper constructor:
+    </p>
+<p>
+    
+<span class="codefrag computeroutput">
+	public BookKeeper(String servers) 
+    	throws KeeperException, IOException    
+    </span>
+   	
+</p>
+<p> 
+    where <span class="codefrag computeroutput">servers</span> is a comma-separated list of ZooKeeper servers.
+    </p>
+<a name="N10064"></a><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, QMode mode,  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">mode</span> is the ledger mode (QMode.GENERIC, QMode.VERIFIABLE).
+    	If <span class="codefrag computeroutput">mode</span> is QMode.GENERIC, then <span class="codefrag computeroutput">ensSize</span> has to
+    	be at least <em>3t+1</em>, and <span class="codefrag computeroutput">qSize</span> has to be <em>2t+1</em>.
+    	<em>t</em> is the maximum number of tolerated bookie failures.  
+    	</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 input parameter it requires is a password.
+    </p>
+<p>
+   	
+<strong>Asynchronous call:</strong>
+   	
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+    public void asyncCreateLedger(int ensSize, 
+            int qSize, 
+            QMode mode,  
+            byte passwd[],
+            CreateCallback cb,
+            Object ctx
+            )
+    throws KeeperException, InterruptedException, 
+    IOException, BKException
+    </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.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 a control object for accountability purposes;
+		</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="N1012E"></a><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)
+    throws InterruptedException
+    </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. 
+		</p>
+		
+</li>
+	
+</ul>
+<a name="N101C9"></a><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 KeeperException, 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="N1023E"></a><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, byte passwd[])
+    throws KeeperException, InterruptedException, IOException, BKException
+    </span>
+	
+</p>
+<ul>
+	
+<li>
+	
+<p>
+	
+<span class="codefrag computeroutput">ledgerId</span> is the ledger identifier;
+	</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, byte passwd[], OpenCallback cb, Object ctx)
+    throws InterruptedException
+    </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="N102CB"></a><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 LedgerSequence 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, LedgerSequence 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">LedgerSequence</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>
+</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>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 107 - 0
docs/bookkeeperProgrammer.pdf


+ 439 - 0
docs/bookkeeperStarted.html

@@ -0,0 +1,439 @@
+<!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.8">
+<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://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">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://hadoop.apache.org/zookeeper/"><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="hadoop.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://hadoop.apache.org/zookeeper/">Project</a>
+</li>
+<li>
+<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.2 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>
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</div>
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://hadoop.apache.org/zookeeper/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="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>
+  
+
+  
+  
+<a name="N10009"></a><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="N10016"></a><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="N10024"></a><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://hadoop.apache.org/zookeeper/releases.html">
+        	  stable</a> release from one of the Apache Download
+       	 Mirrors.</p>
+<a name="N10032"></a><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="N1003C"></a><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-dev-bookkeeper.jar:./zookeeper-dev.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
+		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /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. 
+		</p>
+<a name="N10051"></a><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="N10078"></a><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);		
+			
+LedgerSequence 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>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 107 - 0
docs/bookkeeperStarted.pdf


+ 45 - 5
docs/index.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>
@@ -305,6 +320,31 @@ document.write("Last Published: " + document.lastModified);
       
 </li>
 
+	  
+<li>
+<strong>BookKeeper Documentation</strong>
+	  
+<p> BookKeeper is a highly-available system that implements high-performance write-ahead logging. It uses ZooKeeper for metadata, 
+	  which is the main reason for being a ZooKeeper contrib.
+	  </p>
+      
+<ul>
+      
+<li>
+<a href="bookkeeperOverview.html">henn, what's it again?</a>
+</li>
+	  
+<li>
+<a href="bookkeeperStarted.html">Ok, now how do I try it out</a>
+</li>
+	  
+<li>
+<a href="bookkeeperProgrammer.html">Awesome, but how do I integrate it with my app?</a>
+</li>
+      
+</ul>
+      
+</li>
     
 </ul>
   

+ 62 - 23
docs/index.pdf

@@ -169,10 +169,10 @@ endobj
 >>
 endobj
 20 0 obj
-<< /Length 758 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 1671 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gat%!a_oie&A@B[k3*l'P*@@m]u=tsZpiB<(/U[I6'Z.QND-pJS03;gC8\^TJM2I^^00?PkHXc)8UsWj+l7G\162FD*s*%_[ZH3!L]HEdr1*_[PeDY*&:^u25*1'l_4kFm\78cX<LNd2^=&kuR-YgAO&41Z(HUAjV5c*6K!IG&fg_GC/EFJqoM-=f_%82"fk@LpoDM^Mi.omUV6hjEe(:-i,?j?F8KG[Ud=5_2FbLe\:FW%5\5D^)n"82qKPqsJ,;a4C'85c=/J&tsLkgVZ!/q'@n,P!-`gb"3f46R)m!Lc)SQ\dD4U>O"$i4u',8UT</Pm@Y-k+D5(_Rmg:<FYY-&kNS?5Tj=.-7"4LN"tC+t60%._0`#]ZX5D$X0*hHENJonHWq!XB]#mk+kC+nWG-e[X3TT@^"N"lo.XS(glhhPspf`WV>M<$LRR3WUdX=B3'nH#`0@uOpTO;XqaG?XN*!Gj<WUVr%:2ggFb;MS;HDbj/b6M6Y7?f7:pGMjlOb63XPolLUYUM"@Y-I:4,HCFKf9Dl>^cL9:E_60%4?<b),LXCU;;ddU/a-LIGOX-`Y_b?sc'_Q/%Z=><[b_"PI=_*Qu)bL]he;)$E['0VSu7KMC3k>.n4HIA+k#kR/K,!"%N4H(AKpC8fT4K"HL>,Ua1j4'0Ggc8#r^D&MU,s6e:qfko:7X64A5c,b\h`aV>U];R<kga/qX=*de.,f[)?oj4bi76h?b-q;S%/fcK9C$t($NP53";KeBm~>
+GatU495iiK&AJ$CnCA<+W"LCK<%j/?dk/#I@Wran"o:242Iiem79>X^jPP0[#;r5L=[nO3aln)5S/FNYQ\uqL"sfk5:R9<7T558Dn_l,DW=OD3MnOX2A@X(;hY]ekqk!^[QG3DJ0q]!fpq0&6IZ*uonuBd&Ng2(dK4HTFR!MVbHr-m(?KN!<DCO%8DOskU2]h%\go5oWcj*#lb;XifV9n\5ll1F&orF<Bd<C"!aLlFSWai;#J?O\'8$8k8+I7:F4mJ(UlDNb'haR,[q<_h##\[Im*I'bq]dH+/H>+"]SfR>ac4Y.AO,Iq7qdkO72PaDj3KPF'bB[5`#)#"-(*6=TJ3BS_o$TL<;]*CVMCa8".p:qBf*)A=4\Cp()$+XPPn7N+MFt&A.Nbr2M?T8,<^"WI]](;=]Kiu7jR_%9BnJ>]"`KSP55!QNH/aVPUt(:I=h0^-S]IWgQBMp7jb9Wg4i@^W`H^\<fhojNY>Z6hUDE1Lo4)g6pNuUsSQX^u=b=f7AS2=M97q68[]aY)ofh5\40tTTil@^VV,o5u@nC%EmZi+oT?A&HIJBG0b>>F!roZ2oCj0g,i`0MNn[([2?bVejguHlq'r'G)G1*D%Rd1_WU&+1GNm$C\a=;Hc[Sj3QQ:(pKCa+8)2B0^nYD7To_T,PLL]*n>mq!frU(ZpVQYj1bStD?8p?tG)$:>t*M$q9fj[frj&`Kl"f!'e2c[f*&-$a.<N7)K^+A2MNTO(1"l'\.I"3%Cdo62fY91"QBC!eX=ZRIm3Jp_T:(paF(m%,>!^FNT=/SZlWVo?XignoU/!K1Uc2,N?mX'As_=tR[jKuOh^U7`21:WXT[#)^'N%HPKTB<dJAfU'"hJ]aHV)o`VH?4>S5f5jBR@`9uRc7lX/Zt)9N3MqULME#=EcUD9D)CRA1X-:`.`N'N!rj:,K)!BWfYZ%AISRL)7OkHkkXMq6*_J,i$7;,OpT?T3.TZHJ'3P=(Q>)6PKeHQ!WCrn,u&Ht<3H2Zg0C9_Lo2Q\d4?oA2LIQ1h<HR*W8'lP_.6X%hCl(lU\@/.D^\?IO(Bno)GSb:KE"e@'OEqq9e:p??VTSF_pl<(TTBn?h;Q]#RJR[[dAXBsY&75;c=G:-On]l[:S9;T=q:?e@`CCVdk]q7f4MS;Wh;!duA344rZhI\.+<'%LP%Ol),VoO^>dMe"f\gsf*X7J6ZDJ!a9cDY]R=TcWTh%eJ7eNt(HDbORE&r#)!^.qu-g-MuFB1941[8&]`1StFp$91eX$(YM4K4:la?HGnb.d=6TZ"lKdXZ*-82?i/.*6jo-%Q^i\/?Tbj(?3e0@g[*NKRlni)-/gE[X-)rXi%6Z$UU(Q$B5=GhZEoG/R]2t[b;n0e%KO0[95d#G*,@e&VUAgME%+BZNc<#MSnDdH&nU$mPFR#8E`DEJT@*mrAL=Jp$VUM^)eYYIcdEdk$G1nh!#&l+-\8+=Y@;;=n@]0XDFJFS+f%os&d$9P_6\dfG&rRQl/ZoAl6>'"Ff>VN(!@+*QH;o+j"d].Ja(D*GdZ2I=VoS8CGT>8NY5$@P\u57?\J]m/rNlBbE/5j24;DN>^[e9Nf`UM'(T3CpU7958&AgJ5ZFUqA/aPhRAfqo0q-<4,=Vh5H<o3,RW&m;'#7NrOV&5fP];"C@)YAALWO=\b>m1q[]LY-)(~>
 endstream
 endobj
 21 0 obj
@@ -189,6 +189,9 @@ endobj
 23 0 R
 24 0 R
 25 0 R
+26 0 R
+27 0 R
+28 0 R
 ]
 endobj
 23 0 obj
@@ -225,34 +228,67 @@ endobj
 >>
 endobj
 26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 126.0 504.8 229.476 492.8 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (bookkeeperOverview.html)
+/S /URI >>
+/H /I
+>>
+endobj
+27 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 126.0 491.6 257.328 479.6 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (bookkeeperStarted.html)
+/S /URI >>
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 126.0 478.4 363.972 466.4 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (bookkeeperProgrammer.html)
+/S /URI >>
+/H /I
+>>
+endobj
+29 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F3
 /BaseFont /Helvetica-Bold
 /Encoding /WinAnsiEncoding >>
 endobj
-27 0 obj
+30 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F5
 /BaseFont /Times-Roman
 /Encoding /WinAnsiEncoding >>
 endobj
-28 0 obj
+31 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F1
 /BaseFont /Helvetica
 /Encoding /WinAnsiEncoding >>
 endobj
-29 0 obj
+32 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F2
 /BaseFont /Helvetica-Oblique
 /Encoding /WinAnsiEncoding >>
 endobj
-30 0 obj
+33 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F7
@@ -271,15 +307,15 @@ endobj
 endobj
 3 0 obj
 << 
-/Font << /F3 26 0 R /F5 27 0 R /F1 28 0 R /F2 29 0 R /F7 30 0 R >> 
+/Font << /F3 29 0 R /F5 30 0 R /F1 31 0 R /F2 32 0 R /F7 33 0 R >> 
 /ProcSet [ /PDF /ImageC /Text ] >> 
 endobj
 xref
-0 31
+0 34
 0000000000 65535 f 
-0000007144 00000 n 
-0000007209 00000 n 
-0000007259 00000 n 
+0000008593 00000 n 
+0000008658 00000 n 
+0000008708 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
 0000002781 00000 n 
@@ -297,22 +333,25 @@ xref
 0000004698 00000 n 
 0000004866 00000 n 
 0000005029 00000 n 
-0000005879 00000 n 
-0000006002 00000 n 
-0000006043 00000 n 
-0000006214 00000 n 
-0000006399 00000 n 
-0000006588 00000 n 
-0000006701 00000 n 
-0000006811 00000 n 
-0000006919 00000 n 
-0000007035 00000 n 
+0000006793 00000 n 
+0000006916 00000 n 
+0000006978 00000 n 
+0000007149 00000 n 
+0000007334 00000 n 
+0000007523 00000 n 
+0000007694 00000 n 
+0000007864 00000 n 
+0000008037 00000 n 
+0000008150 00000 n 
+0000008260 00000 n 
+0000008368 00000 n 
+0000008484 00000 n 
 trailer
 <<
-/Size 31
+/Size 34
 /Root 2 0 R
 /Info 4 0 R
 >>
 startxref
-7382
+8831
 %%EOF

+ 20 - 5
docs/javaExample.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 54 - 5
docs/linkmap.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>
@@ -269,6 +284,40 @@ document.write("Last Published: " + document.lastModified);
 </ul>
   
   
+<ul>
+<li>
+<a>BookKeeper</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul>
+      
+<ul>
+<li>
+<a href="bookkeeperStarted.html">Getting started</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>bkStarted</em>
+</li>
+</ul>
+      
+<ul>
+<li>
+<a href="bookkeeperOverview.html">Overview</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>bkOverview</em>
+</li>
+</ul>
+      
+<ul>
+<li>
+<a href="bookkeeperConfig.html">Setup guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>bkProgrammer</em>
+</li>
+</ul>
+      
+<ul>
+<li>
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>bkProgrammer</em>
+</li>
+</ul>
+  
+</ul>
+</ul>
+  
+  
 <ul>
 <li>
 <a>Admin &amp; Ops</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>

+ 38 - 21
docs/linkmap.pdf

@@ -5,10 +5,10 @@
 /Producer (FOP 0.20.5) >>
 endobj
 5 0 obj
-<< /Length 1121 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 1148 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gau0C>uTN:'RekGiMVDm7+&L27n=a3%7pgeP>7TB8*jtVM:XMg%-bO1/-D2/Kc+g?40tuKnMs+kpIMk#bJhXLP$n]*[bNEAs0l1IlsbN$ke8Gqq_:hh+M>d]g[*8"1M,\>likZB2m`6Re_dg0)$cJe]F*foAo,61[?\.:T4`Xbb@AT:15#npLlURWi/eFjb=gCZ&?MMW$eo-,hC9@'"6In<QZDGooX:`p%7XM9p-cS(Qu#%<>19TiB-b"=NY:&K$-M7.q\P4E,E#!p%h%D/d(@j-.b7etCLPR's8D!@*g$C%LiW^A'$$*O)UflammU%U0T9PW5\O9tLMLV,Q+WNcMP(q#`++h8?9OSZM"^u[]AJ:Aca%T[;pH/tOFL%<`Q]FcPV.bXnUEucOWdmOLV="a:dtgJ>3CIB2ptl0?]8-9AqdL14^4n,F]n:&Zb=8H'$BI+U(;p+P*H_u@*JB!b'(Kml2qqZ)HkSmk_(Z=AP$CEQIiFjNAU6td;KdTa-2HJHYj'hq]F^UOaHKCk%5h2]1GC;)E"W,nt\E4)LZ&4Ft:hD@"3URWV('X;oes51o>*oSk6&[aHM?=(>$A?F80&5a2e*7`.#U\#erET_sc%uH''r,JM9Rh'`>.5m'Ms^@&.@H[8EZe*GWFlG*\0lSI=ItVjB]mUmF9eQ"kIr3@-jj,78LI3T4sE@+n?@XfBDAr\?Ar2"T7\_@oDW:GP+"0PN*l<Oo/fE%g87\]YH/U555V&=!R,\3ro,ST`_ET-TP<B.:i1^8lfm8tpB<b#ub4^X%DGn0.SYm@ul>M2:!@T/&reGrFr80\T3#[i9T\o;&b2KI.`1LXs43fn<SV>BeCP[A[[V`'k-"SAr3V7%K2[U.L]AW-0Jf9%6a_3uGI1"Oib%8WcCe97#U(qPJGZ\-W&Q_bKC;H-u[_qklNu$,JR[C0D(iP6NuYWf!s_n(_6Y_l_:N[-l?R0ieCNJ*:j^\FPoh0C'1n6-_7NR3B?s1G[]9:)=.`"c_>#\?2D3S5U1;d"jECat,%L@/3(Z8iQbeF`D-9deF2^B^B.5MkHfY%-m*U7]aK+RGQR8@=jUdh:6:LQ**FB=B1>$ceSeRft-`@Y/.X?IfZFaa]&~>
+Gau0D?$"IS'Re<2nC(8Vd-BBZ,DF"_?+,u.L7JL&;%b`DENC;+/c5!<QIB#PX#f:*A1#^Epn"8HHg[/@4Ic9JL*W,fR*700Yl.d"@'Z5o"PPM$nofsj#RJb>fd?NB1bFZ6T"MjQAnR/'.]W/2D#8dOR$Z[B]'.nP<+TTOlK?:@A9M^M=b:UJ*5Jg9"WYr#DK]14XU3S(*;OI!2g5\A:']I[c)'bg$anZRdWd!ZiV,aJoT5":<?'aF9VWoDjc1P?=Ut"=a8HCcm#f72fXccV#jBNJrt%i"g9iWuJA9q?g`#8J%,qtP4NF/;DN/WKR("=h!Z2-K?QdiMrp38BX$U-RAOTE&#i[#I;CrrJ"2rppL@&o4eL+MRpF/Ur@`Z6\!93jpjq'2%62%@l`CT/D+%+j&*FM>mdS&a5Za\AMU0@4e4Z,PF\K&lDW]JIOLfrWf*$WO>+/3t8I[$ZC[3s25Q'(`aRaa>S5h**@3hleoTThm!nQK8@;Ji6OYDbABKG]%BK=9PZXBp@#f6cqnZSj]SZ-+HpR+N1lll_A3j+CA_/N+QIT6^8*D,VuU9:8*N&>^Q:[_j!D9!U9'QrA"deX2PmU+IJI_[sG5'**Kj#U_il8b+D^Q=HV2iBm%-.X'[i`Y6e%0hN7V*:7LX!Oe.%#gJ'HG))DMo;Is=b!iQu5ie0>=:HDFNQhK`'*=qD3`^"oVj)smgfikt$W6Uq3C,@!UO1+q4uA]!c@J1AHp-:AS`:\YAb8q:0u00[ch=JtfIAPOSuFQ+[rkprP(s;jGL>R=52Qh@[-N[mj5I@j&7'$0(cEoIe:%-RfjI/,7;04\Wh/EmIIh8:?K<AQJ-#.G9#?BRQ/nkZG)%_e%XYd]KNdhV+gU=E1-cW:/?5Q<7N(_a'FD76M")&F7gC_9d:S<(Ue]hIF%E=DA,Q5ddIQK&&[=/BSG(1+Mg8Br7^Cb8Ifc"N_@Gr7p*!oF.WnrsG&QuC4W`o]PbSCk]`rLP6enEFl5i'U9n'Ss^,rMBR"CPKe1lIRZUE!t@WFXmDQa8KSHld-JIJH@GrGh]0al!aS,eju:p8CB5@(?C9n2=*Jf3j#(rFM/._,+'$=7Vh_XC:NKt.uQ)gS3IC+2iM.c<HjQ@6e^f3Vh8[RS=aka295.2;q3~>
 endstream
 endobj
 6 0 obj
@@ -20,34 +20,49 @@ endobj
 >>
 endobj
 7 0 obj
+<< /Length 480 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU/9lGV;(r#SlHCTc(lZ_<dAfd6iR?;$8\La9eCd_+8RJm!tF93@jio'GkjnX.*3XEESO[+R$7Ub@d'RKskpCbM<7nOpj@ZJ;?HG>qI.XL<M&:rZch2<js-:r;oZ>JQFJSY,Rr99mc'L'&UH&VTX@4VCJGrKE.c&/8cS8!e\#g!eM$e=,#db`gdT=XK+]5)hN&+i2\;1JMi3c4IZDm$M\5lg]._.fCk1j0;`'@4*8Da-OAJT9O@9_OJO&OenQ[Y@]f5%R7s#)!2-c,>pFlD,*s9%'_?\m4KBLC<cVdetYR3cLI_V+Ha,O.j%^s6H<rNF2o^+C:+gJI7V\'R=2,:gF3E>#VqWb\&?^i2]5g<ulMVBkpCo%i<>^VmpDI-QsUo!r:U\9_MN)D#KRPGZ!%@I^SiI.S,1?`dWQWKkWf%X_2K5aeEgRo+j.)[cq%`2G9_i99KM/fgQ:<_W9Td%aEl/!rakG!W~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+>>
+endobj
+9 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F3
 /BaseFont /Helvetica-Bold
 /Encoding /WinAnsiEncoding >>
 endobj
-8 0 obj
+10 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F5
 /BaseFont /Times-Roman
 /Encoding /WinAnsiEncoding >>
 endobj
-9 0 obj
+11 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F6
 /BaseFont /Times-Italic
 /Encoding /WinAnsiEncoding >>
 endobj
-10 0 obj
+12 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F1
 /BaseFont /Helvetica
 /Encoding /WinAnsiEncoding >>
 endobj
-11 0 obj
+13 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F2
@@ -56,8 +71,8 @@ endobj
 endobj
 1 0 obj
 << /Type /Pages
-/Count 1
-/Kids [6 0 R ] >>
+/Count 2
+/Kids [6 0 R 8 0 R ] >>
 endobj
 2 0 obj
 << /Type /Catalog
@@ -66,29 +81,31 @@ endobj
 endobj
 3 0 obj
 << 
-/Font << /F3 7 0 R /F5 8 0 R /F1 10 0 R /F6 9 0 R /F2 11 0 R >> 
+/Font << /F3 9 0 R /F5 10 0 R /F1 12 0 R /F6 11 0 R /F2 13 0 R >> 
 /ProcSet [ /PDF /ImageC /Text ] >> 
 endobj
 xref
-0 12
+0 14
 0000000000 65535 f 
-0000001945 00000 n 
-0000002003 00000 n 
-0000002053 00000 n 
+0000002651 00000 n 
+0000002715 00000 n 
+0000002765 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
-0000001284 00000 n 
-0000001390 00000 n 
-0000001502 00000 n 
-0000001611 00000 n 
-0000001721 00000 n 
-0000001829 00000 n 
+0000001311 00000 n 
+0000001417 00000 n 
+0000001988 00000 n 
+0000002094 00000 n 
+0000002206 00000 n 
+0000002316 00000 n 
+0000002427 00000 n 
+0000002535 00000 n 
 trailer
 <<
-/Size 12
+/Size 14
 /Root 2 0 R
 /Info 4 0 R
 >>
 startxref
-2173
+2887
 %%EOF

+ 20 - 5
docs/recipes.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <div class="menupagetitle">Recipes</div>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 5
docs/releasenotes.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 21 - 6
docs/zookeeperAdmin.html

@@ -135,8 +135,23 @@ document.write("Last Published: " + document.lastModified);
 <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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
+<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_selected_1.4', 'skin/')" id="menu_selected_1.4Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Admin &amp; Ops</div>
+<div id="menu_selected_1.4" class="selectedmenuitemgroup" style="display: block;">
 <div class="menupage">
 <div class="menupagetitle">Administrator's Guide</div>
 </div>
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 5
docs/zookeeperInternals.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_selected_1.4', 'skin/')" id="menu_selected_1.4Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Contributor</div>
-<div id="menu_selected_1.4" class="selectedmenuitemgroup" style="display: block;">
+<div onclick="SwitchMenu('menu_selected_1.5', 'skin/')" id="menu_selected_1.5Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Contributor</div>
+<div id="menu_selected_1.5" class="selectedmenuitemgroup" style="display: block;">
 <div class="menupage">
 <div class="menupagetitle">ZooKeeper Internals</div>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 21 - 6
docs/zookeeperJMX.html

@@ -135,8 +135,23 @@ document.write("Last Published: " + document.lastModified);
 <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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
+<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_selected_1.4', 'skin/')" id="menu_selected_1.4Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Admin &amp; Ops</div>
+<div id="menu_selected_1.4" class="selectedmenuitemgroup" style="display: block;">
 <div class="menuitem">
 <a href="zookeeperAdmin.html">Administrator's Guide</a>
 </div>
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <div class="menupagetitle">JMX</div>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 5
docs/zookeeperOver.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 5
docs/zookeeperProgrammers.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 21 - 6
docs/zookeeperQuotas.html

@@ -135,8 +135,23 @@ document.write("Last Published: " + document.lastModified);
 <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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
+<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_selected_1.4', 'skin/')" id="menu_selected_1.4Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Admin &amp; Ops</div>
+<div id="menu_selected_1.4" class="selectedmenuitemgroup" style="display: block;">
 <div class="menuitem">
 <a href="zookeeperAdmin.html">Administrator's Guide</a>
 </div>
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 5
docs/zookeeperStarted.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>

+ 20 - 7
docs/zookeeperTutorial.html

@@ -135,9 +135,24 @@ document.write("Last Published: " + document.lastModified);
 <a href="recipes.html">Recipes</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</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">
@@ -147,14 +162,14 @@ document.write("Last Published: " + document.lastModified);
 <a href="zookeeperJMX.html">JMX</a>
 </div>
 </div>
-<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" class="menuitemgroup">
+<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.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.5" class="menuitemgroup">
+<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="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
 </div>
@@ -231,12 +246,10 @@ document.write("Last Published: " + document.lastModified);
                 zk = null;
             }
         }
-        //else mutex = new Integer(-1);
     }
 
     synchronized public void process(WatchedEvent event) {
         synchronized (mutex) {
-            //System.out.println("Process: " + event.getType());
             mutex.notify();
         }
     }

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 3 - 3
docs/zookeeperTutorial.pdf


+ 149 - 0
src/docs/src/documentation/content/xdocs/bookkeeperConfig.xml

@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+"http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+<article id="bk_Admin">
+  <title>BookKeeper Administrator's Guide</title>
+
+  <subtitle>Setup Guide</subtitle>
+
+  <articleinfo>
+    <legalnotice>
+      <para>Licensed 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 <ulink
+      url="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</ulink>.
+      </para>
+
+      <para>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.
+      </para>
+    </legalnotice>
+
+    <abstract>
+      <para>This document contains information about deploying, administering
+      and mantaining BookKeeper. It also discusses best practices and common
+      problems.
+      </para>
+	  <para> As BookKeeper is still a prototype, this article is likely to change
+	  significantly over time. 
+	  </para>
+    </abstract>
+  </articleinfo>
+
+  <section id="bk_deployment">
+    <title>Deployment</title>
+
+    <para>This section contains information about deploying BookKeeper and
+    covers these topics:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para><xref linkend="bk_sysReq" /></para>
+      </listitem>
+
+      <listitem>
+        <para><xref linkend="bk_runningBookies" /></para>
+      </listitem>
+
+      <listitem>
+        <para><xref linkend="bk_zkMetadata" /></para>
+      </listitem>
+    </itemizedlist>
+    
+    <para> The first section tells you how many machines you need. The second explains how to bootstrap bookies
+     (BookKeeper storage servers). The third section explains how we use ZooKeeper and our requirements with
+     respect to ZooKeeper.
+    </para>
+    
+    <section id="bk_sysReq">
+ 	   <title>System requirements</title>
+ 	   <para> A typical BookKeeper installation comprises a set of bookies and a set of ZooKeeper replicas. The exact number of bookies
+ 	   depends on the quorum mode, desired throughput, and number of clients using this installation simultaneously. The minimum number of
+ 	   bookies is three for self-verifying (stores a message authentication code along with each entry) and four for generic (does not
+ 	   store a message authentication codewith each entry), and there is no upper limit on the number of bookies. Increasing the number of 
+ 	   bookies, in fact, enables higher throughput.
+ 	   </para>
+ 	   
+ 	   <para> For performance, we require each server to have at least two disks. It is possible to run a bookie with a single disk, but 
+ 	   performance will be significantly lower in this case. Of course, it works with one disk, but performance is significantly lower. 
+ 	   </para>
+
+ 	   <para> For ZooKeeper, there is no constraint with respect to the number of replicas. Having a single machine running ZooKeeper
+ 	   in standalone mode is sufficient for BookKeeper. For resilience purposes, it might be a good idea to run ZooKeeper in quorum 
+ 	   mode with multiple servers. Please refer to the ZooKeeper documentation for detail on how to configure ZooKeeper with multiple
+ 	   replicas
+ 	   </para>    
+     </section>
+     
+     <section id="bk_runningBookies">
+ 	   <title>Running bookies</title>
+ 	   <para>
+ 	   To run a bookie, we execute the following command:
+ 	   </para>
+ 	   
+ 	   <para><computeroutput>
+		java -cp .:./zookeeper-dev-bookkeeper.jar:./zookeeper-dev.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
+		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\
+		/path_to_ledger_device/
+	   </computeroutput></para>
+ 	   
+ 	   <para>
+ 	   The parameters are:
+ 	   </para>
+ 	   
+ 	   <itemizedlist>
+ 	   	<listitem>
+ 	   	<para>
+ 	   		Port number that the bookie listens on;
+ 	   	</para>
+ 	   	</listitem>
+ 	   	
+ 	   	<listitem>
+ 	   	<para>
+ 	   		Path for Log Device (stores bookie write-ahead log);
+ 	   	</para>
+ 	   	</listitem>
+ 	   	
+ 	   	<listitem>
+ 	   	<para>
+ 	   		Path for Ledger Device (stores ledger entries);
+ 	   	</para>
+ 	   	</listitem>
+ 	   </itemizedlist>
+ 	   
+ 	   <para>
+ 	   Ideally, <computeroutput>/path_to_log_device/ </computeroutput> and <computeroutput>/path_to_ledger_device/ </computeroutput> are each
+ 	   in a different device. 
+ 	   </para>
+ 	 </section>
+ 	 
+ 	 <section id="bk_zkMetadata">
+ 	   <title>ZooKeeper Metadata</title>
+ 	   <para>
+ 	   For BookKeeper, we require a ZooKeeper installation to store metadata, and to pass the list
+ 	   of ZooKeeper servers as parameter to the constructor of the BookKeeper class (<computeroutput>
+ 	   org.apache.bookkeeper.client,BookKeeper</computeroutput>).
+ 	   To setup ZooKeeper, please check the <ulink url="index.html">
+          ZooKeeper documentation</ulink>.
+ 	   </para>
+ 	 </section>
+  </section>
+</article>

+ 128 - 0
src/docs/src/documentation/content/xdocs/bookkeeperOverview.xml

@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+"http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+<article id="bk_GettStartedGuide">
+  <title>BookKeeper overview</title>
+
+  <articleinfo>
+    <legalnotice>
+      <para>Licensed 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 <ulink
+      url="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</ulink>.</para>
+
+      <para>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.</para>
+    </legalnotice>
+
+    <abstract>
+      <para>This guide contains detailed information about using BookKeeper
+      for logging. It discusses the basic operations BookKeeper supports, 
+      and how to create logs and perform basic read and write operations on these
+      logs.</para>
+    </abstract>
+  </articleinfo>
+  <section id="bk_Overview">
+    <title>BookKeeper overview</title>
+
+    <para>This document explains basic concepts of BookKeeper. We start by discussing
+    the basic elements of BookKeeper, and next we discuss how they work together. 
+    </para>
+    
+    <section id="bk_basicComponents">
+    <title>Basic elements</title>
+	<para> 
+	BookKeeper uses four basic elements:
+	</para>
+	
+	<itemizedlist>
+      <listitem>
+      <para> 
+		<emphasis role="bold">Ledger</emphasis>: 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;
+	  </para>
+	  </listitem>
+	
+	  <listitem>
+	  <para> 
+		<emphasis role="bold">BookKeeper client</emphasis>: 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; 
+	  </para>
+	  </listitem> 
+	
+	  <listitem>
+	  <para>
+		<emphasis role="bold">Bookie</emphasis>: A bookie is a BookKeeper storage server. Bookies store the content of ledgers. For any given
+		ledger L, we call an <emphasis>ensemble</emphasis> 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.
+	  </para>
+	  </listitem>
+
+	  <listitem>
+	  <para> 	
+		<emphasis role="bold">Metadata storage service</emphasis>: BookKeeper requires a metadata storage service to store information related 
+		to ledgers and available bookies. We currently use ZooKeeper for such a task.     
+   	  </para>
+   	  </listitem>
+    </itemizedlist>
+    </section>
+    
+    <section id="bk_moreDetail">
+    <title>In slightly more detail...</title>
+    
+    <para> 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. 
+    </para> 
+    
+	<para> An application first creates a ledger before writing to bookies through a local BookKeeper client instance. To 
+	create a ledger, an application has to specify which kind of ledger it wants to use: self-verifying or generic. Self-verifying
+	includes a digest on every entry, which enables a reduction on the degree of replication. Generic ledgers do not store a digest
+	along with entries at the cost of using more bookies.   
+	</para>
+	
+	<para> Upon creating a ledger, a BookKeeper clients writes metadata about the ledger to ZooKeeper. A given client first creates
+	a znode named "L" as a child of "/ledger" with the SEQUENCE flag. ZooKeeper consequently assigns a unique sequence number to the 
+	node, naming the node "/Lx", where x is the sequence number assigned. We use this sequence number as the identifier of the ledger. 
+	This identifier is necessary when opening a ledger. We also store the ensemble composition so that readers know which set of bookies
+	of access for a given ledger. 	
+	</para>
+	
+	<para>
+	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 an 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 in the form of a close znode as a child of "/Lx", where x is the identifier of the ledger.     
+	</para>
+	
+	<para>
+	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.
+	</para> 
+	</section>  
+  </section>  
+</article>

+ 554 - 0
src/docs/src/documentation/content/xdocs/bookkeeperProgrammer.xml

@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+"http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+<article id="bk_GettStartedGuide">
+  <title>BookKeeper Getting Started Guide</title>
+
+  <articleinfo>
+    <legalnotice>
+      <para>Licensed 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 <ulink
+      url="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</ulink>.</para>
+
+      <para>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.</para>
+    </legalnotice>
+
+    <abstract>
+      <para>This guide contains detailed information about using BookKeeper
+      for logging. It discusses the basic operations BookKeeper supports, 
+      and how to create logs and perform basic read and write operations on these
+      logs.</para>
+    </abstract>
+  </articleinfo>
+  <section id="bk_GettingStarted">
+    <title>Programming with BookKeeper</title>
+    
+    <itemizedlist>
+      <listitem>
+        <para><xref linkend="bk_instance" /></para>
+      </listitem>
+
+      <listitem>
+        <para><xref linkend="bk_createLedger" /></para>
+      </listitem>
+
+      <listitem>
+        <para><xref linkend="bk_writeLedger" /></para>
+      </listitem>
+
+      <listitem>
+        <para><xref linkend="bk_closeLedger" /></para>
+      </listitem>
+      
+	  <listitem>
+        <para><xref linkend="bk_openLedger" /></para>
+      </listitem>
+      
+      <listitem>
+        <para><xref linkend="bk_readLedger" /></para>
+      </listitem>
+      
+    </itemizedlist>
+    
+    <section id="bk_instance">
+    <title> Instantiating BookKeeper.</title>
+    <para>
+    The first step to use BookKeeper is to instantiate a BookKeeper object:
+    </para>
+    <para>
+    <computeroutput>
+    org.apache.bookkeeper.BookKeeper
+    </computeroutput>
+    </para>
+    
+    <para>
+    There is one BookKeeper constructor:
+    </para>
+    
+    <para>
+    <computeroutput>
+	public BookKeeper(String servers) 
+    	throws KeeperException, IOException    
+    </computeroutput>
+   	</para>
+    
+    <para> 
+    where <computeroutput>servers</computeroutput> is a comma-separated list of ZooKeeper servers.
+    </para>
+    
+    </section>
+    
+    <section id="bk_createLedger">
+    <title> Creating a ledger. </title>
+    
+    <para> 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 <computeroutput>org.apache.bookkeeper.client.BookKeeper</computeroutput>.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Synchronous call:</emphasis>
+   	</para>
+   	
+   	<para>
+    <computeroutput>
+    public LedgerHandle createLedger(int ensSize, int qSize, QMode mode,  byte passwd[])
+        throws KeeperException, InterruptedException, 
+        IOException, BKException
+    </computeroutput>
+	</para>
+
+    <para>
+    where:
+    </para>
+    <itemizedlist>
+    	<listitem>
+    	<para> 
+    	<computeroutput>ensSize</computeroutput> is the number of bookies (ensemble size);
+    	</para>
+    	</listitem>
+    
+    	<listitem> 
+    	<para>
+    	<computeroutput>qSize</computeroutput> is the write quorum size;
+    	</para>
+    	</listitem>
+    
+    	<listitem> 
+    	<para>
+    	<computeroutput>mode</computeroutput> is the ledger mode (QMode.GENERIC, QMode.VERIFIABLE).
+    	If <computeroutput>mode</computeroutput> is QMode.GENERIC, then <computeroutput>ensSize</computeroutput> has to
+    	be at least <emphasis>3t+1</emphasis>, and <computeroutput>qSize</computeroutput> has to be <emphasis>2t+1</emphasis>.
+    	<emphasis>t</emphasis> is the maximum number of tolerated bookie failures.  
+    	</para>
+    	</listitem>
+    	
+    	<listitem>
+    	<para>
+    	<computeroutput>passwd</computeroutput> is a password that authorizes the client to write to the
+    	ledger being created.
+    	</para>
+    	</listitem>
+    </itemizedlist>
+    
+    <para>
+    All further operations on a ledger are invoked through the <computeroutput>LedgerHandle</computeroutput>
+    object returned.
+    </para>
+    
+    <para>
+    As a convenience, we provide a <computeroutput>createLedger</computeroutput> with default parameters (3,2,VERIFIABLE), 
+    and the only input parameter it requires is a password.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Asynchronous call:</emphasis>
+   	</para>
+    
+    <para>
+    <computeroutput>
+    public void asyncCreateLedger(int ensSize, 
+            int qSize, 
+            QMode mode,  
+            byte passwd[],
+            CreateCallback cb,
+            Object ctx
+            )
+    throws KeeperException, InterruptedException, 
+    IOException, BKException
+    </computeroutput>
+	</para>
+	
+    <para>
+	The parameters are the same of the synchronous version, with the
+	exception of <computeroutput>cb</computeroutput> and <computeroutput>ctx</computeroutput>. <computeroutput>CreateCallback</computeroutput>
+	is an interface in <computeroutput>org.apache.bookkeeper.client.AsyncCallback</computeroutput>, and
+	a class implementing it has to implement a method called <computeroutput>createComplete</computeroutput>
+	that has the following signature: 
+    </para>
+
+	<para>
+	<computeroutput>
+	void createComplete(int rc, LedgerHandle lh, Object ctx);
+	</computeroutput>    
+	</para>
+	
+	<para>
+	where:
+	</para>
+	<itemizedlist>
+		<listitem>
+		<para>
+		<computeroutput>rc</computeroutput> is a return code (please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+		</para>
+		</listitem>
+	
+		<listitem>
+		<para>
+		<computeroutput>lh</computeroutput> is a <computeroutput>LedgerHandle</computeroutput> object to manipulate a ledger;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>ctx</computeroutput> is a control object for accountability purposes;
+		</para>
+		</listitem>
+	</itemizedlist>	
+	
+	<para>
+	The <computeroutput>ctx</computeroutput> object passed as a parameter to the call to create a ledger
+	is the one same returned in the callback.
+    </para>
+    </section>
+    
+    <section id="bk_writeLedger">
+    <title> Adding entries to a ledger. </title>
+    <para>
+    Once we have a ledger handle <computeroutput>lh</computeroutput> 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 <computeroutput>org.apache.bookkeeper.client.LedgerHandle</computeroutput>.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Synchronous call:</emphasis>
+   	</para>
+   	
+   	<para>
+    <computeroutput>
+	public long addEntry(byte[] data)
+    	throws InterruptedException
+    </computeroutput>
+	</para>
+
+    <para>
+    where:
+    </para>
+    
+    <itemizedlist>
+    	<listitem>
+    	<para> 
+    	<computeroutput>data</computeroutput> is a byte array;
+    	</para>
+    	</listitem>
+    </itemizedlist>
+    
+    <para>
+	A call to <computeroutput>addEntry</computeroutput> returns the status of the operation ((please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Asynchronous call:</emphasis>
+   	</para>
+
+	<para>
+    <computeroutput>
+	public void asyncAddEntry(byte[] data, AddCallback cb, Object ctx)
+    throws InterruptedException
+    </computeroutput>
+	</para>
+	
+    <para>
+    It also takes a byte array as the sequence of bytes to be stored as an entry. Additionaly, it takes
+    a callback object <computeroutput>cb</computeroutput> and a control object <computeroutput>ctx</computeroutput>. The callback object must implement
+    the <computeroutput>AddCallback</computeroutput> interface in <computeroutput>org.apache.bookkeeper.client.AsyncCallback</computeroutput>, and
+	a class implementing it has to implement a method called <computeroutput>addComplete</computeroutput>
+	that has the following signature: 
+    </para>
+
+	<para>
+	<computeroutput>
+	void addComplete(int rc, LedgerHandle lh, long entryId, Object ctx);
+	</computeroutput>    
+	</para>
+	
+	<para>
+	where:
+	</para>
+	<itemizedlist>
+		<listitem>
+		<para>
+		<computeroutput>rc</computeroutput> is a return code (please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+		</para>
+		</listitem>
+	
+		<listitem>
+		<para>
+		<computeroutput>lh</computeroutput> is a <computeroutput>LedgerHandle</computeroutput> object to manipulate a ledger;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>entryId</computeroutput> is the identifier of entry associated with this request;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>ctx</computeroutput> is control object used for accountability purposes. 
+		</para>
+		</listitem>
+	</itemizedlist>	 
+    </section>
+    
+    <section id="bk_closeLedger">
+    <title> Closing a ledger. </title>
+    <para>
+    Once a client is done writing, it closes the ledger. The following methods belong
+    to <computeroutput>org.apache.bookkeeper.client.LedgerHandle</computeroutput>.
+    </para>
+    <para>
+   	<emphasis role="bold">Synchronous close:</emphasis>
+   	</para>
+    
+    <para>
+    <computeroutput>
+	public void close() 
+    throws KeeperException, InterruptedException
+    </computeroutput>
+	</para>
+
+    <para>
+    It takes no input parameters.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Asynchronous close:</emphasis>
+   	</para>
+    <para>
+    <computeroutput>
+	public void asyncClose(CloseCallback cb, Object ctx)
+    throws InterruptedException
+    </computeroutput>
+	</para>
+	
+    <para>
+    It takes a callback object <computeroutput>cb</computeroutput> and a control object <computeroutput>ctx</computeroutput>. The callback object must implement
+    the <computeroutput>CloseCallback</computeroutput> interface in <computeroutput>org.apache.bookkeeper.client.AsyncCallback</computeroutput>, and
+	a class implementing it has to implement a method called <computeroutput>closeComplete</computeroutput>
+	that has the following signature: 
+    </para>
+
+	<para>
+	<computeroutput>
+	void closeComplete(int rc, LedgerHandle lh, Object ctx)
+	</computeroutput>    
+	</para>
+	
+	<para>
+	where:
+	</para>
+	<itemizedlist>
+		<listitem>
+		<para>
+		<computeroutput>rc</computeroutput> is a return code (please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+		</para>
+		</listitem>
+	
+		<listitem>
+		<para>
+		<computeroutput>lh</computeroutput> is a <computeroutput>LedgerHandle</computeroutput> object to manipulate a ledger;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>ctx</computeroutput> is control object used for accountability purposes. 
+		</para>
+		</listitem>
+	</itemizedlist>	
+    
+    </section>
+    
+    <section id="bk_openLedger">
+    <title> Opening a ledger. </title>
+    <para>
+    To read from a ledger, a client must open it first. The following methods belong
+    to <computeroutput>org.apache.bookkeeper.client.BookKeeper</computeroutput>.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Synchronous open:</emphasis>
+   	</para>
+    
+    <para>
+    <computeroutput>
+	public LedgerHandle openLedger(long lId, byte passwd[])
+    throws KeeperException, InterruptedException, IOException, BKException
+    </computeroutput>
+	</para>
+
+	<itemizedlist>
+	<listitem>
+	<para>
+	<computeroutput>ledgerId</computeroutput> is the ledger identifier;
+	</para>
+	</listitem>
+	
+	<listitem>
+	<para>
+	<computeroutput>passwd</computeroutput> is a password to access the ledger (used only in the case of <computeroutput>VERIFIABLE</computeroutput> ledgers);
+	</para>
+	</listitem>
+	</itemizedlist>
+    
+    <para>
+   	<emphasis role="bold">Asynchronous open:</emphasis>
+   	</para>
+    <para>
+    <computeroutput>
+	public void asyncOpenLedger(long lId, byte passwd[], OpenCallback cb, Object ctx)
+    throws InterruptedException
+    </computeroutput>
+	</para>
+	
+    <para>
+    It also takes a a ledger identifier and a password. Additionaly, it takes a callback object 
+    <computeroutput>cb</computeroutput> and a control object <computeroutput>ctx</computeroutput>. The callback object must implement
+    the <computeroutput>OpenCallback</computeroutput> interface in <computeroutput>org.apache.bookkeeper.client.AsyncCallback</computeroutput>, and
+	a class implementing it has to implement a method called <computeroutput>openComplete</computeroutput>
+	that has the following signature: 
+    </para>
+
+	<para>
+	<computeroutput>
+	public void openComplete(int rc, LedgerHandle lh, Object ctx)
+	</computeroutput>    
+	</para>
+	
+	<para>
+	where:
+	</para>
+	<itemizedlist>
+		<listitem>
+		<para>
+		<computeroutput>rc</computeroutput> is a return code (please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+		</para>
+		</listitem>
+	
+		<listitem>
+		<para>
+		<computeroutput>lh</computeroutput> is a <computeroutput>LedgerHandle</computeroutput> object to manipulate a ledger;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>ctx</computeroutput> is control object used for accountability purposes. 
+		</para>
+		</listitem>
+	</itemizedlist>	
+    </section>
+    
+    <section id="bk_readLedger">
+    <title> Reading from ledger </title>
+    <para>
+    Read calls may request one or more consecutive entries. The following methods belong
+    to <computeroutput>org.apache.bookkeeper.client.LedgerHandle</computeroutput>.
+    </para>
+    
+    <para>
+   	<emphasis role="bold">Synchronous read:</emphasis>
+   	</para>
+    
+    <para>
+    <computeroutput>
+	public LedgerSequence readEntries(long firstEntry, long lastEntry) 
+    throws InterruptedException, BKException
+    </computeroutput>
+	</para>
+
+	<itemizedlist>
+	<listitem>
+	<para>
+	<computeroutput>firstEntry</computeroutput> is the identifier of the first entry in the sequence of entries to read;
+	</para>
+	</listitem>
+	
+	<listitem>
+	<para>
+	<computeroutput>lastEntry</computeroutput> is the identifier of the last entry in the sequence of entries to read;
+	</para>
+	</listitem>
+	</itemizedlist>
+    
+    <para>
+   	<emphasis role="bold">Asynchronous read:</emphasis>
+   	</para>
+    <para>
+    <computeroutput>
+	public void asyncReadEntries(long firstEntry, 
+            long lastEntry, ReadCallback cb, Object ctx)
+    throws BKException, InterruptedException
+    </computeroutput>
+	</para>
+	
+    <para>
+    It also takes a first and a last entry identifiers. Additionaly, it takes a callback object 
+    <computeroutput>cb</computeroutput> and a control object <computeroutput>ctx</computeroutput>. The callback object must implement
+    the <computeroutput>ReadCallback</computeroutput> interface in <computeroutput>org.apache.bookkeeper.client.AsyncCallback</computeroutput>, and
+	a class implementing it has to implement a method called <computeroutput>readComplete</computeroutput>
+	that has the following signature: 
+    </para>
+
+	<para>
+	<computeroutput>
+	void readComplete(int rc, LedgerHandle lh, LedgerSequence seq, Object ctx)
+	</computeroutput>    
+	</para>
+	
+	<para>
+	where:
+	</para>
+	<itemizedlist>
+		<listitem>
+		<para>
+		<computeroutput>rc</computeroutput> is a return code (please refer to <computeroutput>org.apache.bookeeper.client.BKDefs</computeroutput> for a list);
+		</para>
+		</listitem>
+	
+		<listitem>
+		<para>
+		<computeroutput>lh</computeroutput> is a <computeroutput>LedgerHandle</computeroutput> object to manipulate a ledger;
+		</para>
+		</listitem>
+		
+		<listitem>
+		<para>
+		<computeroutput>seq</computeroutput> is a <computeroutput>LedgerSequence</computeroutput> object to containing the list of entries requested;
+		</para>
+		</listitem>
+
+		<listitem>
+		<para>
+		<computeroutput>ctx</computeroutput> is control object used for accountability purposes. 
+		</para>
+		</listitem>
+	</itemizedlist>	
+    </section>
+   </section>
+</article>

+ 204 - 0
src/docs/src/documentation/content/xdocs/bookkeeperStarted.xml

@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation
+
+  Licensed 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.
+-->
+
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+"http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+<article id="bk_GettStartedGuide">
+  <title>BookKeeper Getting Started Guide</title>
+
+  <articleinfo>
+    <legalnotice>
+      <para>Licensed 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 <ulink
+      url="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</ulink>.</para>
+
+      <para>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.</para>
+    </legalnotice>
+
+    <abstract>
+      <para>This guide contains detailed information about using BookKeeper
+      for logging. It discusses the basic operations BookKeeper supports, 
+      and how to create logs and perform basic read and write operations on these
+      logs.</para>
+    </abstract>
+  </articleinfo>
+  <section id="bk_GettingStarted">
+    <title>Getting Started: Setting up BookKeeper to write logs.</title>
+
+    <para>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 
+    <ulink url="bookkeeperProgrammer.html">BookKeeper Programmer's Guide</ulink>.
+    </para>
+  
+	  <section id="bk_Prerequisites">
+    	  <title>Pre-requisites</title>
+	      <para>See <ulink url="bookkeeperConfig.html#bk_sysReq">
+    	      System Requirements</ulink> in the Admin guide.</para>
+	    </section>
+
+	  <section id="bk_Download">
+      	<title>Download</title>
+		<para> BookKeeper is distributed along with ZooKeeper. To get a ZooKeeper distribution, 
+			   download a recent
+    	    <ulink url="http://hadoop.apache.org/zookeeper/releases.html">
+        	  stable</ulink> release from one of the Apache Download
+       	 Mirrors.</para>
+	  </section>
+	  
+	  <section id="bk_localBK">
+      	<title>LocalBookKeeper</title>
+		<para> 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.
+		</para>
+	  </section>
+	  
+	  <section id="bk_setupBookies">
+      	<title>Setting up bookies</title>
+		<para> 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.  
+		</para>
+		
+		<para>
+		For each bookie, we need to execute a command like the following:
+		</para>
+		
+		<para><computeroutput>
+		java -cp .:./zookeeper-dev-bookkeeper.jar:./zookeeper-dev.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
+		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\
+		/path_to_ledger_device/
+		</computeroutput></para>
+		
+		<para> "/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. 
+		</para>
+	  </section>
+	  
+	  <section id="bk_setupZK">
+	  	<title>Setting up ZooKeeper</title>
+	  	<para> 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:
+	  	</para>
+	  	
+	  	<orderedlist>
+	  	<listitem>
+	  	<para><computeroutput>
+	  	/ledgers	
+	  	</computeroutput></para>
+	  	</listitem>
+	  	
+	  	<listitem>
+	  	<para><computeroutput>
+	  	/ledgers/available
+	  	</computeroutput></para>
+	  	</listitem>
+	  	
+	  	<listitem>
+	  	<para> 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 
+	  	<computeroutput>/ledgers/available/bookie.foo.com:3181</computeroutput>.  
+	  	</para>
+	  	</listitem>
+	  	</orderedlist>
+	  </section>
+	  
+	  <section id="bk_example">
+	    <title>Example</title>
+	    <para>
+	    In the following excerpt of code, we:
+	    </para>
+	    
+	    <orderedlist>
+	    	<listitem>
+	    	<para>
+	    	Create a ledger;
+	    	</para>
+	    	</listitem>
+	    	
+	    	<listitem>
+	    	<para>
+	    	Write to the ledger;
+	    	</para>
+	    	</listitem>
+	    	
+	    	<listitem>
+	    	<para>
+	    	Close the ledger;
+	    	</para>
+	    	</listitem>
+	    	
+	    	<listitem>
+	    	<para>
+	    	Open the same ledger for reading;
+	    	</para>
+	    	</listitem>
+	    	
+	    	<listitem>
+	    	<para>
+	    	Read from the ledger;
+	    	</para>
+	    	</listitem>
+	    	
+	    	<listitem>
+	    	<para>
+	    	Close the ledger again;
+	    	</para>
+	    	</listitem>
+	    </orderedlist>
+	    
+	    <programlisting>
+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);		
+			
+LedgerSequence 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();
+	    </programlisting>
+	  </section>  
+  </section>
+</article>

+ 10 - 0
src/docs/src/documentation/content/xdocs/index.xml

@@ -79,6 +79,16 @@
       </ul>
       </li>
 
+	  <li><strong>BookKeeper Documentation</strong>
+	  <p> BookKeeper is a highly-available system that implements high-performance write-ahead logging. It uses ZooKeeper for metadata, 
+	  which is the main reason for being a ZooKeeper contrib.
+	  </p>
+      <ul>
+      <li><a href="bookkeeperOverview.html">henn, what's it again?</a></li>
+	  <li><a href="bookkeeperStarted.html">Ok, now how do I try it out</a></li>
+	  <li><a href="bookkeeperProgrammer.html">Awesome, but how do I integrate it with my app?</a></li>
+      </ul>
+      </li>
     </ul>
   </body>
   

+ 7 - 0
src/docs/src/documentation/content/xdocs/site.xml

@@ -46,6 +46,13 @@ See http://forrest.apache.org/docs/linking.html for more info.
     <recipes   label="Recipes"		      href="recipes.html" />
   </docs>
   
+  <docs label="BookKeeper">
+      <bkStarted label="Getting started"  href="bookkeeperStarted.html" />
+      <bkOverview label="Overview"            href="bookkeeperOverview.html" />
+      <bkProgrammer   label="Setup guide"                    href="bookkeeperConfig.html" />
+      <bkProgrammer   label="Programmer's guide"                    href="bookkeeperProgrammer.html" />
+  </docs>
+  
   <docs label="Admin &amp; Ops">
       <admin label="Administrator's Guide"  href="zookeeperAdmin.html" />
       <quota label="Quota Guide"            href="zookeeperQuotas.html" />

+ 0 - 2
src/docs/src/documentation/content/xdocs/zookeeperTutorial.xml

@@ -68,12 +68,10 @@
                 zk = null;
             }
         }
-        //else mutex = new Integer(-1);
     }
 
     synchronized public void process(WatchedEvent event) {
         synchronized (mutex) {
-            //System.out.println("Process: " + event.getType());
             mutex.notify();
         }
     }

Vissa filer visades inte eftersom för många filer har ändrats