You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ma...@apache.org on 2011/12/17 00:33:04 UTC

svn commit: r1215340 [35/42] - in /zookeeper/site/trunk: content/ content/doc/r3.4.1/ content/doc/r3.4.1/api/ content/doc/r3.4.1/api/org/ content/doc/r3.4.1/api/org/apache/ content/doc/r3.4.1/api/org/apache/zookeeper/ content/doc/r3.4.1/api/org/apache/...

Added: zookeeper/site/trunk/content/doc/r3.4.1/recipes.html
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/recipes.html?rev=1215340&view=auto
==============================================================================
--- zookeeper/site/trunk/content/doc/r3.4.1/recipes.html (added)
+++ zookeeper/site/trunk/content/doc/r3.4.1/recipes.html Fri Dec 16 23:32:55 2011
@@ -0,0 +1,974 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>ZooKeeper Recipes and Solutions</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.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.2', 'skin/')" id="menu_selected_1.2Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Developer</div>
+<div id="menu_selected_1.2" class="selectedmenuitemgroup" style="display: block;">
+<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="menupage">
+<div class="menupagetitle">Recipes</div>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">BookKeeper</div>
+<div id="menu_1.3" class="menuitemgroup">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="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="recipes.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>ZooKeeper Recipes and Solutions</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#ch_recipes">A Guide to Creating Higher-level Constructs with ZooKeeper</a>
+<ul class="minitoc">
+<li>
+<a href="#sc_outOfTheBox">Out of the Box Applications: Name Service, Configuration, Group
+    Membership</a>
+</li>
+<li>
+<a href="#sc_recipes_eventHandles">Barriers</a>
+<ul class="minitoc">
+<li>
+<a href="#sc_doubleBarriers">Double Barriers</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#sc_recipes_Queues">Queues</a>
+<ul class="minitoc">
+<li>
+<a href="#sc_recipes_priorityQueues">Priority Queues</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#sc_recipes_Locks">Locks</a>
+<ul class="minitoc">
+<li>
+<a href="#Shared+Locks">Shared Locks</a>
+</li>
+<li>
+<a href="#sc_recoverableSharedLocks">Recoverable Shared Locks</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#sc_recipes_twoPhasedCommit">Two-phased Commit</a>
+</li>
+<li>
+<a href="#sc_leaderElection">Leader Election</a>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+
+  
+<a name="ch_recipes"></a>
+<h2 class="h3">A Guide to Creating Higher-level Constructs with ZooKeeper</h2>
+<div class="section">
+<p>In this article, you'll find guidelines for using
+    ZooKeeper to implement higher order functions. All of them are conventions
+    implemented at the client and do not require special support from
+    ZooKeeper. Hopfully the community will capture these conventions in client-side libraries 
+    to ease their use and to encourage standardization.</p>
+<p>One of the most interesting things about ZooKeeper is that even
+    though ZooKeeper uses <em>asynchronous</em> notifications, you
+    can use it to build <em>synchronous</em> consistency
+    primitives, such as queues and locks. As you will see, this is possible
+    because ZooKeeper imposes an overall order on updates, and has mechanisms
+    to expose this ordering.</p>
+<p>Note that the recipes below attempt to employ best practices. In
+    particular, they avoid polling, timers or anything else that would result
+    in a "herd effect", causing bursts of traffic and limiting
+    scalability.</p>
+<p>There are many useful functions that can be imagined that aren't
+    included here - revocable read-write priority locks, as just one example.
+    And some of the constructs mentioned here - locks, in particular -
+    illustrate certain points, even though you may find other constructs, such
+    as event handles or queues, a more practical means of performing the same
+    function. In general, the examples in this section are designed to
+    stimulate thought.</p>
+<a name="sc_outOfTheBox"></a>
+<h3 class="h4">Out of the Box Applications: Name Service, Configuration, Group
+    Membership</h3>
+<p>Name service and configuration are two of the primary applications
+    of ZooKeeper. These two functions are provided directly by the ZooKeeper
+    API.</p>
+<p>Another function directly provided by ZooKeeper is <em>group
+    membership</em>. The group is represented by a node. Members of the
+    group create ephemeral nodes under the group node. Nodes of the members
+    that fail abnormally will be removed automatically when ZooKeeper detects
+    the failure.</p>
+<a name="sc_recipes_eventHandles"></a>
+<h3 class="h4">Barriers</h3>
+<p>Distributed systems use <em>barriers</em>
+      to block processing of a set of nodes until a condition is met
+      at which time all the nodes are allowed to proceed. Barriers are
+      implemented in ZooKeeper by designating a barrier node. The
+      barrier is in place if the barrier node exists. Here's the
+      pseudo code:</p>
+<ol>
+      
+<li>
+        
+<p>Client calls the ZooKeeper API's <strong>exists()</strong> function on the barrier node, with
+        <em>watch</em> set to true.</p>
+      
+</li>
+
+      
+<li>
+        
+<p>If <strong>exists()</strong> returns false, the
+        barrier is gone and the client proceeds</p>
+      
+</li>
+
+      
+<li>
+        
+<p>Else, if <strong>exists()</strong> returns true,
+        the clients wait for a watch event from ZooKeeper for the barrier
+        node.</p>
+      
+</li>
+
+      
+<li>
+        
+<p>When the watch event is triggered, the client reissues the
+        <strong>exists( )</strong> call, again waiting until
+        the barrier node is removed.</p>
+      
+</li>
+    
+</ol>
+<a name="sc_doubleBarriers"></a>
+<h4>Double Barriers</h4>
+<p>Double barriers enable clients to synchronize the beginning and
+      the end of a computation. When enough processes have joined the barrier,
+      processes start their computation and leave the barrier once they have
+      finished. This recipe shows how to use a ZooKeeper node as a
+      barrier.</p>
+<p>The pseudo code in this recipe represents the barrier node as
+      <em>b</em>. Every client process <em>p</em>
+      registers with the barrier node on entry and unregisters when it is
+      ready to leave. A node registers with the barrier node via the <strong>Enter</strong> procedure below, it waits until
+      <em>x</em> client process register before proceeding with
+      the computation. (The <em>x</em> here is up to you to
+      determine for your system.)</p>
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+        
+            
+<tr>
+              
+<td><strong>Enter</strong></td>
+
+              <td><strong>Leave</strong></td>
+            
+</tr>
+
+            
+<tr>
+              
+<td>
+<ol>
+                  
+<li>
+                    
+<p>Create a name <em><em>n</em> =
+                        <em>b</em>+&ldquo;/&rdquo;+<em>p</em></em>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Set watch: <strong>exists(<em>b</em> + &lsquo;&lsquo;/ready&rsquo;&rsquo;,
+                        true)</strong>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Create child: <strong>create(
+                        <em>n</em>, EPHEMERAL)</strong>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>
+<strong>L = getChildren(b,
+                        false)</strong>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>if fewer children in L than<em>
+                        x</em>, wait for watch event</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>else <strong>create(b + &lsquo;&lsquo;/ready&rsquo;&rsquo;,
+                        REGULAR)</strong>
+</p>
+                  
+</li>
+                
+</ol>
+</td>
+
+              <td>
+<ol>
+                  
+<li>
+                    
+<p>
+<strong>L = getChildren(b,
+                        false)</strong>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>if no children, exit</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>if <em>p</em> is only process node in
+                      L, delete(n) and exit</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>if <em>p</em> is the lowest process
+                      node in L, wait on highest process node in P</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>else <strong>delete(<em>n</em>) </strong>if
+                      still exists and wait on lowest process node in L</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>goto 1</p>
+                  
+</li>
+                
+</ol>
+</td>
+            
+</tr>
+          
+      
+</table>
+<p>On entering, all processes watch on a ready node and
+        create an ephemeral node as a child of the barrier node. Each process
+        but the last enters the barrier and waits for the ready node to appear
+        at line 5. The process that creates the xth node, the last process, will
+        see x nodes in the list of children and create the ready node, waking up
+        the other processes. Note that waiting processes wake up only when it is
+        time to exit, so waiting is efficient.
+      </p>
+<p>On exit, you can't use a flag such as <em>ready</em>
+      because you are watching for process nodes to go away. By using
+      ephemeral nodes, processes that fail after the barrier has been entered
+      do not prevent correct processes from finishing. When processes are
+      ready to leave, they need to delete their process nodes and wait for all
+      other processes to do the same.</p>
+<p>Processes exit when there are no process nodes left as children of
+      <em>b</em>. However, as an efficiency, you can use the
+      lowest process node as the ready flag. All other processes that are
+      ready to exit watch for the lowest existing process node to go away, and
+      the owner of the lowest process watches for any other process node
+      (picking the highest for simplicity) to go away. This means that only a
+      single process wakes up on each node deletion except for the last node,
+      which wakes up everyone when it is removed.</p>
+<a name="sc_recipes_Queues"></a>
+<h3 class="h4">Queues</h3>
+<p>Distributed queues are a common data structure. To implement a
+    distributed queue in ZooKeeper, first designate a znode to hold the queue,
+    the queue node. The distributed clients put something into the queue by
+    calling create() with a pathname ending in "queue-", with the
+    <em>sequence</em> and <em>ephemeral</em> flags in
+    the create() call set to true. Because the <em>sequence</em>
+    flag is set, the new pathnames will have the form
+    _path-to-queue-node_/queue-X, where X is a monotonic increasing number. A
+    client that wants to be removed from the queue calls ZooKeeper's <strong>getChildren( )</strong> function, with
+    <em>watch</em> set to true on the queue node, and begins
+    processing nodes with the lowest number. The client does not need to issue
+    another <strong>getChildren( )</strong> until it exhausts
+    the list obtained from the first <strong>getChildren(
+    )</strong> call. If there are are no children in the queue node, the
+    reader waits for a watch notification to check the queue again.</p>
+<div class="note">
+<div class="label">Note</div>
+<div class="content">
+      
+<p>There now exists a Queue implementation in ZooKeeper
+      recipes directory. This is distributed with the release --
+      src/recipes/queue directory of the release artifact.
+      </p>
+    
+</div>
+</div>
+<a name="sc_recipes_priorityQueues"></a>
+<h4>Priority Queues</h4>
+<p>To implement a priority queue, you need only make two simple
+      changes to the generic <a href="#sc_recipes_Queues">queue
+      recipe</a> . First, to add to a queue, the pathname ends with
+      "queue-YY" where YY is the priority of the element with lower numbers
+      representing higher priority (just like UNIX). Second, when removing
+      from the queue, a client uses an up-to-date children list meaning that
+      the client will invalidate previously obtained children lists if a watch
+      notification triggers for the queue node.</p>
+<a name="sc_recipes_Locks"></a>
+<h3 class="h4">Locks</h3>
+<p>Fully distributed locks that are globally synchronous, meaning at
+    any snapshot in time no two clients think they hold the same lock. These
+    can be implemented using ZooKeeeper. As with priority queues, first define
+    a lock node.</p>
+<div class="note">
+<div class="label">Note</div>
+<div class="content">
+      
+<p>There now exists a Lock implementation in ZooKeeper
+      recipes directory. This is distributed with the release --
+      src/recipes/lock directory of the release artifact.
+      </p>
+    
+</div>
+</div>
+<p>Clients wishing to obtain a lock do the following:</p>
+<ol>
+      
+<li>
+        
+<p>Call <strong>create( )</strong> with a pathname
+        of "_locknode_/lock-" and the <em>sequence</em> and
+        <em>ephemeral</em> flags set.</p>
+      
+</li>
+
+      
+<li>
+        
+<p>Call <strong>getChildren( )</strong> on the lock
+        node <em>without</em> setting the watch flag (this is
+        important to avoid the herd effect).</p>
+      
+</li>
+
+      
+<li>
+        
+<p>If the pathname created in step <strong>1</strong> has the lowest sequence number suffix, the
+        client has the lock and the client exits the protocol.</p>
+      
+</li>
+
+      
+<li>
+        
+<p>The client calls <strong>exists( )</strong> with
+        the watch flag set on the path in the lock directory with the next
+        lowest sequence number.</p>
+      
+</li>
+
+      
+<li>
+        
+<p>if <strong>exists( )</strong> returns false, go
+        to step <strong>2</strong>. Otherwise, wait for a
+        notification for the pathname from the previous step before going to
+        step <strong>2</strong>.</p>
+      
+</li>
+    
+</ol>
+<p>The unlock protocol is very simple: clients wishing to release a
+    lock simply delete the node they created in step 1.</p>
+<p>Here are a few things to notice:</p>
+<ul>
+      
+<li>
+        
+<p>The removal of a node will only cause one client to wake up
+        since each node is watched by exactly one client. In this way, you
+        avoid the herd effect.</p>
+      
+</li>
+    
+</ul>
+<ul>
+      
+<li>
+        
+<p>There is no polling or timeouts.</p>
+      
+</li>
+    
+</ul>
+<ul>
+      
+<li>
+        
+<p>Because of the way you implement locking, it is easy to see the
+        amount of lock contention, break locks, debug locking problems,
+        etc.</p>
+      
+</li>
+    
+</ul>
+<a name="Shared+Locks"></a>
+<h4>Shared Locks</h4>
+<p>You can implement shared locks by with a few changes to the lock
+      protocol:</p>
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+        
+            
+<tr>
+              
+<td><strong>Obtaining a read
+              lock:</strong></td>
+
+              <td><strong>Obtaining a write
+              lock:</strong></td>
+            
+</tr>
+
+            
+<tr>
+              
+<td>
+<ol>
+                  
+<li>
+                    
+<p>Call <strong>create( )</strong> to
+                    create a node with pathname
+                    "<span class="codefrag filename">_locknode_/read-</span>". This is the
+                    lock node use later in the protocol. Make sure to set both
+                    the <em>sequence</em> and
+                    <em>ephemeral</em> flags.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Call <strong>getChildren( )</strong>
+                    on the lock node <em>without</em> setting the
+                    <em>watch</em> flag - this is important, as it
+                    avoids the herd effect.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>If there are no children with a pathname starting
+                    with "<span class="codefrag filename">write-</span>" and having a lower
+                    sequence number than the node created in step <strong>1</strong>, the client has the lock and can
+                    exit the protocol. </p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Otherwise, call <strong>exists(
+                    )</strong>, with <em>watch</em> flag, set on
+                    the node in lock directory with pathname staring with
+                    "<span class="codefrag filename">write-</span>" having the next lowest
+                    sequence number.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>If <strong>exists( )</strong>
+                    returns <em>false</em>, goto step <strong>2</strong>.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Otherwise, wait for a notification for the pathname
+                    from the previous step before going to step <strong>2</strong>
+</p>
+                  
+</li>
+                
+</ol>
+</td>
+
+              <td>
+<ol>
+                  
+<li>
+                    
+<p>Call <strong>create( )</strong> to
+                    create a node with pathname
+                    "<span class="codefrag filename">_locknode_/write-</span>". This is the
+                    lock node spoken of later in the protocol. Make sure to
+                    set both <em>sequence</em> and
+                    <em>ephemeral</em> flags.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Call <strong>getChildren( )
+                    </strong> on the lock node <em>without</em>
+                    setting the <em>watch</em> flag - this is
+                    important, as it avoids the herd effect.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>If there are no children with a lower sequence
+                    number than the node created in step <strong>1</strong>, the client has the lock and the
+                    client exits the protocol.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Call <strong>exists( ),</strong>
+                    with <em>watch</em> flag set, on the node with
+                    the pathname that has the next lowest sequence
+                    number.</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>If <strong>exists( )</strong>
+                    returns <em>false</em>, goto step <strong>2</strong>. Otherwise, wait for a
+                    notification for the pathname from the previous step
+                    before going to step <strong>2</strong>.</p>
+                  
+</li>
+                
+</ol>
+</td>
+            
+</tr>
+          
+      
+</table>
+<div class="note">
+<div class="label">Note</div>
+<div class="content">
+        
+<p>It might appear that this recipe creates a herd effect:
+          when there is a large group of clients waiting for a read
+          lock, and all getting notified more or less simultaneously
+          when the "<span class="codefrag filename">write-</span>" node with the lowest
+          sequence number is deleted. In fact. that's valid behavior:
+          as all those waiting reader clients should be released since
+          they have the lock. The herd effect refers to releasing a
+          "herd" when in fact only a single or a small number of
+          machines can proceed.
+        </p>
+      
+</div>
+</div>
+<a name="sc_recoverableSharedLocks"></a>
+<h4>Recoverable Shared Locks</h4>
+<p>With minor modifications to the Shared Lock protocol, you make
+      shared locks revocable by modifying the shared lock protocol:</p>
+<p>In step <strong>1</strong>, of both obtain reader
+      and writer lock protocols, call <strong>getData(
+      )</strong> with <em>watch</em> set, immediately after the
+      call to <strong>create( )</strong>. If the client
+      subsequently receives notification for the node it created in step
+      <strong>1</strong>, it does another <strong>getData( )</strong> on that node, with
+      <em>watch</em> set and looks for the string "unlock", which
+      signals to the client that it must release the lock. This is because,
+      according to this shared lock protocol, you can request the client with
+      the lock give up the lock by calling <strong>setData()
+      </strong> on the lock node, writing "unlock" to that node.</p>
+<p>Note that this protocol requires the lock holder to consent to
+      releasing the lock. Such consent is important, especially if the lock
+      holder needs to do some processing before releasing the lock. Of course
+      you can always implement <em>Revocable Shared Locks with Freaking
+      Laser Beams</em> by stipulating in your protocol that the revoker
+      is allowed to delete the lock node if after some length of time the lock
+      isn't deleted by the lock holder.</p>
+<a name="sc_recipes_twoPhasedCommit"></a>
+<h3 class="h4">Two-phased Commit</h3>
+<p>A two-phase commit protocol is an algorithm that lets all clients in
+    a distributed system agree either to commit a transaction or abort.</p>
+<p>In ZooKeeper, you can implement a two-phased commit by having a
+    coordinator create a transaction node, say "/app/Tx", and one child node
+    per participating site, say "/app/Tx/s_i". When coordinator creates the
+    child node, it leaves the content undefined. Once each site involved in
+    the transaction receives the transaction from the coordinator, the site
+    reads each child node and sets a watch. Each site then processes the query
+    and votes "commit" or "abort" by writing to its respective node. Once the
+    write completes, the other sites are notified, and as soon as all sites
+    have all votes, they can decide either "abort" or "commit". Note that a
+    node can decide "abort" earlier if some site votes for "abort".</p>
+<p>An interesting aspect of this implementation is that the only role
+    of the coordinator is to decide upon the group of sites, to create the
+    ZooKeeper nodes, and to propagate the transaction to the corresponding
+    sites. In fact, even propagating the transaction can be done through
+    ZooKeeper by writing it in the transaction node.</p>
+<p>There are two important drawbacks of the approach described above.
+    One is the message complexity, which is O(n&sup2;). The second is the
+    impossibility of detecting failures of sites through ephemeral nodes. To
+    detect the failure of a site using ephemeral nodes, it is necessary that
+    the site create the node.</p>
+<p>To solve the first problem, you can have only the coordinator
+    notified of changes to the transaction nodes, and then notify the sites
+    once coordinator reaches a decision. Note that this approach is scalable,
+    but it's is slower too, as it requires all communication to go through the
+    coordinator.</p>
+<p>To address the second problem, you can have the coordinator
+    propagate the transaction to the sites, and have each site creating its
+    own ephemeral node.</p>
+<a name="sc_leaderElection"></a>
+<h3 class="h4">Leader Election</h3>
+<p>A simple way of doing leader election with ZooKeeper is to use the
+    <strong>SEQUENCE|EPHEMERAL</strong> flags when creating
+    znodes that represent "proposals" of clients. The idea is to have a znode,
+    say "/election", such that each znode creates a child znode "/election/n_"
+    with both flags SEQUENCE|EPHEMERAL. With the sequence flag, ZooKeeper
+    automatically appends a sequence number that is greater that any one
+    previously appended to a child of "/election". The process that created
+    the znode with the smallest appended sequence number is the leader.
+    </p>
+<p>That's not all, though. It is important to watch for failures of the
+    leader, so that a new client arises as the new leader in the case the
+    current leader fails. A trivial solution is to have all application
+    processes watching upon the current smallest znode, and checking if they
+    are the new leader when the smallest znode goes away (note that the
+    smallest znode will go away if the leader fails because the node is
+    ephemeral). But this causes a herd effect: upon of failure of the current
+    leader, all other processes receive a notification, and execute
+    getChildren on "/election" to obtain the current list of children of
+    "/election". If the number of clients is large, it causes a spike on the
+    number of operations that ZooKeeper servers have to process. To avoid the
+    herd effect, it is sufficient to watch for the next znode down on the
+    sequence of znodes. If a client receives a notification that the znode it
+    is watching is gone, then it becomes the new leader in the case that there
+    is no smaller znode. Note that this avoids the herd effect by not having
+    all clients watching the same znode. </p>
+<p>Here's the pseudo code:</p>
+<p>Let ELECTION be a path of choice of the application. To volunteer to
+    be a leader: </p>
+<ol>
+      
+<li>
+        
+<p>Create znode z with path "ELECTION/n_" with both SEQUENCE and
+        EPHEMERAL flags;</p>
+      
+</li>
+
+      
+<li>
+        
+<p>Let C be the children of "ELECTION", and i be the sequence
+        number of z;</p>
+      
+</li>
+
+      
+<li>
+        
+<p>Watch for changes on "ELECTION/n_j", where j is the smallest
+        sequence number such that j &lt; i and n_j is a znode in C;</p>
+      
+</li>
+    
+</ol>
+<p>Upon receiving a notification of znode deletion: </p>
+<ol>
+      
+<li>
+        
+<p>Let C be the new set of children of ELECTION; </p>
+      
+</li>
+
+      
+<li>
+        
+<p>If z is the smallest node in C, then execute leader
+        procedure;</p>
+      
+</li>
+
+      
+<li>
+        
+<p>Otherwise, watch for changes on "ELECTION/n_j", where j is the
+        smallest sequence number such that j &lt; i and n_j is a znode in C;
+        </p>
+      
+</li>
+    
+</ol>
+<p>Note that the znode having no preceding znode on the list of
+    children does not imply that the creator of this znode is aware that it is
+    the current leader. Applications may consider creating a separate to znode
+    to acknowledge that the leader has executed the leader procedure. </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>

Added: zookeeper/site/trunk/content/doc/r3.4.1/recipes.pdf
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/recipes.pdf?rev=1215340&view=auto
==============================================================================
Binary file - no diff available.

Propchange: zookeeper/site/trunk/content/doc/r3.4.1/recipes.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.html
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.html?rev=1215340&view=auto
==============================================================================
--- zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.html (added)
+++ zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.html Fri Dec 16 23:32:55 2011
@@ -0,0 +1,3031 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-skin-name" content="pelt">
+<title>ZooKeeper 3.4.1 Release Notes</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.4 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_selected_1.1', 'skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Overview</div>
+<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
+<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="menupage">
+<div class="menupagetitle">Release Notes</div>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
+<div id="menu_1.2" class="menuitemgroup">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">BookKeeper</div>
+<div id="menu_1.3" class="menuitemgroup">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="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="releasenotes.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>ZooKeeper 3.4.1 Release Notes</h1>
+<div id="front-matter">
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#changes">Changes Since ZooKeeper 3.4.0</a>
+</li>
+<li>
+<a href="#prevchanges">Changes Since ZooKeeper 3.3.0</a>
+</li>
+</ul>
+</div>
+</div>
+  
+
+  
+
+
+<p>
+These release notes include new developer and user facing incompatibilities, features, and major improvements.
+</p>
+
+
+<ul>
+  
+<li>
+<p>
+<a href="#changes">Changes</a>
+</p>
+</li>
+
+</ul>
+
+
+<a name="changes"></a>
+<h2 class="h3">Changes Since ZooKeeper 3.4.0</h2>
+<div class="section">
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+<caption>Changes Since ZooKeeper 3.4.0</caption>
+
+<title>Changes Since ZooKeeper 3.4.0</title>
+
+
+<tr>
+  
+<th>Issue</th>
+  <th>Notes</th>
+
+</tr>
+
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1311">
+   ZOOKEEPER-1311</a>
+ </td>
+<td>
+ZooKeeper test jar is broken
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1305">
+   ZOOKEEPER-1305</a>
+ </td>
+<td>
+zookeeper.c:prepend_string func can dereference null ptr
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1316">
+   ZOOKEEPER-1316</a>
+ </td>
+<td>
+zookeeper_init leaks memory if chroot is just '/'
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1315">
+   ZOOKEEPER-1315</a>
+ </td>
+<td>
+ zookeeper_init always reports sessionPasswd=hidden
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1317">
+   ZOOKEEPER-1317</a>
+ </td>
+<td>
+ Possible segfault in zookeeper_init.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1319">
+   ZOOKEEPER-1319</a>
+ </td>
+<td>
+ Missing data after restarting+expanding a cluster.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1269">
+   ZOOKEEPER-1269</a>
+ </td>
+<td>
+ Multi deserialization issues.
+</td>
+
+</tr>
+
+
+</table>
+</div>
+
+
+<a name="prevchanges"></a>
+<h2 class="h3">Changes Since ZooKeeper 3.3.0</h2>
+<div class="section">
+<table class="ForrestTable" cellspacing="1" cellpadding="4">
+<caption>Changes Since ZooKeeper 3.3.0</caption>
+
+<title>Changes Since ZooKeeper 3.3.0</title>
+
+
+<tr>
+  
+<th>Issue</th>
+  <th>Notes</th>
+
+</tr>
+
+
+<tr>
+ 
+<td>
+   Sub-Tasks
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1239">
+   ZOOKEEPER-1239</a>
+ </td>
+ <td>
+ add logging/stats to identify fsync stalls.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1208">
+   ZOOKEEPER-1208</a>
+ </td>
+<td>
+Ephemeral node not removed after the client session is long gone. 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-784">
+   ZOOKEEPER-784</a>
+ </td>
+ <td>
+  server-side functionality for read-only mode. This is not thoroughly tested.
+  Avoid using it in production. This is also at risk of being removed from
+  the feature set later.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-798">
+   ZOOKEEPER-798</a>
+ </td>
+ <td>
+  Fixup loggraph for FLE changes
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-839">
+   ZOOKEEPER-839</a>
+ </td>
+ <td>
+  deleteRecursive does not belong to the other methods
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-908">
+   ZOOKEEPER-908</a>
+ </td>
+ <td>
+  Remove code duplication and inconsistent naming in ClientCnxn.Packet creation
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-909">
+   ZOOKEEPER-909</a>
+ </td>
+ <td>
+  Extract NIO specific code from ClientCnxn
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-966">
+   ZOOKEEPER-966</a>
+ </td>
+ <td>
+  Client side for multi
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-967">
+   ZOOKEEPER-967</a>
+ </td>
+ <td>
+  Server side decoding and function dispatch
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-968">
+   ZOOKEEPER-968</a>
+ </td>
+ <td>
+  Database multi-update
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1042">
+   ZOOKEEPER-1042</a>
+ </td>
+ <td>
+  Generate zookeeper test jar for maven installation
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1081">
+   ZOOKEEPER-1081</a>
+ </td>
+ <td>
+  modify leader/follower code to correctly deal with new leader
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1082">
+   ZOOKEEPER-1082</a>
+ </td>
+ <td>
+  modify leader election to correctly take into account current epoch
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1150">
+   ZOOKEEPER-1150</a>
+ </td>
+ <td>
+  fix for this patch to compile on windows...
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1160">
+   ZOOKEEPER-1160</a>
+ </td>
+ <td>
+  test timeouts are too small
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1201">
+   ZOOKEEPER-1201</a>
+ </td>
+ <td>
+  Clean SaslServerCallbackHandler.java
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+   Bug Fixes
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1268">
+   ZOOKEEPER-1268</a>
+ </td>
+ <td>
+  problems with read only mode, intermittent test failures and ERRORs in the log.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1271">
+   ZOOKEEPER-1271</a>
+ </td>
+ <td>
+	testEarlyLeaderAbandonment failing on solaris - clients not retrying connection.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1192">
+   ZOOKEEPER-1192</a>
+ </td>
+ <td>
+Leader.waitForEpochAck() checks waitingForNewEpoch instead of checking electionFinished.
+</td>
+
+</tr>
+
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1246">
+   ZOOKEEPER-1246</a>
+ </td>
+ <td>
+  Dead code in PrepRequestProcessor catch Exception block.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1264">
+   ZOOKEEPER-1264</a>
+ </td>
+ <td>
+  FollowerResyncConcurrencyTest failing intermittently.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1270">
+   ZOOKEEPER-1270</a>
+ </td>
+ <td>
+   testEarlyLeaderAbandonment failing intermittently, quorum formed, no serving.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1291">
+   ZOOKEEPER-1291</a>
+ </td>
+ <td>
+   AcceptedEpoch not updated at leader before it proposes the epoch to followers.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1282">
+   ZOOKEEPER-1282</a>
+ </td>
+ <td>
+Learner.java not following Zab 1.0 protocol - setCurrentEpoch should be done upon receipt of NEWLEADER
+ (before acking it) and not upon receipt of UPTODATE.
+ </td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-335">
+   ZOOKEEPER-335</a>
+ </td>
+ <td>
+  zookeeper servers should commit the new leader txn to their logs.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-418">
+   ZOOKEEPER-418</a>
+ </td>
+ <td>
+  Need nifty zookeeper browser
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-603">
+   ZOOKEEPER-603</a>
+ </td>
+ <td>
+  zkpython should do a better job of freeing memory under error conditions
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-662">
+   ZOOKEEPER-662</a>
+ </td>
+ <td>
+  Too many CLOSE_WAIT socket state on a server
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-690">
+   ZOOKEEPER-690</a>
+ </td>
+ <td>
+  AsyncTestHammer test fails on hudson.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-719">
+   ZOOKEEPER-719</a>
+ </td>
+ <td>
+  Add throttling to BookKeeper client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-720">
+   ZOOKEEPER-720</a>
+ </td>
+ <td>
+  Use zookeeper-{version}-sources.jar instead of zookeeper-{version}-src.jar to publish sources in the Maven repository
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-722">
+   ZOOKEEPER-722</a>
+ </td>
+ <td>
+  zkServer.sh uses sh's builtin echo on BSD, behaves incorrectly.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-731">
+   ZOOKEEPER-731</a>
+ </td>
+ <td>
+  Zookeeper#delete  , #create - async versions miss a verb in the javadoc 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-734">
+   ZOOKEEPER-734</a>
+ </td>
+ <td>
+  QuorumPeerTestBase.java and ZooKeeperServerMainTest.java do not handle windows path correctly
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-735">
+   ZOOKEEPER-735</a>
+ </td>
+ <td>
+  cppunit test testipv6 assumes that the machine is ipv6 enabled.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-737">
+   ZOOKEEPER-737</a>
+ </td>
+ <td>
+  some 4 letter words may fail with netcat (nc)
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-738">
+   ZOOKEEPER-738</a>
+ </td>
+ <td>
+  zookeeper.jute.h fails to compile with -pedantic 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-741">
+   ZOOKEEPER-741</a>
+ </td>
+ <td>
+  root level create on REST proxy fails
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-742">
+   ZOOKEEPER-742</a>
+ </td>
+ <td>
+  Deallocatng None on writes
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-746">
+   ZOOKEEPER-746</a>
+ </td>
+ <td>
+  learner outputs session id to log in dec (should be hex)
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-749">
+   ZOOKEEPER-749</a>
+ </td>
+ <td>
+  OSGi metadata not included in binary only jar
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-750">
+   ZOOKEEPER-750</a>
+ </td>
+ <td>
+  move maven artifacts into "dist-maven" subdir of the release (package target)
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-758">
+   ZOOKEEPER-758</a>
+ </td>
+ <td>
+  zkpython segfaults on invalid acl with missing key
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-763">
+   ZOOKEEPER-763</a>
+ </td>
+ <td>
+  Deadlock on close w/ zkpython / c client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-764">
+   ZOOKEEPER-764</a>
+ </td>
+ <td>
+  Observer elected leader due to inconsistent voting view
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-766">
+   ZOOKEEPER-766</a>
+ </td>
+ <td>
+  forrest recipes docs don't mention the lock/queue recipe implementations available in the release
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-769">
+   ZOOKEEPER-769</a>
+ </td>
+ <td>
+  Leader can treat observers as quorum members
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-772">
+   ZOOKEEPER-772</a>
+ </td>
+ <td>
+  zkpython segfaults when watcher from async get children is invoked.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-774">
+   ZOOKEEPER-774</a>
+ </td>
+ <td>
+  Recipes tests are slightly outdated: they do not compile against JUnit 4.8
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-777">
+   ZOOKEEPER-777</a>
+ </td>
+ <td>
+  setting acl on a non existant node should return no node error
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-782">
+   ZOOKEEPER-782</a>
+ </td>
+ <td>
+  Incorrect C API documentation for Watches
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-783">
+   ZOOKEEPER-783</a>
+ </td>
+ <td>
+  committedLog in ZKDatabase is not properly synchronized
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-787">
+   ZOOKEEPER-787</a>
+ </td>
+ <td>
+  groupId in deployed pom is wrong
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-790">
+   ZOOKEEPER-790</a>
+ </td>
+ <td>
+  Last processed zxid set prematurely while establishing leadership
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-792">
+   ZOOKEEPER-792</a>
+ </td>
+ <td>
+  zkpython memory leak
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-794">
+   ZOOKEEPER-794</a>
+ </td>
+ <td>
+  Callbacks are not invoked when the client is closed
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-795">
+   ZOOKEEPER-795</a>
+ </td>
+ <td>
+  eventThread isn't shutdown after a connection "session expired" event coming
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-796">
+   ZOOKEEPER-796</a>
+ </td>
+ <td>
+  zkServer.sh should support an external PIDFILE variable
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-800">
+   ZOOKEEPER-800</a>
+ </td>
+ <td>
+  zoo_add_auth returns ZOK if zookeeper handle is in ZOO_CLOSED_STATE
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-804">
+   ZOOKEEPER-804</a>
+ </td>
+ <td>
+  c unit tests failing due to "assertion cptr failed"
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-813">
+   ZOOKEEPER-813</a>
+ </td>
+ <td>
+  maven install is broken due to incorrect organisation
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-814">
+   ZOOKEEPER-814</a>
+ </td>
+ <td>
+  monitoring scripts are missing apache license headers
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-820">
+   ZOOKEEPER-820</a>
+ </td>
+ <td>
+  update c unit tests to ensure "zombie" java server processes don't cause failure
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-822">
+   ZOOKEEPER-822</a>
+ </td>
+ <td>
+  Leader election taking a long time  to complete
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-831">
+   ZOOKEEPER-831</a>
+ </td>
+ <td>
+  BookKeeper: Throttling improved for reads
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-844">
+   ZOOKEEPER-844</a>
+ </td>
+ <td>
+  handle auth failure in java client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-846">
+   ZOOKEEPER-846</a>
+ </td>
+ <td>
+  zookeeper client doesn't shut down cleanly on the close call
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-854">
+   ZOOKEEPER-854</a>
+ </td>
+ <td>
+  BookKeeper does not compile due to changes in the ZooKeeper code
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-855">
+   ZOOKEEPER-855</a>
+ </td>
+ <td>
+  clientPortBindAddress should be clientPortAddress
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-861">
+   ZOOKEEPER-861</a>
+ </td>
+ <td>
+  Missing the test SSL certificate used for running junit tests.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-867">
+   ZOOKEEPER-867</a>
+ </td>
+ <td>
+  ClientTest is failing on hudson - fd cleanup
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-870">
+   ZOOKEEPER-870</a>
+ </td>
+ <td>
+  Zookeeper trunk build broken.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-874">
+   ZOOKEEPER-874</a>
+ </td>
+ <td>
+  FileTxnSnapLog.restore does not call listener
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-880">
+   ZOOKEEPER-880</a>
+ </td>
+ <td>
+  QuorumCnxManager$SendWorker grows without bounds
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-881">
+   ZOOKEEPER-881</a>
+ </td>
+ <td>
+  ZooKeeperServer.loadData loads database twice
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-882">
+   ZOOKEEPER-882</a>
+ </td>
+ <td>
+  Startup loads last transaction from snapshot
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-884">
+   ZOOKEEPER-884</a>
+ </td>
+ <td>
+  Remove LedgerSequence references from BookKeeper documentation and comments in tests 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-888">
+   ZOOKEEPER-888</a>
+ </td>
+ <td>
+  c-client / zkpython: Double free corruption on node watcher
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-893">
+   ZOOKEEPER-893</a>
+ </td>
+ <td>
+  ZooKeeper high cpu usage when invalid requests
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-897">
+   ZOOKEEPER-897</a>
+ </td>
+ <td>
+  C Client seg faults during close
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-898">
+   ZOOKEEPER-898</a>
+ </td>
+ <td>
+  C Client might not cleanup correctly during close
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-902">
+   ZOOKEEPER-902</a>
+ </td>
+ <td>
+  Fix findbug issue in trunk "Malicious code vulnerability"
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-904">
+   ZOOKEEPER-904</a>
+ </td>
+ <td>
+  super digest is not actually acting as a full superuser
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-913">
+   ZOOKEEPER-913</a>
+ </td>
+ <td>
+  Version parser fails to parse "3.3.2-dev" from build.xml.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-917">
+   ZOOKEEPER-917</a>
+ </td>
+ <td>
+  Leader election selected incorrect leader
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-919">
+   ZOOKEEPER-919</a>
+ </td>
+ <td>
+  Ephemeral nodes remains in one of ensemble after deliberate SIGKILL
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-921">
+   ZOOKEEPER-921</a>
+ </td>
+ <td>
+  zkPython incorrectly checks for existence of required ACL elements
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-937">
+   ZOOKEEPER-937</a>
+ </td>
+ <td>
+  test -e not available on solaris /bin/sh
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-957">
+   ZOOKEEPER-957</a>
+ </td>
+ <td>
+  zkCleanup.sh doesn't do anything
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-958">
+   ZOOKEEPER-958</a>
+ </td>
+ <td>
+  Flag to turn off autoconsume in hedwig c++ client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-961">
+   ZOOKEEPER-961</a>
+ </td>
+ <td>
+  Watch recovery after disconnection when connection string contains a prefix
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-962">
+   ZOOKEEPER-962</a>
+ </td>
+ <td>
+  leader/follower coherence issue when follower is receiving a DIFF
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-963">
+   ZOOKEEPER-963</a>
+ </td>
+ <td>
+  Make Forrest work with JDK6
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-965">
+   ZOOKEEPER-965</a>
+ </td>
+ <td>
+  Need a multi-update command to allow multiple znodes to be updated safely
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-975">
+   ZOOKEEPER-975</a>
+ </td>
+ <td>
+  new peer goes in LEADING state even if ensemble is online
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-976">
+   ZOOKEEPER-976</a>
+ </td>
+ <td>
+  ZooKeeper startup script doesn't use JAVA_HOME
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-981">
+   ZOOKEEPER-981</a>
+ </td>
+ <td>
+  Hang in zookeeper_close() in the multi-threaded C client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-983">
+   ZOOKEEPER-983</a>
+ </td>
+ <td>
+  running zkServer.sh start remotely using ssh hangs
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-985">
+   ZOOKEEPER-985</a>
+ </td>
+ <td>
+  Test BookieRecoveryTest fails on trunk.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1006">
+   ZOOKEEPER-1006</a>
+ </td>
+ <td>
+  QuorumPeer "Address already in use" -- regression in 3.3.3
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1007">
+   ZOOKEEPER-1007</a>
+ </td>
+ <td>
+  iarchive leak in C client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1013">
+   ZOOKEEPER-1013</a>
+ </td>
+ <td>
+  zkServer.sh usage message should mention all startup options
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1027">
+   ZOOKEEPER-1027</a>
+ </td>
+ <td>
+  chroot not transparent in zoo_create()
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1028">
+   ZOOKEEPER-1028</a>
+ </td>
+ <td>
+  In python bindings, zookeeper.set2() should return a stat dict but instead returns None
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1033">
+   ZOOKEEPER-1033</a>
+ </td>
+ <td>
+  c client should install includes into INCDIR/zookeeper, not INCDIR/c-client-src
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1034">
+   ZOOKEEPER-1034</a>
+ </td>
+ <td>
+  perl bindings should automatically find the zookeeper c-client headers
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1046">
+   ZOOKEEPER-1046</a>
+ </td>
+ <td>
+  Creating a new sequential node results in a ZNODEEXISTS error
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1049">
+   ZOOKEEPER-1049</a>
+ </td>
+ <td>
+  Session expire/close flooding renders heartbeats to delay significantly
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1051">
+   ZOOKEEPER-1051</a>
+ </td>
+ <td>
+  SIGPIPE in Zookeeper 0.3.* when send'ing after cluster disconnection
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1052">
+   ZOOKEEPER-1052</a>
+ </td>
+ <td>
+  Findbugs warning in QuorumPeer.ResponderThread.run()
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1055">
+   ZOOKEEPER-1055</a>
+ </td>
+ <td>
+  check for duplicate ACLs in addACL() and create()
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1058">
+   ZOOKEEPER-1058</a>
+ </td>
+ <td>
+  fix typo in opToString for getData
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1059">
+   ZOOKEEPER-1059</a>
+ </td>
+ <td>
+  stat command isses on non-existing node causes NPE 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1060">
+   ZOOKEEPER-1060</a>
+ </td>
+ <td>
+  QuorumPeer takes a long time to shutdown
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1061">
+   ZOOKEEPER-1061</a>
+ </td>
+ <td>
+  Zookeeper stop fails if start called twice
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1063">
+   ZOOKEEPER-1063</a>
+ </td>
+ <td>
+  Dubious synchronization in Zookeeper and ClientCnxnSocketNIO classes
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1068">
+   ZOOKEEPER-1068</a>
+ </td>
+ <td>
+  Documentation and default config suggest incorrect location for Zookeeper state
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1069">
+   ZOOKEEPER-1069</a>
+ </td>
+ <td>
+  Calling shutdown() on a QuorumPeer too quickly can lead to a corrupt log
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1073">
+   ZOOKEEPER-1073</a>
+ </td>
+ <td>
+  address a documentation issue in ZOOKEEPER-1030
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1074">
+   ZOOKEEPER-1074</a>
+ </td>
+ <td>
+  zkServer.sh is missing nohup/sleep, which are necessary for remote invocation
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1076">
+   ZOOKEEPER-1076</a>
+ </td>
+ <td>
+  some quorum tests are unnecessarily extending QuorumBase
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1083">
+   ZOOKEEPER-1083</a>
+ </td>
+ <td>
+  Javadoc for WatchedEvent not being generated
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1086">
+   ZOOKEEPER-1086</a>
+ </td>
+ <td>
+  zookeeper test jar has non mavenised dependency.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1087">
+   ZOOKEEPER-1087</a>
+ </td>
+ <td>
+  ForceSync VM arguement not working when set to "no"
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1088">
+   ZOOKEEPER-1088</a>
+ </td>
+ <td>
+  delQuota does not remove the quota node and subesquent setquota calls for that path will fail
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1090">
+   ZOOKEEPER-1090</a>
+ </td>
+ <td>
+  Race condition while taking snapshot can lead to not restoring data tree correctly
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1091">
+   ZOOKEEPER-1091</a>
+ </td>
+ <td>
+  when the chrootPath of ClientCnxn is not null and the Watches of zooKeeper is not null and the method primeConnection(SelectionKey k) of ClientCnxn Occurred again for some reason ,then the wrong watcher clientPath is sended to server
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1097">
+   ZOOKEEPER-1097</a>
+ </td>
+ <td>
+  Quota is not correctly rehydrated on snapshot reload
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1101">
+   ZOOKEEPER-1101</a>
+ </td>
+ <td>
+  Upload zookeeper-test maven artifacts to maven repository.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1108">
+   ZOOKEEPER-1108</a>
+ </td>
+ <td>
+  Various bugs in zoo_add_auth in C
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1109">
+   ZOOKEEPER-1109</a>
+ </td>
+ <td>
+  Zookeeper service is down when SyncRequestProcessor meets any exception.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1111">
+   ZOOKEEPER-1111</a>
+ </td>
+ <td>
+  JMXEnv uses System.err instead of logging
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1119">
+   ZOOKEEPER-1119</a>
+ </td>
+ <td>
+  zkServer stop command incorrectly reading comment lines in zoo.cfg
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1124">
+   ZOOKEEPER-1124</a>
+ </td>
+ <td>
+  Multiop submitted to non-leader always fails due to timeout
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1136">
+   ZOOKEEPER-1136</a>
+ </td>
+ <td>
+  NEW_LEADER should be queued not sent to match the Zab 1.0 protocol on the twiki
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1138">
+   ZOOKEEPER-1138</a>
+ </td>
+ <td>
+  release audit failing for a number of new files
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1139">
+   ZOOKEEPER-1139</a>
+ </td>
+ <td>
+  jenkins is reporting two warnings, fix these
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1140">
+   ZOOKEEPER-1140</a>
+ </td>
+ <td>
+  server shutdown is not stopping threads
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1141">
+   ZOOKEEPER-1141</a>
+ </td>
+ <td>
+  zkpython fails tests under python 2.4
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1142">
+   ZOOKEEPER-1142</a>
+ </td>
+ <td>
+  incorrect stat output
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1144">
+   ZOOKEEPER-1144</a>
+ </td>
+ <td>
+  ZooKeeperServer not starting on leader due to a race condition
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1145">
+   ZOOKEEPER-1145</a>
+ </td>
+ <td>
+  ObserverTest.testObserver fails at particular point after several runs of ant junt.run -Dtestcase
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1146">
+   ZOOKEEPER-1146</a>
+ </td>
+ <td>
+  significant regression in client (c/python) performance
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1152">
+   ZOOKEEPER-1152</a>
+ </td>
+ <td>
+  Exceptions thrown from handleAuthentication can cause buffer corruption issues in NIOServer
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1154">
+   ZOOKEEPER-1154</a>
+ </td>
+ <td>
+  Data inconsistency when the node(s) with the highest zxid is not present at the time of leader election
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1156">
+   ZOOKEEPER-1156</a>
+ </td>
+ <td>
+  Log truncation truncating log too much - can cause data loss
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1165">
+   ZOOKEEPER-1165</a>
+ </td>
+ <td>
+  better eclipse support in tests
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1168">
+   ZOOKEEPER-1168</a>
+ </td>
+ <td>
+  ZooKeeper fails to run with IKVM
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1171">
+   ZOOKEEPER-1171</a>
+ </td>
+ <td>
+  fix build for java 7
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1174">
+   ZOOKEEPER-1174</a>
+ </td>
+ <td>
+  FD leak when network unreachable
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1181">
+   ZOOKEEPER-1181</a>
+ </td>
+ <td>
+  Fix problems with Kerberos TGT renewal
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1185">
+   ZOOKEEPER-1185</a>
+ </td>
+ <td>
+  Send AuthFailed event to client if SASL authentication fails
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1189">
+   ZOOKEEPER-1189</a>
+ </td>
+ <td>
+  For an invalid snapshot file(less than 10bytes size) RandomAccessFile stream is leaking.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1190">
+   ZOOKEEPER-1190</a>
+ </td>
+ <td>
+  ant package is not including many of the bin scripts in the package (zkServer.sh for example)
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1195">
+   ZOOKEEPER-1195</a>
+ </td>
+ <td>
+  SASL authorizedID being incorrectly set: should use getHostName() rather than getServiceName()
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1203">
+   ZOOKEEPER-1203</a>
+ </td>
+ <td>
+  Zookeeper systest is missing Junit Classes 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1206">
+   ZOOKEEPER-1206</a>
+ </td>
+ <td>
+  Sequential node creation does not use always use digits in node name given certain Locales.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1212">
+   ZOOKEEPER-1212</a>
+ </td>
+ <td>
+  zkServer.sh stop action is not conformat with LSB para 20.2&nbsp;Init&nbsp;Script&nbsp;Actions
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1237">
+   ZOOKEEPER-1237</a>
+ </td>
+ <td>
+  ERRORs being logged when queued responses are sent after socket has closed.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  Improvements
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-494">
+   ZOOKEEPER-494</a>
+ </td>
+ <td>
+  zookeeper should install include headers in /usr/local/include/zookeeper
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-500">
+   ZOOKEEPER-500</a>
+ </td>
+ <td>
+  Async methods shouldnt throw exceptions
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-631">
+   ZOOKEEPER-631</a>
+ </td>
+ <td>
+  zkpython's C code could do with a style clean-up
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-636">
+   ZOOKEEPER-636</a>
+ </td>
+ <td>
+  configure.ac has instructions which override the contents of CFLAGS and CXXFLAGS.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-724">
+   ZOOKEEPER-724</a>
+ </td>
+ <td>
+  Improve junit test integration - log harness information
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-733">
+   ZOOKEEPER-733</a>
+ </td>
+ <td>
+  use netty to handle client connections
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-765">
+   ZOOKEEPER-765</a>
+ </td>
+ <td>
+  Add python example script
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-773">
+   ZOOKEEPER-773</a>
+ </td>
+ <td>
+  Log visualisation
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-788">
+   ZOOKEEPER-788</a>
+ </td>
+ <td>
+  Add server id to message logs
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-789">
+   ZOOKEEPER-789</a>
+ </td>
+ <td>
+  Improve FLE log messages
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-797">
+   ZOOKEEPER-797</a>
+ </td>
+ <td>
+  c client source with AI_ADDRCONFIG cannot be compiled with early glibc
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-809">
+   ZOOKEEPER-809</a>
+ </td>
+ <td>
+  Improved REST Interface
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-821">
+   ZOOKEEPER-821</a>
+ </td>
+ <td>
+  Add ZooKeeper version information to zkpython
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-853">
+   ZOOKEEPER-853</a>
+ </td>
+ <td>
+  Make zookeeper.is_unrecoverable return True or False and not an integer
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-862">
+   ZOOKEEPER-862</a>
+ </td>
+ <td>
+  Hedwig created ledgers with hardcoded Bookkeeper ensemble and quorum size.  Make these a server config parameter instead.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-864">
+   ZOOKEEPER-864</a>
+ </td>
+ <td>
+  Hedwig C++ client improvements
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-891">
+   ZOOKEEPER-891</a>
+ </td>
+ <td>
+  Allow non-numeric version strings
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-905">
+   ZOOKEEPER-905</a>
+ </td>
+ <td>
+  enhance zkServer.sh for easier zookeeper automation-izing
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-926">
+   ZOOKEEPER-926</a>
+ </td>
+ <td>
+  Fork Hadoop common's test-patch.sh and modify for Zookeeper
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-977">
+   ZOOKEEPER-977</a>
+ </td>
+ <td>
+  passing null for path_buffer in zoo_create
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-980">
+   ZOOKEEPER-980</a>
+ </td>
+ <td>
+  allow configuration parameters for log4j.properties
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-993">
+   ZOOKEEPER-993</a>
+ </td>
+ <td>
+  Code improvements
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-997">
+   ZOOKEEPER-997</a>
+ </td>
+ <td>
+  ZkClient ignores command if there are any space in front of it
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1018">
+   ZOOKEEPER-1018</a>
+ </td>
+ <td>
+  The connection permutation in get_addrs uses a weak and inefficient shuffle
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1025">
+   ZOOKEEPER-1025</a>
+ </td>
+ <td>
+  zkCli is overly sensitive to to spaces.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1030">
+   ZOOKEEPER-1030</a>
+ </td>
+ <td>
+  Increase default for maxClientCnxns
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1094">
+   ZOOKEEPER-1094</a>
+ </td>
+ <td>
+  Small improvements to LeaderElection and Vote classes
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1095">
+   ZOOKEEPER-1095</a>
+ </td>
+ <td>
+  Simple leader election recipe
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1103">
+   ZOOKEEPER-1103</a>
+ </td>
+ <td>
+  In QuorumTest, use the same "for ( .. try { break } catch { } )" pattern in testFollowersStartAfterLeaders as in testSessionMove.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1104">
+   ZOOKEEPER-1104</a>
+ </td>
+ <td>
+  CLONE - In QuorumTest, use the same "for ( .. try { break } catch { } )" pattern in testFollowersStartAfterLeaders as in testSessionMove.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1143">
+   ZOOKEEPER-1143</a>
+ </td>
+ <td>
+  quorum send &amp; recv workers are missing thread names
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1153">
+   ZOOKEEPER-1153</a>
+ </td>
+ <td>
+  Deprecate AuthFLE and LE
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1166">
+   ZOOKEEPER-1166</a>
+ </td>
+ <td>
+  Please add a few svn:ignore properties
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1169">
+   ZOOKEEPER-1169</a>
+ </td>
+ <td>
+  Fix compiler (eclipse) warnings in (generated) jute code
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1243">
+   ZOOKEEPER-1243</a>
+ </td>
+ <td>
+  New 4lw for short simple monitoring ldck
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+   Features
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-464">
+   ZOOKEEPER-464</a>
+ </td>
+ <td>
+  Need procedure to garbage collect ledgers
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-465">
+   ZOOKEEPER-465</a>
+ </td>
+ <td>
+  Ledger size in bytes
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-546">
+   ZOOKEEPER-546</a>
+ </td>
+ <td>
+  add "diskless" ensemble support
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-712">
+   ZOOKEEPER-712</a>
+ </td>
+ <td>
+  Bookie recovery
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-729">
+   ZOOKEEPER-729</a>
+ </td>
+ <td>
+  Recursively delete a znode  - zkCli.sh rmr /node
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-744">
+   ZOOKEEPER-744</a>
+ </td>
+ <td>
+  Add monitoring four-letter word
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-747">
+   ZOOKEEPER-747</a>
+ </td>
+ <td>
+  Add C# generation to Jute
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-775">
+   ZOOKEEPER-775</a>
+ </td>
+ <td>
+  A large scale pub/sub system
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-799">
+   ZOOKEEPER-799</a>
+ </td>
+ <td>
+  Add tools and recipes for monitoring as a contrib
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-808">
+   ZOOKEEPER-808</a>
+ </td>
+ <td>
+  Web-based Administrative Interface
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-859">
+   ZOOKEEPER-859</a>
+ </td>
+ <td>
+  Native Windows version of C client
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-938">
+   ZOOKEEPER-938</a>
+ </td>
+ <td>
+  Support Kerberos authentication of clients.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-992">
+   ZOOKEEPER-992</a>
+ </td>
+ <td>
+  MT Native Version of Windows C Client 
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-999">
+   ZOOKEEPER-999</a>
+ </td>
+ <td>
+  Create an package integration project
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1012">
+   ZOOKEEPER-1012</a>
+ </td>
+ <td>
+  support distinct JVMFLAGS for zookeeper server in zkServer.sh and zookeeper client in zkCli.sh
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1020">
+   ZOOKEEPER-1020</a>
+ </td>
+ <td>
+  Implement function in C client to determine which host you're currently connected to.
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1107">
+   ZOOKEEPER-1107</a>
+ </td>
+ <td>
+  automating log and snapshot cleaning
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+   Tasks
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-754">
+   ZOOKEEPER-754</a>
+ </td>
+ <td>
+  numerous misspellings "succesfully"
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-1149">
+   ZOOKEEPER-1149</a>
+ </td>
+ <td>
+  users cannot migrate from 3.4-&gt;3.3-&gt;3.4 server code against a single datadir
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+   Tests
+ </td>
+ <td>
+  
+</td>
+
+</tr>
+
+<tr>
+ 
+<td>
+  <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-239">
+   ZOOKEEPER-239</a>
+ </td>
+ <td>
+  ZooKeeper System Tests
+</td>
+
+</tr>
+
+
+</table>
+</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>

Added: zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.pdf
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.pdf?rev=1215340&view=auto
==============================================================================
Binary file - no diff available.

Propchange: zookeeper/site/trunk/content/doc/r3.4.1/releasenotes.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_de.xml
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_de.xml?rev=1215340&view=auto
==============================================================================
--- zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_de.xml (added)
+++ zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_de.xml Fri Dec 16 23:32:55 2011
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<catalogue>
+  <message key="Font size:">Schriftgrösse:</message>
+  <message key="Last Published:">Zuletzt veröffentlicht:</message>
+  <message key="Search">Suche:</message>
+  <message key="Search the site with">Suche auf der Seite mit</message>
+</catalogue>

Added: zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_en_US.xml
URL: http://svn.apache.org/viewvc/zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_en_US.xml?rev=1215340&view=auto
==============================================================================
--- zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_en_US.xml (added)
+++ zookeeper/site/trunk/content/doc/r3.4.1/skin/CommonMessages_en_US.xml Fri Dec 16 23:32:55 2011
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<catalogue>
+  <message  key="Font size:">Font size:</message>
+  <message key="Last Published:">Last Published:</message>
+  <message key="Search">Search</message>
+  <message key="Search the site with">Search site with</message>
+</catalogue>