You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by an...@apache.org on 2018/11/09 16:41:38 UTC

[01/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Repository: zookeeper
Updated Branches:
  refs/heads/branch-3.5 14364ebb4 -> ab59048a6


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperTutorial.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperTutorial.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperTutorial.xml
deleted file mode 100644
index e320ed6..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperTutorial.xml
+++ /dev/null
@@ -1,712 +0,0 @@
-<?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="ar_Tutorial">
-  <title>Programming with ZooKeeper - A basic tutorial</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 article contains sample Java code for simple implementations of barrier
-      and consumers queues..</para>
-
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_Introduction">
-    <title>Introduction</title>
-
-    <para>In this tutorial, we show simple implementations of barriers and 
-    producer-consumer queues using ZooKeeper. We call the respective classes Barrier and Queue. 
-    These examples assume that you have at least one ZooKeeper server running.</para>
-    
-    <para>Both primitives use the following common excerpt of code:</para>
-    
-    <programlisting>
-    static ZooKeeper zk = null;
-    static Integer mutex;
-
-    String root;
-
-    SyncPrimitive(String address) {
-        if(zk == null){
-            try {
-                System.out.println("Starting ZK:");
-                zk = new ZooKeeper(address, 3000, this);
-                mutex = new Integer(-1);
-                System.out.println("Finished starting ZK: " + zk);
-            } catch (IOException e) {
-                System.out.println(e.toString());
-                zk = null;
-            }
-        }
-    }
-
-    synchronized public void process(WatchedEvent event) {
-        synchronized (mutex) {
-            mutex.notify();
-        }
-    }
-</programlisting>
-
-<para>Both classes extend SyncPrimitive. In this way, we execute steps that are 
-common to all primitives in the constructor of SyncPrimitive. To keep the examples 
-simple, we create a ZooKeeper object the first time we instantiate either a barrier 
-object or a queue object, and we declare a static variable that is a reference 
-to this object. The subsequent instances of Barrier and Queue check whether a 
-ZooKeeper object exists. Alternatively, we could have the application creating a
-ZooKeeper object and passing it to the constructor of Barrier and Queue.</para>
-<para>
-We use the process() method to process notifications triggered due to watches. 
-In the following discussion, we present code that sets watches. A watch is internal 
-structure that enables ZooKeeper to notify a client of a change to a node. For example, 
-if a client is waiting for other clients to leave a barrier, then it can set a watch and 
-wait for modifications to a particular node, which can indicate that it is the end of the wait. 
-This point becomes clear once we go over the examples.
-</para>
-</section>
-   
- <section id="sc_barriers"><title>Barriers</title>
- 
- <para>
- A barrier is a primitive that enables a group of processes to synchronize the 
- beginning and the end of a computation. The general idea of this implementation 
- is to have a barrier node that serves the purpose of being a parent for individual 
- process nodes. Suppose that we call the barrier node "/b1". Each process "p" then 
- creates a node "/b1/p". Once enough processes have created their corresponding 
- nodes, joined processes can start the computation.
- </para>
- 
- <para>In this example, each process instantiates a Barrier object, and its constructor takes as parameters:</para>
-
- <itemizedlist><listitem><para>the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181")</para></listitem>
-<listitem><para>the path of the barrier node on ZooKeeper (e.g., "/b1")</para></listitem>
-<listitem><para>the size of the group of processes</para></listitem>
-</itemizedlist>
-
-<para>The constructor of Barrier passes the address of the Zookeeper server to the 
-constructor of the parent class. The parent class creates a ZooKeeper instance if 
-one does not exist. The constructor of Barrier then creates a 
-barrier node on ZooKeeper, which is the parent node of all process nodes, and 
-we call root (<emphasis role="bold">Note:</emphasis> This is not the ZooKeeper root "/").</para>
-
-<programlisting>
-        /**
-         * Barrier constructor
-         *
-         * @param address
-         * @param root
-         * @param size
-         */
-        Barrier(String address, String root, int size) {
-            super(address);
-            this.root = root;
-            this.size = size;
-
-            // Create barrier node
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-
-            // My node name
-            try {
-                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
-            } catch (UnknownHostException e) {
-                System.out.println(e.toString());
-            }
-
-        }
-</programlisting>
-<para>
-To enter the barrier, a process calls enter(). The process creates a node under 
-the root to represent it, using its host name to form the node name. It then wait 
-until enough processes have entered the barrier. A process does it by checking 
-the number of children the root node has with "getChildren()", and waiting for 
-notifications in the case it does not have enough. To receive a notification when 
-there is a change to the root node, a process has to set a watch, and does it 
-through the call to "getChildren()". In the code, we have that "getChildren()" 
-has two parameters. The first one states the node to read from, and the second is
-a boolean flag that enables the process to set a watch. In the code the flag is true.
-</para>
-
-<programlisting>
-        /**
-         * Join barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean enter() throws KeeperException, InterruptedException{
-            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.EPHEMERAL_SEQUENTIAL);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-
-                    if (list.size() &lt; size) {
-                        mutex.wait();
-                    } else {
-                        return true;
-                    }
-                }
-            }
-        }
-</programlisting>
-<para>
-Note that enter() throws both KeeperException and InterruptedException, so it is 
-the responsibility of the application to catch and handle such exceptions.</para>
-
-<para>
-Once the computation is finished, a process calls leave() to leave the barrier. 
-First it deletes its corresponding node, and then it gets the children of the root 
-node. If there is at least one child, then it waits for a notification (obs: note 
-that the second parameter of the call to getChildren() is true, meaning that 
-ZooKeeper has to set a watch on the the root node). Upon reception of a notification, 
-it checks once more whether the root node has any children.</para>
-
-<programlisting>
-        /**
-         * Wait until all reach barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean leave() throws KeeperException, InterruptedException{
-            zk.delete(root + "/" + name, 0);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                        if (list.size() &gt; 0) {
-                            mutex.wait();
-                        } else {
-                            return true;
-                        }
-                    }
-                }
-        }
-    }
-</programlisting>
-</section>
-<section id="sc_producerConsumerQueues"><title>Producer-Consumer Queues</title>
-<para>
-A producer-consumer queue is a distributed data structure that groups of processes 
-use to generate and consume items. Producer processes create new elements and add 
-them to the queue. Consumer processes remove elements from the list, and process them. 
-In this implementation, the elements are simple integers. The queue is represented 
-by a root node, and to add an element to the queue, a producer process creates a new node, 
-a child of the root node.
-</para>
-
-<para>
-The following excerpt of code corresponds to the constructor of the object. As 
-with Barrier objects, it first calls the constructor of the parent class, SyncPrimitive, 
-that creates a ZooKeeper object if one doesn't exist. It then verifies if the root 
-node of the queue exists, and creates if it doesn't.
-</para>
-<programlisting>
-        /**
-         * Constructor of producer-consumer queue
-         *
-         * @param address
-         * @param name
-         */
-        Queue(String address, String name) {
-            super(address);
-            this.root = name;
-            // Create ZK node name
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-        }
-</programlisting>
- 
-<para>
-A producer process calls "produce()" to add an element to the queue, and passes 
-an integer as an argument. To add an element to the queue, the method creates a 
-new node using "create()", and uses the SEQUENCE flag to instruct ZooKeeper to 
-append the value of the sequencer counter associated to the root node. In this way, 
-we impose a total order on the elements of the queue, thus guaranteeing that the 
-oldest element of the queue is the next one consumed.
-</para>
-
-<programlisting>
-        /**
-         * Add element to the queue.
-         *
-         * @param i
-         * @return
-         */
-
-        boolean produce(int i) throws KeeperException, InterruptedException{
-            ByteBuffer b = ByteBuffer.allocate(4);
-            byte[] value;
-
-            // Add child with value i
-            b.putInt(i);
-            value = b.array();
-            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
-                        CreateMode.PERSISTENT_SEQUENTIAL);
-
-            return true;
-        }
-</programlisting>
-<para>
-To consume an element, a consumer process obtains the children of the root node, 
-reads the node with smallest counter value, and returns the element. Note that 
-if there is a conflict, then one of the two contending processes won't be able to 
-delete the node and the delete operation will throw an exception.</para>
-
-<para>
-A call to getChildren() returns the list of children in lexicographic order. 
-As lexicographic order does not necessary follow the numerical order of the counter 
-values, we need to decide which element is the smallest. To decide which one has 
-the smallest counter value, we traverse the list, and remove the prefix "element" 
-from each one.</para>
-
-<programlisting>
-        /**
-         * Remove first element from the queue.
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-        int consume() throws KeeperException, InterruptedException{
-            int retvalue = -1;
-            Stat stat = null;
-
-            // Get the first element available
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                    if (list.size() == 0) {
-                        System.out.println("Going to wait");
-                        mutex.wait();
-                    } else {
-                        Integer min = new Integer(list.get(0).substring(7));
-                        for(String s : list){
-                            Integer tempValue = new Integer(s.substring(7));
-                            //System.out.println("Temporary value: " + tempValue);
-                            if(tempValue &lt; min) min = tempValue;
-                        }
-                        System.out.println("Temporary value: " + root + "/element" + min);
-                        byte[] b = zk.getData(root + "/element" + min,
-                                    false, stat);
-                        zk.delete(root + "/element" + min, 0);
-                        ByteBuffer buffer = ByteBuffer.wrap(b);
-                        retvalue = buffer.getInt();
-
-                        return retvalue;
-                    }
-                }
-            }
-        }
-    }
-</programlisting>
- 
-</section>
-
-<section>
-<title>Complete example</title>
-<para>
-In the following section you can find a complete command line application to demonstrate the above mentioned
-recipes. Use the following command to run it.
-</para>
-<programlisting>
-ZOOBINDIR="[path_to_distro]/bin"
-. "$ZOOBINDIR"/zkEnv.sh
-java SyncPrimitive [Test Type] [ZK server] [No of elements] [Client type]
-</programlisting>
-
-<section>
-<title>Queue test</title>
-<para>Start a producer to create 100 elements</para>
-<programlisting>
-java SyncPrimitive qTest localhost 100 p
-</programlisting>
-
-<para>Start a consumer to consume 100 elements</para>
-<programlisting>
-java SyncPrimitive qTest localhost 100 c
-</programlisting>
-</section>
-
-<section>
-<title>Barrier test</title>
-<para>Start a barrier with 2 participants (start as many times as many participants you'd like to enter)</para>
-<programlisting>
-java SyncPrimitive bTest localhost 2
-</programlisting>
-</section>
-
-<section id="sc_sourceListing"><title>Source Listing</title>
-<example id="eg_SyncPrimitive_java">
-<title>SyncPrimitive.Java</title>
-<programlisting>
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Random;
-
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.ZooDefs.Ids;
-import org.apache.zookeeper.data.Stat;
-
-public class SyncPrimitive implements Watcher {
-
-    static ZooKeeper zk = null;
-    static Integer mutex;
-
-    String root;
-
-    SyncPrimitive(String address) {
-        if(zk == null){
-            try {
-                System.out.println("Starting ZK:");
-                zk = new ZooKeeper(address, 3000, this);
-                mutex = new Integer(-1);
-                System.out.println("Finished starting ZK: " + zk);
-            } catch (IOException e) {
-                System.out.println(e.toString());
-                zk = null;
-            }
-        }
-        //else mutex = new Integer(-1);
-    }
-
-    synchronized public void process(WatchedEvent event) {
-        synchronized (mutex) {
-            //System.out.println("Process: " + event.getType());
-            mutex.notify();
-        }
-    }
-
-    /**
-     * Barrier
-     */
-    static public class Barrier extends SyncPrimitive {
-        int size;
-        String name;
-
-        /**
-         * Barrier constructor
-         *
-         * @param address
-         * @param root
-         * @param size
-         */
-        Barrier(String address, String root, int size) {
-            super(address);
-            this.root = root;
-            this.size = size;
-
-            // Create barrier node
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-
-            // My node name
-            try {
-                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
-            } catch (UnknownHostException e) {
-                System.out.println(e.toString());
-            }
-
-        }
-
-        /**
-         * Join barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean enter() throws KeeperException, InterruptedException{
-            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.EPHEMERAL_SEQUENTIAL);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-
-                    if (list.size() &lt; size) {
-                        mutex.wait();
-                    } else {
-                        return true;
-                    }
-                }
-            }
-        }
-
-        /**
-         * Wait until all reach barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean leave() throws KeeperException, InterruptedException{
-            zk.delete(root + "/" + name, 0);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                        if (list.size() &gt; 0) {
-                            mutex.wait();
-                        } else {
-                            return true;
-                        }
-                    }
-                }
-        }
-    }
-
-    /**
-     * Producer-Consumer queue
-     */
-    static public class Queue extends SyncPrimitive {
-
-        /**
-         * Constructor of producer-consumer queue
-         *
-         * @param address
-         * @param name
-         */
-        Queue(String address, String name) {
-            super(address);
-            this.root = name;
-            // Create ZK node name
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-        }
-
-        /**
-         * Add element to the queue.
-         *
-         * @param i
-         * @return
-         */
-
-        boolean produce(int i) throws KeeperException, InterruptedException{
-            ByteBuffer b = ByteBuffer.allocate(4);
-            byte[] value;
-
-            // Add child with value i
-            b.putInt(i);
-            value = b.array();
-            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
-                        CreateMode.PERSISTENT_SEQUENTIAL);
-
-            return true;
-        }
-
-
-        /**
-         * Remove first element from the queue.
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-        int consume() throws KeeperException, InterruptedException{
-            int retvalue = -1;
-            Stat stat = null;
-
-            // Get the first element available
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                    if (list.size() == 0) {
-                        System.out.println("Going to wait");
-                        mutex.wait();
-                    } else {
-                        Integer min = new Integer(list.get(0).substring(7));
-                        String minNode = list.get(0);
-                        for(String s : list){
-                            Integer tempValue = new Integer(s.substring(7));
-                            //System.out.println("Temporary value: " + tempValue);
-                            if(tempValue &lt; min) {
-                                min = tempValue;
-                                minNode = s;
-                            }
-                        }
-                        System.out.println("Temporary value: " + root + "/" + minNode);
-                        byte[] b = zk.getData(root + "/" + minNode,
-                        false, stat);
-                        zk.delete(root + "/" + minNode, 0);
-                        ByteBuffer buffer = ByteBuffer.wrap(b);
-                        retvalue = buffer.getInt();
-
-                        return retvalue;
-                    }
-                }
-            }
-        }
-    }
-
-    public static void main(String args[]) {
-        if (args[0].equals("qTest"))
-            queueTest(args);
-        else
-            barrierTest(args);
-
-    }
-
-    public static void queueTest(String args[]) {
-        Queue q = new Queue(args[1], "/app1");
-
-        System.out.println("Input: " + args[1]);
-        int i;
-        Integer max = new Integer(args[2]);
-
-        if (args[3].equals("p")) {
-            System.out.println("Producer");
-            for (i = 0; i &lt; max; i++)
-                try{
-                    q.produce(10 + i);
-                } catch (KeeperException e){
-
-                } catch (InterruptedException e){
-
-                }
-        } else {
-            System.out.println("Consumer");
-
-            for (i = 0; i &lt; max; i++) {
-                try{
-                    int r = q.consume();
-                    System.out.println("Item: " + r);
-                } catch (KeeperException e){
-                    i--;
-                } catch (InterruptedException e){
-
-                }
-            }
-        }
-    }
-
-    public static void barrierTest(String args[]) {
-        Barrier b = new Barrier(args[1], "/b1", new Integer(args[2]));
-        try{
-            boolean flag = b.enter();
-            System.out.println("Entered barrier: " + args[2]);
-            if(!flag) System.out.println("Error when entering the barrier");
-        } catch (KeeperException e){
-
-        } catch (InterruptedException e){
-
-        }
-
-        // Generate random integer
-        Random rand = new Random();
-        int r = rand.nextInt(100);
-        // Loop for rand iterations
-        for (int i = 0; i &lt; r; i++) {
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException e) {
-
-            }
-        }
-        try{
-            b.leave();
-        } catch (KeeperException e){
-
-        } catch (InterruptedException e){
-
-        }
-        System.out.println("Left barrier");
-    }
-}
-</programlisting></example>
-</section>
-</section>
-
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/2pc.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/2pc.jpg b/zookeeper-docs/src/documentation/resources/images/2pc.jpg
deleted file mode 100755
index fe4488f..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/2pc.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/bk-overview.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/bk-overview.jpg b/zookeeper-docs/src/documentation/resources/images/bk-overview.jpg
deleted file mode 100644
index 6e12fb4..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/bk-overview.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/favicon.ico
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/favicon.ico b/zookeeper-docs/src/documentation/resources/images/favicon.ico
deleted file mode 100644
index 161bcf7..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/favicon.ico and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/hadoop-logo.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/hadoop-logo.jpg b/zookeeper-docs/src/documentation/resources/images/hadoop-logo.jpg
deleted file mode 100644
index 809525d..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/hadoop-logo.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/state_dia.dia
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/state_dia.dia b/zookeeper-docs/src/documentation/resources/images/state_dia.dia
deleted file mode 100755
index 4a58a00..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/state_dia.dia and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/state_dia.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/state_dia.jpg b/zookeeper-docs/src/documentation/resources/images/state_dia.jpg
deleted file mode 100755
index b6f4a8b..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/state_dia.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkarch.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkarch.jpg b/zookeeper-docs/src/documentation/resources/images/zkarch.jpg
deleted file mode 100644
index a0e5fcc..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkarch.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkcomponents.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkcomponents.jpg b/zookeeper-docs/src/documentation/resources/images/zkcomponents.jpg
deleted file mode 100644
index 7690578..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkcomponents.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zknamespace.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zknamespace.jpg b/zookeeper-docs/src/documentation/resources/images/zknamespace.jpg
deleted file mode 100644
index 05534bc..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zknamespace.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkperfRW-3.2.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkperfRW-3.2.jpg b/zookeeper-docs/src/documentation/resources/images/zkperfRW-3.2.jpg
deleted file mode 100644
index 594b50b..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkperfRW-3.2.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkperfRW.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkperfRW.jpg b/zookeeper-docs/src/documentation/resources/images/zkperfRW.jpg
deleted file mode 100644
index ad3019f..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkperfRW.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkperfreliability.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkperfreliability.jpg b/zookeeper-docs/src/documentation/resources/images/zkperfreliability.jpg
deleted file mode 100644
index 232bba8..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkperfreliability.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zkservice.jpg
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zkservice.jpg b/zookeeper-docs/src/documentation/resources/images/zkservice.jpg
deleted file mode 100644
index 1ec9154..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zkservice.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/resources/images/zookeeper_small.gif
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/resources/images/zookeeper_small.gif b/zookeeper-docs/src/documentation/resources/images/zookeeper_small.gif
deleted file mode 100644
index 4e8014f..0000000
Binary files a/zookeeper-docs/src/documentation/resources/images/zookeeper_small.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/skinconf.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/skinconf.xml b/zookeeper-docs/src/documentation/skinconf.xml
deleted file mode 100644
index 9edf69e..0000000
--- a/zookeeper-docs/src/documentation/skinconf.xml
+++ /dev/null
@@ -1,360 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-
-<!--
-Skin configuration file. This file contains details of your project,
-which will be used to configure the chosen Forrest skin.
--->
-
-<!DOCTYPE skinconfig PUBLIC "-//APACHE//DTD Skin Configuration V0.6-3//EN" "http://forrest.apache.org/dtd/skinconfig-v06-3.dtd">
-<skinconfig>
-  <!-- To enable lucene search add provider="lucene" (default is google).
-    Add box-location="alt" to move the search box to an alternate location
-    (if the skin supports it) and box-location="all" to show it in all
-    available locations on the page.  Remove the <search> element to show
-    no search box. @domain will enable sitesearch for the specific domain with google.
-    In other words google will search the @domain for the query string.
-
-  -->
-  <search name="ZooKeeper" domain="zookeeper.apache.org" provider="google"/>
-
-  <!-- Disable the print link? If enabled, invalid HTML 4.0.1 -->
-  <disable-print-link>true</disable-print-link>  
-  <!-- Disable the PDF link? -->
-  <disable-pdf-link>false</disable-pdf-link>
-  <!-- Disable the POD link? -->
-  <disable-pod-link>true</disable-pod-link>
-  <!-- Disable the Text link? FIXME: NOT YET IMPLEMENETED. -->
-  <disable-txt-link>true</disable-txt-link>
-  <!-- Disable the xml source link? -->
-  <!-- The xml source link makes it possible to access the xml rendition
-    of the source frim the html page, and to have it generated statically.
-    This can be used to enable other sites and services to reuse the
-    xml format for their uses. Keep this disabled if you don't want other
-    sites to easily reuse your pages.-->
-  <disable-xml-link>true</disable-xml-link>
-
-  <!-- Disable navigation icons on all external links? -->
-  <disable-external-link-image>true</disable-external-link-image>
-
-  <!-- Disable w3c compliance links? 
-    Use e.g. align="center" to move the compliance links logos to 
-    an alternate location default is left.
-    (if the skin supports it) -->
-  <disable-compliance-links>true</disable-compliance-links>
-
-  <!-- Render mailto: links unrecognisable by spam harvesters? -->
-  <obfuscate-mail-links>false</obfuscate-mail-links>
-
-  <!-- Disable the javascript facility to change the font size -->
-  <disable-font-script>true</disable-font-script>
-
-  <!-- project logo -->
-  <project-name>ZooKeeper</project-name>
-  <project-description>ZooKeeper: distributed coordination</project-description>
-  <project-url>http://zookeeper.apache.org/</project-url>
-  <project-logo>images/zookeeper_small.gif</project-logo>
-
-  <!-- group logo -->
-  <group-name>Hadoop</group-name>
-  <group-description>Apache Hadoop</group-description>
-  <group-url>http://hadoop.apache.org/</group-url>
-  <group-logo>images/hadoop-logo.jpg</group-logo>
-
-  <!-- optional host logo (e.g. sourceforge logo)
-       default skin: renders it at the bottom-left corner -->
-  <host-url></host-url>
-  <host-logo></host-logo>
-
-  <!-- relative url of a favicon file, normally favicon.ico -->
-  <favicon-url>images/favicon.ico</favicon-url>
-
-  <!-- The following are used to construct a copyright statement -->
-  <year></year>
-  <vendor>The Apache Software Foundation.</vendor>
-  <copyright-link>http://www.apache.org/licenses/</copyright-link>
-
-  <!-- Some skins use this to form a 'breadcrumb trail' of links.
-    Use location="alt" to move the trail to an alternate location
-    (if the skin supports it).
-	  Omit the location attribute to display the trail in the default location.
-	  Use location="none" to not display the trail (if the skin supports it).
-    For some skins just set the attributes to blank.
-  -->
-  <trail>
-    <link1 name="Apache" href="http://www.apache.org/"/>
-    <link2 name="ZooKeeper" href="http://zookeeper.apache.org/"/>
-    <link3 name="ZooKeeper" href="http://zookeeper.apache.org/"/>
-  </trail>
-
-  <!-- Configure the TOC, i.e. the Table of Contents.
-  @max-depth
-   how many "section" levels need to be included in the
-   generated Table of Contents (TOC). 
-  @min-sections
-   Minimum required to create a TOC.
-  @location ("page","menu","page,menu", "none")
-   Where to show the TOC.
-  -->
-  <toc max-depth="2" min-sections="1" location="page"/>
-
-  <!-- Heading types can be clean|underlined|boxed  -->
-  <headings type="clean"/>
-  
-  <!-- The optional feedback element will be used to construct a
-    feedback link in the footer with the page pathname appended:
-    <a href="@href">{@to}</a>
-  <feedback to="webmaster@foo.com"
-    href="mailto:webmaster@foo.com?subject=Feedback&#160;" >
-    Send feedback about the website to:
-  </feedback>
-    -->
-  <!--
-    extra-css - here you can define custom css-elements that are 
-    a. overriding the fallback elements or 
-    b. adding the css definition from new elements that you may have 
-       used in your documentation.
-    -->
-  <extra-css>
-    <!--Example of b. 
-        To define the css definition of a new element that you may have used
-        in the class attribute of a <p> node. 
-        e.g. <p class="quote"/>
-    -->
-    p.quote {
-      margin-left: 2em;
-      padding: .5em;
-      background-color: #f0f0f0;
-      font-family: monospace;
-    }
-
-    pre.code {
-      margin-left: 0em;
-      padding: 0.5em;
-      background-color: #f0f0f0;
-      font-family: monospace;
-    }
-
-<!-- patricks
-    .code {
-      font-family: "Courier New", Courier, monospace;
-      font-size: 110%;
-    }
--->
-
-  </extra-css>
-
-  <colors>
-  <!-- These values are used for the generated CSS files. -->
-
-  <!-- Krysalis -->
-<!--
-    <color name="header"    value="#FFFFFF"/>
-
-    <color name="tab-selected" value="#a5b6c6" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="tab-unselected" value="#F7F7F7"  link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-selected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#a5b6c6"  link="#000000" vlink="#000000" hlink="#000000"/>
-
-    <color name="heading" value="#a5b6c6"/>
-    <color name="subheading" value="#CFDCED"/>
-        
-    <color name="navstrip" value="#CFDCED" font="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="toolbox" value="#a5b6c6"/>
-    <color name="border" value="#a5b6c6"/>
-        
-    <color name="menu" value="#F7F7F7" link="#000000" vlink="#000000" hlink="#000000"/>    
-    <color name="dialog" value="#F7F7F7"/>
-            
-    <color name="body"    value="#ffffff" link="#0F3660" vlink="#009999" hlink="#000066"/>
-    
-    <color name="table" value="#a5b6c6"/>    
-    <color name="table-cell" value="#ffffff"/>    
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#a5b6c6"/>
-        
-    <color name="footer" value="#a5b6c6"/>
--->
-  
-  <!-- Forrest -->
-<!--
-    <color name="header"    value="#294563"/>
-
-    <color name="tab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="tab-unselected" value="#b5c7e7" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="subtab-selected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="subtab-unselected" value="#4a6d8c" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-
-    <color name="heading" value="#294563"/>
-    <color name="subheading" value="#4a6d8c"/>
-        
-    <color name="navstrip" value="#cedfef" font="#0F3660" link="#0F3660" vlink="#0F3660" hlink="#000066"/>
-    <color name="toolbox" value="#4a6d8c"/>
-    <color name="border" value="#294563"/>
-    
-    <color name="menu" value="#4a6d8c" font="#cedfef" link="#ffffff" vlink="#ffffff" hlink="#ffcf00"/>    
-    <color name="dialog" value="#4a6d8c"/>
-            
-    <color name="body" value="#ffffff"  link="#0F3660" vlink="#009999" hlink="#000066"/>
-    
-    <color name="table" value="#7099C5"/>    
-    <color name="table-cell" value="#f0f0ff"/>    
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#CFDCED"/>
-        
-    <color name="footer" value="#cedfef"/>
--->
-
-  <!-- Collabnet --> 
-<!--
-    <color name="header"    value="#003366"/>
-
-    <color name="tab-selected" value="#dddddd" link="#555555" vlink="#555555" hlink="#555555"/>
-    <color name="tab-unselected" value="#999999" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="subtab-selected" value="#cccccc" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#cccccc" link="#555555" vlink="#555555" hlink="#555555"/>
-
-    <color name="heading" value="#003366"/>
-    <color name="subheading" value="#888888"/>
-    
-    <color name="navstrip" value="#dddddd" font="#555555"/>
-    <color name="toolbox" value="#dddddd" font="#555555"/>
-    <color name="border" value="#999999"/>
-    
-    <color name="menu" value="#ffffff"/>    
-    <color name="dialog" value="#eeeeee"/>
-            
-    <color name="body"      value="#ffffff"/>
-    
-    <color name="table" value="#ccc"/>    
-    <color name="table-cell" value="#ffffff"/>   
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#003366"/>
-        
-    <color name="footer" value="#ffffff"/>
--->
- <!-- Lenya using pelt-->
-<!--
-    <color name="header" value="#ffffff"/>
-
-    <color name="tab-selected" value="#4C6C8F" link="#ffffff" vlink="#ffffff" hlink="#ffffff"/>
-    <color name="tab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-selected" value="#000000" link="#000000" vlink="#000000" hlink="#000000"/>
-    <color name="subtab-unselected" value="#E5E4D9" link="#000000" vlink="#000000" hlink="#000000"/>
-
-    <color name="heading" value="#E5E4D9"/>
-    <color name="subheading" value="#000000"/>
-    <color name="published" value="#4C6C8F" font="#FFFFFF"/>
-    <color name="feedback" value="#4C6C8F" font="#FFFFFF" align="center"/>
-    <color name="navstrip" value="#E5E4D9" font="#000000"/>
-
-    <color name="toolbox" value="#CFDCED" font="#000000"/>
-
-    <color name="border" value="#999999"/>
-    <color name="menu" value="#4C6C8F" font="#ffffff" link="#ffffff" vlink="#ffffff" hlink="#ffffff" current="#FFCC33" />    
-    <color name="menuheading" value="#cfdced" font="#000000" />
-    <color name="searchbox" value="#E5E4D9" font="#000000"/>
-    
-    <color name="dialog" value="#CFDCED"/>
-    <color name="body" value="#ffffff" />            
-    
-    <color name="table" value="#ccc"/>    
-    <color name="table-cell" value="#ffffff"/>   
-    <color name="highlight" value="#ffff00"/>
-    <color name="fixme" value="#cc6600"/>
-    <color name="note" value="#006699"/>
-    <color name="warning" value="#990000"/>
-    <color name="code" value="#003366"/>
-        
-    <color name="footer" value="#E5E4D9"/>
--->
-  </colors>
- 
-  <!-- Settings specific to PDF output. -->
-  <pdf>
-    <!-- 
-       Supported page sizes are a0, a1, a2, a3, a4, a5, executive,
-       folio, legal, ledger, letter, quarto, tabloid (default letter).
-       Supported page orientations are portrait, landscape (default
-       portrait).
-       Supported text alignments are left, right, justify (default left).
-    -->
-    <page size="letter" orientation="portrait" text-align="left"/>
-
-    <!--
-       Margins can be specified for top, bottom, inner, and outer
-       edges. If double-sided="false", the inner edge is always left
-       and the outer is always right. If double-sided="true", the
-       inner edge will be left on odd pages, right on even pages,
-       the outer edge vice versa.
-       Specified below are the default settings.
-    -->
-    <margins double-sided="false">
-      <top>1in</top>
-      <bottom>1in</bottom>
-      <inner>1.25in</inner>
-      <outer>1in</outer>
-    </margins>
-
-    <!--
-      Print the URL text next to all links going outside the file
-    -->
-    <show-external-urls>false</show-external-urls>
-
-    <!--
-      Disable the copyright footer on each page of the PDF.
-      A footer is composed for each page. By default, a "credit" with role=pdf
-      will be used, as explained below. Otherwise a copyright statement
-      will be generated. This latter can be disabled.
-    -->
-    <disable-copyright-footer>false</disable-copyright-footer>
-  </pdf>
-
-  <!-- Credits are typically rendered as a set of small clickable
-    images in the page footer.
-    Use box-location="alt" to move the credit to an alternate location
-    (if the skin supports it). 
-  -->
-  <credits>
-    <credit box-location="alt">
-      <name>Built with Apache Forrest</name>
-      <url>http://forrest.apache.org/</url>
-      <image>images/built-with-forrest-button.png</image>
-      <width>88</width>
-      <height>31</height>
-    </credit>
-    <!-- A credit with @role="pdf" will be used to compose a footer
-     for each page in the PDF, using either "name" or "url" or both.
-    -->
-    <!--
-    <credit role="pdf">
-      <name>Built with Apache Forrest</name>
-      <url>http://forrest.apache.org/</url>
-    </credit>
-    -->
-  </credits>
-
-</skinconfig>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/status.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/status.xml b/zookeeper-docs/status.xml
deleted file mode 100644
index 3ac3fda..0000000
--- a/zookeeper-docs/status.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<status>
-
-  <developers>
-    <person name="Joe Bloggs"      email="joe@joescompany.org"      id="JB" />
-    <!-- Add more people here -->
-  </developers>
-
-  <changes>
-    <!-- Add new releases here -->
-    <release version="0.1" date="unreleased">
-      <!-- Some action types have associated images. By default, images are
-      defined for 'add', 'fix', 'remove', 'update' and 'hack'. If you add
-      src/documentation/resources/images/<foo>.jpg images, these will
-      automatically be used for entries of type <foo>. -->
-
-      <action dev="JB" type="add" context="admin">
-        Initial Import
-      </action>
-      <!-- Sample action:
-      <action dev="JB" type="fix" due-to="Joe Contributor"
-          due-to-email="joec@apache.org" fixes-bug="123">
-          Fixed a bug in the Foo class.
-        </action>
-        -->
-    </release>
-  </changes>
-
-  <todo>
-    <actions priority="high">
-      <action context="docs" dev="JB">
-        Customize this template project with your project's details.  This
-        TODO list is generated from 'status.xml'.
-      </action>
-      <action context="docs" dev="JB">
-        Add lots of content.  XML content goes in
-        <code>src/documentation/content/xdocs</code>, or wherever the
-        <code>${project.xdocs-dir}</code> property (set in
-        <code>forrest.properties</code>) points.
-      </action>
-      <action context="feedback" dev="JB">
-        Mail <link
-          href="mailto:forrest-dev@xml.apache.org">forrest-dev@xml.apache.org</link>
-        with feedback.
-      </action>
-    </actions>
-    <!-- Add todo items. @context is an arbitrary string. Eg:
-    <actions priority="high">
-      <action context="code" dev="SN">
-      </action>
-    </actions>
-    <actions priority="medium">
-      <action context="docs" dev="open">
-      </action>
-    </actions>
-    -->
-  </todo>
-
-</status>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-server/src/test/resources/test-github-pr.sh
----------------------------------------------------------------------
diff --git a/zookeeper-server/src/test/resources/test-github-pr.sh b/zookeeper-server/src/test/resources/test-github-pr.sh
index e155769..f4d65ff 100755
--- a/zookeeper-server/src/test/resources/test-github-pr.sh
+++ b/zookeeper-server/src/test/resources/test-github-pr.sh
@@ -25,8 +25,8 @@ parseArgs() {
     QABUILD)
       ### Set QABUILD to true to indicate that this script is being run by Hudson
       QABUILD=true
-      if [[ $# != 14 ]] ; then
-        echo "ERROR: usage $0 QABUILD <PATCH_DIR> <PS_CMD> <WGET_CMD> <JIRACLI> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <FORREST_HOME> <WORKSPACE_BASEDIR> <JIRA_PASSWD> <JAVA5_HOME> <CURL_CMD>"
+      if [[ $# != 13 ]] ; then
+        echo "ERROR: usage $0 QABUILD <PATCH_DIR> <PS_CMD> <WGET_CMD> <JIRACLI> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <WORKSPACE_BASEDIR> <JIRA_PASSWD> <JAVA5_HOME> <CURL_CMD>"
         cleanupAndExit 0
       fi
       PATCH_DIR=$2
@@ -37,11 +37,10 @@ parseArgs() {
       GREP=$7
       PATCH=$8
       FINDBUGS_HOME=$9
-      FORREST_HOME=${10}
-      BASEDIR=${11}
-      JIRA_PASSWD=${12}
-      JAVA5_HOME=${13}
-      CURL=${14}
+      BASEDIR=${10}
+      JIRA_PASSWD=${11}
+      JAVA5_HOME=${12}
+      CURL=${13}
       if [ ! -e "$PATCH_DIR" ] ; then
         mkdir -p $PATCH_DIR
       fi
@@ -66,8 +65,8 @@ parseArgs() {
     DEVELOPER)
       ### Set QABUILD to false to indicate that this script is being run by a developer
       QABUILD=false
-      if [[ $# != 10 ]] ; then
-        echo "ERROR: usage $0 DEVELOPER <GIT_PR_URL> <SCRATCH_DIR> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <FORREST_HOME> <WORKSPACE_BASEDIR> <JAVA5_HOME>"
+      if [[ $# != 9 ]] ; then
+        echo "ERROR: usage $0 DEVELOPER <GIT_PR_URL> <SCRATCH_DIR> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <WORKSPACE_BASEDIR> <JAVA5_HOME>"
         cleanupAndExit 0
       fi
       PATCH_DIR=$3
@@ -92,9 +91,8 @@ parseArgs() {
       GREP=$5
       PATCH=$6
       FINDBUGS_HOME=$7
-      FORREST_HOME=$8
-      BASEDIR=$9
-      JAVA5_HOME=${10}
+      BASEDIR=$8
+      JAVA5_HOME=${9}
       ### Obtain the patch filename to append it to the version number
       local subject=`grep "Subject:" ${PATCH_FILE}`
       local length=`expr match ${subject} ZOOKEEPER-[0-9]*`
@@ -171,8 +169,8 @@ setup () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant  -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1"
- $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant  -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1"
+ $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1
   if [[ $? != 0 ]] ; then
     echo "Trunk compilation is broken?"
     cleanupAndExit 1
@@ -287,8 +285,8 @@ checkJavacWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1"
-  $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1"
+  $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1
   if [[ $? != 0 ]] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 
@@ -327,8 +325,8 @@ checkReleaseAuditWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1"
-  $ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1"
+  $ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1
 
   ### Compare trunk and patch release audit warning numbers
   if [[ -f $PATCH_DIR/patchReleaseAuditWarnings.txt ]] ; then
@@ -401,8 +399,8 @@ checkFindbugsWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= findbugs"
-  $ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= findbugs
+  echo "$ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= findbugs"
+  $ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= findbugs
   if [ $? != 0 ] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 
@@ -452,8 +450,8 @@ runCoreTests () {
   ### Kill any rogue build processes from the last attempt
   $PS auxwww | $GREP ZookeeperPatchProcess | /usr/bin/nawk '{print $2}' | /usr/bin/xargs -t -I {} /bin/kill -9 {} > /dev/null
 
-  echo "$ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Dforrest.home=$FORREST_HOME -Djava5.home=$JAVA5_HOME test-core"
-  $ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Dforrest.home=$FORREST_HOME -Djava5.home=$JAVA5_HOME test-core
+  echo "$ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Djava5.home=$JAVA5_HOME test-core"
+  $ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Djava5.home=$JAVA5_HOME test-core
   if [[ $? != 0 ]] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-server/src/test/resources/test-patch.sh
----------------------------------------------------------------------
diff --git a/zookeeper-server/src/test/resources/test-patch.sh b/zookeeper-server/src/test/resources/test-patch.sh
index fbc6037..39080eb 100755
--- a/zookeeper-server/src/test/resources/test-patch.sh
+++ b/zookeeper-server/src/test/resources/test-patch.sh
@@ -26,8 +26,8 @@ parseArgs() {
     HUDSON)
       ### Set HUDSON to true to indicate that this script is being run by Hudson
       HUDSON=true
-      if [[ $# != 15 ]] ; then
-        echo "ERROR: usage $0 HUDSON <PATCH_DIR> <PS_CMD> <WGET_CMD> <JIRACLI> <SVN_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <FORREST_HOME> <WORKSPACE_BASEDIR> <JIRA_PASSWD> <JAVA5_HOME> <CURL_CMD> <DEFECT> "
+      if [[ $# != 14 ]] ; then
+        echo "ERROR: usage $0 HUDSON <PATCH_DIR> <PS_CMD> <WGET_CMD> <JIRACLI> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <WORKSPACE_BASEDIR> <JIRA_PASSWD> <JAVA5_HOME> <CURL_CMD> <DEFECT> "
         cleanupAndExit 0
       fi
       PATCH_DIR=$2
@@ -38,12 +38,11 @@ parseArgs() {
       GREP=$7
       PATCH=$8
       FINDBUGS_HOME=$9
-      FORREST_HOME=${10}
-      BASEDIR=${11}
-      JIRA_PASSWD=${12}
-      JAVA5_HOME=${13}
-      CURL=${14}
-      defect=${15}
+      BASEDIR=${10}
+      JIRA_PASSWD=${11}
+      JAVA5_HOME=${12}
+      CURL=${13}
+      defect=${14}
 		
       ### Retrieve the defect number
       if [ -z "$defect" ] ; then
@@ -59,8 +58,8 @@ parseArgs() {
     DEVELOPER)
       ### Set HUDSON to false to indicate that this script is being run by a developer
       HUDSON=false
-      if [[ $# != 10 ]] ; then
-        echo "ERROR: usage $0 DEVELOPER <PATCH_FILE> <SCRATCH_DIR> <SVN_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <FORREST_HOME> <WORKSPACE_BASEDIR> <JAVA5_HOME>"
+      if [[ $# != 9 ]] ; then
+        echo "ERROR: usage $0 DEVELOPER <PATCH_FILE> <SCRATCH_DIR> <GIT_CMD> <GREP_CMD> <PATCH_CMD> <FINDBUGS_HOME> <WORKSPACE_BASEDIR> <JAVA5_HOME>"
         cleanupAndExit 0
       fi
       ### PATCH_FILE contains the location of the patchfile
@@ -84,9 +83,8 @@ parseArgs() {
       GREP=$5
       PATCH=$6
       FINDBUGS_HOME=$7
-      FORREST_HOME=$8
-      BASEDIR=$9
-      JAVA5_HOME=${10}
+      BASEDIR=$8
+      JAVA5_HOME=${9}
       ### Obtain the patch filename to append it to the version number
       defect=`basename $PATCH_FILE` 
       ;;
@@ -172,8 +170,8 @@ setup () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant  -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1"
- $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant  -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1"
+ $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/trunkJavacWarnings.txt 2>&1
   if [[ $? != 0 ]] ; then
     echo "Trunk compilation is broken?"
     cleanupAndExit 1
@@ -311,8 +309,8 @@ checkJavacWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1"
-  $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1"
+  $ANT_HOME/bin/ant -Djavac.args="-Xlint -Xmaxwarns 1000" -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= clean tar > $PATCH_DIR/patchJavacWarnings.txt 2>&1
   if [[ $? != 0 ]] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 
@@ -351,8 +349,8 @@ checkReleaseAuditWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1"
-  $ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1
+  echo "$ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1"
+  $ANT_HOME/bin/ant -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= releaseaudit > $PATCH_DIR/patchReleaseAuditWarnings.txt 2>&1
 
   ### Compare trunk and patch release audit warning numbers
   if [[ -f $PATCH_DIR/patchReleaseAuditWarnings.txt ]] ; then
@@ -425,8 +423,8 @@ checkFindbugsWarnings () {
   echo "======================================================================"
   echo ""
   echo ""
-  echo "$ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= findbugs"
-  $ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -Dforrest.home=${FORREST_HOME} -DZookeeperPatchProcess= findbugs
+  echo "$ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= findbugs"
+  $ANT_HOME/bin/ant -Dfindbugs.home=$FINDBUGS_HOME -Djava5.home=${JAVA5_HOME} -DZookeeperPatchProcess= findbugs
   if [ $? != 0 ] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 
@@ -476,8 +474,8 @@ runCoreTests () {
   ### Kill any rogue build processes from the last attempt
   $PS auxwww | $GREP ZookeeperPatchProcess | /usr/bin/nawk '{print $2}' | /usr/bin/xargs -t -I {} /bin/kill -9 {} > /dev/null
 
-  echo "$ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Dforrest.home=$FORREST_HOME -Djava5.home=$JAVA5_HOME test-core"
-  $ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Dforrest.home=$FORREST_HOME -Djava5.home=$JAVA5_HOME test-core
+  echo "$ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Djava5.home=$JAVA5_HOME test-core"
+  $ANT_HOME/bin/ant -DZookeeperPatchProcess= -Dtest.junit.output.format=xml -Dtest.output=yes -Dtest.junit.threads=8 -Dcompile.c++=yes -Djava5.home=$JAVA5_HOME test-core
   if [[ $? != 0 ]] ; then
     JIRA_COMMENT="$JIRA_COMMENT
 


[06/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/index.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/index.xml b/zookeeper-docs/src/documentation/content/xdocs/index.xml
deleted file mode 100644
index 969e482..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/index.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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 document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
-
-<document>
-  
-  <header>
-    <title>ZooKeeper: Because Coordinating Distributed Systems is a Zoo</title>
-  </header>
-  
-  <body>
-    <p>ZooKeeper is a high-performance coordination service for
-      distributed applications.  It exposes common services - such as
-      naming, configuration management, synchronization, and group
-      services - in a simple interface so you don't have to write them
-      from scratch.  You can use it off-the-shelf to implement
-      consensus, group management, leader election, and presence
-      protocols. And you can build on it for your own, specific needs.
-    </p>
-
-    <p>
-      The following documents describe concepts and procedures to get
-      you started using ZooKeeper. If you have more questions, please
-      ask the <a href="ext:lists">mailing list</a> or browse the
-      archives.
-    </p>
-    <ul>
-
-      <li><strong>ZooKeeper Overview</strong><p>Technical Overview Documents for Client Developers, Adminstrators, and Contributors</p>
-      <ul><li><a href="zookeeperOver.html">Overview</a> - a bird's eye view of ZooKeeper, including design concepts and architecture</li>
-      <li><a href="zookeeperStarted.html">Getting Started</a> - a tutorial-style guide for developers to install, run, and program to ZooKeeper</li>
-      <li><a href="ext:relnotes">Release Notes</a> - new developer and user facing features, improvements, and incompatibilities</li>
-      </ul>
-      </li>
-      
-      <li><strong>Developers</strong><p> Documents for Developers using the ZooKeeper Client API</p>
-      <ul>
-            <li><a href="ext:api/index">API Docs</a> - the technical reference to ZooKeeper Client APIs</li>
-      <li><a href="zookeeperProgrammers.html">Programmer's Guide</a> - a client application developer's guide to ZooKeeper</li>
-      <li><a href="javaExample.html">ZooKeeper Java Example</a> - a simple Zookeeper client appplication, written in Java</li>
-      <li><a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a> - sample implementations of barriers and queues</li>  
-      <li><a href="recipes.html">ZooKeeper Recipes</a> - higher level solutions to common problems in distributed applications</li>
-      </ul>
-      </li>
-      
-      <li><strong>Administrators &amp; Operators</strong> <p> Documents for Administrators and Operations Engineers of ZooKeeper Deployments</p>
-      <ul>
-      <li><a href="zookeeperAdmin.html">Administrator's Guide</a> - a guide for system administrators and anyone else who might deploy ZooKeeper</li>
-      <li><a href="zookeeperQuotas.html">Quota Guide</a> - a guide for system administrators on Quotas in ZooKeeper. </li>
-      <li><a href="zookeeperJMX.html">JMX</a> - how to enable JMX in ZooKeeper</li>
-      <li><a href="zookeeperHierarchicalQuorums.html">Hierarchical quorums</a></li>
-      <li><a href="zookeeperObservers.html">Observers</a> - non-voting ensemble members that easily improve ZooKeeper's scalability</li>
-      <li><a href="zookeeperReconfig.html">Dynamic Reconfiguration</a> - a guide on how to use dynamic reconfiguration in ZooKeeper</li>
-      </ul>
-      </li>
-      
-      <li><strong>Contributors</strong><p> Documents for Developers Contributing to the ZooKeeper Open Source Project</p>
-      <ul>
-      <li><a href="zookeeperInternals.html">ZooKeeper Internals</a> - assorted topics on the inner workings of ZooKeeper</li>
-      </ul>
-      </li>
-      
-      <li><strong>Miscellaneous ZooKeeper Documentation</strong>
-      <ul>
-      <li><a href="ext:wiki">Wiki</a></li>
-      <li><a href="ext:faq">FAQ</a></li>    
-      </ul>
-      </li>
-    </ul>
-  </body>
-  
-</document>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/javaExample.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/javaExample.xml b/zookeeper-docs/src/documentation/content/xdocs/javaExample.xml
deleted file mode 100644
index 16f7795..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/javaExample.xml
+++ /dev/null
@@ -1,664 +0,0 @@
-<?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="ar_JavaExample">
-  <title>ZooKeeper Java Example</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 article contains sample Java code for a simple watch client.</para>
-
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_Introduction">
-    <title>A Simple Watch Client</title>
-
-    <para>To introduce you to the ZooKeeper Java API, we develop here a very simple 
-    watch client. This ZooKeeper client watches a ZooKeeper node for changes 
-    and responds to by starting or stopping a program.</para>
-    
-    <section id="sc_requirements"><title>Requirements</title>
-    
-    <para>The client has four requirements:</para>
-    
-    <itemizedlist><listitem><para>It takes as parameters:</para>
-        <itemizedlist>
-        <listitem><para>the address of the ZooKeeper service</para></listitem>
-        <listitem><para>the name of a znode - the one to be watched</para></listitem>
-        <listitem><para>the name of a file to write the output to</para></listitem>
-        <listitem><para>an executable with arguments.</para></listitem></itemizedlist></listitem>
-    <listitem><para>It fetches the data associated with the znode and starts the executable.</para></listitem>
-    <listitem><para>If the znode changes, the client refetches the contents and restarts the executable.</para></listitem>
-    <listitem><para>If the znode disappears, the client kills the executable.</para></listitem></itemizedlist>
-
-   </section>
-   
-   <section id="sc_design">
-   	<title>Program Design</title>
-
-   <para>Conventionally, ZooKeeper applications are broken into two units, one which maintains the connection, 
-   and the other which monitors data.  In this application, the class called the <emphasis role="bold">Executor</emphasis> 
-   maintains the ZooKeeper connection, and the class called the  <emphasis role="bold">DataMonitor</emphasis> monitors the data
-   in the ZooKeeper tree. Also, Executor contains the main thread and contains the execution logic.
-   It is responsible for what little user interaction there is, as well as interaction with the exectuable program you
-   pass in as an argument and which the sample (per the requirements) shuts down and restarts, according to the 
-   state of the znode.</para>
-   
-   </section>
-  
-   </section>
-
-   <section id="sc_executor"><title>The Executor Class</title>
-    <para>The Executor object is the primary container of the sample application. It contains 
-    both the <emphasis role="bold">ZooKeeper</emphasis> object, <emphasis role="bold">DataMonitor</emphasis>, as described above in 
-    <xref linkend="sc_design"/>.  </para>
-    
-    <programlisting>
-    // from the Executor class...
-    
-    public static void main(String[] args) {
-        if (args.length &lt; 4) {
-            System.err
-                    .println("USAGE: Executor hostPort znode filename program [args ...]");
-            System.exit(2);
-        }
-        String hostPort = args[0];
-        String znode = args[1];
-        String filename = args[2];
-        String exec[] = new String[args.length - 3];
-        System.arraycopy(args, 3, exec, 0, exec.length);
-        try {
-            new Executor(hostPort, znode, filename, exec).run();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public Executor(String hostPort, String znode, String filename,
-            String exec[]) throws KeeperException, IOException {
-        this.filename = filename;
-        this.exec = exec;
-        zk = new ZooKeeper(hostPort, 3000, this);
-        dm = new DataMonitor(zk, znode, null, this);
-    }
-
-    public void run() {
-        try {
-            synchronized (this) {
-                while (!dm.dead) {
-                    wait();
-                }
-            }
-        } catch (InterruptedException e) {
-        }
-    }
-</programlisting>
-
-
-    <para>
-    Recall that the Executor's job is to start and stop the executable whose name you pass in on the command line. 
-    It does this in response to events fired by the ZooKeeper object. As you can see in the code above, the Executor passes
-    a reference to itself as the Watcher argument in the ZooKeeper constructor. It also passes a reference to itself
-    as DataMonitorListener argument to the DataMonitor constructor. Per the Executor's definition, it implements both these
-    interfaces:
-    </para>
-    
-    <programlisting>
-public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener {
-...</programlisting>
-    
-    <para>The <emphasis role="bold">Watcher</emphasis> interface is defined by the ZooKeeper Java API.
-    ZooKeeper uses it to communicate back to its container. It supports only one method, <command>process()</command>, and ZooKeeper uses 
-    it to communciates generic events that the main thread would be intersted in, such as the state of the ZooKeeper connection or the ZooKeeper session.The Executor 
-    in this example simply forwards those events down to the DataMonitor to decide what to do with them. It does this simply to illustrate
-    the point that, by convention, the Executor or some Executor-like object "owns" the ZooKeeper connection, but it is free to delegate the events to other
-    events to other objects. It also uses this as the default channel on which to fire watch events. (More on this later.)</para>
-    
-<programlisting>
-    public void process(WatchedEvent event) {
-        dm.process(event);
-    }
-</programlisting>
-    
-    <para>The <emphasis role="bold">DataMonitorListener</emphasis> 
-    interface, on the other hand, is not part of the the ZooKeeper API. It is a completely custom interface, 
-    designed for this sample application. The DataMonitor object uses it to communicate back to its container, which
-    is also the the Executor object.The DataMonitorListener interface looks like this:</para>
-    <programlisting>
-public interface DataMonitorListener {
-    /**
-    * The existence status of the node has changed.
-    */
-    void exists(byte data[]);
-
-    /**
-    * The ZooKeeper session is no longer valid.
-    * 
-    * @param rc
-    * the ZooKeeper reason code
-    */
-    void closing(int rc);
-}
-</programlisting>
-    <para>This interface is defined in the DataMonitor class and implemented in the Executor class. 
-    When <command>Executor.exists()</command> is invoked,
-    the Executor decides whether to start up or shut down per the requirements. Recall that the requires say to kill the executable when the 
-    znode ceases to <emphasis>exist</emphasis>. </para>
-    
-    <para>When <command>Executor.closing()</command>
-    is invoked, the Executor decides whether or not to shut itself down in response to the ZooKeeper connection permanently disappearing.</para>
-    
-    <para>As you might have guessed, DataMonitor is the object that invokes 
-    these methods, in response to changes in ZooKeeper's state.</para>
-    
-    <para>Here are Executor's implementation of 
-    <command>DataMonitorListener.exists()</command> and <command>DataMonitorListener.closing</command>:
-    </para>
-    <programlisting>
-public void exists( byte[] data ) {
-    if (data == null) {
-        if (child != null) {
-            System.out.println("Killing process");
-            child.destroy();
-            try {
-                child.waitFor();
-            } catch (InterruptedException e) {
-            }
-        }
-        child = null;
-    } else {
-        if (child != null) {
-            System.out.println("Stopping child");
-            child.destroy();
-            try {
-               child.waitFor();
-            } catch (InterruptedException e) {
-            e.printStackTrace();
-            }
-        }
-        try {
-            FileOutputStream fos = new FileOutputStream(filename);
-            fos.write(data);
-            fos.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        try {
-            System.out.println("Starting child");
-            child = Runtime.getRuntime().exec(exec);
-            new StreamWriter(child.getInputStream(), System.out);
-            new StreamWriter(child.getErrorStream(), System.err);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-}
-
-public void closing(int rc) {
-    synchronized (this) {
-        notifyAll();
-    }
-}
-</programlisting>
-    
-</section>
-<section id="sc_DataMonitor"><title>The DataMonitor Class</title>
-<para>
-The DataMonitor class has the meat of the ZooKeeper logic. It is mostly 
-asynchronous and event driven. DataMonitor kicks things off in the constructor with:</para>
-<programlisting>
-public DataMonitor(ZooKeeper zk, String znode, Watcher chainedWatcher,
-        DataMonitorListener listener) {
-    this.zk = zk;
-    this.znode = znode;
-    this.chainedWatcher = chainedWatcher;
-    this.listener = listener;
-    
-    // Get things started by checking if the node exists. We are going
-    // to be completely event driven
-    <emphasis role="bold">zk.exists(znode, true, this, null);</emphasis>
-}
-</programlisting>
-
-<para>The call to <command>ZooKeeper.exists()</command> checks for the existence of the znode, 
-sets a watch, and passes a reference to itself (<command>this</command>)
-as the completion callback object. In this sense, it kicks things off, since the
-real processing happens when the watch is triggered.</para>
-
-<note>
-<para>Don't confuse the completion callback with the watch callback. The <command>ZooKeeper.exists()</command> 
-completion callback, which happens to be the method <command>StatCallback.processResult()</command> implemented 
-in the DataMonitor object, is invoked when the asynchronous <emphasis>setting of the watch</emphasis> operation 
-(by <command>ZooKeeper.exists()</command>) completes on the server. </para>
-<para>
-The triggering of the watch, on the other hand, sends an event to the <emphasis>Executor</emphasis> object, since
-the Executor registered as the Watcher of the ZooKeeper object.</para>
-
-<para>As an aside, you might note that the DataMonitor could also register itself as the Watcher
-for this particular watch event. This is new to ZooKeeper 3.0.0 (the support of multiple Watchers). In this
-example, however, DataMonitor does not register as the Watcher.</para>
-</note>
-
-<para>When the <command>ZooKeeper.exists()</command> operation completes on the server, the ZooKeeper API invokes this completion callback on 
-the client:</para>
-
-<programlisting>
-public void processResult(int rc, String path, Object ctx, Stat stat) {
-    boolean exists;
-    switch (rc) {
-    case Code.Ok:
-        exists = true;
-        break;
-    case Code.NoNode:
-        exists = false;
-        break;
-    case Code.SessionExpired:
-    case Code.NoAuth:
-        dead = true;
-        listener.closing(rc);
-        return;
-    default:
-        // Retry errors
-        zk.exists(znode, true, this, null);
-        return;
-    }
- 
-    byte b[] = null;
-    if (exists) {
-        try {
-            <emphasis role="bold">b = zk.getData(znode, false, null);</emphasis>
-        } catch (KeeperException e) {
-            // We don't need to worry about recovering now. The watch
-            // callbacks will kick off any exception handling
-            e.printStackTrace();
-        } catch (InterruptedException e) {
-            return;
-        }
-    }     
-    if ((b == null &amp;&amp; b != prevData)
-            || (b != null &amp;&amp; !Arrays.equals(prevData, b))) {
-        <emphasis role="bold">listener.exists(b);</emphasis>
-        prevData = b;
-    }
-}
-</programlisting>
-
-<para>
-The code first checks the error codes for znode existence, fatal errors, and 
-recoverable errors. If the file (or znode) exists, it gets the data from the znode, and 
-then invoke the exists() callback of Executor if the state has changed. Note, 
-it doesn't have to do any Exception processing for the getData call because it 
-has watches pending for anything that could cause an error: if the node is deleted 
-before it calls <command>ZooKeeper.getData()</command>, the watch event set by 
-the <command>ZooKeeper.exists()</command> triggers a callback; 
-if there is a communication error, a connection watch event fires when 
-the connection comes back up.
-</para>
-
-<para>Finally, notice how DataMonitor processes watch events: </para>
-<programlisting>
-    public void process(WatchedEvent event) {
-        String path = event.getPath();
-        if (event.getType() == Event.EventType.None) {
-            // We are are being told that the state of the
-            // connection has changed
-            switch (event.getState()) {
-            case SyncConnected:
-                // In this particular example we don't need to do anything
-                // here - watches are automatically re-registered with 
-                // server and any watches triggered while the client was 
-                // disconnected will be delivered (in order of course)
-                break;
-            case Expired:
-                // It's all over
-                dead = true;
-                listener.closing(KeeperException.Code.SessionExpired);
-                break;
-            }
-        } else {
-            if (path != null &amp;&amp; path.equals(znode)) {
-                // Something has changed on the node, let's find out
-                zk.exists(znode, true, this, null);
-            }
-        }
-        if (chainedWatcher != null) {
-            chainedWatcher.process(event);
-        }
-    }
-</programlisting>
-<para>
-If the client-side ZooKeeper libraries can re-establish the
-communication channel (SyncConnected event) to ZooKeeper before
-session expiration (Expired event) all of the session's watches will
-automatically be re-established with the server (auto-reset of watches
-is new in ZooKeeper 3.0.0). See <ulink
-url="zookeeperProgrammers.html#ch_zkWatches">ZooKeeper Watches</ulink>
-in the programmer guide for more on this. A bit lower down in this
-function, when DataMonitor gets an event for a znode, it calls
-<command>ZooKeeper.exists()</command> to find out what has changed.
-</para>
-</section>
-
-<section id="sc_completeSourceCode">
-	<title>Complete Source Listings</title>
-	<example id="eg_Executor_java"><title>Executor.java</title><programlisting>
-/**
- * A simple example program to use DataMonitor to start and
- * stop executables based on a znode. The program watches the
- * specified znode and saves the data that corresponds to the
- * znode in the filesystem. It also starts the specified program
- * with the specified arguments when the znode exists and kills
- * the program if the znode goes away.
- */
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-
-public class Executor
-    implements Watcher, Runnable, DataMonitor.DataMonitorListener
-{
-    String znode;
-
-    DataMonitor dm;
-
-    ZooKeeper zk;
-
-    String filename;
-
-    String exec[];
-
-    Process child;
-
-    public Executor(String hostPort, String znode, String filename,
-            String exec[]) throws KeeperException, IOException {
-        this.filename = filename;
-        this.exec = exec;
-        zk = new ZooKeeper(hostPort, 3000, this);
-        dm = new DataMonitor(zk, znode, null, this);
-    }
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) {
-        if (args.length &lt; 4) {
-            System.err
-                    .println("USAGE: Executor hostPort znode filename program [args ...]");
-            System.exit(2);
-        }
-        String hostPort = args[0];
-        String znode = args[1];
-        String filename = args[2];
-        String exec[] = new String[args.length - 3];
-        System.arraycopy(args, 3, exec, 0, exec.length);
-        try {
-            new Executor(hostPort, znode, filename, exec).run();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /***************************************************************************
-     * We do process any events ourselves, we just need to forward them on.
-     *
-     * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.proto.WatcherEvent)
-     */
-    public void process(WatchedEvent event) {
-        dm.process(event);
-    }
-
-    public void run() {
-        try {
-            synchronized (this) {
-                while (!dm.dead) {
-                    wait();
-                }
-            }
-        } catch (InterruptedException e) {
-        }
-    }
-
-    public void closing(int rc) {
-        synchronized (this) {
-            notifyAll();
-        }
-    }
-
-    static class StreamWriter extends Thread {
-        OutputStream os;
-
-        InputStream is;
-
-        StreamWriter(InputStream is, OutputStream os) {
-            this.is = is;
-            this.os = os;
-            start();
-        }
-
-        public void run() {
-            byte b[] = new byte[80];
-            int rc;
-            try {
-                while ((rc = is.read(b)) > 0) {
-                    os.write(b, 0, rc);
-                }
-            } catch (IOException e) {
-            }
-
-        }
-    }
-
-    public void exists(byte[] data) {
-        if (data == null) {
-            if (child != null) {
-                System.out.println("Killing process");
-                child.destroy();
-                try {
-                    child.waitFor();
-                } catch (InterruptedException e) {
-                }
-            }
-            child = null;
-        } else {
-            if (child != null) {
-                System.out.println("Stopping child");
-                child.destroy();
-                try {
-                    child.waitFor();
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }
-            try {
-                FileOutputStream fos = new FileOutputStream(filename);
-                fos.write(data);
-                fos.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-            try {
-                System.out.println("Starting child");
-                child = Runtime.getRuntime().exec(exec);
-                new StreamWriter(child.getInputStream(), System.out);
-                new StreamWriter(child.getErrorStream(), System.err);
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-}
-</programlisting>
-	
-</example>
-
-<example id="eg_DataMonitor_java">
-	<title>DataMonitor.java</title>
-	<programlisting>
-/**
- * A simple class that monitors the data and existence of a ZooKeeper
- * node. It uses asynchronous ZooKeeper APIs.
- */
-import java.util.Arrays;
-
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.AsyncCallback.StatCallback;
-import org.apache.zookeeper.KeeperException.Code;
-import org.apache.zookeeper.data.Stat;
-
-public class DataMonitor implements Watcher, StatCallback {
-
-    ZooKeeper zk;
-
-    String znode;
-
-    Watcher chainedWatcher;
-
-    boolean dead;
-
-    DataMonitorListener listener;
-
-    byte prevData[];
-
-    public DataMonitor(ZooKeeper zk, String znode, Watcher chainedWatcher,
-            DataMonitorListener listener) {
-        this.zk = zk;
-        this.znode = znode;
-        this.chainedWatcher = chainedWatcher;
-        this.listener = listener;
-        // Get things started by checking if the node exists. We are going
-        // to be completely event driven
-        zk.exists(znode, true, this, null);
-    }
-
-    /**
-     * Other classes use the DataMonitor by implementing this method
-     */
-    public interface DataMonitorListener {
-        /**
-         * The existence status of the node has changed.
-         */
-        void exists(byte data[]);
-
-        /**
-         * The ZooKeeper session is no longer valid.
-         *
-         * @param rc
-         *                the ZooKeeper reason code
-         */
-        void closing(int rc);
-    }
-
-    public void process(WatchedEvent event) {
-        String path = event.getPath();
-        if (event.getType() == Event.EventType.None) {
-            // We are are being told that the state of the
-            // connection has changed
-            switch (event.getState()) {
-            case SyncConnected:
-                // In this particular example we don't need to do anything
-                // here - watches are automatically re-registered with 
-                // server and any watches triggered while the client was 
-                // disconnected will be delivered (in order of course)
-                break;
-            case Expired:
-                // It's all over
-                dead = true;
-                listener.closing(KeeperException.Code.SessionExpired);
-                break;
-            }
-        } else {
-            if (path != null &amp;&amp; path.equals(znode)) {
-                // Something has changed on the node, let's find out
-                zk.exists(znode, true, this, null);
-            }
-        }
-        if (chainedWatcher != null) {
-            chainedWatcher.process(event);
-        }
-    }
-
-    public void processResult(int rc, String path, Object ctx, Stat stat) {
-        boolean exists;
-        switch (rc) {
-        case Code.Ok:
-            exists = true;
-            break;
-        case Code.NoNode:
-            exists = false;
-            break;
-        case Code.SessionExpired:
-        case Code.NoAuth:
-            dead = true;
-            listener.closing(rc);
-            return;
-        default:
-            // Retry errors
-            zk.exists(znode, true, this, null);
-            return;
-        }
-
-        byte b[] = null;
-        if (exists) {
-            try {
-                b = zk.getData(znode, false, null);
-            } catch (KeeperException e) {
-                // We don't need to worry about recovering now. The watch
-                // callbacks will kick off any exception handling
-                e.printStackTrace();
-            } catch (InterruptedException e) {
-                return;
-            }
-        }
-        if ((b == null &amp;&amp; b != prevData)
-                || (b != null &amp;&amp; !Arrays.equals(prevData, b))) {
-            listener.exists(b);
-            prevData = b;
-        }
-    }
-}
-</programlisting>
-</example>
-</section>
-
-
-
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/recipes.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/recipes.xml b/zookeeper-docs/src/documentation/content/xdocs/recipes.xml
deleted file mode 100644
index 40a31ad..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/recipes.xml
+++ /dev/null
@@ -1,688 +0,0 @@
-<?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="ar_Recipes">
-  <title>ZooKeeper Recipes and Solutions</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 pseudocode and guidelines for using Zookeeper to
-      solve common problems in Distributed Application Coordination. It
-      discusses such problems as event handlers, queues, and locks..</para>
-
-      <para>$Revision: 1.6 $ $Date: 2008/09/19 03:46:18 $</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_recipes">
-    <title>A Guide to Creating Higher-level Constructs with ZooKeeper</title>
-
-    <para>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.</para>
-
-    <para>One of the most interesting things about ZooKeeper is that even
-    though ZooKeeper uses <emphasis>asynchronous</emphasis> notifications, you
-    can use it to build <emphasis>synchronous</emphasis> 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.</para>
-
-    <para>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.</para>
-
-    <para>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.</para>
-
-  <section id="sc_recipes_errorHandlingNote">
-    <title>Important Note About Error Handling</title>
-
-	<para>When implementing the recipes you must handle recoverable exceptions 
-        (see the <ulink url="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</ulink>). In 
-	particular, several of the recipes employ sequential ephemeral 
-	nodes. When creating a sequential ephemeral node there is an error case in 
-	which the create() succeeds on the server but the server crashes before 
-	returning the name of the node to the client. When the client reconnects its 
-	session is still valid and, thus, the node is not removed. The implication is 
-	that it is difficult for the client to know if its node was created or not. The 
-	recipes below include measures to handle this.</para>
-  </section>
-
-  <section id="sc_outOfTheBox">
-    <title>Out of the Box Applications: Name Service, Configuration, Group
-    Membership</title>
-
-    <para>Name service and configuration are two of the primary applications
-    of ZooKeeper. These two functions are provided directly by the ZooKeeper
-    API.</para>
-
-    <para>Another function directly provided by ZooKeeper is <emphasis>group
-    membership</emphasis>. 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.</para>
-  </section>
-
-  <section id="sc_recipes_eventHandles">
-    <title>Barriers</title>
-
-    <para>Distributed systems use <emphasis>barriers</emphasis>
-      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:</para>
-
-    <orderedlist>
-      <listitem>
-        <para>Client calls the ZooKeeper API's <emphasis
-        role="bold">exists()</emphasis> function on the barrier node, with
-        <emphasis>watch</emphasis> set to true.</para>
-      </listitem>
-
-      <listitem>
-        <para>If <emphasis role="bold">exists()</emphasis> returns false, the
-        barrier is gone and the client proceeds</para>
-      </listitem>
-
-      <listitem>
-        <para>Else, if <emphasis role="bold">exists()</emphasis> returns true,
-        the clients wait for a watch event from ZooKeeper for the barrier
-        node.</para>
-      </listitem>
-
-      <listitem>
-        <para>When the watch event is triggered, the client reissues the
-        <emphasis role="bold">exists( )</emphasis> call, again waiting until
-        the barrier node is removed.</para>
-      </listitem>
-    </orderedlist>
-
-    <section id="sc_doubleBarriers">
-      <title>Double Barriers</title>
-
-      <para>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.</para>
-
-      <para>The pseudo code in this recipe represents the barrier node as
-      <emphasis>b</emphasis>. Every client process <emphasis>p</emphasis>
-      registers with the barrier node on entry and unregisters when it is
-      ready to leave. A node registers with the barrier node via the <emphasis
-      role="bold">Enter</emphasis> procedure below, it waits until
-      <emphasis>x</emphasis> client process register before proceeding with
-      the computation. (The <emphasis>x</emphasis> here is up to you to
-      determine for your system.)</para>
-
-      <informaltable colsep="0" frame="none" rowsep="0">
-        <tgroup cols="2">
-          <tbody>
-            <row>
-              <entry align="center"><emphasis
-                                       role="bold">Enter</emphasis></entry>
-
-              <entry align="center"><emphasis
-                                       role="bold">Leave</emphasis></entry>
-            </row>
-
-            <row>
-              <entry align="left"><orderedlist>
-                  <listitem>
-                    <para>Create a name <emphasis><emphasis>n</emphasis> =
-                        <emphasis>b</emphasis>+“/”+<emphasis>p</emphasis></emphasis></para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Set watch: <emphasis
-                                        role="bold">exists(<emphasis>b</emphasis> + ‘‘/ready’’,
-                        true)</emphasis></para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Create child: <emphasis role="bold">create(
-                        <emphasis>n</emphasis>, EPHEMERAL)</emphasis></para>
-                  </listitem>
-
-                  <listitem>
-                    <para><emphasis role="bold">L = getChildren(b,
-                        false)</emphasis></para>
-                  </listitem>
-
-                  <listitem>
-                    <para>if fewer children in L than<emphasis>
-                        x</emphasis>, wait for watch event</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>else <emphasis role="bold">create(b + ‘‘/ready’’,
-                        REGULAR)</emphasis></para>
-                  </listitem>
-                </orderedlist></entry>
-
-              <entry><orderedlist>
-                  <listitem>
-                    <para><emphasis role="bold">L = getChildren(b,
-                        false)</emphasis></para>
-                  </listitem>
-
-                  <listitem>
-                    <para>if no children, exit</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>if <emphasis>p</emphasis> is only process node in
-                      L, delete(n) and exit</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>if <emphasis>p</emphasis> is the lowest process
-                      node in L, wait on highest process node in L</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>else <emphasis
-                                  role="bold">delete(<emphasis>n</emphasis>) </emphasis>if
-                      still exists and wait on lowest process node in L</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>goto 1</para>
-                  </listitem>
-                </orderedlist></entry>
-            </row>
-          </tbody>
-        </tgroup>
-      </informaltable>
-      <para>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.
-      </para>
-
-      <para>On exit, you can't use a flag such as <emphasis>ready</emphasis>
-      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.</para>
-
-      <para>Processes exit when there are no process nodes left as children of
-      <emphasis>b</emphasis>. 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.</para>
-    </section>
-  </section>
-
-  <section id="sc_recipes_Queues">
-    <title>Queues</title>
-
-    <para>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
-    <emphasis>sequence</emphasis> and <emphasis>ephemeral</emphasis> flags in
-    the create() call set to true. Because the <emphasis>sequence</emphasis>
-    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 <emphasis
-    role="bold">getChildren( )</emphasis> function, with
-    <emphasis>watch</emphasis> set to true on the queue node, and begins
-    processing nodes with the lowest number. The client does not need to issue
-    another <emphasis role="bold">getChildren( )</emphasis> until it exhausts
-    the list obtained from the first <emphasis role="bold">getChildren(
-    )</emphasis> call. If there are are no children in the queue node, the
-    reader waits for a watch notification to check the queue again.</para>
-
-    <note>
-      <para>There now exists a Queue implementation in ZooKeeper
-      recipes directory. This is distributed with the release --
-      zookeeper-recipes/zookeeper-recipes-queue directory of the release artifact.
-      </para>
-    </note>
-
-    <section id="sc_recipes_priorityQueues">
-      <title>Priority Queues</title>
-
-      <para>To implement a priority queue, you need only make two simple
-      changes to the generic <ulink url="#sc_recipes_Queues">queue
-      recipe</ulink> . 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.</para>
-    </section>
-  </section>
-
-  <section id="sc_recipes_Locks">
-    <title>Locks</title>
-
-    <para>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.</para>
-
-    <note>
-      <para>There now exists a Lock implementation in ZooKeeper
-      recipes directory. This is distributed with the release --
-        zookeeper-recipes/zookeeper-recipes-lock directory of the release artifact.
-      </para>
-    </note>
-
-    <para>Clients wishing to obtain a lock do the following:</para>
-
-    <orderedlist>
-      <listitem>
-        <para>Call <emphasis role="bold">create( )</emphasis> with a pathname
-        of "_locknode_/guid-lock-" and the <emphasis>sequence</emphasis> and
-        <emphasis>ephemeral</emphasis> flags set. The <emphasis>guid</emphasis> 
-		is needed in case the create() result is missed. See the note below.</para>
-      </listitem>
-
-      <listitem>
-        <para>Call <emphasis role="bold">getChildren( )</emphasis> on the lock
-        node <emphasis>without</emphasis> setting the watch flag (this is
-        important to avoid the herd effect).</para>
-      </listitem>
-
-      <listitem>
-        <para>If the pathname created in step <emphasis
-        role="bold">1</emphasis> has the lowest sequence number suffix, the
-        client has the lock and the client exits the protocol.</para>
-      </listitem>
-
-      <listitem>
-        <para>The client calls <emphasis role="bold">exists( )</emphasis> with
-        the watch flag set on the path in the lock directory with the next
-        lowest sequence number.</para>
-      </listitem>
-
-      <listitem>
-        <para>if <emphasis role="bold">exists( )</emphasis> returns false, go
-        to step <emphasis role="bold">2</emphasis>. Otherwise, wait for a
-        notification for the pathname from the previous step before going to
-        step <emphasis role="bold">2</emphasis>.</para>
-      </listitem>
-    </orderedlist>
-
-    <para>The unlock protocol is very simple: clients wishing to release a
-    lock simply delete the node they created in step 1.</para>
-
-    <para>Here are a few things to notice:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>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.</para>
-      </listitem>
-    </itemizedlist>
-
-    <itemizedlist>
-      <listitem>
-        <para>There is no polling or timeouts.</para>
-      </listitem>
-    </itemizedlist>
-
-    <itemizedlist>
-      <listitem>
-        <para>Because of the way you implement locking, it is easy to see the
-        amount of lock contention, break locks, debug locking problems,
-        etc.</para>
-      </listitem>
-    </itemizedlist>
-
-	<section id="sc_recipes_GuidNote">
-      <title>Recoverable Errors and the GUID</title>
-    <itemizedlist>
-      <listitem>
-        <para>If a recoverable error occurs calling <emphasis role="bold">create()</emphasis> the 
-		client should call <emphasis role="bold">getChildren()</emphasis> and check for a node 
-		containing the <emphasis>guid</emphasis> used in the path name. 
-		This handles the case (noted <ulink url="#sc_recipes_errorHandlingNote">above</ulink>) of 
-		the create() succeeding on the server but the server crashing before returning the name 
-		of the new node.</para>
-      </listitem>
-    </itemizedlist>
-	</section>
-
-    <section>
-      <title>Shared Locks</title>
-
-      <para>You can implement shared locks by with a few changes to the lock
-      protocol:</para>
-
-      <informaltable colsep="0" frame="none" rowsep="0">
-        <tgroup cols="2">
-          <tbody>
-            <row>
-              <entry align="center"><emphasis role="bold">Obtaining a read
-              lock:</emphasis></entry>
-
-              <entry align="center"><emphasis role="bold">Obtaining a write
-              lock:</emphasis></entry>
-            </row>
-
-            <row>
-              <entry align="left"><orderedlist>
-                  <listitem>
-                    <para>Call <emphasis role="bold">create( )</emphasis> to
-                    create a node with pathname
-                    "<filename>guid-/read-</filename>". This is the
-                    lock node use later in the protocol. Make sure to set both
-                    the <emphasis>sequence</emphasis> and
-                    <emphasis>ephemeral</emphasis> flags.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Call <emphasis role="bold">getChildren( )</emphasis>
-                    on the lock node <emphasis>without</emphasis> setting the
-                    <emphasis>watch</emphasis> flag - this is important, as it
-                    avoids the herd effect.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>If there are no children with a pathname starting
-                    with "<filename>write-</filename>" and having a lower
-                    sequence number than the node created in step <emphasis
-                    role="bold">1</emphasis>, the client has the lock and can
-                    exit the protocol. </para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Otherwise, call <emphasis role="bold">exists(
-                    )</emphasis>, with <emphasis>watch</emphasis> flag, set on
-                    the node in lock directory with pathname staring with
-                    "<filename>write-</filename>" having the next lowest
-                    sequence number.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>If <emphasis role="bold">exists( )</emphasis>
-                    returns <emphasis>false</emphasis>, goto step <emphasis
-                    role="bold">2</emphasis>.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Otherwise, wait for a notification for the pathname
-                    from the previous step before going to step <emphasis
-                    role="bold">2</emphasis></para>
-                  </listitem>
-                </orderedlist></entry>
-
-              <entry><orderedlist>
-                  <listitem>
-                    <para>Call <emphasis role="bold">create( )</emphasis> to
-                    create a node with pathname
-                    "<filename>guid-/write-</filename>". This is the
-                    lock node spoken of later in the protocol. Make sure to
-                    set both <emphasis>sequence</emphasis> and
-                    <emphasis>ephemeral</emphasis> flags.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Call <emphasis role="bold">getChildren( )
-                    </emphasis> on the lock node <emphasis>without</emphasis>
-                    setting the <emphasis>watch</emphasis> flag - this is
-                    important, as it avoids the herd effect.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>If there are no children with a lower sequence
-                    number than the node created in step <emphasis
-                    role="bold">1</emphasis>, the client has the lock and the
-                    client exits the protocol.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>Call <emphasis role="bold">exists( ),</emphasis>
-                    with <emphasis>watch</emphasis> flag set, on the node with
-                    the pathname that has the next lowest sequence
-                    number.</para>
-                  </listitem>
-
-                  <listitem>
-                    <para>If <emphasis role="bold">exists( )</emphasis>
-                    returns <emphasis>false</emphasis>, goto step <emphasis
-                    role="bold">2</emphasis>. Otherwise, wait for a
-                    notification for the pathname from the previous step
-                    before going to step <emphasis
-                    role="bold">2</emphasis>.</para>
-                  </listitem>
-                </orderedlist></entry>
-            </row>
-          </tbody>
-        </tgroup>
-      </informaltable>
-
-    <para>Notes:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>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 "<filename>write-</filename>" 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.</para>
-      </listitem>
-    </itemizedlist>
-
-    <itemizedlist>
-      <listitem>
-        <para>See the <ulink url="#sc_recipes_GuidNote">note for Locks</ulink> on how to use the guid in the node.</para>
-      </listitem>
-    </itemizedlist>
-
-	</section>
-
-    <section id="sc_revocableSharedLocks">
-      <title>Revocable Shared Locks</title>
-
-      <para>With minor modifications to the Shared Lock protocol, you make
-      shared locks revocable by modifying the shared lock protocol:</para>
-
-      <para>In step <emphasis role="bold">1</emphasis>, of both obtain reader
-      and writer lock protocols, call <emphasis role="bold">getData(
-      )</emphasis> with <emphasis>watch</emphasis> set, immediately after the
-      call to <emphasis role="bold">create( )</emphasis>. If the client
-      subsequently receives notification for the node it created in step
-      <emphasis role="bold">1</emphasis>, it does another <emphasis
-      role="bold">getData( )</emphasis> on that node, with
-      <emphasis>watch</emphasis> 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 <emphasis role="bold">setData()
-      </emphasis> on the lock node, writing "unlock" to that node.</para>
-
-      <para>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 <emphasis>Revocable Shared Locks with Freaking
-      Laser Beams</emphasis> 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.</para>
-    </section>
-  </section>
-
-  <section id="sc_recipes_twoPhasedCommit">
-    <title>Two-phased Commit</title>
-
-    <para>A two-phase commit protocol is an algorithm that lets all clients in
-    a distributed system agree either to commit a transaction or abort.</para>
-
-    <para>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".</para>
-
-    <para>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.</para>
-
-    <para>There are two important drawbacks of the approach described above.
-    One is the message complexity, which is O(n²). 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.</para>
-
-    <para>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.</para>
-
-    <para>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.</para>
-  </section>
-
-  <section id="sc_leaderElection">
-    <title>Leader Election</title>
-
-    <para>A simple way of doing leader election with ZooKeeper is to use the
-    <emphasis role="bold">SEQUENCE|EPHEMERAL</emphasis> 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/guid-n_"
-    with both flags SEQUENCE|EPHEMERAL. With the sequence flag, ZooKeeper
-    automatically appends a sequence number that is greater than any one
-    previously appended to a child of "/election". The process that created
-    the znode with the smallest appended sequence number is the leader.
-    </para>
-
-    <para>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 a 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. </para>
-
-    <para>Here's the pseudo code:</para>
-
-    <para>Let ELECTION be a path of choice of the application. To volunteer to
-    be a leader: </para>
-
-    <orderedlist>
-      <listitem>
-        <para>Create znode z with path "ELECTION/guid-n_" with both SEQUENCE and
-        EPHEMERAL flags;</para>
-      </listitem>
-
-      <listitem>
-        <para>Let C be the children of "ELECTION", and i be the sequence
-        number of z;</para>
-      </listitem>
-
-      <listitem>
-        <para>Watch for changes on "ELECTION/guid-n_j", where j is the largest
-        sequence number such that j &lt; i and n_j is a znode in C;</para>
-      </listitem>
-    </orderedlist>
-
-    <para>Upon receiving a notification of znode deletion: </para>
-
-    <orderedlist>
-      <listitem>
-        <para>Let C be the new set of children of ELECTION; </para>
-      </listitem>
-
-      <listitem>
-        <para>If z is the smallest node in C, then execute leader
-        procedure;</para>
-      </listitem>
-
-      <listitem>
-        <para>Otherwise, watch for changes on "ELECTION/guid-n_j", where j is the
-        largest sequence number such that j &lt; i and n_j is a znode in C;
-        </para>
-      </listitem>
-    </orderedlist>
-
-	<para>Notes:</para>
-
-    <itemizedlist>
-      <listitem>
-	    <para>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 znode
-	    to acknowledge that the leader has executed the leader procedure. </para>
-      </listitem>
-    </itemizedlist>
-
-    <itemizedlist>
-      <listitem>
-        <para>See the <ulink url="#sc_recipes_GuidNote">note for Locks</ulink> on how to use the guid in the node.</para>
-      </listitem>
-    </itemizedlist>
-
-  </section>
-  </section>
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/site.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/site.xml b/zookeeper-docs/src/documentation/content/xdocs/site.xml
deleted file mode 100644
index 614fa6c..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/site.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-
-<!--
-Forrest site.xml
-
-This file contains an outline of the site's information content.  It is used to:
-- Generate the website menus (though these can be overridden - see docs)
-- Provide semantic, location-independent aliases for internal 'site:' URIs, eg
-<link href="site:changes"> links to changes.html (or ../changes.html if in
-  subdir).
-- Provide aliases for external URLs in the external-refs section.  Eg, <link
-  href="ext:cocoon"> links to http://xml.apache.org/cocoon/
-
-See http://forrest.apache.org/docs/linking.html for more info.
--->
-
-<site label="ZooKeeper" href="" xmlns="http://apache.org/forrest/linkmap/1.0">
-
-  <docs label="Overview"> 
-    <welcome   label="Welcome"                href="index.html" />
-    <overview  label="Overview"               href="zookeeperOver.html" />
-    <started   label="Getting Started"        href="zookeeperStarted.html" />
-    <relnotes  label="Release Notes"          href="ext:relnotes" />
-  </docs>
-  
-  <docs label="Developer">
-    <api       label="API Docs"               href="ext:api/index" />
-    <program   label="Programmer's Guide"     href="zookeeperProgrammers.html" />
-    <javaEx    label="Java Example"     href="javaExample.html" />
-    <barTutor  label="Barrier and Queue Tutorial" href="zookeeperTutorial.html" />
-    <recipes   label="Recipes"		      href="recipes.html" />
-  </docs>
-  
-  <docs label="Admin &amp; Ops">
-      <admin label="Administrator's Guide"  href="zookeeperAdmin.html" />
-      <quota label="Quota Guide"            href="zookeeperQuotas.html" />
-      <jmx   label="JMX"                    href="zookeeperJMX.html" />
-      <observers label="Observers Guide" href="zookeeperObservers.html" />
-      <reconfig label="Dynamic Reconfiguration" href="zookeeperReconfig.html" />
-  </docs>
-  
-  <docs label="Contributor">
-      <internals label="ZooKeeper Internals"	href="zookeeperInternals.html" />
-  </docs>
-  
-  <docs label="Miscellaneous">
-    <wiki      label="Wiki"                   href="ext:wiki" />
-    <faq       label="FAQ"                    href="ext:faq" />
-    <lists     label="Mailing Lists"          href="ext:lists" />
-    <!--<other     label="Other Info"	      href="zookeeperOtherInfo.html" />-->
-  </docs>
-  
-  
-
-  <external-refs>
-    <site      href="http://zookeeper.apache.org/"/>
-    <lists     href="http://zookeeper.apache.org/mailing_lists.html"/>
-    <releases  href="http://zookeeper.apache.org/releases.html">
-      <download href="#Download" />
-    </releases>
-    <jira      href="http://zookeeper.apache.org/issue_tracking.html"/>
-    <wiki      href="https://cwiki.apache.org/confluence/display/ZOOKEEPER" />
-    <faq       href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ" />
-    <zlib      href="http://www.zlib.net/" />
-    <lzo       href="http://www.oberhumer.com/opensource/lzo/" />
-    <gzip      href="http://www.gzip.org/" />
-    <cygwin    href="http://www.cygwin.com/" />
-    <osx       href="http://www.apple.com/macosx" />
-    <relnotes  href="releasenotes.html" />
-    <api href="api/">
-      <started href="overview-summary.html#overview_description" />
-      <index href="index.html" />
-      <org href="org/">
-        <apache href="apache/">
-          <zookeeper href="zookeeper/">
-          </zookeeper>
-        </apache>
-      </org>
-    </api>
-  </external-refs>
- 
-</site>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/tabs.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/tabs.xml b/zookeeper-docs/src/documentation/content/xdocs/tabs.xml
deleted file mode 100644
index 90bbf99..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/tabs.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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 tabs PUBLIC "-//APACHE//DTD Cocoon Documentation Tab V1.0//EN" 
-          "http://forrest.apache.org/dtd/tab-cocoon-v10.dtd">
-
-<tabs software="ZooKeeper"
-      title="ZooKeeper"
-      copyright="The Apache Software Foundation"
-      xmlns:xlink="http://www.w3.org/1999/xlink">
-
-  <!-- The rules are:
-    @dir will always have /index.html added.
-    @href is not modified unless it is root-relative and obviously specifies a
-    directory (ends in '/'), in which case /index.html will be added
-  -->
-
-  <tab label="Project" href="http://zookeeper.apache.org/" />
-  <tab label="Wiki" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/" />
-  <tab label="ZooKeeper 3.5 Documentation" dir="" />
-  
-</tabs>


[13/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/screen.css
----------------------------------------------------------------------
diff --git a/docs/skin/screen.css b/docs/skin/screen.css
deleted file mode 100644
index 221cbe5..0000000
--- a/docs/skin/screen.css
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
-* 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.
-*/
-body {  margin: 0px 0px 0px 0px; font-family: Verdana, Helvetica, sans-serif; }
-
-h1     { font-size : 160%; margin: 0px 0px 0px 0px;  padding: 0px; }
-h2     { font-size : 140%; margin: 1em 0px 0.8em 0px; padding: 0px; font-weight : bold;}
-h3     { font-size : 130%; margin: 0.8em 0px 0px 0px; padding: 0px; font-weight : bold; }
-.h3 { margin: 22px 0px 3px 0px; }
-h4     { font-size : 120%; margin: 0.7em 0px 0px 0px; padding: 0px; font-weight : normal; text-align: left; }
-.h4 { margin: 18px 0px 0px 0px; }
-h4.faq { font-size : 120%; margin: 18px 0px 0px 0px; padding: 0px; font-weight : bold;   text-align: left; }
-h5     { font-size : 100%; margin: 14px 0px 0px 0px; padding: 0px; font-weight : normal; text-align: left; }
-
-/**
-* table
-*/
-table .title { background-color: #000000; }
-.ForrestTable         {
-    color: #ffffff;
-    background-color: #7099C5;
-    width: 100%;
-    font-size : 100%;
-    empty-cells: show;
-}
-table caption {
-    padding-left: 5px;
-    color: white;
-    text-align: left;
-    font-weight: bold;
-    background-color: #000000;
-}
-.ForrestTable td {
-    color: black;
-    background-color: #f0f0ff;
-}
-.ForrestTable th { text-align: center; }
-/**
- * Page Header
- */
-
-#top {
-    position: relative;
-    float: left;
-    width: 100%;
-    background: #294563; /* if you want a background in the header, put it here */
-}
-
-#top .breadtrail {
-    background: #CFDCED;
-    color: black;
-    border-bottom: solid 1px white;
-    padding: 3px 10px;
-    font-size: 75%;
-}
-#top .breadtrail a { color: black; }
-
-#top .header {
-    float: left;
-    width: 100%;
-    background: url("images/header_white_line.gif") repeat-x bottom;
-}
-
-#top .grouplogo {
-    padding: 7px 0 10px 10px;
-    float: left;
-    text-align: left;
-}
-#top .projectlogo {
-    padding: 7px 0 10px 10px;
-    float: left;
-    width: 33%;
-    text-align: right;
-}
-#top .projectlogoA1 {
-    padding: 7px 0 10px 10px;
-    float: right;
-}
-html>body #top .searchbox {
-    bottom: 0px;
-}
-#top .searchbox {
-    position: absolute;
-    right: 10px;
-    height: 42px;
-    font-size: 70%;
-    white-space: nowrap;
-    text-align: right;
-    color: white;
-    background-color: #000000;
-    z-index:0;
-    background-image: url(images/rc-t-l-5-1header-2searchbox-3searchbox.png);
-    background-repeat: no-repeat;
-    background-position: top left;
-    bottom: -1px; /* compensate for IE rendering issue */
-}
-
-#top .searchbox form {
-    padding: 5px 10px;
-    margin: 0;
-}
-#top .searchbox p {
-    padding: 0 0 2px 0;
-    margin: 0;
-}
-#top .searchbox input {
-    font-size: 100%;
-}
-
-#tabs {
-    clear: both;
-    padding-left: 10px;
-    margin: 0;
-    list-style: none;
-}
-/*    background: #CFDCED url("images/tab-right.gif") no-repeat right top;*/
-#tabs li {
-    float: left;
-    background-image: url(images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-    background-color: #000000;
-    margin: 0 3px 0 0;
-    padding: 0;
-}
-
-/*background: url("images/tab-left.gif") no-repeat left top;*/
-#tabs li a {
-    float: left;
-    display: block;
-    font-family: verdana, arial, sans-serif;
-    text-decoration: none;
-    color: black;
-    white-space: nowrap;
-    background-image: url(images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png);
-    background-repeat: no-repeat;
-    background-position: top left;
-    padding: 5px 15px 4px;
-    width: .1em; /* IE/Win fix */
-}
-
-#tabs li a:hover {
-   
-    cursor: pointer;
-    text-decoration:underline;
-}
-
-#tabs > li a { width: auto; } /* Rest of IE/Win fix */
-
-/* Commented Backslash Hack hides rule from IE5-Mac \*/
-#tabs a { float: none; }
-/* End IE5-Mac hack */
-
-#top .header .current {
-    background-color: #4C6C8F;
-    background-image: url(images/rc-t-r-5-1header-2tab-selected-3tab-selected.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-}
-#top .header .current a {
-    font-weight: bold;
-    padding-bottom: 5px;
-    color: white;
-    background-image: url(images/rc-t-l-5-1header-2tab-selected-3tab-selected.png);
-    background-repeat: no-repeat;
-    background-position: top left;
-}
-#publishedStrip {
-    padding-right: 10px;
-    padding-left: 20px;
-    padding-top: 3px;
-    padding-bottom:3px;
-    color: #ffffff;
-    font-size : 60%;
-    font-weight: bold;
-    background-color: #4C6C8F;
-    text-align:right;
-}
-
-#level2tabs {
-margin: 0;
-float:left;
-position:relative;
-
-}
-
-
-
-#level2tabs  a:hover {
-   
-    cursor: pointer;
-    text-decoration:underline;
-    
-}
-
-#level2tabs  a{
-   
-    cursor: pointer;
-    text-decoration:none;
-    background-image: url('images/chapter.gif');
-    background-repeat: no-repeat;
-    background-position: center left;
-    padding-left: 6px;
-    margin-left: 6px;
-}
-
-/*
-*    border-top: solid #4C6C8F 15px;
-*/
-#main {
-    position: relative;
-    background: white;
-    clear:both;
-}
-#main .breadtrail {
-    clear:both;
-    position: relative;
-    background: #CFDCED;
-    color: black;
-    border-bottom: solid 1px black;
-    border-top: solid 1px black;
-    padding: 0px 180px;
-    font-size: 75%;
-    z-index:10;
-}
-/**
-* Round corner
-*/
-#roundtop {
-    background-image: url(images/rc-t-r-15-1body-2menu-3menu.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-}
-
-#roundbottom {
-    background-image: url(images/rc-b-r-15-1body-2menu-3menu.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-}
-
-img.corner {
-   width: 15px;
-   height: 15px;
-   border: none;
-   display: block !important;
-}
-
-.roundtopsmall {
-    background-image: url(images/rc-t-r-5-1header-2searchbox-3searchbox.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-}
-
-#roundbottomsmall {
-    background-image: url(images/rc-b-r-5-1header-2tab-selected-3tab-selected.png);
-    background-repeat: no-repeat;
-    background-position: top right;
-}
-
-img.cornersmall {
-   width: 5px;
-   height: 5px;
-   border: none;
-   display: block !important;
-}
-/**
- * Side menu
- */
-#menu a {  font-weight: normal; text-decoration: none;}
-#menu a:visited {  font-weight: normal; }
-#menu a:active {  font-weight: normal; }
-#menu a:hover {  font-weight: normal;  text-decoration:underline;}
-
-#menuarea { width:10em;}
-#menu {
-    position: relative;
-    float: left;
-    width: 160px;
-    padding-top: 0px;
-    top:-18px;
-    left:10px;
-    z-index: 20;
-    background-color: #f90;
-    font-size : 70%;
-    
-}
-
-.menutitle {
-        cursor:pointer;
-        padding: 3px 12px;
-        margin-left: 10px;
-        background-image: url('images/chapter.gif');
-        background-repeat: no-repeat;
-        background-position: center left;
-        font-weight : bold;
-
-        
-}
-
-.menutitle:hover{text-decoration:underline;cursor: pointer;}
-
-#menu .menuitemgroup {
-        margin: 0px 0px 6px 8px;
-        padding: 0px;
-        font-weight : bold; }
-
-#menu .selectedmenuitemgroup{
-        margin: 0px 0px 0px 8px;
-        padding: 0px;
-        font-weight : normal; 
-       
-        }
-
-#menu .menuitem {
-        padding: 2px 0px 1px 13px;
-        background-image: url('images/page.gif');
-        background-repeat: no-repeat;
-        background-position: center left;
-        font-weight : normal;
-        margin-left: 10px;
-}
-
-#menu .menupage {
-        margin: 2px 0px 1px 10px;
-        padding: 0px 3px 0px 12px;
-        background-image: url('images/page.gif');
-        background-repeat: no-repeat;
-        background-position: center left;
-        font-style : normal;
-}
-#menu .menupagetitle {
-        padding: 0px 0px 0px 1px;
-        font-style : normal;
-        border-style: solid;
-        border-width: 1px;
-        margin-right: 10px;
-         
-}
-#menu .menupageitemgroup {
-        padding: 3px 0px 4px 6px;
-        font-style : normal;
-        border-bottom: 1px solid ;
-        border-left: 1px solid ;
-        border-right: 1px solid ;
-        margin-right: 10px;
-}
-#menu .menupageitem {
-        font-style : normal;
-        font-weight : normal;
-        border-width: 0px;
-        font-size : 90%;
-}
-#menu #credit {
-    text-align: center;
-}
-#menu #credit2 {
-    text-align: center;
-    padding: 3px 3px 3px 3px;
-    background-color: #ffffff;
-}
-#menu .searchbox {
-    text-align: center;
-}
-#menu .searchbox form {
-    padding: 3px 3px;
-    margin: 0;
-}
-#menu .searchbox input {
-    font-size: 100%;
-}
-
-#content {
-    padding: 20px 20px 20px 180px;
-    margin: 0;
-    font : small Verdana, Helvetica, sans-serif;
-    font-size : 80%;
-}
-
-#content ul {
-    margin: 0;
-    padding: 0 25px;
-}
-#content li {
-    padding: 0 5px;
-}
-#feedback {
-    color: black;
-    background: #CFDCED;
-    text-align:center;
-    margin-top: 5px;
-}
-#feedback #feedbackto {
-    font-size: 90%;
-    color: black;
-}
-#footer {
-    clear: both;
-    position: relative; /* IE bugfix (http://www.dracos.co.uk/web/css/ie6floatbug/) */
-    width: 100%;
-    background: #CFDCED;
-    border-top: solid 1px #4C6C8F;
-    color: black;
-}
-#footer .copyright {
-    position: relative; /* IE bugfix cont'd */
-    padding: 5px;
-    margin: 0;
-    width: 60%;
-}
-#footer .lastmodified {
-    position: relative; /* IE bugfix cont'd */
-    float: right;
-    width: 30%;
-    padding: 5px;
-    margin: 0;
-    text-align: right;
-}
-#footer a { color: white; }
-
-#footer #logos {
-    text-align: left;
-}
-
-
-/**
- * Misc Styles
- */
-
-acronym { cursor: help; }
-.boxed      { background-color: #a5b6c6;}
-.underlined_5     {border-bottom: solid 5px #4C6C8F;}
-.underlined_10     {border-bottom: solid 10px #4C6C8F;}
-/* ==================== snail trail ============================ */
-
-.trail {
-  position: relative; /* IE bugfix cont'd */
-  font-size: 70%;
-  text-align: right;
-  float: right;
-  margin: -10px 5px 0px 5px;
-  padding: 0;
-}
-
-#motd-area {
-    position:relative;
-    float:right;
-    width: 35%;
-    background-color: #f0f0ff;
-    border: solid 1px #4C6C8F;
-    margin: 0px 0px 10px 10px;
-    padding: 5px;
-}
-
-#minitoc-area {
-    border-top: solid 1px #4C6C8F;
-    border-bottom: solid 1px #4C6C8F;
-    margin: 15px 10% 5px 15px;
-   /* margin-bottom: 15px;
-    margin-left: 15px;
-    margin-right: 10%;*/
-    padding-bottom: 7px;
-    padding-top: 5px;
-}
-.minitoc {
-    list-style-image: url('images/current.gif');
-    font-weight: normal;
-}
-
-.abstract{
-    text-align:justify;
-    }
-
-li p {
-    margin: 0;
-    padding: 0;
-}
-
-.pdflink {
-    position: relative; /* IE bugfix cont'd */
-    float: right;
-    margin: 0px 5px;
-    padding: 0;
-}
-.pdflink br {
-    margin-top: -10px;
-    padding-left: 1px;
-}
-.pdflink a {
-    display: block;
-    font-size: 70%;
-    text-align: center;
-    margin: 0;
-    padding: 0;
-}
-
-.pdflink img {
-    display: block;
-    height: 16px;
-    width: 16px;
-}
-.xmllink {
-    position: relative; /* IE bugfix cont'd */
-    float: right;
-    margin: 0px 5px;
-    padding: 0;
-}
-.xmllink br {
-    margin-top: -10px;
-    padding-left: 1px;
-}
-.xmllink a {
-    display: block;
-    font-size: 70%;
-    text-align: center;
-    margin: 0;
-    padding: 0;
-}
-
-.xmllink img {
-    display: block;
-    height: 16px;
-    width: 16px;
-}
-.podlink {
-    position: relative; /* IE bugfix cont'd */
-    float: right;
-    margin: 0px 5px;
-    padding: 0;
-}
-.podlink br {
-    margin-top: -10px;
-    padding-left: 1px;
-}
-.podlink a {
-    display: block;
-    font-size: 70%;
-    text-align: center;
-    margin: 0;
-    padding: 0;
-}
-
-.podlink img {
-    display: block;
-    height: 16px;
-    width: 16px;
-}
-
-.printlink {
-    position: relative; /* IE bugfix cont'd */
-    float: right;
-}
-.printlink br {
-    margin-top: -10px;
-    padding-left: 1px;
-}
-.printlink a {
-    display: block;
-    font-size: 70%;
-    text-align: center;
-    margin: 0;
-    padding: 0;
-}
-.printlink img {
-    display: block;
-    height: 16px;
-    width: 16px;
-}
-
-p.instruction {
-  display: list-item;
-  list-style-image: url('../images/instruction_arrow.png');
-  list-style-position: outside;
-  margin-left: 2em;
-} 
\ No newline at end of file


[15/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/releasenotes.html
----------------------------------------------------------------------
diff --git a/docs/releasenotes.html b/docs/releasenotes.html
deleted file mode 100644
index 65cf8a9..0000000
--- a/docs/releasenotes.html
+++ /dev/null
@@ -1,2251 +0,0 @@
-<!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 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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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">Admin &amp; Ops</div>
-<div id="menu_1.3" 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.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div>
-<div id="menu_1.4" 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="releasenotes.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<p>
-
-        Release Notes - ZooKeeper - Version 3.5.4
-
-
-<p>
-
-Release 3.5.3 added a new
-feature <a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2169'>ZOOKEEPER-2169</a>
-"Enable creation of nodes with TTLs". There was a major oversight when
-TTL nodes were implemented. The session ID generator for each server
-is seeded with the configured Server ID in the high byte. TTL Nodes
-were using the highest bit to denote a TTL node when used in the
-ephemeral owner. This meant that Server IDs > 127 that created
-ephemeral nodes would have those nodes always considered TTL nodes
-(with the TTL being essentially a random number).
-
-<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2901'>ZOOKEEPER-2901</a>
-fixes the issue. By default TTL is disabled and must now be enabled in
-zoo.cfg. When TTL Nodes are enabled, the max Server ID changes from
-255 to 254. See the documentation for TTL in the administrator guide
-(or the referenced JIRAs) for more details.
-
-<p>
-  
-<h2>        Sub-task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2754'>ZOOKEEPER-2754</a>] -         Set up Apache Jenkins job that runs the flaky test analyzer script.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2792'>ZOOKEEPER-2792</a>] -         [QP MutualAuth]: Port ZOOKEEPER-1045 implementation from branch-3.4 to branch-3.5
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2903'>ZOOKEEPER-2903</a>] -         Port ZOOKEEPER-2901 to 3.5.4
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2939'>ZOOKEEPER-2939</a>] -         Deal with maxbuffer as it relates to proposals
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2981'>ZOOKEEPER-2981</a>] -         Fix build on branch-3.5 for ZOOKEEPER-2939
-</li>
-</ul>
-        
-<h2>        Bug
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1580'>ZOOKEEPER-1580</a>] -         QuorumPeer.setRunning is not used
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1782'>ZOOKEEPER-1782</a>] -         zookeeper.superUser is not as super as superDigest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1807'>ZOOKEEPER-1807</a>] -         Observers spam each other creating connections to the election addr
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2101'>ZOOKEEPER-2101</a>] -         Transaction larger than max buffer of jute makes zookeeper unavailable
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2249'>ZOOKEEPER-2249</a>] -         CRC check failed when preAllocSize smaller than node data
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2316'>ZOOKEEPER-2316</a>] -         comment does not match code logic
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2338'>ZOOKEEPER-2338</a>] -         c bindings should create socket&#39;s with SOCK_CLOEXEC to avoid fd leaks on fork/exec
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2349'>ZOOKEEPER-2349</a>] -         Update documentation for snapCount
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2355'>ZOOKEEPER-2355</a>] -         Ephemeral node is never deleted if follower fails while reading the proposal packet
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2491'>ZOOKEEPER-2491</a>] -         C client build error in vs 2015 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2581'>ZOOKEEPER-2581</a>] -         Not handled NullPointerException while creating key manager and trustManager
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2690'>ZOOKEEPER-2690</a>] -         Update documentation source for ZOOKEEPER-2574
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2722'>ZOOKEEPER-2722</a>] -         Flaky Test: org.apache.zookeeper.test.ReadOnlyModeTest.testSessionEstablishment
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2725'>ZOOKEEPER-2725</a>] -         Upgrading to a global session fails with a multiop
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2743'>ZOOKEEPER-2743</a>] -         Netty connection leaks JMX connection bean upon connection close in certain race conditions.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2747'>ZOOKEEPER-2747</a>] -         Fix ZooKeeperAdmin Compilation Warning
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2757'>ZOOKEEPER-2757</a>] -         Incorrect path crashes zkCli
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2758'>ZOOKEEPER-2758</a>] -         Typo: transasction --&gt; transaction
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2775'>ZOOKEEPER-2775</a>] -         ZK Client not able to connect with Xid out of order error 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2777'>ZOOKEEPER-2777</a>] -         There is a typo in zk.py which prevents from using/compiling it.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2783'>ZOOKEEPER-2783</a>] -         follower disconnects and cannot reconnect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2785'>ZOOKEEPER-2785</a>] -         Server inappropriately throttles connections under load before SASL completes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2786'>ZOOKEEPER-2786</a>] -         Flaky test: org.apache.zookeeper.test.ClientTest.testNonExistingOpCode
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2797'>ZOOKEEPER-2797</a>] -         Invalid TTL from misbehaving client nukes zookeeper
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2798'>ZOOKEEPER-2798</a>] -         Fix flaky test: org.apache.zookeeper.test.ReadOnlyModeTest.testConnectionEvents
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2806'>ZOOKEEPER-2806</a>] -         Flaky test: org.apache.zookeeper.server.quorum.FLEBackwardElectionRoundTest.testBackwardElectionRound
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2808'>ZOOKEEPER-2808</a>] -         ACL with index 1 might be removed if it&#39;s only being used once
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2818'>ZOOKEEPER-2818</a>] -         Improve the ZooKeeper#setACL  java doc
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2819'>ZOOKEEPER-2819</a>] -         Changing membership configuration via rolling restart does not work on 3.5.x.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2841'>ZOOKEEPER-2841</a>] -         ZooKeeper public include files leak porting changes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2845'>ZOOKEEPER-2845</a>] -         Data inconsistency issue due to retain database in leader election
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2852'>ZOOKEEPER-2852</a>] -         Snapshot size factor is not read from system property
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2853'>ZOOKEEPER-2853</a>] -         The lastZxidSeen in FileTxnLog.java is never being assigned
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2859'>ZOOKEEPER-2859</a>] -         CMake build doesn&#39;t support OS X
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2861'>ZOOKEEPER-2861</a>] -         Main-Class JAR manifest attribute is incorrect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2862'>ZOOKEEPER-2862</a>] -         Incorrect javadoc syntax for web links in StaticHostProvider.java
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2874'>ZOOKEEPER-2874</a>] -         Windows Debug builds don&#39;t link with `/MTd`
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2890'>ZOOKEEPER-2890</a>] -         Local automatic variable is left uninitialized and then freed.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2893'>ZOOKEEPER-2893</a>] -         very poor choice of logging if client fails to connect to server
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2901'>ZOOKEEPER-2901</a>] -         Session ID that is negative causes mis-calculation of Ephemeral Type
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2905'>ZOOKEEPER-2905</a>] -         Don&#39;t include `config.h` in `zookeeper.h`
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2906'>ZOOKEEPER-2906</a>] -         The OWASP dependency check jar should not be included in the default classpath
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2908'>ZOOKEEPER-2908</a>] -         quorum.auth.MiniKdcTest.testKerberosLogin failing with NPE on java 9
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2909'>ZOOKEEPER-2909</a>] -         Create ant task to generate ivy dependency reports
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2914'>ZOOKEEPER-2914</a>] -         compiler warning using java 9
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2923'>ZOOKEEPER-2923</a>] -         The comment of the variable matchSyncs in class CommitProcessor has a mistake.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2924'>ZOOKEEPER-2924</a>] -         Flaky Test: org.apache.zookeeper.test.LoadFromLogTest.testRestoreWithTransactionErrors
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2931'>ZOOKEEPER-2931</a>] -         WriteLock recipe: incorrect znode ordering when the sessionId is part of the znode name
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2934'>ZOOKEEPER-2934</a>] -         c versions of election and queue recipes do not compile
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2936'>ZOOKEEPER-2936</a>] -         Duplicate Keys in log4j.properties config files
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2944'>ZOOKEEPER-2944</a>] -         Specify correct overflow value
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2948'>ZOOKEEPER-2948</a>] -         Failing c unit tests on apache jenkins
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2949'>ZOOKEEPER-2949</a>] -         SSL ServerName not set when using hostname, some proxies may failed to proxy the request.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2951'>ZOOKEEPER-2951</a>] -         zkServer.cmd does not start when JAVA_HOME ends with a \
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2953'>ZOOKEEPER-2953</a>] -         Flaky Test: testNoLogBeforeLeaderEstablishment
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2959'>ZOOKEEPER-2959</a>] -         ignore accepted epoch and LEADERINFO ack from observers when a newly elected leader computes new epoch
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2961'>ZOOKEEPER-2961</a>] -         Fix testElectionFraud Flakyness
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2964'>ZOOKEEPER-2964</a>] -         &quot;Conf&quot; command returns dataDir and dataLogDir opposingly
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2978'>ZOOKEEPER-2978</a>] -         fix potential null pointer exception when deleting node
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2982'>ZOOKEEPER-2982</a>] -         Re-try DNS hostname -&gt; IP resolution
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2988'>ZOOKEEPER-2988</a>] -         NPE triggered if server receives a vote for a server id not in their voting view
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2992'>ZOOKEEPER-2992</a>] -         The eclipse build target fails due to protocol redirection: http-&gt;https
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2997'>ZOOKEEPER-2997</a>] -         CMake should not force static CRT linking
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3001'>ZOOKEEPER-3001</a>] -         Incorrect log message when try to delete container node
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3006'>ZOOKEEPER-3006</a>] -         Potential NPE in ZKDatabase#calculateTxnLogSizeLimit
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3007'>ZOOKEEPER-3007</a>] -         Potential NPE in ReferenceCountedACLCache#deserialize 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3025'>ZOOKEEPER-3025</a>] -         cmake windows build is broken on jenkins
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3027'>ZOOKEEPER-3027</a>] -         Accidently removed public API of FileTxnLog.setPreallocSize()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3038'>ZOOKEEPER-3038</a>] -         Cleanup some nitpicks in TTL implementation
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3039'>ZOOKEEPER-3039</a>] -         TxnLogToolkit uses Scanner badly
-</li>
-</ul>
-        
-<h2>        New Feature
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1703'>ZOOKEEPER-1703</a>] -         Please add instructions for running the tutorial
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2875'>ZOOKEEPER-2875</a>] -         Add ant task for running OWASP dependency report
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2994'>ZOOKEEPER-2994</a>] -         Tool required to recover log and snapshot entries with CRC errors
-</li>
-</ul>
-        
-<h2>        Improvement
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1748'>ZOOKEEPER-1748</a>] -         TCP keepalive for leader election connections
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2359'>ZOOKEEPER-2359</a>] -         ZooKeeper client has unnecessary logs for watcher removal errors
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2638'>ZOOKEEPER-2638</a>] -         ZooKeeper should log which serverCnxnFactory is used during startup
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2662'>ZOOKEEPER-2662</a>] -         Export a metric for txn log sync times
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2697'>ZOOKEEPER-2697</a>] -         Handle graceful stop of ZookKeeper client
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2744'>ZOOKEEPER-2744</a>] -         Typos in the comments of ZooKeeper class
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2767'>ZOOKEEPER-2767</a>] -         Correct the exception messages in X509Util if truststore location or password is not configured
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2788'>ZOOKEEPER-2788</a>] -         The define of MAX_CONNECTION_ATTEMPTS in QuorumCnxManager.java seems useless, should it be removed?
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2815'>ZOOKEEPER-2815</a>] -         1. Using try clause to close resource; 2. Others code refactoring for PERSISTENCE module
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2816'>ZOOKEEPER-2816</a>] -         Code refactoring for `ZK_SERVER` module
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2824'>ZOOKEEPER-2824</a>] -         `FileChannel#size` info should be added to `FileTxnLog#commit` to solve the confuse that reason is too large log or too busy disk I/O
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2829'>ZOOKEEPER-2829</a>] -         Interface usability / compatibility improvements through Java annotation.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2856'>ZOOKEEPER-2856</a>] -         ZooKeeperSaslClient#respondToServer should log exception message of SaslException
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2864'>ZOOKEEPER-2864</a>] -         Add script to run a java api compatibility tool
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2865'>ZOOKEEPER-2865</a>] -         Reconfig Causes Inconsistent Configuration file among the nodes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2870'>ZOOKEEPER-2870</a>] -         Improve the efficiency of AtomicFileOutputStream
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2880'>ZOOKEEPER-2880</a>] -         Rename README.txt to README.md
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2887'>ZOOKEEPER-2887</a>] -         define dependency versions in build.xml to be easily overridden in build.properties
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2896'>ZOOKEEPER-2896</a>] -         Remove unused imports from org.apache.zookeeper.test.CreateTest.java
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2904'>ZOOKEEPER-2904</a>] -         Remove unused imports from org.apache.zookeeper.server.quorum.WatchLeakTest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2915'>ZOOKEEPER-2915</a>] -         Use &quot;strict&quot; conflict management in ivy
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2950'>ZOOKEEPER-2950</a>] -         Add keys for the Zxid from the stat command to check_zookeeper.py
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2952'>ZOOKEEPER-2952</a>] -         Upgrade third party libraries to address vulnerabilities
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2967'>ZOOKEEPER-2967</a>] -         Add check to validate dataDir and dataLogDir parameters at startup
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2971'>ZOOKEEPER-2971</a>] -         Create release notes for 3.5.4
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2999'>ZOOKEEPER-2999</a>] -         CMake build should use target-level commands
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3012'>ZOOKEEPER-3012</a>] -         Fix unit test: testDataDirAndDataLogDir should not use hardcode test folders
-</li>
-</ul>
-    
-<h2>        Test
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2415'>ZOOKEEPER-2415</a>] -         SessionTest is using Thread deprecated API.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2577'>ZOOKEEPER-2577</a>] -         Flaky Test: org.apache.zookeeper.server.quorum.ReconfigDuringLeaderSyncTest.testDuringLeaderSync
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2742'>ZOOKEEPER-2742</a>] -         Few test cases of org.apache.zookeeper.ZooKeeperTest fails in Windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2746'>ZOOKEEPER-2746</a>] -         Leader hand-off during dynamic reconfig is best effort, while test always expects it
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2796'>ZOOKEEPER-2796</a>] -         Test org.apache.zookeeper.ZooKeeperTest.testCreateNodeWithoutData is broken by ZOOKEEPER-2757
-</li>
-</ul>
-    
-<h2>        Wish
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2795'>ZOOKEEPER-2795</a>] -         Change log level for &quot;ZKShutdownHandler is not registered&quot; error message
-</li>
-</ul>
-    
-<h2>        Task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2713'>ZOOKEEPER-2713</a>] -         Create CVE text for ZOOKEEPER-2693 &quot;DOS attack on wchp/wchc four letter words (4lw)&quot;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3002'>ZOOKEEPER-3002</a>] -         Upgrade branches 3.5 and trunk to Java 1.8
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-3017'>ZOOKEEPER-3017</a>] -         Link libm in CMake on FreeBSD
-</li>
-</ul>
-<p>
-                                                                                                                                    
-        Release Notes - ZooKeeper - Version 3.5.3
-    
-<h2>        Sub-task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2080'>ZOOKEEPER-2080</a>] -         Fix deadlock in dynamic reconfiguration
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2152'>ZOOKEEPER-2152</a>] -         Intermittent failure in TestReconfig.cc
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2692'>ZOOKEEPER-2692</a>] -         Fix race condition in testWatchAutoResetWithPending
-</li>
-</ul>
-                            
-<h2>        Bug
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1256'>ZOOKEEPER-1256</a>] -         ClientPortBindTest is failing on Mac OS X
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1806'>ZOOKEEPER-1806</a>] -         testCurrentServersAreObserversInNextConfig failing frequently on trunk with non-jdk6
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1898'>ZOOKEEPER-1898</a>] -         ZooKeeper Java cli shell always returns &quot;0&quot; as exit code
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1927'>ZOOKEEPER-1927</a>] -         zkServer.sh fails to read dataDir (and others) from zoo.cfg on Solaris 10 (grep issue, manifests as FAILED TO WRITE PID).  
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2014'>ZOOKEEPER-2014</a>] -         Only admin should be allowed to reconfig a cluster
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2074'>ZOOKEEPER-2074</a>] -         Incorrect exit codes for &quot;./zkCli.sh cmd arg&quot;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2172'>ZOOKEEPER-2172</a>] -         Cluster crashes when reconfig a new node as a participant
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2247'>ZOOKEEPER-2247</a>] -         Zookeeper service becomes unavailable when leader fails to write transaction log
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2383'>ZOOKEEPER-2383</a>] -         Startup race in ZooKeeperServer
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2442'>ZOOKEEPER-2442</a>] -         Socket leak in QuorumCnxManager connectOne
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2460'>ZOOKEEPER-2460</a>] -         Remove javacc dependency from public Maven pom
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2463'>ZOOKEEPER-2463</a>] -         TestMulti is broken in the C client
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2464'>ZOOKEEPER-2464</a>] -         NullPointerException on ContainerManager
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2465'>ZOOKEEPER-2465</a>] -         Documentation copyright notice is out of date.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2467'>ZOOKEEPER-2467</a>] -         NullPointerException when redo Command is passed negative value
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2470'>ZOOKEEPER-2470</a>] -         ServerConfig#parse(String[])  ignores tickTime
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2477'>ZOOKEEPER-2477</a>] -         documentation should refer to Java cli shell and not C cli shell
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2498'>ZOOKEEPER-2498</a>] -         Potential resource leak in C client when processing unexpected / out of order response
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2500'>ZOOKEEPER-2500</a>] -         Fix compilation warnings for CliException classes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2517'>ZOOKEEPER-2517</a>] -         jute.maxbuffer is ignored
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2536'>ZOOKEEPER-2536</a>] -         When provide path for &quot;dataDir&quot; with trailing space, it is taking correct path (by trucating space) for snapshot but creating temporary file with some junk folder name for zookeeper_server.pid
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2537'>ZOOKEEPER-2537</a>] -         When provide path for &quot;dataDir&quot; with heading space, it is taking correct path (by trucating space) for snapshot but zookeeper_server.pid is getting created in root (/) folder
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2539'>ZOOKEEPER-2539</a>] -         Throwing nullpointerException when run the command &quot;config -c&quot; when client port is mentioned as separate and not like new style
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2548'>ZOOKEEPER-2548</a>] -         zooInspector does not start on Windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2558'>ZOOKEEPER-2558</a>] -         Potential memory leak in recordio.c
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2573'>ZOOKEEPER-2573</a>] -         Modify Info.REVISION to adapt git repo
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2574'>ZOOKEEPER-2574</a>] -         PurgeTxnLog can inadvertently delete required txn log files
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2579'>ZOOKEEPER-2579</a>] -         ZooKeeper server should verify that dataDir and snapDir are writeable before starting
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2606'>ZOOKEEPER-2606</a>] -         SaslServerCallbackHandler#handleAuthorizeCallback() should log the exception
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2611'>ZOOKEEPER-2611</a>] -         zoo_remove_watchers - can remove the wrong watch 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2617'>ZOOKEEPER-2617</a>] -         correct a few spelling typos
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2622'>ZOOKEEPER-2622</a>] -         ZooTrace.logQuorumPacket does nothing
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2627'>ZOOKEEPER-2627</a>] -         Remove ZRWSERVERFOUND from C client and replace handle_error with something more semantically explicit for r/w server reconnect.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2628'>ZOOKEEPER-2628</a>] -         Investigate and fix findbug warnings
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2633'>ZOOKEEPER-2633</a>] -         Build failure in contrib/zkfuse with gcc 6.x
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2635'>ZOOKEEPER-2635</a>] -         Regenerate documentation
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2636'>ZOOKEEPER-2636</a>] -         Fix C build break.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2642'>ZOOKEEPER-2642</a>] -         ZooKeeper reconfig API backward compatibility fix
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2647'>ZOOKEEPER-2647</a>] -         Fix TestReconfigServer.cc
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2651'>ZOOKEEPER-2651</a>] -         Missing src/pom.template in release
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2678'>ZOOKEEPER-2678</a>] -         Large databases take a long time to regain a quorum
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2680'>ZOOKEEPER-2680</a>] -         Correct DataNode.getChildren() inconsistent behaviour.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2683'>ZOOKEEPER-2683</a>] -         RaceConditionTest is flaky
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2687'>ZOOKEEPER-2687</a>] -         Deadlock while shutting down the Leader server.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2693'>ZOOKEEPER-2693</a>] -         DOS attack on wchp/wchc four letter words (4lw)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2726'>ZOOKEEPER-2726</a>] -         Patch for ZOOKEEPER-2693 introduces potential race condition
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2737'>ZOOKEEPER-2737</a>] -         NettyServerCnxFactory leaks connection if exception happens while writing to a channel.
-</li>
-</ul>
-                    
-<h2>        Improvement
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2479'>ZOOKEEPER-2479</a>] -         Add &#39;electionTimeTaken&#39; value in LeaderMXBean and FollowerMXBean
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2489'>ZOOKEEPER-2489</a>] -         Upgrade Jetty dependency to a recent stable release version.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2505'>ZOOKEEPER-2505</a>] -         Use shared library instead of static library in C client unit test
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2507'>ZOOKEEPER-2507</a>] -         C unit test improvement: line break between &#39;ZooKeeper server started&#39; and &#39;Running&#39;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2511'>ZOOKEEPER-2511</a>] -         Implement AutoCloseable in ZooKeeper.java
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2557'>ZOOKEEPER-2557</a>] -         Update gitignore to account for other file extensions
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2594'>ZOOKEEPER-2594</a>] -         Use TLS for downloading artifacts during build
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2620'>ZOOKEEPER-2620</a>] -         Add comments to testReadOnlySnapshotDir and testReadOnlyTxnLogDir indicating that the tests will fail when run as root
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2655'>ZOOKEEPER-2655</a>] -         Improve NIOServerCnxn#isZKServerRunning to reflect the semantics correctly
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2672'>ZOOKEEPER-2672</a>] -         Remove CHANGE.txt
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2682'>ZOOKEEPER-2682</a>] -         Make it optional to fail build on test failure
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2724'>ZOOKEEPER-2724</a>] -         Skip cert files for releaseaudit target.
-</li>
-</ul>
-                
-<h2>        New Feature
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1962'>ZOOKEEPER-1962</a>] -         Add a CLI command to recursively list a znode and children
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2719'>ZOOKEEPER-2719</a>] -         Port ZOOKEEPER-2169 to 3.5 branch
-</li>
-</ul>
-                                                        
-<h2>        Task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2658'>ZOOKEEPER-2658</a>] -         Trunk / branch-3.5 build broken.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2709'>ZOOKEEPER-2709</a>] -         Clarify documentation around &quot;auth&quot; ACL scheme
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2734'>ZOOKEEPER-2734</a>] -         3.5.3 should be a beta release instead of alpha release.
-</li>
-</ul>
-            
-<h2>        Test
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2482'>ZOOKEEPER-2482</a>] -         Flaky Test: org.apache.zookeeper.test.ClientPortBindTest.testBindByAddress
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2483'>ZOOKEEPER-2483</a>] -         Flaky Test: org.apache.zookeeper.test.LETest.testLE
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2484'>ZOOKEEPER-2484</a>] -         Flaky Test: org.apache.zookeeper.test.LoadFromLogTest.testLoadFailure
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2508'>ZOOKEEPER-2508</a>] -         Many ZooKeeper tests are flaky because they proceed with zk operation without connecting to ZooKeeper server.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2656'>ZOOKEEPER-2656</a>] -         Fix ServerConfigTest#testValidArguments test case failures
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2664'>ZOOKEEPER-2664</a>] -         ClientPortBindTest#testBindByAddress may fail due to &quot;No such device&quot; exception
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2665'>ZOOKEEPER-2665</a>] -         Port QA github pull request build to branch 3.4 and 3.5
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2716'>ZOOKEEPER-2716</a>] -         Flaky Test: org.apache.zookeeper.server.SessionTrackerTest.testAddSessionAfterSessionExpiry
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2718'>ZOOKEEPER-2718</a>] -         org.apache.zookeeper.server.quorum.StandaloneDisabledTest fails intermittently
-</li>
-</ul>
-        
-
-        Release Notes - ZooKeeper - Version 3.5.2
-    
-<h2>        Sub-task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1872'>ZOOKEEPER-1872</a>] -         QuorumPeer is not shutdown in few cases
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2094'>ZOOKEEPER-2094</a>] -         SSL feature on Netty
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2137'>ZOOKEEPER-2137</a>] -         Make testPortChange() less flaky
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2396'>ZOOKEEPER-2396</a>] -         Login object in ZooKeeperSaslClient is static
-</li>
-</ul>
-                            
-<h2>        Bug
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-412'>ZOOKEEPER-412</a>] -         checkstyle target fails trunk build
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-706'>ZOOKEEPER-706</a>] -         large numbers of watches can cause session re-establishment to fail
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1029'>ZOOKEEPER-1029</a>] -         C client bug in zookeeper_init (if bad hostname is given)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1077'>ZOOKEEPER-1077</a>] -         C client lib doesn&#39;t build on Solaris
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1371'>ZOOKEEPER-1371</a>] -         Remove dependency on log4j in the source code.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1460'>ZOOKEEPER-1460</a>] -         IPv6 literal address not supported for quorum members
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1676'>ZOOKEEPER-1676</a>] -         C client zookeeper_interest returning ZOK on Connection Loss
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1803'>ZOOKEEPER-1803</a>] -         Add description for pzxid in programmer&#39;s guide.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1853'>ZOOKEEPER-1853</a>] -         zkCli.sh can&#39;t issue a CREATE command containing spaces in the data
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1927'>ZOOKEEPER-1927</a>] -         zkServer.sh fails to read dataDir (and others) from zoo.cfg on Solaris 10 (grep issue, manifests as FAILED TO WRITE PID).  
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1929'>ZOOKEEPER-1929</a>] -         std::length_error on update children
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1991'>ZOOKEEPER-1991</a>] -         zkServer.sh returns with a zero exit status when a ZooKeeper process is already running
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2133'>ZOOKEEPER-2133</a>] -         zkperl: Segmentation fault if getting a node with null value
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2141'>ZOOKEEPER-2141</a>] -         ACL cache in DataTree never removes entries
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2142'>ZOOKEEPER-2142</a>] -         JMX ObjectName is incorrect for observers
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2156'>ZOOKEEPER-2156</a>] -         If JAVA_HOME is not set zk startup and fetching status command execution result misleads user.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2174'>ZOOKEEPER-2174</a>] -         JUnit4ZKTestRunner logs test failure for all exceptions even if the test method is annotated with an expected exception.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2195'>ZOOKEEPER-2195</a>] -         fsync.warningthresholdms in zoo.cfg not working
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2201'>ZOOKEEPER-2201</a>] -         Network issues can cause cluster to hang due to near-deadlock
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2211'>ZOOKEEPER-2211</a>] -         PurgeTxnLog does not correctly purge when snapshots and logs are at different locations
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2227'>ZOOKEEPER-2227</a>] -         stmk four-letter word fails execution at server while reading trace mask argument.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2229'>ZOOKEEPER-2229</a>] -         Several four-letter words are undocumented.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2235'>ZOOKEEPER-2235</a>] -         License update
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2239'>ZOOKEEPER-2239</a>] -         JMX State from LocalPeerBean incorrect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2243'>ZOOKEEPER-2243</a>] -         Supported platforms is completely out of date
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2244'>ZOOKEEPER-2244</a>] -         On Windows zookeeper fails to restart
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2245'>ZOOKEEPER-2245</a>] -         SimpleSysTest test cases fails
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2252'>ZOOKEEPER-2252</a>] -         Random test case failure in org.apache.zookeeper.test.StaticHostProviderTest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2256'>ZOOKEEPER-2256</a>] -         Zookeeper is not using specified JMX port in zkEnv.sh
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2264'>ZOOKEEPER-2264</a>] -         Wrong error message when secureClientPortAddress is configured but secureClientPort is not configured 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2268'>ZOOKEEPER-2268</a>] -         Zookeeper doc creation fails on windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2269'>ZOOKEEPER-2269</a>] -         NullPointerException  in RemotePeerBean
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2279'>ZOOKEEPER-2279</a>] -         QuorumPeer  loadDataBase() error message is incorrect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2281'>ZOOKEEPER-2281</a>] -         ZK Server startup fails if there are spaces in the JAVA_HOME path
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2283'>ZOOKEEPER-2283</a>] -         traceFile property is not used in the ZooKeeper,  it should be removed from documentation
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2294'>ZOOKEEPER-2294</a>] -         Ant target generate-clover-reports is broken
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2295'>ZOOKEEPER-2295</a>] -         TGT refresh time logic is wrong
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2297'>ZOOKEEPER-2297</a>] -         NPE is thrown while creating &quot;key manager&quot; and &quot;trust manager&quot; 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2299'>ZOOKEEPER-2299</a>] -         NullPointerException in LocalPeerBean for ClientAddress
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2301'>ZOOKEEPER-2301</a>] -         QuorumPeer does not listen on passed client IP in the constructor
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2302'>ZOOKEEPER-2302</a>] -         Some test cases are not running because wrongly named
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2304'>ZOOKEEPER-2304</a>] -         JMX ClientPort from ZooKeeperServerBean incorrect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2311'>ZOOKEEPER-2311</a>] -         assert in setup_random
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2329'>ZOOKEEPER-2329</a>] -         Clear javac and javadoc warning from zookeeper
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2330'>ZOOKEEPER-2330</a>] -         ZooKeeper close API does not close Login thread.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2337'>ZOOKEEPER-2337</a>] -         Fake &quot;invalid&quot; hostnames used in tests are sometimes valid
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2340'>ZOOKEEPER-2340</a>] -         JMX is disabled even if JMXDISABLE is false
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2360'>ZOOKEEPER-2360</a>] -         Update commons collections version used by tests/releaseaudit
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2364'>ZOOKEEPER-2364</a>] -         &quot;ant docs&quot; fails on branch-3.5 due to missing releasenotes.xml.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2366'>ZOOKEEPER-2366</a>] -         Reconfiguration of client port causes a socket leak
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2375'>ZOOKEEPER-2375</a>] -         Prevent multiple initialization of login object in each ZooKeeperSaslClient instance
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2379'>ZOOKEEPER-2379</a>] -         recent commit broke findbugs qabot check
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2380'>ZOOKEEPER-2380</a>] -         Deadlock between leader shutdown and forwarding ACK to the leader
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2385'>ZOOKEEPER-2385</a>] -         Zookeeper trunk build is failing on windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2388'>ZOOKEEPER-2388</a>] -         Unit tests failing on Solaris
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2393'>ZOOKEEPER-2393</a>] -         Revert run-time dependency on log4j and slf4j-log4j12
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2405'>ZOOKEEPER-2405</a>] -         getTGT() in Login.java mishandles confidential information
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2413'>ZOOKEEPER-2413</a>] -         ContainerManager doesn&#39;t close the Timer it creates when stop() is called
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2450'>ZOOKEEPER-2450</a>] -         Upgrade Netty version due to security vulnerability (CVE-2014-3488)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2457'>ZOOKEEPER-2457</a>] -         Remove license file for servlet-api dependency
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2458'>ZOOKEEPER-2458</a>] -         Remove license file for servlet-api dependency
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2459'>ZOOKEEPER-2459</a>] -         Update NOTICE file with Netty notice
-</li>
-</ul>
-                        
-<h2>        Improvement
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2040'>ZOOKEEPER-2040</a>] -         Server to log underlying cause of SASL connection problems
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2087'>ZOOKEEPER-2087</a>] -         Few UX improvements in ZooInspector
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2139'>ZOOKEEPER-2139</a>] -         Support multiple ZooKeeper client, with different configurations, in a single JVM
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2191'>ZOOKEEPER-2191</a>] -         Continue supporting prior Ant versions that don&#39;t implement the threads attribute for the JUnit task.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2240'>ZOOKEEPER-2240</a>] -         Make the three-node minimum more explicit in documentation and on website
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2300'>ZOOKEEPER-2300</a>] -         Expose SecureClientPort and SecureClientAddress JMX properties
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2306'>ZOOKEEPER-2306</a>] -         Remove file delete duplicate  code from test code
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2315'>ZOOKEEPER-2315</a>] -         Change client connect zk service timeout log level from Info to Warn level
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2326'>ZOOKEEPER-2326</a>] -         Include connected server address:port in log
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2373'>ZOOKEEPER-2373</a>] -         Licenses section missing from pom file
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2378'>ZOOKEEPER-2378</a>] -         upgrade ivy to recent version
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2392'>ZOOKEEPER-2392</a>] -         Update netty to 3.7.1.Final
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2402'>ZOOKEEPER-2402</a>] -         Document client side properties
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2410'>ZOOKEEPER-2410</a>] -         add time unit to &#39;ELECTION TOOK&#39; log.info message
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2433'>ZOOKEEPER-2433</a>] -         ZooKeeperSaslServer: allow user principals in subject
-</li>
-</ul>
-                                                                    
-<h2>        Task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1604'>ZOOKEEPER-1604</a>] -         remove rpm/deb/... packaging
-</li>
-</ul>
-
-        Release Notes - ZooKeeper - Version 3.5.1
-    
-<h2>        Sub-task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1626'>ZOOKEEPER-1626</a>] -         Zookeeper C client should be tolerant of clock adjustments 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1660'>ZOOKEEPER-1660</a>] -         Add documentation for dynamic reconfiguration
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2047'>ZOOKEEPER-2047</a>] -         testTruncationNullLog fails on windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2069'>ZOOKEEPER-2069</a>] -         Netty Support for ClientCnxnSocket
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2119'>ZOOKEEPER-2119</a>] -         Netty client docs
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2123'>ZOOKEEPER-2123</a>] -         Provide implementation of X509 AuthenticationProvider
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2125'>ZOOKEEPER-2125</a>] -         SSL on Netty client-server communication
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2134'>ZOOKEEPER-2134</a>] -         AsyncHammerTest.testHammer fails intermittently
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2153'>ZOOKEEPER-2153</a>] -         X509 Authentication Documentation
-</li>
-</ul>
-                            
-<h2>        Bug
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1366'>ZOOKEEPER-1366</a>] -         Zookeeper should be tolerant of clock adjustments
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1784'>ZOOKEEPER-1784</a>] -         Logic to process INFORMANDACTIVATE packets in syncWithLeader seems bogus
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1893'>ZOOKEEPER-1893</a>] -         automake: use serial-tests option
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1917'>ZOOKEEPER-1917</a>] -         Apache Zookeeper logs cleartext admin passwords
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1949'>ZOOKEEPER-1949</a>] -         recipes jar not included in the distribution package
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1952'>ZOOKEEPER-1952</a>] -         Default log directory and file name can be changed
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1987'>ZOOKEEPER-1987</a>] -         unable to restart 3 node cluster
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2006'>ZOOKEEPER-2006</a>] -         Standalone mode won&#39;t take client port from dynamic config
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2008'>ZOOKEEPER-2008</a>] -         System test fails due to missing leader election port
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2013'>ZOOKEEPER-2013</a>] -         typos in zookeeperProgrammers
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2026'>ZOOKEEPER-2026</a>] -         Startup order in ServerCnxnFactory-ies is wrong
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2029'>ZOOKEEPER-2029</a>] -         Leader.LearnerCnxAcceptor should handle exceptions in run()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2030'>ZOOKEEPER-2030</a>] -         dynamicConfigFile should have an absolute path, not a relative path, to the dynamic configuration file
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2039'>ZOOKEEPER-2039</a>] -         Jute compareBytes incorrect comparison index
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2049'>ZOOKEEPER-2049</a>] -         Yosemite build failure: htonll conflict
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2052'>ZOOKEEPER-2052</a>] -         Unable to delete a node when the node has no children
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2056'>ZOOKEEPER-2056</a>] -         Zookeeper 3.4.x and 3.5.0-alpha is not OSGi compliant
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2060'>ZOOKEEPER-2060</a>] -         Trace bug in NettyServerCnxnFactory
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2062'>ZOOKEEPER-2062</a>] -         RemoveWatchesTest takes forever to run
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2064'>ZOOKEEPER-2064</a>] -         Prevent resource leak in various classes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2072'>ZOOKEEPER-2072</a>] -         Netty Server Should Configure Child Channel Pipeline By Specifying ChannelPipelineFactory
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2073'>ZOOKEEPER-2073</a>] -         Memory leak on zookeeper_close
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2096'>ZOOKEEPER-2096</a>] -         C client builds with incorrect error codes in VisualStudio 2010+
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2109'>ZOOKEEPER-2109</a>] -         Typo in src/c/src/load_gen.c
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2111'>ZOOKEEPER-2111</a>] -         Not isAlive states should be synchronized in ClientCnxn
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2114'>ZOOKEEPER-2114</a>] -         jute generated allocate_* functions are not externally visible
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2124'>ZOOKEEPER-2124</a>] -         Allow Zookeeper version string to have underscore &#39;_&#39;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2146'>ZOOKEEPER-2146</a>] -         BinaryInputArchive readString should check length before allocating memory
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2157'>ZOOKEEPER-2157</a>] -         Upgrade option should be removed from zkServer.sh usage
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2171'>ZOOKEEPER-2171</a>] -         avoid reverse lookups in QuorumCnxManager
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2173'>ZOOKEEPER-2173</a>] -         ZK startup failure should be handled with proper error message
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2178'>ZOOKEEPER-2178</a>] -         Native client fails compilation on Windows.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2182'>ZOOKEEPER-2182</a>] -         Several test suites are not running during pre-commit, because their names do not end with &quot;Test&quot;.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2186'>ZOOKEEPER-2186</a>] -         QuorumCnxManager#receiveConnection may crash with random input
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2187'>ZOOKEEPER-2187</a>] -         remove duplicated code between CreateRequest{,2}
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2190'>ZOOKEEPER-2190</a>] -         In StandaloneDisabledTest, testReconfig() shouldn&#39;t take leaving servers as joining servers
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2193'>ZOOKEEPER-2193</a>] -         reconfig command completes even if parameter is wrong obviously
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2197'>ZOOKEEPER-2197</a>] -         non-ascii character in FinalRequestProcessor.java
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2198'>ZOOKEEPER-2198</a>] -         Set default test.junit.threads to 1.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2199'>ZOOKEEPER-2199</a>] -         Don&#39;t include unistd.h in windows
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2210'>ZOOKEEPER-2210</a>] -         clock_gettime is not available in os x
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2212'>ZOOKEEPER-2212</a>] -         distributed race condition related to QV version
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2213'>ZOOKEEPER-2213</a>] -         Empty path in Set crashes server and prevents restart
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2221'>ZOOKEEPER-2221</a>] -         Zookeeper JettyAdminServer server should start on configured IP.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2224'>ZOOKEEPER-2224</a>] -         Four letter command hangs when network is slow
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2235'>ZOOKEEPER-2235</a>] -         License update
-</li>
-</ul>
-                        
-<h2>        Improvement
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1423'>ZOOKEEPER-1423</a>] -         4lw and jmx should expose the size of the datadir/datalogdir
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1506'>ZOOKEEPER-1506</a>] -         Re-try DNS hostname -&gt; IP resolution if node connection fails
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1907'>ZOOKEEPER-1907</a>] -         Improve Thread handling
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1948'>ZOOKEEPER-1948</a>] -         Enable JMX remote monitoring
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1963'>ZOOKEEPER-1963</a>] -         Make JDK 7 the minimum requirement for Zookeeper
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1994'>ZOOKEEPER-1994</a>] -         Backup config files.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2066'>ZOOKEEPER-2066</a>] -         Updates to README.txt
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2079'>ZOOKEEPER-2079</a>] -         Stop daemon with &quot;kill&quot; rather than &quot;kill -9&quot;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2098'>ZOOKEEPER-2098</a>] -         QuorumCnxManager: use BufferedOutputStream for initial msg
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2107'>ZOOKEEPER-2107</a>] -         zookeeper client should support custom HostProviders
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2110'>ZOOKEEPER-2110</a>] -         Typo fixes in the ZK documentation
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2126'>ZOOKEEPER-2126</a>] -         Improve exit log messsage of EventThread and SendThread by adding SessionId
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2140'>ZOOKEEPER-2140</a>] -         NettyServerCnxn and NIOServerCnxn code should be improved
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2149'>ZOOKEEPER-2149</a>] -         Logging of client address when socket connection established
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2176'>ZOOKEEPER-2176</a>] -         Unclear error message should be info not error
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2183'>ZOOKEEPER-2183</a>] -         Concurrent Testing Processes and Port Assignments
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2185'>ZOOKEEPER-2185</a>] -         Run server with -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError=&#39;kill %p&#39;.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2194'>ZOOKEEPER-2194</a>] -         Let DataNode.getChildren() return an unmodifiable view of its children set
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2205'>ZOOKEEPER-2205</a>] -         Log type of unexpected quorum packet in learner handler loop
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2206'>ZOOKEEPER-2206</a>] -         Add missing packet types to LearnerHandler.packetToString()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2207'>ZOOKEEPER-2207</a>] -         Enhance error logs with LearnerHandler.packetToString()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2208'>ZOOKEEPER-2208</a>] -         Log type of unexpected quorum packet in observer loop
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2214'>ZOOKEEPER-2214</a>] -         Findbugs warning: LearnerHandler.packetToString Dead store to local variable
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2223'>ZOOKEEPER-2223</a>] -         support method-level JUnit testcase
-</li>
-</ul>
-            
-<h2>        New Feature
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2163'>ZOOKEEPER-2163</a>] -         Introduce new ZNode type: container
-</li>
-</ul>
-                                                            
-<h2>        Test
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2017'>ZOOKEEPER-2017</a>] -         New tests for reconfig failure cases
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2032'>ZOOKEEPER-2032</a>] -         ReconfigBackupTest didn&#39;t clean up resources.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-2204'>ZOOKEEPER-2204</a>] -         LearnerSnapshotThrottlerTest.testHighContentionWithTimeout fails occasionally
-</li>
-</ul>
-
-        Release Notes - ZooKeeper - Version 3.5.0
-    
-<h2>        Sub-task
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-442'>ZOOKEEPER-442</a>] -         need a way to remove watches that are no longer of interest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-762'>ZOOKEEPER-762</a>] -         Allow dynamic addition/removal of server nodes in the client API
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-827'>ZOOKEEPER-827</a>] -         enable r/o mode in C client library
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-837'>ZOOKEEPER-837</a>] -         cyclic dependency ClientCnxn, ZooKeeper
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-878'>ZOOKEEPER-878</a>] -         finishPacket and conLossPacket should be methods of Packet
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-910'>ZOOKEEPER-910</a>] -         Use SelectionKey.isXYZ() methods instead of complicated binary logic
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-932'>ZOOKEEPER-932</a>] -         Move blocking read/write calls to SendWorker and RecvWorker Threads
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-933'>ZOOKEEPER-933</a>] -         Remove wildcard  QuorumPeer.OBSERVER_ID
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-934'>ZOOKEEPER-934</a>] -         Add sanity check for server ID
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1044'>ZOOKEEPER-1044</a>] -         Allow dynamic changes to roles of a peer
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1113'>ZOOKEEPER-1113</a>] -         QuorumMaj counts the number of ACKs but does not check who sent the ACK
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1191'>ZOOKEEPER-1191</a>] -         Synchronization issue - wait not in guarded block
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1200'>ZOOKEEPER-1200</a>] -         Remove obsolete DataTreeBuilder
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1201'>ZOOKEEPER-1201</a>] -         Clean SaslServerCallbackHandler.java
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1213'>ZOOKEEPER-1213</a>] -         ZooKeeper server startup fails if configured only with the &#39;minSessionTimeout&#39; and not &#39;maxSessionTimeout&#39;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1216'>ZOOKEEPER-1216</a>] -         Fix more eclipse compiler warnings, also in Tests
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1221'>ZOOKEEPER-1221</a>] -         Provide accessors for Request.{hdr|txn}
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1227'>ZOOKEEPER-1227</a>] -         Zookeeper logs is showing -1 as min/max session timeout if there is no sessiontimeout value configured
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1235'>ZOOKEEPER-1235</a>] -         store KeeperException messages in the Code enum
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1246'>ZOOKEEPER-1246</a>] -         Dead code in PrepRequestProcessor catch Exception block
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1247'>ZOOKEEPER-1247</a>] -         dead code in PrepRequestProcessor.pRequest multi case
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1248'>ZOOKEEPER-1248</a>] -         multi transaction sets request.exception without reason
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1252'>ZOOKEEPER-1252</a>] -         remove unused method o.a.z.test.AxyncTest.restart()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1253'>ZOOKEEPER-1253</a>] -         return value of DataTree.createNode is never used
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1259'>ZOOKEEPER-1259</a>] -         central mapping from type to txn record class
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1282'>ZOOKEEPER-1282</a>] -         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
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1291'>ZOOKEEPER-1291</a>] -         AcceptedEpoch not updated at leader before it proposes the epoch to followers
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1347'>ZOOKEEPER-1347</a>] -         Fix the cnxns to use a concurrent data structures
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1411'>ZOOKEEPER-1411</a>] -         Consolidate membership management, distinguish between static and dynamic configuration parameters
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1414'>ZOOKEEPER-1414</a>] -         QuorumPeerMainTest.testQuorum, testBadPackets are failing intermittently
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1459'>ZOOKEEPER-1459</a>] -         Standalone ZooKeeperServer is not closing the transaction log files on shutdown
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1626'>ZOOKEEPER-1626</a>] -         Zookeeper C client should be tolerant of clock adjustments 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1660'>ZOOKEEPER-1660</a>] -         Add documentation for dynamic reconfiguration
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1730'>ZOOKEEPER-1730</a>] -         Make ZooKeeper easier to test - support simulating a session expiration
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1761'>ZOOKEEPER-1761</a>] -         Expose &#39;check&#39; version api in ZooKeeper client
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1762'>ZOOKEEPER-1762</a>] -         Implement &#39;check&#39; version cli command
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1830'>ZOOKEEPER-1830</a>] -         Support command line shell for removing watches
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1831'>ZOOKEEPER-1831</a>] -         Document remove watches details to the guide
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1834'>ZOOKEEPER-1834</a>] -         Catch IOException in FileTxnLog
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1837'>ZOOKEEPER-1837</a>] -         Fix JMXEnv checks (potential race conditions)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1849'>ZOOKEEPER-1849</a>] -         Need to properly tear down tests in various cases
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1852'>ZOOKEEPER-1852</a>] -         ServerCnxnFactory instance is not properly cleanedup
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1854'>ZOOKEEPER-1854</a>] -         ClientBase ZooKeeper server clean-up
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1857'>ZOOKEEPER-1857</a>] -         PrepRequestProcessotTest doesn&#39;t shutdown ZooKeeper server
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1858'>ZOOKEEPER-1858</a>] -         JMX checks - potential race conditions while stopping and starting server
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1867'>ZOOKEEPER-1867</a>] -         Bug in ZkDatabaseCorruptionTest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1872'>ZOOKEEPER-1872</a>] -         QuorumPeer is not shutdown in few cases
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1873'>ZOOKEEPER-1873</a>] -         Unnecessarily InstanceNotFoundException is coming when unregister failed jmxbeans
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1874'>ZOOKEEPER-1874</a>] -         Add proper teardown/cleanups in ReconfigTest to shutdown quorumpeer
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1904'>ZOOKEEPER-1904</a>] -         WatcherTest#testWatchAutoResetWithPending is failing
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1972'>ZOOKEEPER-1972</a>] -         Fix invalid volatile long/int increment (++)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1975'>ZOOKEEPER-1975</a>] -         Turn off &quot;internationalization warnings&quot; in findbugs exclude file
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1978'>ZOOKEEPER-1978</a>] -         Fix Multithreaded correctness Warnings
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1979'>ZOOKEEPER-1979</a>] -         Fix Performance Warnings found by Findbugs 2.0.3
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1981'>ZOOKEEPER-1981</a>] -         Fix Dodgy Code Warnings identified by findbugs 2.0.3
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1988'>ZOOKEEPER-1988</a>] -         new test patch to verify dynamic reconfig backward compatibility
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1989'>ZOOKEEPER-1989</a>] -         backward compatibility of zoo.cfg
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1993'>ZOOKEEPER-1993</a>] -         Keep the client port upon parsing config
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1995'>ZOOKEEPER-1995</a>] -         Safely remove client port in old config file on reconfig itself
-</li>
-</ul>
-            
-<h2>        Bug
-</h2>
-<ul>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-10'>ZOOKEEPER-10</a>] -         Bad error message
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-87'>ZOOKEEPER-87</a>] -         Follower does not shut itself down if its too far behind the leader.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-366'>ZOOKEEPER-366</a>] -         Session timeout detection can go wrong if the leader system time changes
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-445'>ZOOKEEPER-445</a>] -         Potential bug in leader code
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-463'>ZOOKEEPER-463</a>] -         C++ tests can&#39;t be built on Mac OS using XCode command line tools
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-492'>ZOOKEEPER-492</a>] -         the tests should have their own log4j.properties
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-513'>ZOOKEEPER-513</a>] -         C client disconnect with stand-alone server abnormally
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-515'>ZOOKEEPER-515</a>] -         Zookeeper quorum didn&#39;t provide service when restart after an &quot;Out of memory&quot; crash
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-602'>ZOOKEEPER-602</a>] -         log all exceptions not caught by ZK threads
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-642'>ZOOKEEPER-642</a>] -         &quot;exceeded deadline by N ms&quot; floods logs
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-649'>ZOOKEEPER-649</a>] -         testObserver timed out once on Hudson
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-653'>ZOOKEEPER-653</a>] -         hudson failure in LETest
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-675'>ZOOKEEPER-675</a>] -         LETest thread fails to join
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-697'>ZOOKEEPER-697</a>] -         TestQuotaQuorum is failing on Hudson
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-705'>ZOOKEEPER-705</a>] -         Fails to Build due to unknown opcode &#39;lock&#39; in mt_adaptor.c
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-706'>ZOOKEEPER-706</a>] -         large numbers of watches can cause session re-establishment to fail
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-714'>ZOOKEEPER-714</a>] -         snapshotting doesn&#39;t handle runtime exceptions (like out of memory) well
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-732'>ZOOKEEPER-732</a>] -         Improper translation of error into Python exception
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-752'>ZOOKEEPER-752</a>] -         address use of &quot;recoverable&quot; vs &quot;revocable&quot; in lock recipes documentation
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-770'>ZOOKEEPER-770</a>] -         Slow add_auth calls with multi-threaded client
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-780'>ZOOKEEPER-780</a>] -         zkCli.sh  generates a ArrayIndexOutOfBoundsException 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-786'>ZOOKEEPER-786</a>] -         Exception in ZooKeeper.toString
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-832'>ZOOKEEPER-832</a>] -         Invalid session id causes infinite loop during automatic reconnect
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-847'>ZOOKEEPER-847</a>] -         Missing acl check in zookeeper create
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-856'>ZOOKEEPER-856</a>] -         Connection imbalance leads to overloaded ZK instances
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-857'>ZOOKEEPER-857</a>] -         clarify client vs. server view of session expiration event
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-872'>ZOOKEEPER-872</a>] -         Small fixes to PurgeTxnLog 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-876'>ZOOKEEPER-876</a>] -         Unnecessary snapshot transfers between new leader and followers
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-877'>ZOOKEEPER-877</a>] -         zkpython does not work with python3.1
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-885'>ZOOKEEPER-885</a>] -         Zookeeper drops connections under moderate IO load
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-900'>ZOOKEEPER-900</a>] -         FLE implementation should be improved to use non-blocking sockets
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-915'>ZOOKEEPER-915</a>] -         Errors that happen during sync() processing at the leader do not get propagated back to the client.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-936'>ZOOKEEPER-936</a>] -         zkpython is leaking ACL_vector
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-972'>ZOOKEEPER-972</a>] -         perl Net::ZooKeeper segfaults when setting a watcher on get_children
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-973'>ZOOKEEPER-973</a>] -         bind() could fail on Leader because it does not setReuseAddress on its ServerSocket 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-978'>ZOOKEEPER-978</a>] -         ZookeeperServer does not close zk database on shutdwon
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-982'>ZOOKEEPER-982</a>] -         zkServer.sh won&#39;t start zookeeper on an ubuntu 10.10 system due to a bug in the startup script.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-984'>ZOOKEEPER-984</a>] -         jenkins failure in testSessionMoved - NPE in quorum
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-986'>ZOOKEEPER-986</a>] -         In QuoromCnxManager we are adding sent messgae to lastMessageSent, but we are never removing that message from it after sending it, so this will lead to sending the same message again in next round
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-991'>ZOOKEEPER-991</a>] -         QuoromPeer.OBSERVER_ID
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1002'>ZOOKEEPER-1002</a>] -         The Barrier sample code should create a EPHEMERAL znode instead of EPHEMERAL_SEQUENTIAL znode
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1005'>ZOOKEEPER-1005</a>] -         Zookeeper servers fail to elect a leader succesfully.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1023'>ZOOKEEPER-1023</a>] -         zkpython: add_auth can deadlock the interpreter
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1048'>ZOOKEEPER-1048</a>] -         addauth command does not work in cli_mt/cli_st
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1050'>ZOOKEEPER-1050</a>] -         zooinspector shell scripts do not work
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1057'>ZOOKEEPER-1057</a>] -         zookeeper c-client, connection to offline server fails to successfully fallback to second zk host
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1062'>ZOOKEEPER-1062</a>] -         Net-ZooKeeper: Net::ZooKeeper consumes 100% cpu on wait
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1077'>ZOOKEEPER-1077</a>] -         C client lib doesn&#39;t build on Solaris
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1089'>ZOOKEEPER-1089</a>] -         zkServer.sh status does not work due to invalid option of nc
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1100'>ZOOKEEPER-1100</a>] -         Killed (or missing) SendThread will cause hanging threads
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1105'>ZOOKEEPER-1105</a>] -         c client zookeeper_close not send CLOSE_OP request to server
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1125'>ZOOKEEPER-1125</a>] -         Intermittent java core test failures
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1159'>ZOOKEEPER-1159</a>] -         ClientCnxn does not propagate session expiration indication
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1163'>ZOOKEEPER-1163</a>] -         Memory leak in zk_hashtable.c:do_insert_watcher_object()
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1167'>ZOOKEEPER-1167</a>] -         C api lacks synchronous version of sync() call.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1174'>ZOOKEEPER-1174</a>] -         FD leak when network unreachable
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1179'>ZOOKEEPER-1179</a>] -         NettyServerCnxn does not properly close socket on 4 letter word requests
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1181'>ZOOKEEPER-1181</a>] -         Fix problems with Kerberos TGT renewal
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1184'>ZOOKEEPER-1184</a>] -         jute generated files are not being cleaned up via &quot;ant clean&quot;
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1185'>ZOOKEEPER-1185</a>] -         Send AuthFailed event to client if SASL authentication fails
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1189'>ZOOKEEPER-1189</a>] -         For an invalid snapshot file(less than 10bytes size) RandomAccessFile stream is leaking.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1190'>ZOOKEEPER-1190</a>] -         ant package is not including many of the bin scripts in the package (zkServer.sh for example)
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1192'>ZOOKEEPER-1192</a>] -         Leader.waitForEpochAck() checks waitingForNewEpoch instead of checking electionFinished
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1194'>ZOOKEEPER-1194</a>] -         Two possible race conditions during leader establishment
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1197'>ZOOKEEPER-1197</a>] -         Incorrect socket handling of 4 letter words for NIO
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1203'>ZOOKEEPER-1203</a>] -         Zookeeper systest is missing Junit Classes 
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1206'>ZOOKEEPER-1206</a>] -         Sequential node creation does not use always use digits in node name given certain Locales.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1207'>ZOOKEEPER-1207</a>] -         strange ReadOnlyZooKeeperServer ERROR when starting ensemble
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1208'>ZOOKEEPER-1208</a>] -         Ephemeral node not removed after the client session is long gone
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1209'>ZOOKEEPER-1209</a>] -         LeaderElection recipe doesn&#39;t handle the split-brain issue, n/w disconnection can bring both the client nodes to be in ELECTED
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1212'>ZOOKEEPER-1212</a>] -         zkServer.sh stop action is not conformat with LSB para 20.2 Init Script Actions
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1214'>ZOOKEEPER-1214</a>] -         QuorumPeer should unregister only its previsously registered MBeans instead of use MBeanRegistry.unregisterAll() method.
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1220'>ZOOKEEPER-1220</a>] -         ./zkCli.sh &#39;create&#39; command is throwing ArrayIndexOutOfBoundsException
-</li>
-<li>[<a href='https://issues.apache.org/jira/browse/ZOOKEEPER-1222'>ZOOKEEPER-1222</a>] -         getACL should only call DataTree.copyStat when passed in stat is not null
-</li>
-<li>[<a href='https://issues.apache.org/jira/bro

<TRUNCATED>

[10/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperOver.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperOver.html b/docs/zookeeperOver.html
deleted file mode 100644
index 04da3b5..0000000
--- a/docs/zookeeperOver.html
+++ /dev/null
@@ -1,692 +0,0 @@
-<!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</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Overview</div>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperOver.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_DesignOverview">ZooKeeper: A Distributed Coordination Service for Distributed
-    Applications</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_designGoals">Design Goals</a>
-</li>
-<li>
-<a href="#sc_dataModelNameSpace">Data model and the hierarchical namespace</a>
-</li>
-<li>
-<a href="#Nodes+and+ephemeral+nodes">Nodes and ephemeral nodes</a>
-</li>
-<li>
-<a href="#Conditional+updates+and+watches">Conditional updates and watches</a>
-</li>
-<li>
-<a href="#Guarantees">Guarantees</a>
-</li>
-<li>
-<a href="#Simple+API">Simple API</a>
-</li>
-<li>
-<a href="#Implementation">Implementation</a>
-</li>
-<li>
-<a href="#Uses">Uses</a>
-</li>
-<li>
-<a href="#Performance">Performance</a>
-</li>
-<li>
-<a href="#Reliability">Reliability</a>
-</li>
-<li>
-<a href="#The+ZooKeeper+Project">The ZooKeeper Project</a>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_DesignOverview"></a>
-<h2 class="h3">ZooKeeper: A Distributed Coordination Service for Distributed
-    Applications</h2>
-<div class="section">
-<p>ZooKeeper is a distributed, open-source coordination service for
-    distributed applications. It exposes a simple set of primitives that
-    distributed applications can build upon to implement higher level services
-    for synchronization, configuration maintenance, and groups and naming. It
-    is designed to be easy to program to, and uses a data model styled after
-    the familiar directory tree structure of file systems. It runs in Java and
-    has bindings for both Java and C.</p>
-<p>Coordination services are notoriously hard to get right. They are
-    especially prone to errors such as race conditions and deadlock. The
-    motivation behind ZooKeeper is to relieve distributed applications the
-    responsibility of implementing coordination services from scratch.</p>
-<a name="sc_designGoals"></a>
-<h3 class="h4">Design Goals</h3>
-<p>
-<strong>ZooKeeper is simple.</strong> ZooKeeper
-      allows distributed processes to coordinate with each other through a
-      shared hierarchal namespace which is organized similarly to a standard
-      file system. The name space consists of data registers - called znodes,
-      in ZooKeeper parlance - and these are similar to files and directories.
-      Unlike a typical file system, which is designed for storage, ZooKeeper
-      data is kept in-memory, which means ZooKeeper can achieve high
-      throughput and low latency numbers.</p>
-<p>The ZooKeeper implementation puts a premium on high performance,
-      highly available, strictly ordered access. The performance aspects of
-      ZooKeeper means it can be used in large, distributed systems. The
-      reliability aspects keep it from being a single point of failure. The
-      strict ordering means that sophisticated synchronization primitives can
-      be implemented at the client.</p>
-<p>
-<strong>ZooKeeper is replicated.</strong> Like the
-      distributed processes it coordinates, ZooKeeper itself is intended to be
-      replicated over a sets of hosts called an ensemble.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<tr>
-<td>ZooKeeper Service</td>
-</tr>
-<tr>
-<td>
-          
-            <img alt="" src="images/zkservice.jpg">
-          
-        </td>
-</tr>
-</table>
-<p>The servers that make up the ZooKeeper service must all know about
-      each other. They maintain an in-memory image of state, along with a
-      transaction logs and snapshots in a persistent store. As long as a
-      majority of the servers are available, the ZooKeeper service will be
-      available.</p>
-<p>Clients connect to a single ZooKeeper server. The client maintains
-      a TCP connection through which it sends requests, gets responses, gets
-      watch events, and sends heart beats. If the TCP connection to the server
-      breaks, the client will connect to a different server.</p>
-<p>
-<strong>ZooKeeper is ordered.</strong> ZooKeeper
-      stamps each update with a number that reflects the order of all
-      ZooKeeper transactions. Subsequent operations can use the order to
-      implement higher-level abstractions, such as synchronization
-      primitives.</p>
-<p>
-<strong>ZooKeeper is fast.</strong> It is
-      especially fast in "read-dominant" workloads. ZooKeeper applications run
-      on thousands of machines, and it performs best where reads are more
-      common than writes, at ratios of around 10:1.</p>
-<a name="sc_dataModelNameSpace"></a>
-<h3 class="h4">Data model and the hierarchical namespace</h3>
-<p>The name space provided by ZooKeeper is much like that of a
-      standard file system. A name is a sequence of path elements separated by
-      a slash (/). Every node in ZooKeeper's name space is identified by a
-      path.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<tr>
-<td>ZooKeeper's Hierarchical Namespace</td>
-</tr>
-<tr>
-<td>
-          
-            <img alt="" src="images/zknamespace.jpg">
-          
-        </td>
-</tr>
-</table>
-<a name="Nodes+and+ephemeral+nodes"></a>
-<h3 class="h4">Nodes and ephemeral nodes</h3>
-<p>Unlike standard file systems, each node in a ZooKeeper
-      namespace can have data associated with it as well as children. It is
-      like having a file-system that allows a file to also be a directory.
-      (ZooKeeper was designed to store coordination data: status information,
-      configuration, location information, etc., so the data stored at each
-      node is usually small, in the byte to kilobyte range.) We use the term
-      <em>znode</em> to make it clear that we are talking about
-      ZooKeeper data nodes.</p>
-<p>Znodes maintain a stat structure that includes version numbers for
-      data changes, ACL changes, and timestamps, to allow cache validations
-      and coordinated updates. Each time a znode's data changes, the version
-      number increases. For instance, whenever a client retrieves data it also
-      receives the version of the data.</p>
-<p>The data stored at each znode in a namespace is read and written
-      atomically. Reads get all the data bytes associated with a znode and a
-      write replaces all the data. Each node has an Access Control List (ACL)
-      that restricts who can do what.</p>
-<p>ZooKeeper also has the notion of ephemeral nodes. These znodes
-      exists as long as the session that created the znode is active. When the
-      session ends the znode is deleted. Ephemeral nodes are useful when you
-      want to implement <em>[tbd]</em>.</p>
-<a name="Conditional+updates+and+watches"></a>
-<h3 class="h4">Conditional updates and watches</h3>
-<p>ZooKeeper supports the concept of <em>watches</em>.
-      Clients can set a watch on a znode. A watch will be triggered and
-      removed when the znode changes. When a watch is triggered, the client
-      receives a packet saying that the znode has changed. If the
-      connection between the client and one of the Zoo Keeper servers is
-      broken, the client will receive a local notification. These can be used
-      to <em>[tbd]</em>.</p>
-<a name="Guarantees"></a>
-<h3 class="h4">Guarantees</h3>
-<p>ZooKeeper is very fast and very simple. Since its goal, though, is
-      to be a basis for the construction of more complicated services, such as
-      synchronization, it provides a set of guarantees. These are:</p>
-<ul>
-        
-<li>
-          
-<p>Sequential Consistency - Updates from a client will be applied
-          in the order that they were sent.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Atomicity - Updates either succeed or fail. No partial
-          results.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Single System Image - A client will see the same view of the
-          service regardless of the server that it connects to.</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>Reliability - Once an update has been applied, it will persist
-          from that time forward until a client overwrites the update.</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>Timeliness - The clients view of the system is guaranteed to
-          be up-to-date within a certain time bound.</p>
-        
-</li>
-      
-</ul>
-<p>For more information on these, and how they can be used, see
-      <em>[tbd]</em>
-</p>
-<a name="Simple+API"></a>
-<h3 class="h4">Simple API</h3>
-<p>One of the design goals of ZooKeeper is provide a very simple
-      programming interface. As a result, it supports only these
-      operations:</p>
-<dl>
-        
-<dt>
-<term>create</term>
-</dt>
-<dd>
-<p>creates a node at a location in the tree</p>
-</dd>
-
-        
-<dt>
-<term>delete</term>
-</dt>
-<dd>
-<p>deletes a node</p>
-</dd>
-
-        
-<dt>
-<term>exists</term>
-</dt>
-<dd>
-<p>tests if a node exists at a location</p>
-</dd>
-
-        
-<dt>
-<term>get data</term>
-</dt>
-<dd>
-<p>reads the data from a node</p>
-</dd>
-
-        
-<dt>
-<term>set data</term>
-</dt>
-<dd>
-<p>writes data to a node</p>
-</dd>
-
-        
-<dt>
-<term>get children</term>
-</dt>
-<dd>
-<p>retrieves a list of children of a node</p>
-</dd>
-
-        
-<dt>
-<term>sync</term>
-</dt>
-<dd>
-<p>waits for data to be propagated</p>
-</dd>
-      
-</dl>
-<p>For a more in-depth discussion on these, and how they can be used
-      to implement higher level operations, please refer to
-      <em>[tbd]</em>
-</p>
-<a name="Implementation"></a>
-<h3 class="h4">Implementation</h3>
-<p>
-<a href="#fg_zkComponents">ZooKeeper Components</a> shows the high-level components
-      of the ZooKeeper service. With the exception of the request processor,
-     each of
-      the servers that make up the ZooKeeper service replicates its own copy
-      of each of the components.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<tr>
-<td>ZooKeeper Components</td>
-</tr>
-<tr>
-<td>
-          
-            <img alt="" src="images/zkcomponents.jpg">
-          
-        </td>
-</tr>
-</table>
-<p>The replicated database is an in-memory database containing the
-      entire data tree. Updates are logged to disk for recoverability, and
-      writes are serialized to disk before they are applied to the in-memory
-      database.</p>
-<p>Every ZooKeeper server services clients. Clients connect to
-      exactly one server to submit irequests. Read requests are serviced from
-      the local replica of each server database. Requests that change the
-      state of the service, write requests, are processed by an agreement
-      protocol.</p>
-<p>As part of the agreement protocol all write requests from clients
-      are forwarded to a single server, called the
-      <em>leader</em>. The rest of the ZooKeeper servers, called
-      <em>followers</em>, receive message proposals from the
-      leader and agree upon message delivery. The messaging layer takes care
-      of replacing leaders on failures and syncing followers with
-      leaders.</p>
-<p>ZooKeeper uses a custom atomic messaging protocol. Since the
-      messaging layer is atomic, ZooKeeper can guarantee that the local
-      replicas never diverge. When the leader receives a write request, it
-      calculates what the state of the system is when the write is to be
-      applied and transforms this into a transaction that captures this new
-      state.</p>
-<a name="Uses"></a>
-<h3 class="h4">Uses</h3>
-<p>The programming interface to ZooKeeper is deliberately simple.
-      With it, however, you can implement higher order operations, such as
-      synchronizations primitives, group membership, ownership, etc. Some
-      distributed applications have used it to: <em>[tbd: add uses from
-      white paper and video presentation.]</em> For more information, see
-      <em>[tbd]</em>
-</p>
-<a name="Performance"></a>
-<h3 class="h4">Performance</h3>
-<p>ZooKeeper is designed to be highly performant. But is it? The
-      results of the ZooKeeper's development team at Yahoo! Research indicate
-      that it is. (See <a href="#fg_zkPerfRW">ZooKeeper Throughput as the Read-Write Ratio Varies</a>.) It is especially high
-      performance in applications where reads outnumber writes, since writes
-      involve synchronizing the state of all servers. (Reads outnumbering
-      writes is typically the case for a coordination service.)</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<tr>
-<td>ZooKeeper Throughput as the Read-Write Ratio Varies</td>
-</tr>
-<tr>
-<td>
-          
-            <img alt="" src="images/zkperfRW-3.2.jpg">
-          
-        </td>
-</tr>
-</table>
-<p>The figure <a href="#fg_zkPerfRW">ZooKeeper Throughput as the Read-Write Ratio Varies</a> is a throughput
-      graph of ZooKeeper release 3.2 running on servers with dual 2Ghz
-      Xeon and two SATA 15K RPM drives.  One drive was used as a
-      dedicated ZooKeeper log device. The snapshots were written to
-      the OS drive. Write requests were 1K writes and the reads were
-      1K reads.  "Servers" indicate the size of the ZooKeeper
-      ensemble, the number of servers that make up the
-      service. Approximately 30 other servers were used to simulate
-      the clients. The ZooKeeper ensemble was configured such that
-      leaders do not allow connections from clients.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-<p>In version 3.2 r/w performance improved by ~2x
-      compared to the <a href="http://zookeeper.apache.org/docs/r3.1.1/zookeeperOver.html#Performance">previous
-      3.1 release</a>.</p>
-</div>
-</div>
-<p>Benchmarks also indicate that it is reliable, too. <a href="#fg_zkPerfReliability">Reliability in the Presence of Errors</a> shows how a deployment responds to
-      various failures. The events marked in the figure are the
-      following:</p>
-<ol>
-        
-<li>
-          
-<p>Failure and recovery of a follower</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Failure and recovery of a different follower</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Failure of the leader</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Failure and recovery of two followers</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Failure of another leader</p>
-        
-</li>
-      
-</ol>
-<a name="Reliability"></a>
-<h3 class="h4">Reliability</h3>
-<p>To show the behavior of the system over time as
-        failures are injected we ran a ZooKeeper service made up of
-        7 machines. We ran the same saturation benchmark as before,
-        but this time we kept the write percentage at a constant
-        30%, which is a conservative ratio of our expected
-        workloads.
-      </p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<tr>
-<td>Reliability in the Presence of Errors</td>
-</tr>
-<tr>
-<td>
-          
-            <img alt="" src="images/zkperfreliability.jpg">
-          
-        </td>
-</tr>
-</table>
-<p>The are a few important observations from this graph. First, if
-      followers fail and recover quickly, then ZooKeeper is able to sustain a
-      high throughput despite the failure. But maybe more importantly, the
-      leader election algorithm allows for the system to recover fast enough
-      to prevent throughput from dropping substantially. In our observations,
-      ZooKeeper takes less than 200ms to elect a new leader. Third, as
-      followers recover, ZooKeeper is able to raise throughput again once they
-      start processing requests.</p>
-<a name="The+ZooKeeper+Project"></a>
-<h3 class="h4">The ZooKeeper Project</h3>
-<p>ZooKeeper has been
-          <a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/PoweredBy">
-          successfully used
-        </a>
-        in many industrial applications.  It is used at Yahoo! as the
-        coordination and failure recovery service for Yahoo! Message
-        Broker, which is a highly scalable publish-subscribe system
-        managing thousands of topics for replication and data
-        delivery.  It is used by the Fetching Service for Yahoo!
-        crawler, where it also manages failure recovery. A number of
-        Yahoo! advertising systems also use ZooKeeper to implement
-        reliable services.
-      </p>
-<p>All users and developers are encouraged to join the
-        community and contribute their expertise. See the
-        <a href="http://zookeeper.apache.org/">
-          Zookeeper Project on Apache
-        </a>
-        for more information.
-      </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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperOver.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperOver.pdf b/docs/zookeeperOver.pdf
deleted file mode 100644
index 8ddf5ef..0000000
Binary files a/docs/zookeeperOver.pdf and /dev/null differ


[12/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperAdmin.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperAdmin.html b/docs/zookeeperAdmin.html
deleted file mode 100644
index 487c853..0000000
--- a/docs/zookeeperAdmin.html
+++ /dev/null
@@ -1,2669 +0,0 @@
-<!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 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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<div class="menupage">
-<div class="menupagetitle">Administrator's Guide</div>
-</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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperAdmin.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Administrator's Guide</h1>
-<h3>A Guide to Deployment and Administration</h3>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_deployment">Deployment</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_systemReq">System Requirements</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_supportedPlatforms">Supported Platforms</a>
-</li>
-<li>
-<a href="#sc_requiredSoftware">Required Software </a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_zkMulitServerSetup">Clustered (Multi-Server) Setup</a>
-</li>
-<li>
-<a href="#sc_singleAndDevSetup">Single Server and Developer Setup</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_administration">Administration</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_designing">Designing a ZooKeeper Deployment</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_CrossMachineRequirements">Cross Machine Requirements</a>
-</li>
-<li>
-<a href="#Single+Machine+Requirements">Single Machine Requirements</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_provisioning">Provisioning</a>
-</li>
-<li>
-<a href="#sc_strengthsAndLimitations">Things to Consider: ZooKeeper Strengths and Limitations</a>
-</li>
-<li>
-<a href="#sc_administering">Administering</a>
-</li>
-<li>
-<a href="#sc_maintenance">Maintenance</a>
-<ul class="minitoc">
-<li>
-<a href="#Ongoing+Data+Directory+Cleanup">Ongoing Data Directory Cleanup</a>
-</li>
-<li>
-<a href="#Debug+Log+Cleanup+%28log4j%29">Debug Log Cleanup (log4j)</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_supervision">Supervision</a>
-</li>
-<li>
-<a href="#sc_monitoring">Monitoring</a>
-</li>
-<li>
-<a href="#sc_logging">Logging</a>
-</li>
-<li>
-<a href="#sc_troubleshooting">Troubleshooting</a>
-</li>
-<li>
-<a href="#sc_configuration">Configuration Parameters</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_minimumConfiguration">Minimum Configuration</a>
-</li>
-<li>
-<a href="#sc_advancedConfiguration">Advanced Configuration</a>
-</li>
-<li>
-<a href="#sc_clusterOptions">Cluster Options</a>
-</li>
-<li>
-<a href="#sc_authOptions">Encryption, Authentication, Authorization Options</a>
-</li>
-<li>
-<a href="#Experimental+Options%2FFeatures">Experimental Options/Features</a>
-</li>
-<li>
-<a href="#Unsafe+Options">Unsafe Options</a>
-</li>
-<li>
-<a href="#Disabling+data+directory+autocreation">Disabling data directory autocreation</a>
-</li>
-<li>
-<a href="#sc_performance_options">Performance Tuning Options</a>
-</li>
-<li>
-<a href="#Communication+using+the+Netty+framework">Communication using the Netty framework</a>
-</li>
-<li>
-<a href="#sc_adminserver_config">AdminServer configuration</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_zkCommands">ZooKeeper Commands</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_4lw">The Four Letter Words</a>
-</li>
-<li>
-<a href="#sc_adminserver">The AdminServer</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_dataFileManagement">Data File Management</a>
-<ul class="minitoc">
-<li>
-<a href="#The+Data+Directory">The Data Directory</a>
-</li>
-<li>
-<a href="#The+Log+Directory">The Log Directory</a>
-</li>
-<li>
-<a href="#sc_filemanagement">File Management</a>
-</li>
-<li>
-<a href="#Recovery+-+TxnLogToolkit">Recovery - TxnLogToolkit</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_commonProblems">Things to Avoid</a>
-</li>
-<li>
-<a href="#sc_bestPractices">Best Practices</a>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-
-  
-<a name="ch_deployment"></a>
-<h2 class="h3">Deployment</h2>
-<div class="section">
-<p>This section contains information about deploying Zookeeper and
-    covers these topics:</p>
-<ul>
-      
-<li>
-        
-<p>
-<a href="#sc_systemReq">System Requirements</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#sc_zkMulitServerSetup">Clustered (Multi-Server) Setup</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#sc_singleAndDevSetup">Single Server and Developer Setup</a>
-</p>
-      
-</li>
-    
-</ul>
-<p>The first two sections assume you are interested in installing
-    ZooKeeper in a production environment such as a datacenter. The final
-    section covers situations in which you are setting up ZooKeeper on a
-    limited basis - for evaluation, testing, or development - but not in a
-    production environment.</p>
-<a name="sc_systemReq"></a>
-<h3 class="h4">System Requirements</h3>
-<a name="sc_supportedPlatforms"></a>
-<h4>Supported Platforms</h4>
-<p>ZooKeeper consists of multiple components.  Some components are
-        supported broadly, and other components are supported only on a smaller
-        set of platforms.</p>
-<ul>
-          
-<li>
-            
-<p>
-<strong>Client</strong> is the Java client
-            library, used by applications to connect to a ZooKeeper ensemble.
-            </p>
-          
-</li>
-          
-<li>
-            
-<p>
-<strong>Server</strong> is the Java server
-            that runs on the ZooKeeper ensemble nodes.</p>
-          
-</li>
-          
-<li>
-            
-<p>
-<strong>Native Client</strong> is a client
-            implemented in C, similar to the Java client, used by applications
-            to connect to a ZooKeeper ensemble.</p>
-          
-</li>
-          
-<li>
-            
-<p>
-<strong>Contrib</strong> refers to multiple
-            optional add-on components.</p>
-          
-</li>
-        
-</ul>
-<p>The following matrix describes the level of support committed for
-        running each component on different operating system platforms.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<caption>Support Matrix</caption>
-          
-<title>Support Matrix</title>
-          
-              
-<tr>
-                
-<th>Operating System</th>
-                <th>Client</th>
-                <th>Server</th>
-                <th>Native Client</th>
-                <th>Contrib</th>
-              
-</tr>
-            
-              
-<tr>
-                
-<td>GNU/Linux</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-              
-</tr>
-              
-<tr>
-                
-<td>Solaris</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-                <td>Not Supported</td>
-                <td>Not Supported</td>
-              
-</tr>
-              
-<tr>
-                
-<td>FreeBSD</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-                <td>Not Supported</td>
-                <td>Not Supported</td>
-              
-</tr>
-              
-<tr>
-                
-<td>Windows</td>
-                <td>Development and Production</td>
-                <td>Development and Production</td>
-                <td>Not Supported</td>
-                <td>Not Supported</td>
-              
-</tr>
-              
-<tr>
-                
-<td>Mac OS X</td>
-                <td>Development Only</td>
-                <td>Development Only</td>
-                <td>Not Supported</td>
-                <td>Not Supported</td>
-              
-</tr>
-            
-        
-</table>
-<p>For any operating system not explicitly mentioned as supported in
-        the matrix, components may or may not work.  The ZooKeeper community
-        will fix obvious bugs that are reported for other platforms, but there
-        is no full support.</p>
-<a name="sc_requiredSoftware"></a>
-<h4>Required Software </h4>
-<p>ZooKeeper runs in Java, release 1.8 or greater (JDK 8 or
-        greater, FreeBSD support requires openjdk8).  It runs as an
-        <em>ensemble</em> of ZooKeeper servers. Three
-        ZooKeeper servers is the minimum recommended size for an
-        ensemble, and we also recommend that they run on separate
-        machines. At Yahoo!, ZooKeeper is usually deployed on
-        dedicated RHEL boxes, with dual-core processors, 2GB of RAM,
-        and 80GB IDE hard drives.</p>
-<a name="sc_zkMulitServerSetup"></a>
-<h3 class="h4">Clustered (Multi-Server) Setup</h3>
-<p>For reliable ZooKeeper service, you should deploy ZooKeeper in a
-      cluster known as an <em>ensemble</em>. As long as a majority
-      of the ensemble are up, the service will be available. Because Zookeeper
-      requires a majority, it is best to use an
-      odd number of machines. For example, with four machines ZooKeeper can
-      only handle the failure of a single machine; if two machines fail, the
-      remaining two machines do not constitute a majority. However, with five
-      machines ZooKeeper can handle the failure of two machines. </p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-         
-<p>
-            As mentioned in the
-            <a href="zookeeperStarted.html">ZooKeeper Getting Started Guide</a>
-            , a minimum of three servers are required for a fault tolerant
-            clustered setup, and it is strongly recommended that you have an
-            odd number of servers.
-         </p>
-         
-<p>Usually three servers is more than enough for a production
-            install, but for maximum reliability during maintenance, you may
-            wish to install five servers. With three servers, if you perform
-            maintenance on one of them, you are vulnerable to a failure on one
-            of the other two servers during that maintenance. If you have five
-            of them running, you can take one down for maintenance, and know
-            that you're still OK if one of the other four suddenly fails.
-         </p>
-         
-<p>Your redundancy considerations should include all aspects of
-            your environment. If you have three ZooKeeper servers, but their
-            network cables are all plugged into the same network switch, then
-            the failure of that switch will take down your entire ensemble.
-         </p>
-      
-</div>
-</div>
-<p>Here are the steps to setting a server that will be part of an
-      ensemble. These steps should be performed on every host in the
-      ensemble:</p>
-<ol>
-        
-<li>
-          
-<p>Install the Java JDK. You can use the native packaging system
-          for your system, or download the JDK from:</p>
-
-          
-<p>
-<a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Set the Java heap size. This is very important to avoid
-          swapping, which will seriously degrade ZooKeeper performance. To
-          determine the correct value, use load tests, and make sure you are
-          well below the usage limit that would cause you to swap. Be
-          conservative - use a maximum heap size of 3GB for a 4GB
-          machine.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Install the ZooKeeper Server Package. It can be downloaded
-            from:
-          </p>
-          
-<p>
-            
-<a href="http://zookeeper.apache.org/releases.html">
-              http://zookeeper.apache.org/releases.html
-            </a>
-          
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Create a configuration file. This file can be called anything.
-          Use the following settings as a starting point:</p>
-
-          
-<pre class="code">
-tickTime=2000
-dataDir=/var/lib/zookeeper/
-clientPort=2181
-initLimit=5
-syncLimit=2
-server.1=zoo1:2888:3888
-server.2=zoo2:2888:3888
-server.3=zoo3:2888:3888</pre>
-
-          
-<p>You can find the meanings of these and other configuration
-          settings in the section <a href="#sc_configuration">Configuration Parameters</a>. A word
-          though about a few here:</p>
-
-          
-<p>Every machine that is part of the ZooKeeper ensemble should know
-          about every other machine in the ensemble. You accomplish this with
-          the series of lines of the form <strong>server.id=host:port:port</strong>. The parameters <strong>host</strong> and <strong>port</strong> are straightforward. You attribute the
-          server id to each machine by creating a file named
-          <span class="codefrag filename">myid</span>, one for each server, which resides in
-          that server's data directory, as specified by the configuration file
-          parameter <strong>dataDir</strong>.</p>
-</li>
-
-          
-<li>
-<p>The myid file
-          consists of a single line containing only the text of that machine's
-          id. So <span class="codefrag filename">myid</span> of server 1 would contain the text
-          "1" and nothing else. The id must be unique within the
-          ensemble and should have a value between 1 and 255. <strong>IMPORTANT:</strong> if you
-          enable extended features such as TTL Nodes (see below) the id must be
-          between 1 and 254 due to internal limitations.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>If your configuration file is set up, you can start a
-          ZooKeeper server:</p>
-
-          
-<p>
-<span class="codefrag computeroutput">$ java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf \
-              org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg
-          </span>
-</p>
-          
-          
-<p>QuorumPeerMain starts a ZooKeeper server,
-            <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">JMX</a>
-            management beans are also registered which allows
-            management through a JMX management console. 
-            The <a href="zookeeperJMX.html">ZooKeeper JMX
-            document</a> contains details on managing ZooKeeper with JMX.
-          </p>
-
-          
-<p>See the script <em>bin/zkServer.sh</em>,
-            which is included in the release, for an example
-            of starting server instances.</p>
-
-        
-</li>
-
-        
-<li>
-          
-<p>Test your deployment by connecting to the hosts:</p>
-
-          
-<p>In Java, you can run the following command to execute
-          simple operations:</p>
-
-          
-<p>
-<span class="codefrag computeroutput">$ bin/zkCli.sh -server 127.0.0.1:2181</span>
-</p>
-        
-</li>
-      
-</ol>
-<a name="sc_singleAndDevSetup"></a>
-<h3 class="h4">Single Server and Developer Setup</h3>
-<p>If you want to setup ZooKeeper for development purposes, you will
-      probably want to setup a single server instance of ZooKeeper, and then
-      install either the Java or C client-side libraries and bindings on your
-      development machine.</p>
-<p>The steps to setting up a single server instance are the similar
-      to the above, except the configuration file is simpler. You can find the
-      complete instructions in the <a href="zookeeperStarted.html#sc_InstallingSingleMode">Installing and
-      Running ZooKeeper in Single Server Mode</a> section of the <a href="zookeeperStarted.html">ZooKeeper Getting Started
-      Guide</a>.</p>
-<p>For information on installing the client side libraries, refer to
-      the <a href="zookeeperProgrammers.html#Bindings">Bindings</a>
-      section of the <a href="zookeeperProgrammers.html">ZooKeeper
-      Programmer's Guide</a>.</p>
-</div>
-
-  
-<a name="ch_administration"></a>
-<h2 class="h3">Administration</h2>
-<div class="section">
-<p>This section contains information about running and maintaining
-    ZooKeeper and covers these topics: </p>
-<ul>
-        
-<li>
-          
-<p>
-<a href="#sc_designing">Designing a ZooKeeper Deployment</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_provisioning">Provisioning</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_strengthsAndLimitations">Things to Consider: ZooKeeper Strengths and Limitations</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_administering">Administering</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_maintenance">Maintenance</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_supervision">Supervision</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_monitoring">Monitoring</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_logging">Logging</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_troubleshooting">Troubleshooting</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_configuration">Configuration Parameters</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_zkCommands">ZooKeeper Commands</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_dataFileManagement">Data File Management</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_commonProblems">Things to Avoid</a>
-</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<a href="#sc_bestPractices">Best Practices</a>
-</p>
-        
-</li>
-      
-</ul>
-<a name="sc_designing"></a>
-<h3 class="h4">Designing a ZooKeeper Deployment</h3>
-<p>The reliablity of ZooKeeper rests on two basic assumptions.</p>
-<ol>
-        
-<li>
-<p> Only a minority of servers in a deployment
-            will fail. <em>Failure</em> in this context
-            means a machine crash, or some error in the network that
-            partitions a server off from the majority.</p>
-        
-</li>
-        
-<li>
-<p> Deployed machines operate correctly. To
-            operate correctly means to execute code correctly, to have
-            clocks that work properly, and to have storage and network
-            components that perform consistently.</p>
-        
-</li>
-      
-</ol>
-<p>The sections below contain considerations for ZooKeeper
-      administrators to maximize the probability for these assumptions
-      to hold true. Some of these are cross-machines considerations,
-      and others are things you should consider for each and every
-      machine in your deployment.</p>
-<a name="sc_CrossMachineRequirements"></a>
-<h4>Cross Machine Requirements</h4>
-<p>For the ZooKeeper service to be active, there must be a
-        majority of non-failing machines that can communicate with
-        each other. To create a deployment that can tolerate the
-        failure of F machines, you should count on deploying 2xF+1
-        machines.  Thus, a deployment that consists of three machines
-        can handle one failure, and a deployment of five machines can
-        handle two failures. Note that a deployment of six machines
-        can only handle two failures since three machines is not a
-        majority.  For this reason, ZooKeeper deployments are usually
-        made up of an odd number of machines.</p>
-<p>To achieve the highest probability of tolerating a failure
-        you should try to make machine failures independent. For
-        example, if most of the machines share the same switch,
-        failure of that switch could cause a correlated failure and
-        bring down the service. The same holds true of shared power
-        circuits, cooling systems, etc.</p>
-<a name="Single+Machine+Requirements"></a>
-<h4>Single Machine Requirements</h4>
-<p>If ZooKeeper has to contend with other applications for
-        access to resources like storage media, CPU, network, or
-        memory, its performance will suffer markedly.  ZooKeeper has
-        strong durability guarantees, which means it uses storage
-        media to log changes before the operation responsible for the
-        change is allowed to complete. You should be aware of this
-        dependency then, and take great care if you want to ensure
-        that ZooKeeper operations aren&rsquo;t held up by your media. Here
-        are some things you can do to minimize that sort of
-        degradation:
-      </p>
-<ul>
-        
-<li>
-          
-<p>ZooKeeper's transaction log must be on a dedicated
-            device. (A dedicated partition is not enough.) ZooKeeper
-            writes the log sequentially, without seeking Sharing your
-            log device with other processes can cause seeks and
-            contention, which in turn can cause multi-second
-            delays.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Do not put ZooKeeper in a situation that can cause a
-            swap. In order for ZooKeeper to function with any sort of
-            timeliness, it simply cannot be allowed to swap.
-            Therefore, make certain that the maximum heap size given
-            to ZooKeeper is not bigger than the amount of real memory
-            available to ZooKeeper.  For more on this, see
-            <a href="#sc_commonProblems">Things to Avoid</a>
-            below. </p>
-        
-</li>
-      
-</ul>
-<a name="sc_provisioning"></a>
-<h3 class="h4">Provisioning</h3>
-<p></p>
-<a name="sc_strengthsAndLimitations"></a>
-<h3 class="h4">Things to Consider: ZooKeeper Strengths and Limitations</h3>
-<p></p>
-<a name="sc_administering"></a>
-<h3 class="h4">Administering</h3>
-<p></p>
-<a name="sc_maintenance"></a>
-<h3 class="h4">Maintenance</h3>
-<p>Little long term maintenance is required for a ZooKeeper
-        cluster however you must be aware of the following:</p>
-<a name="Ongoing+Data+Directory+Cleanup"></a>
-<h4>Ongoing Data Directory Cleanup</h4>
-<p>The ZooKeeper <a href="#var_datadir">Data
-          Directory</a> contains files which are a persistent copy
-          of the znodes stored by a particular serving ensemble. These
-          are the snapshot and transactional log files. As changes are
-          made to the znodes these changes are appended to a
-          transaction log. Occasionally, when a log grows large, a
-          snapshot of the current state of all znodes will be written
-          to the filesystem and a new transaction log file is created
-          for future transactions. During snapshotting, ZooKeeper may
-          continue appending incoming transactions to the old log file.
-          Therefore, some transactions which are newer than a snapshot
-          may be found in the last transaction log preceding the
-          snapshot.
-        </p>
-<p>A ZooKeeper server <strong>will not remove
-        old snapshots and log files</strong> when using the default
-        configuration (see autopurge below), this is the
-        responsibility of the operator. Every serving environment is
-        different and therefore the requirements of managing these
-        files may differ from install to install (backup for example).
-        </p>
-<p>The PurgeTxnLog utility implements a simple retention
-        policy that administrators can use. The <a href="api/index.html">API docs</a> contains details on
-        calling conventions (arguments, etc...).
-        </p>
-<p>In the following example the last count snapshots and
-        their corresponding logs are retained and the others are
-        deleted.  The value of &lt;count&gt; should typically be
-        greater than 3 (although not required, this provides 3 backups
-        in the unlikely event a recent log has become corrupted). This
-        can be run as a cron job on the ZooKeeper server machines to
-        clean up the logs daily.</p>
-<pre class="code"> java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf org.apache.zookeeper.server.PurgeTxnLog &lt;dataDir&gt; &lt;snapDir&gt; -n &lt;count&gt;</pre>
-<p>Automatic purging of the snapshots and corresponding
-        transaction logs was introduced in version 3.4.0 and can be
-        enabled via the following configuration parameters <strong>autopurge.snapRetainCount</strong> and <strong>autopurge.purgeInterval</strong>. For more on
-        this, see <a href="#sc_advancedConfiguration">Advanced Configuration</a>
-        below.</p>
-<a name="Debug+Log+Cleanup+%28log4j%29"></a>
-<h4>Debug Log Cleanup (log4j)</h4>
-<p>See the section on <a href="#sc_logging">logging</a> in this document. It is
-        expected that you will setup a rolling file appender using the
-        in-built log4j feature. The sample configuration file in the
-        release tar's conf/log4j.properties provides an example of
-        this.
-        </p>
-<a name="sc_supervision"></a>
-<h3 class="h4">Supervision</h3>
-<p>You will want to have a supervisory process that manages
-      each of your ZooKeeper server processes (JVM). The ZK server is
-      designed to be "fail fast" meaning that it will shutdown
-      (process exit) if an error occurs that it cannot recover
-      from. As a ZooKeeper serving cluster is highly reliable, this
-      means that while the server may go down the cluster as a whole
-      is still active and serving requests. Additionally, as the
-      cluster is "self healing" the failed server once restarted will
-      automatically rejoin the ensemble w/o any manual
-      interaction.</p>
-<p>Having a supervisory process such as <a href="http://cr.yp.to/daemontools.html">daemontools</a> or
-      <a href="http://en.wikipedia.org/wiki/Service_Management_Facility">SMF</a>
-      (other options for supervisory process are also available, it's
-      up to you which one you would like to use, these are just two
-      examples) managing your ZooKeeper server ensures that if the
-      process does exit abnormally it will automatically be restarted
-      and will quickly rejoin the cluster.</p>
-<p>It is also recommended to configure the ZooKeeper server process to
-      terminate and dump its heap if an
-      <span class="codefrag computeroutput">OutOfMemoryError</span> occurs.  This is achieved
-      by launching the JVM with the following arguments on Linux and Windows
-      respectively.  The <span class="codefrag filename">zkServer.sh</span> and
-      <span class="codefrag filename">zkServer.cmd</span> scripts that ship with ZooKeeper set
-      these options.
-      </p>
-<pre class="code">-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'</pre>
-<pre class="code">"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"</pre>
-<a name="sc_monitoring"></a>
-<h3 class="h4">Monitoring</h3>
-<p>The ZooKeeper service can be monitored in one of two
-      primary ways; 1) the command port through the use of <a href="#sc_zkCommands">4 letter words</a> and 2) <a href="zookeeperJMX.html">JMX</a>. See the appropriate section for
-      your environment/requirements.</p>
-<a name="sc_logging"></a>
-<h3 class="h4">Logging</h3>
-<p>
-        ZooKeeper uses <strong><a href="http://www.slf4j.org">SLF4J</a></strong>
-        version 1.7.5 as its logging infrastructure. For backward compatibility it is bound to
-        <strong>LOG4J</strong> but you can use
-        <strong><a href="http://logback.qos.ch/">LOGBack</a></strong>
-        or any other supported logging framework of your choice.
-    </p>
-<p>
-        The ZooKeeper default <span class="codefrag filename">log4j.properties</span>
-        file resides in the <span class="codefrag filename">conf</span> directory. Log4j requires that
-        <span class="codefrag filename">log4j.properties</span> either be in the working directory
-        (the directory from which ZooKeeper is run) or be accessible from the classpath.
-    </p>
-<p>For more information about SLF4J, see
-      <a href="http://www.slf4j.org/manual.html">its manual</a>.</p>
-<p>For more information about LOG4J, see
-      <a href="http://logging.apache.org/log4j/1.2/manual.html#defaultInit">Log4j Default Initialization Procedure</a> 
-      of the log4j manual.</p>
-<a name="sc_troubleshooting"></a>
-<h3 class="h4">Troubleshooting</h3>
-<dl>
-		
-<dt>
-<term> Server not coming up because of file corruption</term>
-</dt>
-<dd>
-<p>A server might not be able to read its database and fail to come up because of 
-		some file corruption in the transaction logs of the ZooKeeper server. You will
-		see some IOException on loading ZooKeeper database. In such a case,
-		make sure all the other servers in your ensemble are up and  working. Use "stat" 
-		command on the command port to see if they are in good health. After you have verified that
-		all the other servers of the ensemble are up, you can go ahead and clean the database
-		of the corrupt server. Delete all the files in datadir/version-2 and datalogdir/version-2/.
-		Restart the server.
-		</p>
-</dd>
-		
-</dl>
-<a name="sc_configuration"></a>
-<h3 class="h4">Configuration Parameters</h3>
-<p>ZooKeeper's behavior is governed by the ZooKeeper configuration
-      file. This file is designed so that the exact same file can be used by
-      all the servers that make up a ZooKeeper server assuming the disk
-      layouts are the same. If servers use different configuration files, care
-      must be taken to ensure that the list of servers in all of the different
-      configuration files match.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-        
-<p>In 3.5.0 and later, some of these parameters should be placed in
-         a dynamic configuration file. If they are placed in the static
-         configuration file, ZooKeeper will automatically move them over to the
-         dynamic configuration file. See <a href="zookeeperReconfig.html">
-         Dynamic Reconfiguration</a> for more information.</p>
-      
-</div>
-</div>
-<a name="sc_minimumConfiguration"></a>
-<h4>Minimum Configuration</h4>
-<p>Here are the minimum configuration keywords that must be defined
-        in the configuration file:</p>
-<dl>
-          
-<dt>
-<term>clientPort</term>
-</dt>
-<dd>
-<p>the port to listen for client connections; that is, the
-              port that clients attempt to connect to.</p>
-</dd>
-
-          
-<dt>
-<term>secureClientPort</term>
-</dt>
-<dd>
-<p>the port to listen on for secure client connections using SSL.
-
-              <strong>clientPort</strong> specifies
-                the port for plaintext connections while <strong>
-                  secureClientPort</strong> specifies the port for SSL
-                connections. Specifying both enables mixed-mode while omitting
-                either will disable that mode.</p>
-<p>Note that SSL feature will be enabled when user plugs-in
-                zookeeper.serverCnxnFactory, zookeeper.clientCnxnSocket as Netty.</p>
-</dd>
-
-          
-<dt>
-<term>dataDir</term>
-</dt>
-<dd>
-<p>the location where ZooKeeper will store the in-memory
-              database snapshots and, unless specified otherwise, the
-              transaction log of updates to the database.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-                
-<p>Be careful where you put the transaction log. A
-                dedicated transaction log device is key to consistent good
-                performance. Putting the log on a busy device will adversely
-                effect performance.</p>
-              
-</div>
-</div>
-</dd>
-
-          
-<dt>
-<term>tickTime</term>
-</dt>
-<dd>
-<p>the length of a single tick, which is the basic time unit
-              used by ZooKeeper, as measured in milliseconds. It is used to
-              regulate heartbeats, and timeouts. For example, the minimum
-              session timeout will be two ticks.</p>
-</dd>
-        
-</dl>
-<a name="sc_advancedConfiguration"></a>
-<h4>Advanced Configuration</h4>
-<p>The configuration settings in the section are optional. You can
-        use them to further fine tune the behaviour of your ZooKeeper servers.
-        Some can also be set using Java system properties, generally of the
-        form <em>zookeeper.keyword</em>. The exact system
-        property, when available, is noted below.</p>
-<dl>
-          
-<dt>
-<term>dataLogDir</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>This option will direct the machine to write the
-              transaction log to the <strong>dataLogDir</strong> rather than the <strong>dataDir</strong>. This allows a dedicated log
-              device to be used, and helps avoid competition between logging
-              and snaphots.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-                
-<p>Having a dedicated log device has a large impact on
-                throughput and stable latencies. It is highly recommened to
-                dedicate a log device and set <strong>dataLogDir</strong> to point to a directory on
-                that device, and then make sure to point <strong>dataDir</strong> to a directory
-                <em>not</em> residing on that device.</p>
-              
-</div>
-</div>
-</dd>
-
-          
-<dt>
-<term>globalOutstandingLimit</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.globalOutstandingLimit.</strong>)</p>
-<p>Clients can submit requests faster than ZooKeeper can
-              process them, especially if there are a lot of clients. To
-              prevent ZooKeeper from running out of memory due to queued
-              requests, ZooKeeper will throttle clients so that there is no
-              more than globalOutstandingLimit outstanding requests in the
-              system. The default limit is 1,000.</p>
-</dd>
-
-          
-<dt>
-<term>preAllocSize</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.preAllocSize</strong>)</p>
-<p>To avoid seeks ZooKeeper allocates space in the
-              transaction log file in blocks of preAllocSize kilobytes. The
-              default block size is 64M. One reason for changing the size of
-              the blocks is to reduce the block size if snapshots are taken
-              more often. (Also, see <strong>snapCount</strong>).</p>
-</dd>
-
-          
-<dt>
-<term>snapCount</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.snapCount</strong>)</p>
-<p>ZooKeeper records its transactions using snapshots and
-              a transaction log (think write-ahead log).The number of
-              transactions recorded in the transaction log before a snapshot
-              can be taken (and the transaction log rolled) is determined
-              by snapCount. In order to prevent all of the machines in the quorum
-              from taking a snapshot at the same time, each ZooKeeper server
-              will take a snapshot when the number of transactions in the transaction log
-              reaches a runtime generated random value in the [snapCount/2+1, snapCount] 
-              range.The default snapCount is 100,000.</p>
-</dd>
-
-          
-<dt>
-<term>maxClientCnxns</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Limits the number of concurrent connections (at the socket 
-              level) that a single client, identified by IP address, may make
-              to a single member of the ZooKeeper ensemble. This is used to 
-              prevent certain classes of DoS attacks, including file 
-              descriptor exhaustion. The default is 60. Setting this to 0
-              entirely removes the limit on concurrent connections.</p>
-</dd>
-
-           
-<dt>
-<term>clientPortAddress</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> the
-               address (ipv4, ipv6 or hostname) to listen for client
-               connections; that is, the address that clients attempt
-               to connect to. This is optional, by default we bind in
-               such a way that any connection to the <strong>clientPort</strong> for any
-               address/interface/nic on the server will be
-               accepted.</p>
-</dd>
-
-          
-<dt>
-<term>minSessionTimeout</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.3.0:</strong> the
-              minimum session timeout in milliseconds that the server
-              will allow the client to negotiate. Defaults to 2 times
-              the <strong>tickTime</strong>.</p>
-</dd>
-
-          
-<dt>
-<term>maxSessionTimeout</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.3.0:</strong> the
-              maximum session timeout in milliseconds that the server
-              will allow the client to negotiate. Defaults to 20 times
-              the <strong>tickTime</strong>.</p>
-</dd>
-           
-           
-<dt>
-<term>fsync.warningthresholdms</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.fsync.warningthresholdms</strong>)</p>
-<p>
-<strong>New in 3.3.4:</strong> A
-               warning message will be output to the log whenever an
-               fsync in the Transactional Log (WAL) takes longer than
-               this value. The values is specified in milliseconds and
-               defaults to 1000. This value can only be set as a
-               system property.</p>
-</dd>
-
-          
-<dt>
-<term>autopurge.snapRetainCount</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.4.0:</strong> 
-              When enabled, ZooKeeper auto purge feature retains
-              the <strong>autopurge.snapRetainCount</strong> most
-              recent snapshots and the corresponding transaction logs in the 
-              <strong>dataDir</strong> and <strong>dataLogDir</strong> respectively and deletes the rest.
-              Defaults to 3. Minimum value is 3.</p>
-</dd>
-          
-          
-<dt>
-<term>autopurge.purgeInterval</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.4.0:</strong> The
-              time interval in hours for which the purge task has to
-              be triggered. Set to a positive integer (1 and above)
-              to enable the auto purging. Defaults to 0.</p>
-</dd>
-
-          
-<dt>
-<term>syncEnabled</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.observer.syncEnabled</strong>)</p>
-<p>
-<strong>New in 3.4.6, 3.5.0:</strong>
-              The observers now log transaction and write snapshot to disk
-              by default like the participants. This reduces the recovery time
-              of the observers on restart. Set to "false" to disable this
-              feature. Default is "true"</p>
-</dd>
-
-          
-<dt>
-<term>zookeeper.extendedTypesEnabled</term>
-</dt>
-<dd>
-<p>(Java system property only: <strong>zookeeper.extendedTypesEnabled</strong>)</p>
-<p>
-<strong>New in 3.5.4, 3.6.0:</strong> Define to "true" to enable
-              extended features such as the creation of <a href="zookeeperProgrammers.html#TTL+Nodes">TTL Nodes</a>.
-              They are disabled by default. IMPORTANT: when enabled server IDs must
-              be less than 255 due to internal limitations.
-              </p>
-</dd>
-
-          
-<dt>
-<term>zookeeper.emulate353TTLNodes</term>
-</dt>
-<dd>
-<p>(Java system property only: <strong>zookeeper.emulate353TTLNodes</strong>)</p>
-<p>
-<strong>New in 3.5.4, 3.6.0:</strong> Due to
-                <a href="https://issues.apache.org/jira/browse/ZOOKEEPER-2901">ZOOKEEPER-2901</a> TTL nodes
-                created in version 3.5.3 are not supported in 3.5.4/3.6.0. However, a workaround is provided via the
-                zookeeper.emulate353TTLNodes system property. If you used TTL nodes in ZooKeeper 3.5.3 and need to maintain
-                compatibility set <strong>zookeeper.emulate353TTLNodes</strong> to "true" in addition to
-                <strong>zookeeper.extendedTypesEnabled</strong>. NOTE: due to the bug, server IDs
-                must be 127 or less. Additionally, the maximum support TTL value is 1099511627775 which is smaller
-                than what was allowed in 3.5.3 (1152921504606846975)</p>
-</dd>
-
-        
-</dl>
-<a name="sc_clusterOptions"></a>
-<h4>Cluster Options</h4>
-<p>The options in this section are designed for use with an ensemble
-        of servers -- that is, when deploying clusters of servers.</p>
-<dl>
-          
-<dt>
-<term>electionAlg</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Election implementation to use. A value of "0" corresponds
-              to the original UDP-based version, "1" corresponds to the
-              non-authenticated UDP-based version of fast leader election, "2"
-              corresponds to the authenticated UDP-based version of fast
-              leader election, and "3" corresponds to TCP-based version of
-              fast leader election. Currently, algorithm 3 is the default</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-              
-<p> The implementations of leader election 0, 1, and 2 are now 
-              <strong> deprecated </strong>. We have the intention
-              of removing them in the next release, at which point only the 
-              FastLeaderElection will be available. 
-              </p>
-              
-</div>
-</div>
-</dd>
-
-          
-<dt>
-<term>initLimit</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Amount of time, in ticks (see <a href="#id_tickTime">tickTime</a>), to allow followers to
-              connect and sync to a leader. Increased this value as needed, if
-              the amount of data managed by ZooKeeper is large.</p>
-</dd>
-
-          
-<dt>
-<term>leaderServes</term>
-</dt>
-<dd>
-<p>(Java system property: zookeeper.<strong>leaderServes</strong>)</p>
-<p>Leader accepts client connections. Default value is "yes".
-              The leader machine coordinates updates. For higher update
-              throughput at thes slight expense of read throughput the leader
-              can be configured to not accept clients and focus on
-              coordination. The default to this option is yes, which means
-              that a leader will accept client connections.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-                
-<p>Turning on leader selection is highly recommended when
-                you have more than three ZooKeeper servers in an ensemble.</p>
-              
-</div>
-</div>
-</dd>
-
-          
-<dt>
-<term>server.x=[hostname]:nnnnn[:nnnnn], etc</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>servers making up the ZooKeeper ensemble. When the server
-              starts up, it determines which server it is by looking for the
-              file <span class="codefrag filename">myid</span> in the data directory. That file
-              contains the server number, in ASCII, and it should match
-              <strong>x</strong> in <strong>server.x</strong> in the left hand side of this
-              setting.</p>
-<p>The list of servers that make up ZooKeeper servers that is
-              used by the clients must match the list of ZooKeeper servers
-              that each ZooKeeper server has.</p>
-<p>There are two port numbers <strong>nnnnn</strong>. 
-              The first followers use to connect to the leader, and the second is for 
-              leader election. The leader election port is only necessary if electionAlg 
-              is 1, 2, or 3 (default). If electionAlg is 0, then the second port is not 
-              necessary. If you want to test multiple servers on a single machine, then 
-              different ports can be used for each server.</p>
-</dd>
-
-          
-<dt>
-<term>syncLimit</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Amount of time, in ticks (see <a href="#id_tickTime">tickTime</a>), to allow followers to sync
-              with ZooKeeper. If followers fall too far behind a leader, they
-              will be dropped.</p>
-</dd>
-
-          
-<dt>
-<term>group.x=nnnnn[:nnnnn]</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Enables a hierarchical quorum construction."x" is a group identifier
-              and the numbers following the "=" sign correspond to server identifiers. 
-              The left-hand side of the assignment is a colon-separated list of server
-              identifiers. Note that groups must be disjoint and the union of all groups
-              must be the ZooKeeper ensemble. </p>
-<p> You will find an example <a href="zookeeperHierarchicalQuorums.html">here</a>
-              
-</p>
-</dd>
-
-          
-<dt>
-<term>weight.x=nnnnn</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>Used along with "group", it assigns a weight to a server when
-              forming quorums. Such a value corresponds to the weight of a server
-              when voting. There are a few parts of ZooKeeper that require voting
-              such as leader election and the atomic broadcast protocol. By default
-              the weight of server is 1. If the configuration defines groups, but not
-              weights, then a value of 1 will be assigned to all servers.  
-              </p>
-<p> You will find an example <a href="zookeeperHierarchicalQuorums.html">here</a>
-              
-</p>
-</dd>
-          
-          
-<dt>
-<term>cnxTimeout</term>
-</dt>
-<dd>
-<p>(Java system property: zookeeper.<strong>cnxTimeout</strong>)</p>
-<p>Sets the timeout value for opening connections for leader election notifications. 
-              Only applicable if you are using electionAlg 3. 
-              </p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-                
-<p>Default value is 5 seconds.</p>
-              
-</div>
-</div>
-</dd>
-
-          
-<dt>
-<term>standaloneEnabled</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.5.0:</strong>
-              When set to false, a single server can be started in replicated
-              mode, a lone participant can run with observers, and a cluster
-              can reconfigure down to one node, and up from one node. The
-              default is true for backwards compatibility. It can be set
-              using QuorumPeerConfig's setStandaloneEnabled method or by
-              adding "standaloneEnabled=false" or "standaloneEnabled=true"
-              to a server's config file.
-              </p>
-</dd>
-
-          
-<dt>
-<term>reconfigEnabled</term>
-</dt>
-<dd>
-<p>(No Java system property)</p>
-<p>
-<strong>New in 3.5.3:</strong>
-                This controls the enabling or disabling of
-                <a href="zookeeperReconfig.html">
-                  Dynamic Reconfiguration</a> feature. When the feature
-                is enabled, users can perform reconfigure operations through
-                the ZooKeeper client API or through ZooKeeper command line tools
-                assuming users are authorized to perform such operations.
-                When the feature is disabled, no user, including the super user,
-                can perform a reconfiguration. Any attempt to reconfigure will return an error.
-                <strong>"reconfigEnabled"</strong> option can be set as
-                <strong>"reconfigEnabled=false"</strong> or
-                <strong>"reconfigEnabled=true"</strong>
-                to a server's config file, or using QuorumPeerConfig's
-                setReconfigEnabled method. The default value is false.
-
-                If present, the value should be consistent across every server in
-                the entire ensemble. Setting the value as true on some servers and false
-                on other servers will cause inconsistent behavior depending on which server
-                is elected as leader. If the leader has a setting of
-                <strong>"reconfigEnabled=true"</strong>, then the ensemble
-                will have reconfig feature enabled. If the leader has a setting of
-                <strong>"reconfigEnabled=false"</strong>, then the ensemble
-                will have reconfig feature disabled. It is thus recommended to have a consistent
-                value for <strong>"reconfigEnabled"</strong> across servers
-                in the ensemble.
-              </p>
-</dd>
-
-          
-<dt>
-<term>4lw.commands.whitelist</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.4lw.commands.whitelist</strong>)</p>
-<p>
-<strong>New in 3.5.3:</strong>
-                A list of comma separated <a href="#sc_4lw">Four Letter Words</a>
-                commands that user wants to use. A valid Four Letter Words
-                command must be put in this list else ZooKeeper server will
-                not enable the command.
-                By default the whitelist only contains "srvr" command
-                which zkServer.sh uses. The rest of four letter word commands are disabled
-                by default.
-              </p>
-<p>Here's an example of the configuration that enables stat, ruok, conf, and isro
-              command while disabling the rest of Four Letter Words command:</p>
-<pre class="code">
-                4lw.commands.whitelist=stat, ruok, conf, isro
-              </pre>
-<p>If you really need enable all four letter word commands by default, you can use
-                the asterisk option so you don't have to include every command one by one in the list.
-                As an example, this will enable all four letter word commands:
-              </p>
-<pre class="code">
-                4lw.commands.whitelist=*
-              </pre>
-</dd>
-
-          
-<dt>
-<term>tcpKeepAlive</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.tcpKeepAlive</strong>)</p>
-<p>
-<strong>New in 3.5.4:</strong>
-                Setting this to true sets the TCP keepAlive flag on the
-                sockets used by quorum members to perform elections.
-                This will allow for connections between quorum members to
-                remain up when there is network infrastructure that may
-                otherwise break them. Some NATs and firewalls may terminate
-                or lose state for long running or idle connections.</p>
-<p> Enabling this option relies on OS level settings to work
-                properly, check your operating system's options regarding TCP
-                keepalive for more information.  Defaults to
-                <strong>false</strong>.
-              </p>
-</dd>
-
-        
-</dl>
-<p></p>
-<a name="sc_authOptions"></a>
-<h4>Encryption, Authentication, Authorization Options</h4>
-<p>The options in this section allow control over
-        encryption/authentication/authorization performed by the service.</p>
-<dl>
-          
-<dt>
-<term>DigestAuthenticationProvider.superDigest</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.DigestAuthenticationProvider.superDigest</strong>)</p>
-<p>By default this feature is <strong>disabled</strong>
-</p>
-<p>
-<strong>New in 3.2:</strong>
-              Enables a ZooKeeper ensemble administrator to access the
-              znode hierarchy as a "super" user. In particular no ACL
-              checking occurs for a user authenticated as
-              super.</p>
-<p>org.apache.zookeeper.server.auth.DigestAuthenticationProvider
-              can be used to generate the superDigest, call it with
-              one parameter of "super:&lt;password&gt;". Provide the
-              generated "super:&lt;data&gt;" as the system property value
-              when starting each server of the ensemble.</p>
-<p>When authenticating to a ZooKeeper server (from a
-              ZooKeeper client) pass a scheme of "digest" and authdata
-              of "super:&lt;password&gt;". Note that digest auth passes
-              the authdata in plaintext to the server, it would be
-              prudent to use this authentication method only on
-              localhost (not over the network) or over an encrypted
-              connection.</p>
-</dd>
-
-          
-<dt>
-<term>X509AuthenticationProvider.superUser</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.X509AuthenticationProvider.superUser</strong>)</p>
-<p>The SSL-backed way to enable a ZooKeeper ensemble
-              administrator to access the znode hierarchy as a "super" user.
-              When this parameter is set to an X500 principal name, only an
-              authenticated client with that principal will be able to bypass
-              ACL checking and have full privileges to all znodes.</p>
-</dd>
-
-          
-<dt>
-<term>zookeeper.superUser</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.superUser</strong>)</p>
-<p>Similar to <strong>zookeeper.X509AuthenticationProvider.superUser</strong>
-              but is generic for SASL based logins. It stores the name of 
-              a user that can access the znode hierarchy as a "super" user.
-              </p>
-</dd>
-
-          
-<dt>
-<term>ssl.keyStore.location and ssl.keyStore.password</term>
-</dt>
-<dd>
-<p>(Java system properties: <strong>
-                zookeeper.ssl.keyStore.location</strong> and <strong>zookeeper.ssl.keyStore.password</strong>)</p>
-<p>Specifies the file path to a JKS containing the local
-                credentials to be used for SSL connections, and the
-                password to unlock the file.</p>
-</dd>
-
-          
-<dt>
-<term>ssl.trustStore.location and ssl.trustStore.password</term>
-</dt>
-<dd>
-<p>(Java system properties: <strong>
-                zookeeper.ssl.trustStore.location</strong> and <strong>zookeeper.ssl.trustStore.password</strong>)</p>
-<p>Specifies the file path to a JKS containing the remote
-                credentials to be used for SSL connections, and the
-                password to unlock the file.</p>
-</dd>
-
-          
-<dt>
-<term>ssl.authProvider</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.ssl.authProvider</strong>)</p>
-<p>Specifies a subclass of <strong>
-              org.apache.zookeeper.auth.X509AuthenticationProvider</strong>
-              to use for secure client authentication. This is useful in
-              certificate key infrastructures that do not use JKS. It may be
-              necessary to extend <strong>javax.net.ssl.X509KeyManager
-              </strong> and <strong>javax.net.ssl.X509TrustManager</strong>
-              to get the desired behavior from the SSL stack. To configure the
-              ZooKeeper server to use the custom provider for authentication,
-              choose a scheme name for the custom AuthenticationProvider and
-              set the property <strong>zookeeper.authProvider.[scheme]
-              </strong> to the fully-qualified class name of the custom
-              implementation. This will load the provider into the ProviderRegistry.
-              Then set this property <strong>
-              zookeeper.ssl.authProvider=[scheme]</strong> and that provider
-              will be used for secure authentication.</p>
-</dd>
-        
-</dl>
-<a name="Experimental+Options%2FFeatures"></a>
-<h4>Experimental Options/Features</h4>
-<p>New features that are currently considered experimental.</p>
-<dl>
-          
-<dt>
-<term>Read Only Mode Server</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>readonlymode.enabled</strong>)</p>
-<p>
-<strong>New in 3.4.0:</strong>
-              Setting this value to true enables Read Only Mode server
-              support (disabled by default). ROM allows clients
-              sessions which requested ROM support to connect to the
-              server even when the server might be partitioned from
-              the quorum. In this mode ROM clients can still read
-              values from the ZK service, but will be unable to write
-              values and see changes from other clients. See
-              ZOOKEEPER-784 for more details.
-              </p>
-</dd>
-
-        
-</dl>
-<a name="Unsafe+Options"></a>
-<h4>Unsafe Options</h4>
-<p>The following options can be useful, but be careful when you use
-        them. The risk of each is explained along with the explanation of what
-        the variable does.</p>
-<dl>
-          
-<dt>
-<term>forceSync</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.forceSync</strong>)</p>
-<p>Requires updates to be synced to media of the transaction
-              log before finishing processing the update. If this option is
-              set to no, ZooKeeper will not require updates to be synced to
-              the media.</p>
-</dd>
-
-          
-<dt>
-<term>jute.maxbuffer:</term>
-</dt>
-<dd>
-<p>(Java system property:<strong>
-              jute.maxbuffer</strong>)</p>
-<p>This option can only be set as a Java system property.
-              There is no zookeeper prefix on it. It specifies the maximum
-              size of the data that can be stored in a znode. The default is
-              0xfffff, or just under 1M. If this option is changed, the system
-              property must be set on all servers and clients otherwise
-              problems will arise. This is really a sanity check. ZooKeeper is
-              designed to store data on the order of kilobytes in size.</p>
-</dd>
-
-          
-<dt>
-<term>skipACL</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.skipACL</strong>)</p>
-<p>Skips ACL checks. This results in a boost in throughput,
-              but opens up full access to the data tree to everyone.</p>
-</dd>
-
-          
-<dt>
-<term>quorumListenOnAllIPs</term>
-</dt>
-<dd>
-<p>When set to true the ZooKeeper server will listen  
-              for connections from its peers on all available IP addresses,
-              and not only the address configured in the server list of the
-              configuration file. It affects the connections handling the 
-              ZAB protocol and the Fast Leader Election protocol. Default
-              value is <strong>false</strong>.</p>
-</dd>
-
-        
-</dl>
-<a name="Disabling+data+directory+autocreation"></a>
-<h4>Disabling data directory autocreation</h4>
-<p>
-<strong>New in 3.5:</strong> The default
-        behavior of a ZooKeeper server is to automatically create the
-        data directory (specified in the configuration file) when
-        started if that directory does not already exist. This can be
-        inconvenient and even dangerous in some cases. Take the case
-        where a configuration change is made to a running server,
-        wherein the <strong>dataDir</strong> parameter
-        is accidentally changed. When the ZooKeeper server is
-        restarted it will create this non-existent directory and begin
-        serving - with an empty znode namespace. This scenario can
-        result in an effective "split brain" situation (i.e. data in
-        both the new invalid directory and the original valid data
-        store). As such is would be good to have an option to turn off
-        this autocreate behavior. In general for production
-        environments this should be done, unfortunately however the
-        default legacy behavior cannot be changed at this point and
-        therefore this must be done on a case by case basis. This is
-        left to users and to packagers of ZooKeeper distributions.
-        </p>
-<p>When running <strong>zkServer.sh</strong> autocreate can be disabled
-        by setting the environment variable <strong>ZOO_DATADIR_AUTOCREATE_DISABLE</strong> to 1.
-        When running ZooKeeper servers directly from class files this
-        can be accomplished by setting <strong>zookeeper.datadir.autocreate=false</strong> on
-        the java command line, i.e. <strong>-Dzookeeper.datadir.autocreate=false</strong>
-        
-</p>
-<p>When this feature is disabled, and the ZooKeeper server
-        determines that the required directories do not exist it will
-        generate an error and refuse to start.
-        </p>
-<p>A new script <strong>zkServer-initialize.sh</strong> is provided to
-        support this new feature. If autocreate is disabled it is
-        necessary for the user to first install ZooKeeper, then create
-        the data directory (and potentially txnlog directory), and
-        then start the server. Otherwise as mentioned in the previous
-        paragraph the server will not start. Running <strong>zkServer-initialize.sh</strong> will create the
-        required directories, and optionally setup the myid file
-        (optional command line parameter). This script can be used
-        even if the autocreate feature itself is not used, and will
-        likely be of use to users as this (setup, including creation
-        of the myid file) has been an issue for users in the past.
-        Note that this script ensures the data directories exist only,
-        it does not create a config file, but rather requires a config
-        file to be available in order to execute.
-        </p>
-<a name="sc_performance_options"></a>
-<h4>Performance Tuning Options</h4>
-<p>
-<strong>New in 3.5.0:</strong> Several subsystems have been reworked
-        to improve read throughput. This includes multi-threading of the NIO communication subsystem and
-        request processing pipeline (Commit Processor). NIO is the default client/server communication
-        subsystem. Its threading model comprises 1 acceptor thread, 1-N selector threads and 0-M
-        socket I/O worker threads. In the request processing pipeline the system can be configured
-        to process multiple read request at once while maintaining the same consistency guarantee
-        (same-session read-after-write). The Commit Processor threading model comprises 1 main
-        thread and 0-N worker threads.
-        </p>
-<p>
-        The default values are aimed at maximizing read throughput on a dedicated ZooKeeper machine.
-        Both subsystems need to have sufficient amount of threads to achieve peak read throughput.
-        </p>
-<dl>
-
-          
-<dt>
-<term>zookeeper.nio.numSelectorThreads</term>
-</dt>
-<dd>
-<p>(Java system property only: <strong>zookeeper.nio.numSelectorThreads</strong>)
-              </p>
-<p>
-<strong>New in 3.5.0:</strong>
-              Number of NIO selector threads. At least 1 selector thread required.
-              It is recommended to use more than one selector for large numbers
-              of client connections. The default value is sqrt( number of cpu cores / 2 ).
-              </p>
-</dd>
-
-          
-<dt>
-<term>zookeeper.nio.numWorkerThreads</term>
-</dt>
-<dd>
-<p>(Java system property only: <strong>zookeeper.nio.numWorkerThreads</strong>)
-              </p>
-<p>
-<strong>New in 3.5.0:</strong>
-              Number of NIO worker threads. If configured with 0 worker threads, the selector threads
-              do the socket I/O directly. The default value is 2 times the number of cpu cores.
-              </p>
-</dd>
-
-          
-<dt>
-<term>zookeeper.commitProcessor.numWorkerThreads</term>
-</dt>
-<dd>
-<p>(Java system property only: <strong>zookeeper.commitProcessor.numWorkerThreads</strong>)
-              </p>
-<p>
-<strong>New in 3.5.0:</strong>
-              Number of Commit Processor worker threads. If configured with 0 worker threads, the main thread
-              will process the request directly. The default value is the number of cpu cores.
-              </p>
-</dd>
-
-          
-<dt>
-<term>znode.container.checkIntervalMs</term>
-</dt>
-<dd>
-<p>(Java system property only)</p>
-<p>
-<strong>New in 3.5.1:</strong> The
-                time interval in milliseconds for each check of candidate container
-                and ttl nodes. Default is "60000".</p>
-</dd>
-
-          
-<dt>
-<term>znode.container.maxPerMinute</term>
-</dt>
-<dd>
-<p>(Java system property only)</p>
-<p>
-<strong>New in 3.5.1:</strong> The
-                maximum number of container nodes that can be deleted per
-                minute. This prevents herding during container deletion.
-                Default is "10000".</p>
-</dd>
-        
-</dl>
-<a name="Communication+using+the+Netty+framework"></a>
-<h4>Communication using the Netty framework</h4>
-<p>
-<a href="http://netty.io">Netty</a>
-            is an NIO based client/server communication framework, it
-            simplifies (over NIO being used directly) many of the
-            complexities of network level communication for java
-            applications. Additionally the Netty framework has built
-            in support for encryption (SSL) and authentication
-            (certificates). These are optional features and can be
-            turned on or off individually.
-        </p>
-<p>In versions 3.5+, a ZooKeeper server can use Netty
-            instead of NIO (default option) by setting the environment
-            variable <strong>zookeeper.serverCnxnFactory</strong>
-            to <strong>org.apache.zookeeper.server.NettyServerCnxnFactory</strong>;
-            for the client, set <strong>zookeeper.clientCnxnSocket</strong>
-            to <strong>org.apache.zookeeper.ClientCnxnSocketNetty</strong>.
-        </p>
-<p>
-          TBD - tuning options for netty - currently there are none that are netty specific but we should add some. Esp around max bound on the number of reader worker threads netty creates.
-        </p>
-<p>
-          TBD - how to manage encryption
-        </p>
-<p>
-          TBD - how to manage certificates
-        </p>
-<a name="sc_adminserver_config"></a>
-<h4>AdminServer configuration</h4>
-<p>
-<strong>New in 3.5.0:</strong> The following
-        options are used to configure the <a href="#sc_adminserver">AdminServer</a>.</p>
-<dl>
-          
-<dt>
-<term>admin.enableServer</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.admin.enableServer</strong>)</p>
-<p>Set to "false" to disable the AdminServer.  By default the
-              AdminServer is enabled.</p>
-</dd>
-
-          
-<dt>
-<term>admin.serverAddress</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.admin.serverAddress</strong>)</p>
-<p>The address the embedded Jetty server listens on. Defaults to 0.0.0.0.</p>
-</dd>
-
-          
-<dt>
-<term>admin.serverPort</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.admin.serverPort</strong>)</p>
-<p>The port the embedded Jetty server listens on.  Defaults to 8080.</p>
-</dd>
-
-            
-<dt>
-<term>admin.idleTimeout</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.admin.idleTimeout</strong>)</p>
-<p>Set the maximum idle time in milliseconds that a connection can wait 
-                          before sending or receiving data. Defaults to 30000 ms.</p>
-</dd>
-
-
-          
-<dt>
-<term>admin.commandURL</term>
-</dt>
-<dd>
-<p>(Java system property: <strong>zookeeper.admin.commandURL</strong>)</p>
-<p>The URL for listing and issuing commands relative to the
-              root URL.  Defaults to "/commands".</p>
-</dd>
-        
-</dl>
-<a name="sc_zkCommands"></a>
-<h3 class="h4">ZooKeeper Commands</h3>
-<a name="sc_4lw"></a>
-<h4>The Four Letter Words</h4>
-<p>ZooKeeper responds to a small set of commands. Each command is
-        composed of four letters. You issue the commands to ZooKeeper via telnet
-        or nc, at the client port.</p>
-<p>Three of the more interesting commands: "stat" gives some
-        general information about the server and connected clients,
-        while "srvr" and "cons" give extended details on server and
-        connections respectively.</p>
-<p>
-<strong>New in 3.5.3:</strong>
-          Four Letter Words need to be explicitly white listed before using.
-          Please refer <strong>4lw.commands.whitelist</strong>
-           described in <a href="#sc_clusterOptions">
-            cluster configuration section</a> for details.
-          Moving forward, Four Letter Words will be deprecated, please use
-          <a href="#sc_adminserver">AdminServer</a> instead.
-        </p>
-<dl>
-          
-<dt>
-<term>conf</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Print
-              details about serving configuration.</p>
-</dd>
-
-          
-<dt>
-<term>cons</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> List
-              full connection/session details for all clients connected
-              to this server. Includes information on numbers of packets
-              received/sent, session id, operation latencies, last
-              operation performed, etc...</p>
-</dd>
-
-          
-<dt>
-<term>crst</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Reset
-              connection/session statistics for all connections.</p>
-</dd>
-
-          
-<dt>
-<term>dump</term>
-</dt>
-<dd>
-<p>Lists the outstanding sessions and ephemeral nodes. This
-              only works on the leader.</p>
-</dd>
-
-          
-<dt>
-<term>envi</term>
-</dt>
-<dd>
-<p>Print details about serving environment</p>
-</dd>
-
-          
-<dt>
-<term>ruok</term>
-</dt>
-<dd>
-<p>Tests if server is running in a non-error state. The server
-              will respond with imok if it is running. Otherwise it will not
-              respond at all.</p>
-<p>A response of "imok" does not necessarily indicate that the
-              server has joined the quorum, just that the server process is active
-              and bound to the specified client port. Use "stat" for details on
-              state wrt quorum and client connection information.</p>
-</dd>
-
-          
-<dt>
-<term>srst</term>
-</dt>
-<dd>
-<p>Reset server statistics.</p>
-</dd>
-
-          
-<dt>
-<term>srvr</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Lists
-              full details for the server.</p>
-</dd>
-
-          
-<dt>
-<term>stat</term>
-</dt>
-<dd>
-<p>Lists brief details for the server and connected
-              clients.</p>
-</dd>
-
-          
-<dt>
-<term>wchs</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Lists
-              brief information on watches for the server.</p>
-</dd>
-
-          
-<dt>
-<term>wchc</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Lists
-              detailed information on watches for the server, by
-              session.  This outputs a list of sessions(connections)
-              with associated watches (paths). Note, depending on the
-              number of watches this operation may be expensive (ie
-              impact server performance), use it carefully.</p>
-</dd>
-
-          
-<dt>
-<term>dirs</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.5.1:</strong>
-                Shows the total size of snapshot and log files in bytes
-              </p>
-</dd>
-
-          
-<dt>
-<term>wchp</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.3.0:</strong> Lists
-              detailed information on watches for the server, by path.
-              This outputs a list of paths (znodes) with associated
-              sessions. Note, depending on the number of watches this
-              operation may be expensive (ie impact server performance),
-              use it carefully.</p>
-</dd>
-
-
-          
-<dt>
-<term>mntr</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.4.0:</strong> Outputs a list 
-              of variables that could be used for monitoring the health of the cluster.</p>
-<pre class="code">$ echo mntr | nc localhost 2185
-
-              zk_version  3.4.0
-              zk_avg_latency  0
-              zk_max_latency  0
-              zk_min_latency  0
-              zk_packets_received 70
-              zk_packets_sent 69
-              zk_num_alive_connections	1
-              zk_outstanding_requests 0
-              zk_server_state leader
-              zk_znode_count   4
-              zk_watch_count  0
-              zk_ephemerals_count 0
-              zk_approximate_data_size    27
-              zk_followers    4                   - only exposed by the Leader
-              zk_synced_followers 4               - only exposed by the Leader
-              zk_pending_syncs    0               - only exposed by the Leader
-              zk_open_file_descriptor_count 23    - only available on Unix platforms
-              zk_max_file_descriptor_count 1024   - only available on Unix platforms
-              zk_last_proposal_size 23
-              zk_min_proposal_size 23
-              zk_max_proposal_size 64
-              </pre>
-<p>The output is compatible with java properties format and the content 
-              may change over time (new keys added). Your scripts should expect changes.</p>
-<p>ATTENTION: Some of the keys are platform specific and some of the keys are only exported by the Leader. </p>
-<p>The output contains multiple lines with the following format:</p>
-<pre class="code">key \t value</pre>
-</dd>
-
-          
-<dt>
-<term>isro</term>
-</dt>
-<dd>
-<p>
-<strong>New in 3.4.0:</strong> Tests if
-              server is running in read-only mode.  The server will respond with
-              "ro" if in read-only mode or "rw" if not in read-only mode.</p>
-</dd>
-
-          
-<dt>
-<term>gtmk</term>
-</dt>
-<dd>
-<p>Gets the current trace mask as a 64-bit signed long value in
-              decimal format.  See <span class="codefrag command">stmk</span> for an explanation of
-              the possible values.</p>
-</dd>
-
-          
-<dt>
-<term>stmk</term>
-</dt>
-<dd>
-<p>Sets the current trace mask.  The trace mask is 64 bits,
-              where each bit enables or disables a specific category of trace
-              logging on the server.  Log4J must be configured to enable
-              <span class="codefrag command">TRACE</span> level first in order to see trace logging
-              messages.  The bits of the trace mask correspond to the following
-              trace logging categories.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<caption>Trace Mask Bit Values</caption>
-                
-<title>Trace Mask Bit Values</title>
-                
-                    
-<tr>
-                      
-<td>0b0000000000</td>
-                      <td>Unused, reserved for future use.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0000000010</td>
-                      <td>Logs client requests, excluding ping
-                      requests.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0000000100</td>
-                      <td>Unused, reserved for future use.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0000001000</td>
-                      <td>Logs client ping requests.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0000010000</td>
-                      <td>Logs packets received from the quorum peer that is
-                      the current leader, excluding ping requests.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0000100000</td>
-                      <td>Logs addition, removal and validation of client
-                      sessions.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0001000000</td>
-                      <td>Logs delivery of watch events to client
-                      sessions.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0010000000</td>
-                      <td>Logs ping packets received from the quorum peer
-                      that is the current leader.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b0100000000</td>
-                      <td>Unused, reserved for future use.</td>
-                    
-</tr>
-                    
-<tr>
-                      
-<td>0b1000000000</td>
-                      <td>Unused, reserved for future use.</td>
-                    
-</tr>
-                  
-              
-</table>
-<p>All remaining bits in the 64-bit value are unused and
-              reserved for future use.  Multiple trace logging categories are
-              specified by calculating the bitwise OR of the documented values.
-              The default trace mask is 0b0100110010.  Thus, by default, trace
-              logging includes client requests, packets received from the
-              leader and sessions.</p>
-<p>To set a different trace mask, send a request containing the
-              <span class="codefrag command">stmk</span> four-letter word followed by the trace
-              mask represented as a 64-bit signed long value.  This example uses
-              the Perl <span class="codefrag command">pack</span> function to construct a trace
-              mask that enables all trace logging categories described above and
-              convert it to a 64-bit signed long value with big-endian byte
-              order.  The result is appended to <span class="codefrag command">stmk</span> and sent
-              to the server using netcat.  The server responds with the new
-              trace mask in decimal format.</p>
-<pre class="code">$ perl -e "print 'stmk', pack('q&gt;', 0b0011111010)" | nc localhost 2181
-250
-              </pre>
-</dd>
-        
-</dl>
-<p>Here's an example of the <strong>ruok</strong>
-        command:</p>
-<pre class="code">$ echo ruok | nc 127.0.0.1 5111
-        imok
-        </pre>
-<a name="sc_adminserver"></a>
-<h4>The AdminServer</h4>
-<p>
-<strong>New in 3.5.0: </strong>The AdminServer is
-        an embedded Jetty server that provides an HTTP interface to the four
-        letter word commands.  By default, the server is started on port 8080,
-        and commands are issued by going to the URL "/commands/[command name]",
-        e.g., http://localhost:8080/commands/stat.  The command response is
-        returned as JSON.  Unlike the original protocol, commands are not
-        restricted to four-letter names, and commands can have multiple names;
-        for instance, "stmk" can also be referred to as "set_trace_mask".  To
-        view a list of all available commands, point a browser to the URL
-        /commands (e.g., http://localhost:8080/commands).  See the <a href="#sc_adminserver_config">AdminServer configuration options</a>
-        for how to change the port and URLs.</p>
-<p>The AdminServer is enabled by default, but can be disabled by either:</p>
-<ul>
-          
-<li>
-<p>Setting the zookeeper.admin.enableServer system
-          property to false.</p>
-</li>
-          
-<li>
-<p>Removing Jetty from the classpath.  (This option is
-          useful if you would like to override ZooKeeper's jetty
-          dependency.)</p>
-</li>
-        
-</ul>
-<p>Note that the TCP four letter word interface is still available if
-        the AdminServer is disabled.</p>
-<a name="sc_dataFileManagement"></a>
-<h3 class="h4">Data File Management</h3>
-<p>ZooKeeper stores its data in a data directory and its transaction
-      log in a transaction log directory. By default these two directories are
-      the same. The server can (and should) be configured to store the
-      transaction log files in a separate directory than the data files.
-      Throughput increases and latency decreases when transaction logs reside
-      on a dedicated log devices.</p>
-<a name="The+Data+Directory"></a>
-<h4>The Data Directory</h4>
-<p>This directory has two files in it:</p>
-<ul>
-          
-<li>
-            
-<p>
-<span class="codefrag filename">myid</span> - contains a single integer in
-            human readable ASCII text that represents the server id.</p>
-          
-</li>
-
-          
-<li>
-            
-<p>
-<span class="codefrag filename">snapshot.&lt;zxid&gt;</span> - holds the fuzzy
-            snapshot of a data tree.</p>
-          
-</li>
-        
-</ul>
-<p>Each ZooKeeper server has a unique id. This id is used in two
-        places: the <span class="codefrag filename">myid</span> file and the configuration file.
-        The <span class="codefrag filename">myid</span> file identifies the server that
-        corresponds to the given data directory. The configuration file lists
-        the contact information for each server identified by its server id.
-        When a ZooKeeper server instance starts, it reads its id from the
-        <span class="codefrag filename">myid</span> file and then, using that id, reads from the
-        configuration file, looking up the port on which it should
-        listen.</p>
-<p>The <span class="codefrag filename">snapshot</span> files stored in the data
-        directory are fuzzy snapshots in the sense that during the time the
-        ZooKeeper server is taking the snapshot, updates are occurring to the
-        data tree. The suffix of the <span class="codefrag filename">snapshot</span> file names
-        is the <em>zxid</em>, the ZooKeeper transaction id, of the
-        last committed transaction at the start of the snapshot. Thus, the
-        snapshot includes a subset of the updates to the data tree that
-        occurred while the snapshot was in process. The snapshot, then, may
-        not correspond to any data tree that actually existed, and for this
-        reason we refer to it as a fuzzy snapshot. Still, ZooKeeper can
-        recover using this snapshot because it takes advantage of the
-        idempotent nature of its updates. By replaying the transaction log
-        against fuzzy snapshots ZooKeeper gets the state of the system at the
-        end of the log.</p>
-<a name="The+Log+Directory"></a>
-<h4>The Log Directory</h4>
-<p>The Log Directory contains the ZooKeeper transaction logs.
-        Before any update takes place, ZooKeeper ensures that the transaction
-        that represents the update is written to non-volatile storage. A new
-        log file is started when the number of transactions written to the
-        current log file reaches a (variable) threshold. The threshold is
-        computed using the same parameter which influences the frequency of
-        snapshotting (see snapCount above). The log file's suffix is the first
-        zxid written to that log.</p>
-<a name="sc_filemanagement"></a>
-<h4>File Management</h4>
-<p>The format of snapshot and log files does not change between
-        standalone ZooKeeper servers and different configurations of
-        replicated ZooKeeper servers. Therefore, you can pull these files from
-        a running replicated ZooKeeper server to a development machine with a
-        stand-alone ZooKeeper server for trouble shooting.</p>
-<p>Using older log and snapshot files, you can look at the previous
-        state of ZooKeeper servers and even restore that state. The
-        LogFormatter class allows an administrator to look at the transactions
-        in a log.</p>
-<p>The ZooKeeper server creates snapshot and log files, but
-        never deletes them. The retention policy of the data and l

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperAdmin.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperAdmin.pdf b/docs/zookeeperAdmin.pdf
deleted file mode 100644
index 3c81835..0000000
Binary files a/docs/zookeeperAdmin.pdf and /dev/null differ


[11/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperHierarchicalQuorums.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperHierarchicalQuorums.html b/docs/zookeeperHierarchicalQuorums.html
deleted file mode 100644
index 7948729..0000000
--- a/docs/zookeeperHierarchicalQuorums.html
+++ /dev/null
@@ -1,264 +0,0 @@
-<!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>Introduction to hierarchical quorums</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 Documentation</a>
-</li>
-</ul>
-<!--+
-    |end Tabs
-    +-->
-</div>
-</div>
-<div id="main">
-<div id="publishedStrip">
-<!--+
-    |start Subtabs
-    +-->
-<div id="level2tabs"></div>
-<!--+
-    |end Endtabs
-    +-->
-<script type="text/javascript"><!--
-document.write("Last Published: " + document.lastModified);
-//  --></script>
-</div>
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-
-             &nbsp;
-           </div>
-<!--+
-    |start Menu, mainarea
-    +-->
-<!--+
-    |start Menu
-    +-->
-<div id="menu">
-<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
-<div id="menu_1.1" class="menuitemgroup">
-<div class="menuitem">
-<a href="index.html">Welcome</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperHierarchicalQuorums.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>Introduction to hierarchical quorums</h1>
-<div id="front-matter"></div>
-  
-
-  
-
-    
-<p>
-    This document gives an example of how to use hierarchical quorums. The basic idea is
-    very simple. First, we split servers into groups, and add a line for each group listing
-    the servers that form this group. Next we have to assign a weight to each server.  
-    </p>
-    
-    
-<p>
-    The following example shows how to configure a system with three groups of three servers
-    each, and we assign a weight of 1 to each server:
-    </p>
-    
-    
-<pre class="code">
-    group.1=1:2:3
-    group.2=4:5:6
-    group.3=7:8:9
-   
-    weight.1=1
-    weight.2=1
-    weight.3=1
-    weight.4=1
-    weight.5=1
-    weight.6=1
-    weight.7=1
-    weight.8=1
-    weight.9=1
- 	</pre>
-
-	
-<p>    
-    When running the system, we are able to form a quorum once we have a majority of votes from
-    a majority of non-zero-weight groups. Groups that have zero weight are discarded and not
-    considered when forming quorums. Looking at the example, we are able to form a quorum once
-    we have votes from at least two servers from each of two different groups.
-    </p> 
- 
-<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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperHierarchicalQuorums.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperHierarchicalQuorums.pdf b/docs/zookeeperHierarchicalQuorums.pdf
deleted file mode 100644
index b23e319..0000000
Binary files a/docs/zookeeperHierarchicalQuorums.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperInternals.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperInternals.html b/docs/zookeeperInternals.html
deleted file mode 100644
index 08d6ede..0000000
--- a/docs/zookeeperInternals.html
+++ /dev/null
@@ -1,793 +0,0 @@
-<!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 Internals</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 Documentation</a>
-</li>
-</ul>
-<!--+
-    |end Tabs
-    +-->
-</div>
-</div>
-<div id="main">
-<div id="publishedStrip">
-<!--+
-    |start Subtabs
-    +-->
-<div id="level2tabs"></div>
-<!--+
-    |end Endtabs
-    +-->
-<script type="text/javascript"><!--
-document.write("Last Published: " + document.lastModified);
-//  --></script>
-</div>
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-
-             &nbsp;
-           </div>
-<!--+
-    |start Menu, mainarea
-    +-->
-<!--+
-    |start Menu
-    +-->
-<div id="menu">
-<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
-<div id="menu_1.1" class="menuitemgroup">
-<div class="menuitem">
-<a href="index.html">Welcome</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperInternals.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Internals</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_Introduction">Introduction</a>
-</li>
-<li>
-<a href="#sc_atomicBroadcast">Atomic Broadcast</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_guaranteesPropertiesDefinitions">Guarantees, Properties, and Definitions</a>
-</li>
-<li>
-<a href="#sc_leaderElection">Leader Activation</a>
-</li>
-<li>
-<a href="#sc_activeMessaging">Active Messaging</a>
-</li>
-<li>
-<a href="#sc_summary">Summary</a>
-</li>
-<li>
-<a href="#sc_comparisons">Comparisons</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_quorum">Quorums</a>
-</li>
-<li>
-<a href="#sc_logging">Logging</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_developerGuidelines">Developer Guidelines</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_rightLevel">Logging at the Right Level</a>
-</li>
-<li>
-<a href="#sc_slf4jIdioms">Use of Standard slf4j Idioms</a>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_Introduction"></a>
-<h2 class="h3">Introduction</h2>
-<div class="section">
-<p>This document contains information on the inner workings of ZooKeeper. 
-    So far, it discusses these topics:
-    </p>
-<ul>    
-
-<li>
-<p>
-<a href="#sc_atomicBroadcast">Atomic Broadcast</a>
-</p>
-</li>
-
-<li>
-<p>
-<a href="#sc_logging">Logging</a>
-</p>
-</li>
-
-</ul>
-</div>
-
-
-<a name="sc_atomicBroadcast"></a>
-<h2 class="h3">Atomic Broadcast</h2>
-<div class="section">
-<p>
-At the heart of ZooKeeper is an atomic messaging system that keeps all of the servers in sync.</p>
-<a name="sc_guaranteesPropertiesDefinitions"></a>
-<h3 class="h4">Guarantees, Properties, and Definitions</h3>
-<p>
-The specific guarantees provided by the messaging system used by ZooKeeper are the following:</p>
-<dl>
-
-
-<dt>
-<term>
-<em>Reliable delivery</em>
-</term>
-</dt>
-<dd>
-<p>If a message, m, is delivered 
-by one server, it will be eventually delivered by all servers.</p>
-</dd>
-
-
-<dt>
-<term>
-<em>Total order</em>
-</term>
-</dt>
-<dd>
-<p> If a message is 
-delivered before message b by one server, a will be delivered before b by all 
-servers. If a and b are delivered messages, either a will be delivered before b 
-or b will be delivered before a.</p>
-</dd>
-
-
-<dt>
-<term>
-<em>Causal order</em> 
-</term>
-</dt>
-<dd>
-<p>
-If a message b is sent after a message a has been delivered by the sender of b, 
-a must be ordered before b. If a sender sends c after sending b, c must be ordered after b.
-</p>
-</dd>
-
-
-</dl>
-<p>
-The ZooKeeper messaging system also needs to be efficient, reliable, and easy to 
-implement and maintain. We make heavy use of messaging, so we need the system to 
-be able to handle thousands of requests per second. Although we can require at 
-least k+1 correct servers to send new messages, we must be able to recover from 
-correlated failures such as power outages. When we implemented the system we had 
-little time and few engineering resources, so we needed a protocol that is 
-accessible to engineers and is easy to implement. We found that our protocol 
-satisfied all of these goals.
-
-</p>
-<p>
-Our protocol assumes that we can construct point-to-point FIFO channels between 
-the servers. While similar services usually assume message delivery that can 
-lose or reorder messages, our assumption of FIFO channels is very practical 
-given that we use TCP for communication. Specifically we rely on the following property of TCP:</p>
-<dl>
-
-
-<dt>
-<term>
-<em>Ordered delivery</em>
-</term>
-</dt>
-<dd>
-<p>Data is delivered in the same order it is sent and a message m is 
-delivered only after all messages sent before m have been delivered. 
-(The corollary to this is that if message m is lost all messages after m will be lost.)</p>
-</dd>
-
-
-<dt>
-<term>
-<em>No message after close</em>
-</term>
-</dt>
-<dd>
-<p>Once a FIFO channel is closed, no messages will be received from it.</p>
-</dd>
-
-
-</dl>
-<p>
-FLP proved that consensus cannot be achieved in asynchronous distributed systems 
-if failures are possible. To ensure we achieve consensus in the presence of failures 
-we use timeouts. However, we rely on times for liveness not for correctness. So, 
-if timeouts stop working (clocks malfunction for example) the messaging system may 
-hang, but it will not violate its guarantees.</p>
-<p>When describing the ZooKeeper messaging protocol we will talk of packets, 
-proposals, and messages:</p>
-<dl>
-
-<dt>
-<term>
-<em>Packet</em>
-</term>
-</dt>
-<dd>
-<p>a sequence of bytes sent through a FIFO channel</p>
-</dd>
-<dt>
-<term>
-<em>Proposal</em>
-</term>
-</dt>
-<dd>
-<p>a unit of agreement. Proposals are agreed upon by exchanging packets 
-with a quorum of ZooKeeper servers. Most proposals contain messages, however the 
-NEW_LEADER proposal is an example of a proposal that does not correspond to a message.</p>
-</dd>
-<dt>
-<term>
-<em>Message</em>
-</term>
-</dt>
-<dd>
-<p>a sequence of bytes to be atomically broadcast to all ZooKeeper 
-servers. A message put into a proposal and agreed upon before it is delivered.</p>
-</dd>
-
-
-</dl>
-<p>
-As stated above, ZooKeeper guarantees a total order of messages, and it also 
-guarantees a total order of proposals. ZooKeeper exposes the total ordering using
-a ZooKeeper transaction id (<em>zxid</em>). All proposals will be stamped with a zxid when 
-it is proposed and exactly reflects the total ordering. Proposals are sent to all 
-ZooKeeper servers and committed when a quorum of them acknowledge the proposal. 
-If a proposal contains a message, the message will be delivered when the proposal 
-is committed. Acknowledgement means the server has recorded the proposal to persistent storage. 
-Our quorums have the requirement that any pair of quorum must have at least one server 
-in common. We ensure this by requiring that all quorums have size (<em>n/2+1</em>) where 
-n is the number of servers that make up a ZooKeeper service.
-</p>
-<p>
-The zxid has two parts: the epoch and a counter. In our implementation the zxid 
-is a 64-bit number. We use the high order 32-bits for the epoch and the low order 
-32-bits for the counter. Because it has two parts represent the zxid both as a 
-number and as a pair of integers, (<em>epoch, count</em>). The epoch number represents a 
-change in leadership. Each time a new leader comes into power it will have its 
-own epoch number. We have a simple algorithm to assign a unique zxid to a proposal: 
-the leader simply increments the zxid to obtain a unique zxid for each proposal. 
-<em>Leadership activation will ensure that only one leader uses a given epoch, so our 
-simple algorithm guarantees that every proposal will have a unique id.</em>
-
-</p>
-<p>
-ZooKeeper messaging consists of two phases:</p>
-<dl>
-
-<dt>
-<term>
-<em>Leader activation</em>
-</term>
-</dt>
-<dd>
-<p>In this phase a leader establishes the correct state of the system 
-and gets ready to start making proposals.</p>
-</dd>
-
-
-<dt>
-<term>
-<em>Active messaging</em>
-</term>
-</dt>
-<dd>
-<p>In this phase a leader accepts messages to propose and coordinates message delivery.</p>
-</dd>
-
-</dl>
-<p>
-ZooKeeper is a holistic protocol. We do not focus on individual proposals, rather 
-look at the stream of proposals as a whole. Our strict ordering allows us to do this 
-efficiently and greatly simplifies our protocol. Leadership activation embodies 
-this holistic concept. A leader becomes active only when a quorum of followers 
-(The leader counts as a follower as well. You can always vote for yourself ) has synced 
-up with the leader, they have the same state. This state consists of all of the 
-proposals that the leader believes have been committed and the proposal to follow 
-the leader, the NEW_LEADER proposal. (Hopefully you are thinking to 
-yourself, <em>Does the set of proposals that the leader believes has been committed 
-included all the proposals that really have been committed?</em> The answer is <em>yes</em>. 
-Below, we make clear why.)
-</p>
-<a name="sc_leaderElection"></a>
-<h3 class="h4">Leader Activation</h3>
-<p>
-Leader activation includes leader election. We currently have two leader election 
-algorithms in ZooKeeper: LeaderElection and FastLeaderElection (AuthFastLeaderElection 
-is a variant of FastLeaderElection that uses UDP and allows servers to perform a simple
-form of authentication to avoid IP spoofing). ZooKeeper messaging doesn't care about the 
-exact method of electing a leader has long as the following holds:
-</p>
-<ul>
-
-
-<li>
-<p>The leader has seen the highest zxid of all the followers.</p>
-</li>
-
-<li>
-<p>A quorum of servers have committed to following the leader.</p>
-</li>
-
-
-</ul>
-<p>
-Of these two requirements only the first, the highest zxid amoung the followers 
-needs to hold for correct operation. The second requirement, a quorum of followers, 
-just needs to hold with high probability. We are going to recheck the second requirement, 
-so if a failure happens during or after the leader election and quorum is lost, 
-we will recover by abandoning leader activation and running another election.
-</p>
-<p>
-After leader election a single server will be designated as a leader and start 
-waiting for followers to connect. The rest of the servers will try to connect to 
-the leader. The leader will sync up with followers by sending any proposals they 
-are missing, or if a follower is missing too many proposals, it will send a full 
-snapshot of the state to the follower.
-</p>
-<p>
-There is a corner case in which a follower that has proposals, U, not seen 
-by a leader arrives. Proposals are seen in order, so the proposals of U will have a zxids 
-higher than zxids seen by the leader. The follower must have arrived after the 
-leader election, otherwise the follower would have been elected leader given that 
-it has seen a higher zxid. Since committed proposals must be seen by a quorum of 
-servers, and a quorum of servers that elected the leader did not see U, the proposals 
-of you have not been committed, so they can be discarded. When the follower connects 
-to the leader, the leader will tell the follower to discard U.
-</p>
-<p>
-A new leader establishes a zxid to start using for new proposals by getting the 
-epoch, e, of the highest zxid it has seen and setting the next zxid to use to be 
-(e+1, 0), fter the leader syncs with a follower, it will propose a NEW_LEADER 
-proposal. Once the NEW_LEADER proposal has been committed, the leader will activate 
-and start receiving and issuing proposals.
-</p>
-<p>
-It all sounds complicated but here are the basic rules of operation during leader 
-activation:
-</p>
-<ul>
-
-<li>
-<p>A follower will ACK the NEW_LEADER proposal after it has synced with the leader.</p>
-</li>
-
-<li>
-<p>A follower will only ACK a NEW_LEADER proposal with a given zxid from a single server.</p>
-</li>
-
-<li>
-<p>A new leader will COMMIT the NEW_LEADER proposal when a quorum of followers have ACKed it.</p>
-</li>
-
-<li>
-<p>A follower will commit any state it received from the leader when the NEW_LEADER proposal is COMMIT.</p>
-</li>
-
-<li>
-<p>A new leader will not accept new proposals until the NEW_LEADER proposal has been COMMITED.</p>
-</li>
-
-</ul>
-<p>
-If leader election terminates erroneously, we don't have a problem since the 
-NEW_LEADER proposal will not be committed since the leader will not have quorum. 
-When this happens, the leader and any remaining followers will timeout and go back 
-to leader election.
-</p>
-<a name="sc_activeMessaging"></a>
-<h3 class="h4">Active Messaging</h3>
-<p>
-Leader Activation does all the heavy lifting. Once the leader is coronated he can 
-start blasting out proposals. As long as he remains the leader no other leader can 
-emerge since no other leader will be able to get a quorum of followers. If a new 
-leader does emerge, 
-it means that the leader has lost quorum, and the new leader will clean up any 
-mess left over during her leadership activation.
-</p>
-<p>ZooKeeper messaging operates similar to a classic two-phase commit.</p>
-<img alt="" src="images/2pc.jpg"><p>
-All communication channels are FIFO, so everything is done in order. Specifically 
-the following operating constraints are observed:</p>
-<ul>
-
-
-<li>
-<p>The leader sends proposals to all followers using 
-the same order. Moreover, this order follows the order in which requests have been 
-received. Because we use FIFO channels this means that followers also receive proposals in order.
-</p>
-</li>
-
-
-<li>
-<p>Followers process messages in the order they are received. This 
-means that messages will be ACKed in order and the leader will receive ACKs from 
-followers in order, due to the FIFO channels. It also means that if message $m$ 
-has been written to non-volatile storage, all messages that were proposed before 
-$m$ have been written to non-volatile storage.</p>
-</li>
-
-
-<li>
-<p>The leader will issue a COMMIT to all followers as soon as a 
-quorum of followers have ACKed a message. Since messages are ACKed in order, 
-COMMITs will be sent by the leader as received by the followers in order.</p>
-</li>
-
-
-<li>
-<p>COMMITs are processed in order. Followers deliver a proposals 
-message when that proposal is committed.</p>
-</li>
-
-
-</ul>
-<a name="sc_summary"></a>
-<h3 class="h4">Summary</h3>
-<p>So there you go. Why does it work? Specifically, why does a set of proposals 
-believed by a new leader always contain any proposal that has actually been committed? 
-First, all proposals have a unique zxid, so unlike other protocols, we never have 
-to worry about two different values being proposed for the same zxid; followers 
-(a leader is also a follower) see and record proposals in order; proposals are 
-committed in order; there is only one active leader at a time since followers only 
-follow a single leader at a time; a new leader has seen all committed proposals 
-from the previous epoch since it has seen the highest zxid from a quorum of servers; 
-any uncommited proposals from a previous epoch seen by a new leader will be committed 
-by that leader before it becomes active.</p>
-<a name="sc_comparisons"></a>
-<h3 class="h4">Comparisons</h3>
-<p>
-Isn't this just Multi-Paxos? No, Multi-Paxos requires some way of assuring that 
-there is only a single coordinator. We do not count on such assurances. Instead 
-we use the leader activation to recover from leadership change or old leaders 
-believing they are still active.
-</p>
-<p>
-Isn't this just Paxos? Your active messaging phase looks just like phase 2 of Paxos? 
-Actually, to us active messaging looks just like 2 phase commit without the need to 
-handle aborts. Active messaging is different from both in the sense that it has 
-cross proposal ordering requirements. If we do not maintain strict FIFO ordering of 
-all packets, it all falls apart. Also, our leader activation phase is different from 
-both of them. In particular, our use of epochs allows us to skip blocks of uncommitted
-proposals and to not worry about duplicate proposals for a given zxid.
-</p>
-</div>
-
-
-<a name="sc_quorum"></a>
-<h2 class="h3">Quorums</h2>
-<div class="section">
-<p>
-Atomic broadcast and leader election use the notion of quorum to guarantee a consistent
-view of the system. By default, ZooKeeper uses majority quorums, which means that every
-voting that happens in one of these protocols requires a majority to vote on. One example is
-acknowledging a leader proposal: the leader can only commit once it receives an
-acknowledgement from a quorum of servers.
-</p>
-<p>
-If we extract the properties that we really need from our use of majorities, we have that we only
-need to guarantee that groups of processes used to validate an operation by voting (e.g., acknowledging
-a leader proposal) pairwise intersect in at least one server. Using majorities guarantees such a property.
-However, there are other ways of constructing quorums different from majorities. For example, we can assign
-weights to the votes of servers, and say that the votes of some servers are more important. To obtain a quorum,
-we get enough votes so that the sum of weights of all votes is larger than half of the total sum of all weights.    
-</p>
-<p>
-A different construction that uses weights and is useful in wide-area deployments (co-locations) is a hierarchical
-one. With this construction, we split the servers into disjoint groups and assign weights to processes. To form 
-a quorum, we have to get a hold of enough servers from a majority of groups G, such that for each group g in G,
-the sum of votes from g is larger than half of the sum of weights in g. Interestingly, this construction enables
-smaller quorums. If we have, for example, 9 servers, we split them into 3 groups, and assign a weight of 1 to each
-server, then we are able to form quorums of size 4. Note that two subsets of processes composed each of a majority
-of servers from each of a majority of groups necessarily have a non-empty intersection. It is reasonable to expect
-that a majority of co-locations will have a majority of servers available with high probability. 
-</p>
-<p>
-With ZooKeeper, we provide a user with the ability of configuring servers to use majority quorums, weights, or a 
-hierarchy of groups.
-</p>
-</div>
-
-
-<a name="sc_logging"></a>
-<h2 class="h3">Logging</h2>
-<div class="section">
-<p>
-Zookeeper uses 
-<a href="http://www.slf4j.org/index.html">slf4j</a> as an abstraction layer for logging. 
-<a href="http://logging.apache.org/log4j">log4j</a> in version 1.2 is chosen as the final logging implementation for now.
-For better embedding support, it is planned in the future to leave the decision of choosing the final logging implementation to the end user.
-Therefore, always use the slf4j api to write log statements in the code, but configure log4j for how to log at runtime.
-Note that slf4j has no FATAL level, former messages at FATAL level have been moved to ERROR level. 
-For information on configuring log4j for
-ZooKeeper, see the <a href="zookeeperAdmin.html#sc_logging">Logging</a> section 
-of the <a href="zookeeperAdmin.html">ZooKeeper Administrator's Guide.</a>
-
-
-</p>
-<a name="sc_developerGuidelines"></a>
-<h3 class="h4">Developer Guidelines</h3>
-<p>Please follow the  
-<a href="http://www.slf4j.org/manual.html">slf4j manual</a> when creating log statements within code.
-Also read the
-<a href="http://www.slf4j.org/faq.html#logging_performance">FAQ on performance</a>
-, when creating log statements. Patch reviewers will look for the following:</p>
-<a name="sc_rightLevel"></a>
-<h4>Logging at the Right Level</h4>
-<p>
-There are several levels of logging in slf4j. 
-It's important to pick the right one. In order of higher to lower severity:</p>
-<ol>
-   
-<li>
-<p>ERROR level designates error events that might still allow the application to continue running.</p>
-</li>
-   
-<li>
-<p>WARN level designates potentially harmful situations.</p>
-</li>
-   
-<li>
-<p>INFO level designates informational messages that highlight the progress of the application at coarse-grained level.</p>
-</li>
-   
-<li>
-<p>DEBUG Level designates fine-grained informational events that are most useful to debug an application.</p>
-</li>
-   
-<li>
-<p>TRACE Level designates finer-grained informational events than the DEBUG.</p>
-</li>
-
-</ol>
-<p>
-ZooKeeper is typically run in production such that log messages of INFO level 
-severity and higher (more severe) are output to the log.</p>
-<a name="sc_slf4jIdioms"></a>
-<h4>Use of Standard slf4j Idioms</h4>
-<p>
-<em>Static Message Logging</em>
-</p>
-<pre class="code">
-LOG.debug("process completed successfully!");
-</pre>
-<p>
-However when creating parameterized messages are required, use formatting anchors.
-</p>
-<pre class="code">
-LOG.debug("got {} messages in {} minutes",new Object[]{count,time});    
-</pre>
-<p>
-<em>Naming</em>
-</p>
-<p>
-Loggers should be named after the class in which they are used.
-</p>
-<pre class="code">
-public class Foo {
-    private static final Logger LOG = LoggerFactory.getLogger(Foo.class);
-    ....
-    public Foo() {
-       LOG.info("constructing Foo");
-</pre>
-<p>
-<em>Exception handling</em>
-</p>
-<pre class="code">
-try {
-  // code
-} catch (XYZException e) {
-  // do this
-  LOG.error("Something bad happened", e);
-  // don't do this (generally)
-  // LOG.error(e);
-  // why? because "don't do" case hides the stack trace
- 
-  // continue process here as you need... recover or (re)throw
-}
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperInternals.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperInternals.pdf b/docs/zookeeperInternals.pdf
deleted file mode 100644
index ec99459..0000000
Binary files a/docs/zookeeperInternals.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperJMX.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperJMX.html b/docs/zookeeperJMX.html
deleted file mode 100644
index 40f9574..0000000
--- a/docs/zookeeperJMX.html
+++ /dev/null
@@ -1,467 +0,0 @@
-<!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 JMX</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<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="menupage">
-<div class="menupagetitle">JMX</div>
-</div>
-<div class="menuitem">
-<a href="zookeeperObservers.html">Observers Guide</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperJMX.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper JMX</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_jmx">JMX</a>
-</li>
-<li>
-<a href="#ch_starting">Starting ZooKeeper with JMX enabled</a>
-</li>
-<li>
-<a href="#ch_console">Run a JMX console</a>
-</li>
-<li>
-<a href="#ch_reference">ZooKeeper MBean Reference</a>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_jmx"></a>
-<h2 class="h3">JMX</h2>
-<div class="section">
-<p>Apache ZooKeeper has extensive support for JMX, allowing you
-    to view and manage a ZooKeeper serving ensemble.</p>
-<p>This document assumes that you have basic knowledge of
-    JMX. See <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">
-    Sun JMX Technology</a> page to get started with JMX.
-    </p>
-<p>See the <a href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html">
-    JMX Management Guide</a> for details on setting up local and
-    remote management of VM instances. By default the included
-    <em>zkServer.sh</em> supports only local management -
-    review the linked document to enable support for remote management
-    (beyond the scope of this document).
-    </p>
-</div>
-
-  
-<a name="ch_starting"></a>
-<h2 class="h3">Starting ZooKeeper with JMX enabled</h2>
-<div class="section">
-<p>The class
-      <em>org.apache.zookeeper.server.quorum.QuorumPeerMain</em>
-      will start a JMX manageable ZooKeeper server. This class
-      registers the proper MBeans during initalization to support JMX
-      monitoring and management of the
-      instance. See <em>bin/zkServer.sh</em> for one
-      example of starting ZooKeeper using QuorumPeerMain.</p>
-</div>
-
-  
-<a name="ch_console"></a>
-<h2 class="h3">Run a JMX console</h2>
-<div class="section">
-<p>There are a number of JMX consoles available which can connect
-      to the running server. For this example we will use Sun's
-      <em>jconsole</em>.</p>
-<p>The Java JDK ships with a simple JMX console
-      named <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a>
-      which can be used to connect to ZooKeeper and inspect a running
-      server. Once you've started ZooKeeper using QuorumPeerMain
-      start <em>jconsole</em>, which typically resides in
-      <em>JDK_HOME/bin/jconsole</em>
-</p>
-<p>When the "new connection" window is displayed either connect
-      to local process (if jconsole started on same host as Server) or
-      use the remote process connection.</p>
-<p>By default the "overview" tab for the VM is displayed (this
-      is a great way to get insight into the VM btw). Select
-      the "MBeans" tab.</p>
-<p>You should now see <em>org.apache.ZooKeeperService</em>
-      on the left hand side. Expand this item and depending on how you've
-      started the server you will be able to monitor and manage various
-      service related features.</p>
-<p>Also note that ZooKeeper will register log4j MBeans as
-    well. In the same section along the left hand side you will see
-    "log4j". Expand that to manage log4j through JMX. Of particular
-    interest is the ability to dynamically change the logging levels
-    used by editing the appender and root thresholds. Log4j MBean
-    registration can be disabled by passing
-    <em>-Dzookeeper.jmx.log4j.disable=true</em> to the JVM
-    when starting ZooKeeper.
-    </p>
-</div>
-
-  
-<a name="ch_reference"></a>
-<h2 class="h3">ZooKeeper MBean Reference</h2>
-<div class="section">
-<p>This table details JMX for a server participating in a
-    replicated ZooKeeper ensemble (ie not standalone). This is the
-    typical case for a production environment.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<caption>MBeans, their names and description</caption>
-      
-<title>MBeans, their names and description</title>
-
-      
-          
-<tr>
-            
-<th>MBean</th>
-            <th>MBean Object Name</th>
-            <th>Description</th>
-          
-</tr>
-        
-          
-<tr>
-            
-<td>Quorum</td>
-            <td>ReplicatedServer_id&lt;#&gt;</td>
-            <td>Represents the Quorum, or Ensemble - parent of all
-            cluster members. Note that the object name includes the
-            "myid" of the server (name suffix) that your JMX agent has
-            connected to.</td>
-          
-</tr>
-          
-<tr>
-            
-<td>LocalPeer|RemotePeer</td>
-            <td>replica.&lt;#&gt;</td>
-            <td>Represents a local or remote peer (ie server
-            participating in the ensemble). Note that the object name
-            includes the "myid" of the server (name suffix).</td>
-          
-</tr>
-          
-<tr>
-            
-<td>LeaderElection</td>
-            <td>LeaderElection</td>
-            <td>Represents a ZooKeeper cluster leader election which is
-            in progress. Provides information about the election, such as
-            when it started.</td>
-          
-</tr>
-          
-<tr>
-            
-<td>Leader</td>
-            <td>Leader</td>
-            <td>Indicates that the parent replica is the leader and
-            provides attributes/operations for that server. Note that
-            Leader is a subclass of ZooKeeperServer, so it provides
-            all of the information normally associated with a
-            ZooKeeperServer node.</td>
-          
-</tr>
-          
-<tr>
-            
-<td>Follower</td>
-            <td>Follower</td>
-            <td>Indicates that the parent replica is a follower and
-            provides attributes/operations for that server. Note that
-            Follower is a subclass of ZooKeeperServer, so it provides
-            all of the information normally associated with a
-            ZooKeeperServer node.</td>
-          
-</tr>
-          
-<tr>
-            
-<td>DataTree</td>
-            <td>InMemoryDataTree</td>
-            <td>Statistics on the in memory znode database, also
-            operations to access finer (and more computationally
-            intensive) statistics on the data (such as ephemeral
-            count). InMemoryDataTrees are children of ZooKeeperServer
-            nodes.</td>
-          
-</tr>
-          
-<tr>
-            
-<td>ServerCnxn</td>
-            <td>&lt;session_id&gt;</td>
-            <td>Statistics on each client connection, also
-            operations on those connections (such as
-            termination). Note the object name is the session id of
-            the connection in hex form.</td>
-          
-</tr>
-    
-</table>
-<p>This table details JMX for a standalone server. Typically
-    standalone is only used in development situations.</p>
-<table class="ForrestTable" cellspacing="1" cellpadding="4">
-<caption>MBeans, their names and description</caption>
-      
-<title>MBeans, their names and description</title>
-
-      
-          
-<tr>
-            
-<th>MBean</th>
-            <th>MBean Object Name</th>
-            <th>Description</th>
-          
-</tr>
-        
-          
-<tr>
-            
-<td>ZooKeeperServer</td>
-            <td>StandaloneServer_port&lt;#&gt;</td>
-            <td>Statistics on the running server, also operations
-            to reset these attributes. Note that the object name
-            includes the client port of the server (name
-            suffix).</td>
-          
-</tr>
-          
-<tr>
-            
-<td>DataTree</td>
-            <td>InMemoryDataTree</td>
-            <td>Statistics on the in memory znode database, also
-            operations to access finer (and more computationally
-            intensive) statistics on the data (such as ephemeral
-            count).</td>
-          
-</tr>
-          
-<tr>
-            
-<td>ServerCnxn</td>
-            <td>&lt;session_id&gt;</td>
-            <td>Statistics on each client connection, also
-            operations on those connections (such as
-            termination). Note the object name is the session id of
-            the connection in hex form.</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperJMX.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperJMX.pdf b/docs/zookeeperJMX.pdf
deleted file mode 100644
index 37416f3..0000000
Binary files a/docs/zookeeperJMX.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperObservers.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperObservers.html b/docs/zookeeperObservers.html
deleted file mode 100644
index 842839c..0000000
--- a/docs/zookeeperObservers.html
+++ /dev/null
@@ -1,354 +0,0 @@
-<!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 Observers</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<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="menupage">
-<div class="menupagetitle">Observers Guide</div>
-</div>
-<div class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperObservers.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Observers</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_Introduction">Observers: Scaling ZooKeeper Without Hurting Write Performance
-      </a>
-</li>
-<li>
-<a href="#sc_UsingObservers">How to use Observers</a>
-</li>
-<li>
-<a href="#ch_UseCases">Example use cases</a>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_Introduction"></a>
-<h2 class="h3">Observers: Scaling ZooKeeper Without Hurting Write Performance
-      </h2>
-<div class="section">
-<p>
-      Although ZooKeeper performs very well by having clients connect directly
-      to voting members of the ensemble, this architecture makes it hard to
-      scale out to huge numbers of clients. The problem is that as we add more
-      voting members, the write performance drops. This is due to the fact that
-      a write operation requires the agreement of (in general) at least half the
-      nodes in an ensemble and therefore the cost of a vote can increase
-      significantly as more voters are added.
-    </p>
-<p>
-      We have introduced a new type of ZooKeeper node called
-      an <em>Observer</em> which helps address this problem and
-      further improves ZooKeeper's scalability. Observers are non-voting members
-      of an ensemble which only hear the results of votes, not the agreement
-      protocol that leads up to them. Other than this simple distinction,
-      Observers function exactly the same as Followers - clients may connect to
-      them and send read and write requests to them. Observers forward these
-      requests to the Leader like Followers do, but they then simply wait to
-      hear the result of the vote. Because of this, we can increase the number
-      of Observers as much as we like without harming the performance of votes.
-    </p>
-<p>
-      Observers have other advantages. Because they do not vote, they are not a
-      critical part of the ZooKeeper ensemble. Therefore they can fail, or be
-      disconnected from the cluster, without harming the availability of the
-      ZooKeeper service. The benefit to the user is that Observers may connect
-      over less reliable network links than Followers. In fact, Observers may be
-      used to talk to a ZooKeeper server from another data center. Clients of
-      the Observer will see fast reads, as all reads are served locally, and
-      writes result in minimal network traffic as the number of messages
-      required in the absence of the vote protocol is smaller.
-    </p>
-</div>
-  
-<a name="sc_UsingObservers"></a>
-<h2 class="h3">How to use Observers</h2>
-<div class="section">
-<p>Setting up a ZooKeeper ensemble that uses Observers is very simple,
-    and requires just two changes to your config files. Firstly, in the config
-    file of every node that is to be an Observer, you must place this line:
-    </p>
-<pre class="code">
-      peerType=observer
-    </pre>
-<p>
-      This line tells ZooKeeper that the server is to be an Observer. Secondly,
-      in every server config file, you must add :observer to the server
-      definition line of each Observer. For example:
-    </p>
-<pre class="code">
-      server.1:localhost:2181:3181:observer
-    </pre>
-<p>
-      This tells every other server that server.1 is an Observer, and that they
-      should not expect it to vote. This is all the configuration you need to do
-      to add an Observer to your ZooKeeper cluster. Now you can connect to it as
-      though it were an ordinary Follower. Try it out, by running:</p>
-<pre class="code">
-      $ bin/zkCli.sh -server localhost:2181
-    </pre>
-<p>
-      where localhost:2181 is the hostname and port number of the Observer as
-      specified in every config file. You should see a command line prompt
-      through which you can issue commands like <em>ls</em> to query
-      the ZooKeeper service.
-    </p>
-</div>
-  
-  
-<a name="ch_UseCases"></a>
-<h2 class="h3">Example use cases</h2>
-<div class="section">
-<p>
-      Two example use cases for Observers are listed below. In fact, wherever
-      you wish to scale the number of clients of your ZooKeeper ensemble, or
-      where you wish to insulate the critical part of an ensemble from the load
-      of dealing with client requests, Observers are a good architectural
-      choice.
-    </p>
-<ul>
-      
-<li>
-	
-<p> As a datacenter bridge: Forming a ZK ensemble between two
-	datacenters is a problematic endeavour as the high variance in latency
-	between the datacenters could lead to false positive failure detection
-	and partitioning. However if the ensemble runs entirely in one
-	datacenter, and the second datacenter runs only Observers, partitions
-	aren't problematic as the ensemble remains connected. Clients of the
-	Observers may still see and issue proposals.</p>
-      
-</li>
-      
-<li>
-	
-<p>As a link to a message bus: Some companies have expressed an
-	interest in using ZK as a component of a persistent reliable message
-	bus. Observers would give a natural integration point for this work: a
-	plug-in mechanism could be used to attach the stream of proposals an
-	Observer sees to a publish-subscribe system, again without loading the
-	core ensemble.
-	</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperObservers.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperObservers.pdf b/docs/zookeeperObservers.pdf
deleted file mode 100644
index 95924c7..0000000
Binary files a/docs/zookeeperObservers.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperOtherInfo.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperOtherInfo.html b/docs/zookeeperOtherInfo.html
deleted file mode 100644
index 24b594c..0000000
--- a/docs/zookeeperOtherInfo.html
+++ /dev/null
@@ -1,230 +0,0 @@
-<!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>ZooKeeper</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="The Hadoop database"></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 Documentation</a>
-</li>
-</ul>
-<!--+
-    |end Tabs
-    +-->
-</div>
-</div>
-<div id="main">
-<div id="publishedStrip">
-<!--+
-    |start Subtabs
-    +-->
-<div id="level2tabs"></div>
-<!--+
-    |end Endtabs
-    +-->
-<script type="text/javascript"><!--
-document.write("Last Published: " + document.lastModified);
-//  --></script>
-</div>
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-
-             &nbsp;
-           </div>
-<!--+
-    |start Menu, mainarea
-    +-->
-<!--+
-    |start Menu
-    +-->
-<div id="menu">
-<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
-<div id="menu_1.1" class="menuitemgroup">
-<div class="menuitem">
-<a href="index.html">Welcome</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" class="menuitemgroup">
-<div class="menuitem">
-<a href="zookeeperAdmin.html">Administrator's Guide</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 class="menuitem">
-<a href="zookeeperInternals.html">ZooKeeper Internals</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_selected_1.5', 'skin/')" id="menu_selected_1.5Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Informal Documentation</div>
-<div id="menu_selected_1.5" class="selectedmenuitemgroup" style="display: block;">
-<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 class="menupage">
-<div class="menupagetitle">Other Info</div>
-</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="zookeeperOtherInfo.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper</h1>
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_placeholder">Other Info</a>
-</li>
-</ul>
-</div>
-  
-
-  
-
-  
-<a name="N10009"></a><a name="ch_placeholder"></a>
-<h2 class="h3">Other Info</h2>
-<div class="section">
-<p> currently empty </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>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperOtherInfo.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperOtherInfo.pdf b/docs/zookeeperOtherInfo.pdf
deleted file mode 100644
index bbefa13..0000000
--- a/docs/zookeeperOtherInfo.pdf
+++ /dev/null
@@ -1,151 +0,0 @@
-%PDF-1.3
-%����
-4 0 obj
-<< /Type /Info
-/Producer (FOP 0.20.5) >>
-endobj
-5 0 obj
-<< /Length 376 /Filter [ /ASCII85Decode /FlateDecode ]
- >>
-stream
-Gau`Mb>,r/&A7ljp=L?eeuq2r'N#/r+G<Ne%Vb2bPtG<0!:&H?4/G[aGO0rFp<;0q4#QAF-:'%*0Jt)i</b5(37))S./[5J#\BHWH%VI*ZZGllDJb`U/"!qV:^m1VO\R4"ngI].:[AM"qMVL5''BAQP`(Mqi'M+,20!co=0Cq-g[@md)E=;bE>%,)E0Ns*L3uZ2^Z[t57XsV@TC:sfgU;83KJ!2\3;b.*./e[Q3!QrKlod0V'Tl=KR0FD?9dhi?(2EQaVS:I;<%5[hA;@CocWk6:;@S=JSIJ#tG2%GS?8]DL7$d`BF.mkIJgc]$1cBrdD-;kgPH4SaZ5]@Ygdet-qmC3Z,hm,Z#]K0$f^<SMBpT[3Ifn6SQt$~>
-endstream
-endobj
-6 0 obj
-<< /Type /Page
-/Parent 1 0 R
-/MediaBox [ 0 0 612 792 ]
-/Resources 3 0 R
-/Contents 5 0 R
-/Annots 7 0 R
->>
-endobj
-7 0 obj
-[
-8 0 R
-]
-endobj
-8 0 obj
-<< /Type /Annot
-/Subtype /Link
-/Rect [ 102.0 529.541 160.316 517.541 ]
-/C [ 0 0 0 ]
-/Border [ 0 0 0 ]
-/A 9 0 R
-/H /I
->>
-endobj
-10 0 obj
-<< /Length 385 /Filter [ /ASCII85Decode /FlateDecode ]
- >>
-stream
-Gar'$0i,\@&;>?.MAt<DY0X@_H_cHA?iWTl!^gXl[Se%L2[/m3@jaPPaO<5AhtPtZ$8Ps<5X?8%'k+<m#V8(@_nmr@)9".^iWu_$Uf3Y#)<[4(G%Z5dGBN#En.*E#\LGU40Sr9.Uc6BueThY!gRW>[*5$t9nk9g]0*-@Es2tn16M9R8fm?r4LJ'tfA(+`gk'Y9:;_b]l-4GP.KqSN+^!4^1#A]fr4CsMK4!6:IPoO6gb%47LrMIO5"<!^cSUh+7e,X_C[l-]TMAhb$R.*s>AAa\3k"<_BX\h]*EX>p&XOp`_]B8,IgKiS0kudb@92(4!VNWKQ2MnK3>`\Q9X4m$jO![MDXuBq(G;UCh3ujFIfVak?-gSP6L8N`(!1BR4[K~>
-endstream
-endobj
-11 0 obj
-<< /Type /Page
-/Parent 1 0 R
-/MediaBox [ 0 0 612 792 ]
-/Resources 3 0 R
-/Contents 10 0 R
->>
-endobj
-13 0 obj
-<<
- /Title (\376\377\0\61\0\40\0\117\0\164\0\150\0\145\0\162\0\40\0\111\0\156\0\146\0\157)
- /Parent 12 0 R
- /A 9 0 R
->> endobj
-14 0 obj
-<< /Type /Font
-/Subtype /Type1
-/Name /F3
-/BaseFont /Helvetica-Bold
-/Encoding /WinAnsiEncoding >>
-endobj
-15 0 obj
-<< /Type /Font
-/Subtype /Type1
-/Name /F5
-/BaseFont /Times-Roman
-/Encoding /WinAnsiEncoding >>
-endobj
-16 0 obj
-<< /Type /Font
-/Subtype /Type1
-/Name /F1
-/BaseFont /Helvetica
-/Encoding /WinAnsiEncoding >>
-endobj
-17 0 obj
-<< /Type /Font
-/Subtype /Type1
-/Name /F2
-/BaseFont /Helvetica-Oblique
-/Encoding /WinAnsiEncoding >>
-endobj
-18 0 obj
-<< /Type /Font
-/Subtype /Type1
-/Name /F7
-/BaseFont /Times-Bold
-/Encoding /WinAnsiEncoding >>
-endobj
-1 0 obj
-<< /Type /Pages
-/Count 2
-/Kids [6 0 R 11 0 R ] >>
-endobj
-2 0 obj
-<< /Type /Catalog
-/Pages 1 0 R
- /Outlines 12 0 R
- /PageMode /UseOutlines
- >>
-endobj
-3 0 obj
-<< 
-/Font << /F3 14 0 R /F5 15 0 R /F1 16 0 R /F2 17 0 R /F7 18 0 R >> 
-/ProcSet [ /PDF /ImageC /Text ] >> 
-endobj
-9 0 obj
-<<
-/S /GoTo
-/D [11 0 R /XYZ 85.0 659.0 null]
->>
-endobj
-12 0 obj
-<<
- /First 13 0 R
- /Last 13 0 R
->> endobj
-xref
-0 19
-0000000000 65535 f 
-0000002095 00000 n 
-0000002160 00000 n 
-0000002252 00000 n 
-0000000015 00000 n 
-0000000071 00000 n 
-0000000538 00000 n 
-0000000658 00000 n 
-0000000683 00000 n 
-0000002375 00000 n 
-0000000818 00000 n 
-0000001295 00000 n 
-0000002438 00000 n 
-0000001403 00000 n 
-0000001539 00000 n 
-0000001652 00000 n 
-0000001762 00000 n 
-0000001870 00000 n 
-0000001986 00000 n 
-trailer
-<<
-/Size 19
-/Root 2 0 R
-/Info 4 0 R
->>
-startxref
-2489
-%%EOF


[03/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperProgrammers.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperProgrammers.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperProgrammers.xml
deleted file mode 100644
index 903b469..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperProgrammers.xml
+++ /dev/null
@@ -1,1872 +0,0 @@
-<?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_programmersGuide">
-  <title>ZooKeeper Programmer's Guide</title>
-
-  <subtitle>Developing Distributed Applications that use ZooKeeper</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 guide contains detailed information about creating
-      distributed applications that use ZooKeeper. It discusses the basic
-      operations ZooKeeper supports, and how these can be used to build
-      higher-level abstractions. It contains solutions to common tasks, a
-      troubleshooting guide, and links to other information.</para>
-
-      <para>$Revision: 1.14 $ $Date: 2008/09/19 05:31:45 $</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="_introduction">
-    <title>Introduction</title>
-
-    <para>This document is a guide for developers wishing to create
-    distributed applications that take advantage of ZooKeeper's coordination
-    services. It contains conceptual and practical information.</para>
-
-    <para>The first four sections of this guide present higher level
-    discussions of various ZooKeeper concepts. These are necessary both for an
-    understanding of how ZooKeeper works as well how to work with it. It does
-    not contain source code, but it does assume a familiarity with the
-    problems associated with distributed computing. The sections in this first
-    group are:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para><xref linkend="ch_zkDataModel" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_zkSessions" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_zkWatches" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_zkGuarantees" /></para>
-      </listitem>
-    </itemizedlist>
-
-    <para>The next four sections provide practical programming
-    information. These are:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para><xref linkend="ch_guideToZkOperations" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_bindings" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_programStructureWithExample" />
-        <emphasis>[tbd]</emphasis></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="ch_gotchas" /></para>
-      </listitem>
-    </itemizedlist>
-
-    <para>The book concludes with an <ulink
-    url="#apx_linksToOtherInfo">appendix</ulink> containing links to other
-    useful, ZooKeeper-related information.</para>
-
-    <para>Most of information in this document is written to be accessible as
-    stand-alone reference material. However, before starting your first
-    ZooKeeper application, you should probably at least read the chaptes on
-    the <ulink url="#ch_zkDataModel">ZooKeeper Data Model</ulink> and <ulink
-    url="#ch_guideToZkOperations">ZooKeeper Basic Operations</ulink>. Also,
-    the <ulink url="#ch_programStructureWithExample">Simple Programmming
-    Example</ulink> <emphasis>[tbd]</emphasis> is helpful for understanding the basic
-    structure of a ZooKeeper client application.</para>
-  </section>
-
-  <section id="ch_zkDataModel">
-    <title>The ZooKeeper Data Model</title>
-
-    <para>ZooKeeper has a hierarchal name space, much like a distributed file
-    system. The only difference is that each node in the namespace can have
-    data associated with it as well as children. It is like having a file
-    system that allows a file to also be a directory. Paths to nodes are
-    always expressed as canonical, absolute, slash-separated paths; there are
-    no relative reference. Any unicode character can be used in a path subject
-    to the following constraints:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>The null character (\u0000) cannot be part of a path name. (This
-        causes problems with the C binding.)</para>
-      </listitem>
-
-      <listitem>
-        <para>The following characters can't be used because they don't
-        display well, or render in confusing ways: \u0001 - \u001F and \u007F
-        - \u009F.</para>
-      </listitem>
-
-      <listitem>
-        <para>The following characters are not allowed: \ud800 - uF8FF,
-        \uFFF0 - uFFFF.</para>
-      </listitem>
-
-      <listitem>
-        <para>The "." character can be used as part of another name, but "."
-        and ".." cannot alone be used to indicate a node along a path,
-        because ZooKeeper doesn't use relative paths. The following would be
-        invalid: "/a/b/./c" or "/a/b/../c".</para>
-      </listitem>
-
-      <listitem>
-        <para>The token "zookeeper" is reserved.</para>
-      </listitem>
-    </itemizedlist>
-
-    <section id="sc_zkDataModel_znodes">
-      <title>ZNodes</title>
-
-      <para>Every node in a ZooKeeper tree is referred to as a
-      <emphasis>znode</emphasis>. Znodes maintain a stat structure that
-      includes version numbers for data changes, acl changes. The stat
-      structure also has timestamps. The version number, together with the
-      timestamp, allows ZooKeeper to validate the cache and to coordinate
-      updates. Each time a znode's data changes, the version number increases.
-      For instance, whenever a client retrieves data, it also receives the
-      version of the data. And when a client performs an update or a delete,
-      it must supply the version of the data of the znode it is changing. If
-      the version it supplies doesn't match the actual version of the data,
-      the update will fail. (This behavior can be overridden. For more
-      information see... )<emphasis>[tbd...]</emphasis></para>
-
-      <note>
-        <para>In distributed application engineering, the word
-        <emphasis>node</emphasis> can refer to a generic host machine, a
-        server, a member of an ensemble, a client process, etc. In the ZooKeeper
-        documentation, <emphasis>znodes</emphasis> refer to the data nodes.
-        <emphasis>Servers</emphasis>  refer to machines that make up the
-        ZooKeeper service; <emphasis>quorum peers</emphasis> refer to the
-        servers that make up an ensemble; client refers to any host or process
-        which uses a ZooKeeper service.</para>
-      </note>
-
-      <para>Znodes are the main enitity that a programmer access. They have
-      several characteristics that are worth mentioning here.</para>
-
-      <section id="sc_zkDataMode_watches">
-        <title>Watches</title>
-
-        <para>Clients can set watches on znodes. Changes to that znode trigger
-        the watch and then clear the watch. When a watch triggers, ZooKeeper
-        sends the client a notification. More information about watches can be
-        found in the section 
-	    <ulink url="#ch_zkWatches">ZooKeeper Watches</ulink>.</para>
-      </section>
-
-      <section>
-        <title>Data Access</title>
-
-        <para>The data stored at each znode in a namespace is read and written
-        atomically. Reads get all the data bytes associated with a znode and a
-        write replaces all the data. Each node has an Access Control List
-        (ACL) that restricts who can do what.</para>
-        
-        <para>ZooKeeper was not designed to be a general database or large
-        object store. Instead, it manages coordination data. This data can
-        come in the form of configuration, status information, rendezvous, etc.
-        A common property of the various forms of coordination data is that
-        they are relatively small: measured in kilobytes.
-        The ZooKeeper client and the server implementations have sanity checks
-        to ensure that znodes have less than 1M of data, but the data should
-        be much less than that on average. Operating on relatively large data
-        sizes will cause some operations to take much more time than others and
-        will affect the latencies of some operations because of the extra time
-        needed to move more data over the network and onto storage media. If
-        large data storage is needed, the usually pattern of dealing with such
-        data is to store it on a bulk storage system, such as NFS or HDFS, and
-        store pointers to the storage locations in ZooKeeper.</para> 
-      </section>
-
-      <section>
-        <title>Ephemeral Nodes</title>
-
-        <para>ZooKeeper also has the notion of ephemeral nodes. These znodes
-        exists as long as the session that created the znode is active. When
-        the session ends the znode is deleted. Because of this behavior
-        ephemeral znodes are not allowed to have children.</para>
-      </section>
-
-      <section>
-        <title>Sequence Nodes -- Unique Naming</title>
-
-        <para>When creating a znode you can also request that
-        ZooKeeper append a monotonically increasing counter to the end
-        of path. This counter is unique to the parent znode. The
-        counter has a format of %010d -- that is 10 digits with 0
-        (zero) padding (the counter is formatted in this way to
-        simplify sorting), i.e. "&lt;path&gt;0000000001". See
-        <ulink url="recipes.html#sc_recipes_Queues">Queue
-        Recipe</ulink> for an example use of this feature. Note: the
-        counter used to store the next sequence number is a signed int
-        (4bytes) maintained by the parent node, the counter will
-        overflow when incremented beyond 2147483647 (resulting in a
-        name "&lt;path&gt;-2147483648").</para>
-      </section>
-
-      <section>
-        <title>Container Nodes</title>
-
-        <para><emphasis role="bold">Added in 3.5.3</emphasis></para>
-
-        <para>ZooKeeper has the notion of container znodes. Container znodes are
-          special purpose znodes useful for recipes such as leader, lock, etc.
-          When the last child of a container is deleted, the container becomes
-          a candidate to be deleted by the server at some point in the future.</para>
-
-        <para>Given this property, you should be prepared to get
-          KeeperException.NoNodeException when creating children inside of
-          container znodes. i.e. when creating child znodes inside of container znodes
-          always check for KeeperException.NoNodeException and recreate the container
-          znode when it occurs.</para>
-      </section>
-
-      <section>
-        <title>TTL Nodes</title>
-
-        <para><emphasis role="bold">Added in 3.5.3</emphasis></para>
-
-        <para>When creating PERSISTENT or PERSISTENT_SEQUENTIAL znodes,
-          you can optionally set a TTL in milliseconds for the znode. If the znode
-          is not modified within the TTL and has no children it will become a candidate
-          to be deleted by the server at some point in the future.</para>
-
-        <para>Note: TTL Nodes must be enabled via System property as
-        they are disabled by default. See the <ulink url="zookeeperAdmin.html#sc_configuration">Administrator's
-        Guide</ulink> for details. If you attempt to create TTL Nodes without the proper System property set the server
-        will throw <emphasis>KeeperException.UnimplementedException</emphasis>.</para>
-      </section>
-    </section>
-
-    <section id="sc_timeInZk">
-      <title>Time in ZooKeeper</title>
-
-      <para>ZooKeeper tracks time multiple ways:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para><emphasis role="bold">Zxid</emphasis></para>
-
-          <para>Every change to the ZooKeeper state receives a stamp in the
-          form of a <emphasis>zxid</emphasis> (ZooKeeper Transaction Id).
-          This exposes the total ordering of all changes to ZooKeeper. Each
-          change will have a unique zxid and if zxid1 is smaller than zxid2
-          then zxid1 happened before zxid2.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">Version numbers</emphasis></para>
-
-          <para>Every change to a node will cause an increase to one of the
-          version numbers of that node. The three version numbers are version
-          (number of changes to the data of a znode), cversion (number of
-          changes to the children of a znode), and aversion (number of changes
-          to the ACL of a znode).</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">Ticks</emphasis></para>
-
-          <para>When using multi-server ZooKeeper, servers use ticks to define
-          timing of events such as status uploads, session timeouts,
-          connection timeouts between peers, etc. The tick time is only
-          indirectly exposed through the minimum session timeout (2 times the
-          tick time); if a client requests a session timeout less than the
-          minimum session timeout, the server will tell the client that the
-          session timeout is actually the minimum session timeout.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">Real time</emphasis></para>
-
-          <para>ZooKeeper doesn't use real time, or clock time, at all except
-          to put timestamps into the stat structure on znode creation and
-          znode modification.</para>
-        </listitem>
-      </itemizedlist>
-    </section>
-
-    <section id="sc_zkStatStructure">
-      <title>ZooKeeper Stat Structure</title>
-
-      <para>The Stat structure for each znode in ZooKeeper is made up of the
-      following fields:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para><emphasis role="bold">czxid</emphasis></para>
-
-          <para>The zxid of the change that caused this znode to be
-          created.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">mzxid</emphasis></para>
-
-          <para>The zxid of the change that last modified this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">pzxid</emphasis></para>
-
-          <para>The zxid of the change that last modified children of this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">ctime</emphasis></para>
-
-          <para>The time in milliseconds from epoch when this znode was
-          created.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">mtime</emphasis></para>
-
-          <para>The time in milliseconds from epoch when this znode was last
-          modified.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">version</emphasis></para>
-
-          <para>The number of changes to the data of this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">cversion</emphasis></para>
-
-          <para>The number of changes to the children of this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">aversion</emphasis></para>
-
-          <para>The number of changes to the ACL of this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">ephemeralOwner</emphasis></para>
-
-          <para>The session id of the owner of this znode if the znode is an
-          ephemeral node. If it is not an ephemeral node, it will be
-          zero.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">dataLength</emphasis></para>
-
-          <para>The length of the data field of this znode.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis role="bold">numChildren</emphasis></para>
-
-          <para>The number of children of this znode.</para>
-        </listitem>
-
-      </itemizedlist>
-    </section>
-  </section>
-
-  <section id="ch_zkSessions">
-    <title>ZooKeeper Sessions</title>
-
-    <para>A ZooKeeper client establishes a session with the ZooKeeper
-    service by creating a handle to the service using a language
-    binding. Once created, the handle starts of in the CONNECTING state
-    and the client library tries to connect to one of the servers that
-    make up the ZooKeeper service at which point it switches to the
-    CONNECTED state. During normal operation will be in one of these
-    two states. If an unrecoverable error occurs, such as session
-    expiration or authentication failure, or if the application explicitly
-    closes the handle, the handle will move to the CLOSED state.
-    The following figure shows the possible state transitions of a
-    ZooKeeper client:</para>
-    
-    <mediaobject id="fg_states" >
-  		<imageobject>
-    		<imagedata fileref="images/state_dia.jpg"/>
-  		</imageobject>
-	</mediaobject>
-    
-    <para>To create a client session the application code must provide
-    a connection string containing a comma separated list of host:port pairs,
-    each corresponding to a ZooKeeper server (e.g. "127.0.0.1:4545" or
-    "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"). The ZooKeeper
-    client library will pick an arbitrary server and try to connect to
-    it. If this connection fails, or if the client becomes
-    disconnected from the server for any reason, the client will
-    automatically try the next server in the list, until a connection
-    is (re-)established.</para>
-
-    <para> <emphasis role="bold">Added in 3.2.0</emphasis>: An
-    optional "chroot" suffix may also be appended to the connection
-    string. This will run the client commands while interpreting all
-    paths relative to this root (similar to the unix chroot
-    command). If used the example would look like:
-    "127.0.0.1:4545/app/a" or
-    "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" where the
-    client would be rooted at "/app/a" and all paths would be relative
-    to this root - ie getting/setting/etc...  "/foo/bar" would result
-    in operations being run on "/app/a/foo/bar" (from the server
-    perspective). This feature is particularly useful in multi-tenant
-    environments where each user of a particular ZooKeeper service
-    could be rooted differently. This makes re-use much simpler as
-    each user can code his/her application as if it were rooted at
-    "/", while actual location (say /app/a) could be determined at
-    deployment time.</para>
-
-    <para>When a client gets a handle to the ZooKeeper service,
-    ZooKeeper creates a ZooKeeper session, represented as a 64-bit
-    number, that it assigns to the client. If the client connects to a
-    different ZooKeeper server, it will send the session id as a part
-    of the connection handshake.  As a security measure, the server
-    creates a password for the session id that any ZooKeeper server
-    can validate.The password is sent to the client with the session
-    id when the client establishes the session. The client sends this
-    password with the session id whenever it reestablishes the session
-    with a new server.</para>
-
-    <para>One of the parameters to the ZooKeeper client library call
-    to create a ZooKeeper session is the session timeout in
-    milliseconds. The client sends a requested timeout, the server
-    responds with the timeout that it can give the client. The current
-    implementation requires that the timeout be a minimum of 2 times
-    the tickTime (as set in the server configuration) and a maximum of
-    20 times the tickTime. The ZooKeeper client API allows access to
-    the negotiated timeout.</para>
-
-    <para>When a client (session) becomes partitioned from the ZK
-    serving cluster it will begin searching the list of servers that
-    were specified during session creation. Eventually, when
-    connectivity between the client and at least one of the servers is
-    re-established, the session will either again transition to the
-    "connected" state (if reconnected within the session timeout
-    value) or it will transition to the "expired" state (if
-    reconnected after the session timeout). It is not advisable to
-    create a new session object (a new ZooKeeper.class or zookeeper
-    handle in the c binding) for disconnection. The ZK client library
-    will handle reconnect for you. In particular we have heuristics
-    built into the client library to handle things like "herd effect",
-    etc... Only create a new session when you are notified of session
-    expiration (mandatory).</para>
-
-    <para>Session expiration is managed by the ZooKeeper cluster
-    itself, not by the client. When the ZK client establishes a
-    session with the cluster it provides a "timeout" value detailed
-    above. This value is used by the cluster to determine when the
-    client's session expires. Expirations happens when the cluster
-    does not hear from the client within the specified session timeout
-    period (i.e. no heartbeat). At session expiration the cluster will
-    delete any/all ephemeral nodes owned by that session and
-    immediately notify any/all connected clients of the change (anyone
-    watching those znodes). At this point the client of the expired
-    session is still disconnected from the cluster, it will not be
-    notified of the session expiration until/unless it is able to
-    re-establish a connection to the cluster. The client will stay in
-    disconnected state until the TCP connection is re-established with
-    the cluster, at which point the watcher of the expired session
-    will receive the "session expired" notification.</para>
-
-    <para>Example state transitions for an expired session as seen by
-    the expired session's watcher:</para>
-
-    <orderedlist>
-      <listitem><para>'connected' : session is established and client
-      is communicating with cluster (client/server communication is
-      operating properly)</para></listitem>
-      <listitem><para>.... client is partitioned from the
-      cluster</para></listitem>
-      <listitem><para>'disconnected' : client has lost connectivity
-      with the cluster</para></listitem>
-      <listitem><para>.... time elapses, after 'timeout' period the
-      cluster expires the session, nothing is seen by client as it is
-      disconnected from cluster</para></listitem>
-      <listitem><para>.... time elapses, the client regains network
-      level connectivity with the cluster</para></listitem>
-      <listitem><para>'expired' : eventually the client reconnects to
-      the cluster, it is then notified of the
-      expiration</para></listitem>
-    </orderedlist>
-
-    <para>Another parameter to the ZooKeeper session establishment
-    call is the default watcher. Watchers are notified when any state
-    change occurs in the client. For example if the client loses
-    connectivity to the server the client will be notified, or if the
-    client's session expires, etc... This watcher should consider the
-    initial state to be disconnected (i.e. before any state changes
-    events are sent to the watcher by the client lib). In the case of
-    a new connection, the first event sent to the watcher is typically
-    the session connection event.</para>
-
-    <para>The session is kept alive by requests sent by the client. If
-    the session is idle for a period of time that would timeout the
-    session, the client will send a PING request to keep the session
-    alive. This PING request not only allows the ZooKeeper server to
-    know that the client is still active, but it also allows the
-    client to verify that its connection to the ZooKeeper server is
-    still active. The timing of the PING is conservative enough to
-    ensure reasonable time to detect a dead connection and reconnect
-    to a new server.</para>
-
-    <para>
-      Once a connection to the server is successfully established
-      (connected) there are basically two cases where the client lib generates
-      connectionloss (the result code in c binding, exception in Java -- see 
-      the API documentation for binding specific details) when either a synchronous or
-      asynchronous operation is performed and one of the following holds:
-    </para>
-
-    <orderedlist>
-      <listitem><para>The application calls an operation on a session that is no
-      longer alive/valid</para></listitem>
-      <listitem><para>The ZooKeeper client disconnects from a server when there
-      are pending operations to that server, i.e., there is a pending asynchronous call.
-      </para></listitem>
-    </orderedlist>
-
-    <para> <emphasis role="bold">Added in 3.2.0 -- SessionMovedException</emphasis>. There is an internal
-      exception that is generally not seen by clients called the SessionMovedException.
-      This exception occurs because a request was received on a connection for a session
-      which has been reestablished on a different server. The normal cause of this error is
-      a client that sends a request to a server, but the network packet gets delayed, so
-      the client times out and connects to a new server. When the delayed packet arrives at
-      the first server, the old server detects that the session has moved, and closes the
-      client connection. Clients normally do not see this error since they do not read
-      from those old connections. (Old connections are usually closed.) One situation in which this
-      condition can be seen is when two clients try to reestablish the same connection using
-      a saved session id and password. One of the clients will reestablish the connection
-      and the second client will be disconnected (causing the pair to attempt to re-establish
-      its connection/session indefinitely).</para>
-
-    <para> <emphasis role="bold">Updating the list of servers</emphasis>.  We allow a client to 
-      update the connection string by providing a new comma separated list of host:port pairs, 
-      each corresponding to a ZooKeeper server. The function invokes a probabilistic load-balancing 
-      algorithm which may cause the client to disconnect from its current host with the goal
-      to achieve expected uniform number of connections per server in the new list. 
-      In case the current host to which the client is connected is not in the new list
-      this call will always cause the connection to be dropped. Otherwise, the decision
-	  is based on whether the number of servers has increased or decreased and by how much.	
-	</para>
-
-    <para>
-      For example, if the previous connection string contained 3 hosts and now the list contains
-      these 3 hosts and 2 more hosts, 40% of clients connected to each of the 3 hosts will
-      move to one of the new hosts in order to balance the load. The algorithm will cause the client 
-      to drop its connection to the current host to which it is connected with probability 0.4 and in this 
-	  case cause the client to connect to one of the 2 new hosts, chosen at random.
-    </para>
-
-	<para>
-	  Another example -- suppose we have 5 hosts and now update the list to remove 2 of the hosts, 
-	  the clients connected to the 3 remaining hosts will stay connected, whereas all clients connected 
-	  to the 2 removed hosts will need to move to one of the 3 hosts, chosen at random. If the connection
-	  is dropped, the client moves to a special mode where he chooses a new server to connect to using the
-	  probabilistic algorithm, and not just round robin. 
-    </para>
-
-    <para>
-	  In the first example, each client decides to disconnect with probability 0.4 but once the decision is
-	  made, it will try to connect to a random new server and only if it cannot connect to any of the new 
-	  servers will it try to connect to the old ones. After finding a server, or trying all servers in the 
-	  new list and failing to connect, the client moves back to the normal mode of operation where it picks
-	  an arbitrary server from the connectString and attempt to connect to it. If that fails, is will continue
-	  trying different random servers in round robin. (see above the algorithm used to initially choose a server)
-    </para>
-
-  </section>
-
-  <section id="ch_zkWatches">
-    <title>ZooKeeper Watches</title>
-
-    <para>All of the read operations in ZooKeeper - <emphasis
-    role="bold">getData()</emphasis>, <emphasis
-    role="bold">getChildren()</emphasis>, and <emphasis
-    role="bold">exists()</emphasis> - have the option of setting a watch as a
-    side effect. Here is ZooKeeper's definition of a watch: a watch event is
-    one-time trigger, sent to the client that set the watch, which occurs when
-    the data for which the watch was set changes. There are three key points
-    to consider in this definition of a watch:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para><emphasis role="bold">One-time trigger</emphasis></para>
-
-        <para>One watch event will be sent to the client when the data has changed.
-        For example, if a client does a getData("/znode1", true) and later the
-        data for /znode1 is changed or deleted, the client will get a watch
-        event for /znode1. If /znode1 changes again, no watch event will be
-        sent unless the client has done another read that sets a new
-        watch.</para>
-      </listitem>
-
-      <listitem>
-        <para><emphasis role="bold">Sent to the client</emphasis></para>
-
-        <para>This implies that an event is on the way to the client, but may
-        not reach the client before the successful return code to the change
-        operation reaches the client that initiated the change. Watches are
-        sent asynchronously to watchers. ZooKeeper provides an ordering
-        guarantee: a client will never see a change for which it has set a
-        watch until it first sees the watch event. Network delays or other
-        factors may cause different clients to see watches and return codes
-        from updates at different times. The key point is that everything seen
-        by the different clients will have a consistent order.</para>
-      </listitem>
-
-      <listitem>
-        <para><emphasis role="bold">The data for which the watch was
-        set</emphasis></para>
-
-        <para>This refers to the different ways a node can change.  It
-        helps to think of ZooKeeper as maintaining two lists of
-        watches: data watches and child watches.  getData() and
-        exists() set data watches. getChildren() sets child
-        watches. Alternatively, it may help to think of watches being
-        set according to the kind of data returned. getData() and
-        exists() return information about the data of the node,
-        whereas getChildren() returns a list of children.  Thus,
-        setData() will trigger data watches for the znode being set
-        (assuming the set is successful). A successful create() will
-        trigger a data watch for the znode being created and a child
-        watch for the parent znode. A successful delete() will trigger
-        both a data watch and a child watch (since there can be no
-        more children) for a znode being deleted as well as a child
-        watch for the parent znode.</para>
-      </listitem>
-    </itemizedlist>
-
-    <para>Watches are maintained locally at the ZooKeeper server to which the
-    client is connected. This allows watches to be lightweight to set,
-    maintain, and dispatch. When a client connects to a new server, the watch
-    will be triggered for any session events. Watches will not be received
-    while disconnected from a server. When a client reconnects, any previously
-    registered watches will be reregistered and triggered if needed. In
-    general this all occurs transparently. There is one case where a watch
-    may be missed: a watch for the existence of a znode not yet created will
-    be missed if the znode is created and deleted while disconnected.</para>
-
-	<section id="sc_WatchSemantics">
-      <title>Semantics of Watches</title>
-	  
-	  <para> We can set watches with the three calls that read the state of 
-	  ZooKeeper: exists, getData, and getChildren. The following list details
-	  the events that a watch can trigger and the calls that enable them:
-	  </para>
-	  
-	  <itemizedlist>
-        <listitem>
-          <para><emphasis role="bold">Created event:</emphasis></para>
-          <para>Enabled with a call to exists.</para>
-        </listitem>
-        
-        <listitem>
-          <para><emphasis role="bold">Deleted event:</emphasis></para>
-          <para>Enabled with a call to exists, getData, and getChildren.</para>
-        </listitem>
-        
-        <listitem>
-          <para><emphasis role="bold">Changed event:</emphasis></para>
-          <para>Enabled with a call to exists and getData.</para>
-        </listitem>
-        
-        <listitem>
-          <para><emphasis role="bold">Child event:</emphasis></para>
-          <para>Enabled with a call to getChildren.</para>
-        </listitem>
-      </itemizedlist>
-	</section>
-
-    <section id="sc_WatchRemoval">
-      <title>Remove Watches</title>
-      <para>We can remove the watches registered on a znode with a call to 
-      removeWatches. Also, a ZooKeeper client can remove watches locally even
-      if there is no server connection by setting the local flag to true. The 
-      following list details the events which will be triggered after the 
-      successful watch removal.
-      </para>
-      <itemizedlist>
-        <listitem>
-          <para><emphasis role="bold">Child Remove event:</emphasis></para>
-          <para>Watcher which was added with a call to getChildren.</para>
-        </listitem>
-        
-        <listitem>
-          <para><emphasis role="bold">Data Remove event:</emphasis></para>
-          <para>Watcher which was added with a call to exists or getData.</para>
-        </listitem>
-      </itemizedlist>
-   </section>
-
-    <section id="sc_WatchGuarantees">
-      <title>What ZooKeeper Guarantees about Watches</title>
-
-      <para>With regard to watches, ZooKeeper maintains these
-      guarantees:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para>Watches are ordered with respect to other events, other
-          watches, and asynchronous replies. The ZooKeeper client libraries
-          ensures that everything is dispatched in order.</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>A client will see a watch event for a znode it is watching
-          before seeing the new data that corresponds to that znode.</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>The order of watch events from ZooKeeper corresponds to the
-          order of the updates as seen by the ZooKeeper service.</para>
-        </listitem>
-      </itemizedlist>
-    </section>
-
-    <section id="sc_WatchRememberThese">
-      <title>Things to Remember about Watches</title>
-
-      <itemizedlist>
-        <listitem>
-          <para>Watches are one time triggers; if you get a watch event and
-          you want to get notified of future changes, you must set another
-          watch.</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>Because watches are one time triggers and there is latency
-          between getting the event and sending a new request to get a watch
-          you cannot reliably see every change that happens to a node in
-          ZooKeeper. Be prepared to handle the case where the znode changes
-          multiple times between getting the event and setting the watch
-          again. (You may not care, but at least realize it may
-          happen.)</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>A watch object, or function/context pair, will only be
-          triggered once for a given notification. For example, if the same
-          watch object is registered for an exists and a getData call for the
-          same file and that file is then deleted, the watch object would
-          only be invoked once with the deletion notification for the file.
-          </para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>When you disconnect from a server (for example, when the
-          server fails), you will not get any watches until the connection
-          is reestablished. For this reason session events are sent to all
-          outstanding watch handlers. Use session events to go into a safe
-          mode: you will not be receiving events while disconnected, so your
-          process should act conservatively in that mode.</para>
-        </listitem>
-      </itemizedlist>
-    </section>
-  </section>
-
-  <section id="sc_ZooKeeperAccessControl">
-    <title>ZooKeeper access control using ACLs</title>
-
-    <para>ZooKeeper uses ACLs to control access to its znodes (the
-    data nodes of a ZooKeeper data tree). The ACL implementation is
-    quite similar to UNIX file access permissions: it employs
-    permission bits to allow/disallow various operations against a
-    node and the scope to which the bits apply. Unlike standard UNIX
-    permissions, a ZooKeeper node is not limited by the three standard
-    scopes for user (owner of the file), group, and world
-    (other). ZooKeeper does not have a notion of an owner of a
-    znode. Instead, an ACL specifies sets of ids and permissions that
-    are associated with those ids.</para>
-
-    <para>Note also that an ACL pertains only to a specific znode. In
-    particular it does not apply to children. For example, if
-    <emphasis>/app</emphasis> is only readable by ip:172.16.16.1 and
-    <emphasis>/app/status</emphasis> is world readable, anyone will
-    be able to read <emphasis>/app/status</emphasis>; ACLs are not
-    recursive.</para>
-
-    <para>ZooKeeper supports pluggable authentication schemes. Ids are
-    specified using the form <emphasis>scheme:expression</emphasis>,
-    where <emphasis>scheme</emphasis> is the authentication scheme
-    that the id corresponds to. The set of valid expressions are defined
-    by the scheme. For example, <emphasis>ip:172.16.16.1</emphasis> is
-    an id for a host with the address <emphasis>172.16.16.1</emphasis>
-    using the <emphasis>ip</emphasis> scheme, whereas <emphasis>digest:bob:password</emphasis>
-    is an id for the user with the name of <emphasis>bob</emphasis> using
-    the <emphasis>digest</emphasis> scheme.</para>
-
-    <para>When a client connects to ZooKeeper and authenticates
-    itself, ZooKeeper associates all the ids that correspond to a
-    client with the clients connection. These ids are checked against
-    the ACLs of znodes when a clients tries to access a node. ACLs are
-    made up of pairs of <emphasis>(scheme:expression,
-    perms)</emphasis>. The format of
-    the <emphasis>expression</emphasis> is specific to the scheme. For
-    example, the pair <emphasis>(ip:19.22.0.0/16, READ)</emphasis>
-    gives the <emphasis>READ</emphasis> permission to any clients with
-    an IP address that starts with 19.22.</para>
-
-    <section id="sc_ACLPermissions">
-      <title>ACL Permissions</title>
-                               
-      <para>ZooKeeper supports the following permissions:</para>
-
-      <itemizedlist>
-        <listitem><para><emphasis role="bold">CREATE</emphasis>: you can create a child node</para></listitem>
-        <listitem><para><emphasis role="bold">READ</emphasis>: you can get data from a node and list its children.</para></listitem>
-        <listitem><para><emphasis role="bold">WRITE</emphasis>: you can set data for a node</para></listitem>
-        <listitem><para><emphasis role="bold">DELETE</emphasis>: you can delete a child node</para></listitem>
-        <listitem><para><emphasis role="bold">ADMIN</emphasis>: you can set permissions</para></listitem>
-      </itemizedlist>
-
-      <para>The <emphasis>CREATE</emphasis>
-      and <emphasis>DELETE</emphasis> permissions have been broken out
-      of the <emphasis>WRITE</emphasis> permission for finer grained
-      access controls. The cases for <emphasis>CREATE</emphasis>
-      and <emphasis>DELETE</emphasis> are the following:</para>
-
-      <para>You want A to be able to do a set on a ZooKeeper node, but
-      not be able to <emphasis>CREATE</emphasis>
-      or <emphasis>DELETE</emphasis> children.</para>
-
-      <para><emphasis>CREATE</emphasis>
-      without <emphasis>DELETE</emphasis>: clients create requests by
-      creating ZooKeeper nodes in a parent directory. You want all
-      clients to be able to add, but only request processor can
-      delete. (This is kind of like the APPEND permission for
-      files.)</para>
-
-      <para>Also, the <emphasis>ADMIN</emphasis> permission is there
-      since ZooKeeper doesn’t have a notion of file owner. In some
-      sense the <emphasis>ADMIN</emphasis> permission designates the
-      entity as the owner. ZooKeeper doesn’t support the LOOKUP
-      permission (execute permission bit on directories to allow you
-      to LOOKUP even though you can't list the directory). Everyone
-      implicitly has LOOKUP permission. This allows you to stat a
-      node, but nothing more. (The problem is, if you want to call
-      zoo_exists() on a node that doesn't exist, there is no
-      permission to check.)</para>
-
-    <section id="sc_BuiltinACLSchemes">
-      <title>Builtin ACL Schemes</title>
-
-      <para>ZooKeeeper has the following built in schemes:</para>
-
-      <itemizedlist>
-        <listitem><para><emphasis role="bold">world</emphasis> has a
-        single id, <emphasis>anyone</emphasis>, that represents
-        anyone.</para></listitem>
-
-        <listitem><para><emphasis role="bold">auth</emphasis> is a special
-        scheme which ignores any provided expression and instead uses the current user,
-        credentials, and scheme. Any expression (whether <emphasis>user</emphasis> like with SASL
-        authentication or <emphasis>user:password</emphasis> like with DIGEST authentication) provided is ignored
-        by the ZooKeeper server when persisting the ACL. However, the expression must still be
-        provided in the ACL because the ACL must match the form <emphasis>scheme:expression:perms</emphasis>.
-        This scheme is provided as a convenience as it is a common use-case for
-        a user to create a znode and then restrict access to that znode to only that user.
-        If there is no authenticated user, setting an ACL with the auth scheme will fail.
-        </para></listitem>
-
-        <listitem><para><emphasis role="bold">digest</emphasis> uses
-        a <emphasis>username:password</emphasis> string to generate
-        MD5 hash which is then used as an ACL ID
-        identity. Authentication is done by sending
-        the <emphasis>username:password</emphasis> in clear text. When
-        used in the ACL the expression will be
-        the <emphasis>username:base64</emphasis>
-        encoded <emphasis>SHA1</emphasis>
-        password <emphasis>digest</emphasis>.</para>
-        </listitem>
-
-        <listitem><para><emphasis role="bold">ip</emphasis> uses the
-        client host IP as an ACL ID identity. The ACL expression is of
-        the form <emphasis>addr/bits</emphasis> where the most
-        significant <emphasis>bits</emphasis>
-        of <emphasis>addr</emphasis> are matched against the most
-        significant <emphasis>bits</emphasis> of the client host
-        IP.</para></listitem>
-
-        <listitem><para><emphasis role="bold">x509</emphasis> uses the client
-        X500 Principal as an ACL ID identity. The ACL expression is the exact
-        X500 Principal name of a client. When using the secure port, clients
-        are automatically authenticated and their auth info for the x509 scheme
-        is set.</para></listitem>
-
-      </itemizedlist>
-    </section>
-
-    <section>
-      <title>ZooKeeper C client API</title>
-
-      <para>The following constants are provided by the ZooKeeper C
-      library:</para>
-
-      <itemizedlist>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_READ; //can read node’s value and list its children</para></listitem>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_WRITE;// can set the node’s value</para></listitem>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_CREATE; //can create children</para></listitem>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_DELETE;// can delete children</para></listitem>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_ADMIN; //can execute set_acl()</para></listitem>
-        <listitem><para><emphasis>const</emphasis> <emphasis>int</emphasis> ZOO_PERM_ALL;// all of the above flags OR’d together</para></listitem>
-      </itemizedlist>
-
-      <para>The following are the standard ACL IDs:</para>
-
-      <itemizedlist>
-        <listitem><para><emphasis>struct</emphasis> Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)</para></listitem>
-        <listitem><para><emphasis>struct</emphasis> Id ZOO_AUTH_IDS;// (‘auth’,’’)</para></listitem>
-      </itemizedlist>
-
-      <para>ZOO_AUTH_IDS empty identity string should be interpreted as “the identity of the creator”.</para>
-
-      <para>ZooKeeper client comes with three standard ACLs:</para>
-
-      <itemizedlist>
-        <listitem><para><emphasis>struct</emphasis> ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)</para></listitem>
-        <listitem><para><emphasis>struct</emphasis> ACL_vector ZOO_READ_ACL_UNSAFE;// (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)</para></listitem>
-        <listitem><para><emphasis>struct</emphasis> ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL,ZOO_AUTH_IDS)</para></listitem>
-      </itemizedlist>
-
-      <para>The ZOO_OPEN_ACL_UNSAFE is completely open free for all
-      ACL: any application can execute any operation on the node and
-      can create, list and delete its children. The
-      ZOO_READ_ACL_UNSAFE is read-only access for any
-      application. CREATE_ALL_ACL grants all permissions to the
-      creator of the node. The creator must have been authenticated by
-      the server (for example, using “<emphasis>digest</emphasis>”
-      scheme) before it can create nodes with this ACL.</para>
-
-      <para>The following ZooKeeper operations deal with ACLs:</para>
-
-      <itemizedlist><listitem>
-          <para><emphasis>int</emphasis> <emphasis>zoo_add_auth</emphasis>
-            (zhandle_t *zh,<emphasis>const</emphasis> <emphasis>char</emphasis>*
-            scheme,<emphasis>const</emphasis> <emphasis>char</emphasis>*
-            cert, <emphasis>int</emphasis> certLen, void_completion_t
-            completion, <emphasis>const</emphasis> <emphasis>void</emphasis>
-            *data);</para>
-      </listitem></itemizedlist>
-
-      <para>The application uses the zoo_add_auth function to
-      authenticate itself to the server. The function can be called
-      multiple times if the application wants to authenticate using
-      different schemes and/or identities.</para>
-
-      <itemizedlist><listitem>
-          <para><emphasis>int</emphasis> <emphasis>zoo_create</emphasis>
-            (zhandle_t *zh, <emphasis>const</emphasis> <emphasis>char</emphasis>
-            *path, <emphasis>const</emphasis> <emphasis>char</emphasis>
-            *value,<emphasis>int</emphasis>
-            valuelen, <emphasis>const</emphasis> <emphasis>struct</emphasis>
-            ACL_vector *acl, <emphasis>int</emphasis>
-            flags,<emphasis>char</emphasis>
-            *realpath, <emphasis>int</emphasis>
-            max_realpath_len);</para>
-      </listitem></itemizedlist>
-
-      <para>zoo_create(...) operation creates a new node. The acl
-      parameter is a list of ACLs associated with the node. The parent
-      node must have the CREATE permission bit set.</para>
-
-      <itemizedlist><listitem>
-          <para><emphasis>int</emphasis> <emphasis>zoo_get_acl</emphasis>
-            (zhandle_t *zh, <emphasis>const</emphasis> <emphasis>char</emphasis>
-            *path,<emphasis>struct</emphasis> ACL_vector
-            *acl, <emphasis>struct</emphasis> Stat *stat);</para>
-      </listitem></itemizedlist>
-
-      <para>This operation returns a node’s ACL info.</para>
-
-      <itemizedlist><listitem>
-          <para><emphasis>int</emphasis> <emphasis>zoo_set_acl</emphasis>
-            (zhandle_t *zh, <emphasis>const</emphasis> <emphasis>char</emphasis>
-            *path, <emphasis>int</emphasis>
-            version,<emphasis>const</emphasis> <emphasis>struct</emphasis>
-            ACL_vector *acl);</para>
-      </listitem></itemizedlist>
-
-      <para>This function replaces node’s ACL list with a new one. The
-      node must have the ADMIN permission set.</para>
-
-      <para>Here is a sample code that makes use of the above APIs to
-      authenticate itself using the “<emphasis>foo</emphasis>” scheme
-      and create an ephemeral node “/xyz” with create-only
-      permissions.</para>
-
-      <note><para>This is a very simple example which is intended to show
-        how to interact with ZooKeeper ACLs
-        specifically. See <filename>.../trunk/zookeeper-client/zookeeper-client-c/src/cli.c</filename>
-        for an example of a C client implementation</para>
-      </note>
-
-      <programlisting>
-#include &lt;string.h>
-#include &lt;errno.h>
-
-#include "zookeeper.h"
-
-static zhandle_t *zh;
-
-/**
- * In this example this method gets the cert for your
- *   environment -- you must provide
- */
-char *foo_get_cert_once(char* id) { return 0; }
-
-/** Watcher function -- empty for this example, not something you should
- * do in real code */
-void watcher(zhandle_t *zzh, int type, int state, const char *path,
-             void *watcherCtx) {}
-
-int main(int argc, char argv) {
-  char buffer[512];
-  char p[2048];
-  char *cert=0;
-  char appId[64];
-
-  strcpy(appId, "example.foo_test");
-  cert = foo_get_cert_once(appId);
-  if(cert!=0) {
-    fprintf(stderr,
-            "Certificate for appid [%s] is [%s]\n",appId,cert);
-    strncpy(p,cert, sizeof(p)-1);
-    free(cert);
-  } else {
-    fprintf(stderr, "Certificate for appid [%s] not found\n",appId);
-    strcpy(p, "dummy");
-  }
-
-  zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);
-
-  zh = zookeeper_init("localhost:3181", watcher, 10000, 0, 0, 0);
-  if (!zh) {
-    return errno;
-  }
-  if(zoo_add_auth(zh,"foo",p,strlen(p),0,0)!=ZOK)
-    return 2;
-
-  struct ACL CREATE_ONLY_ACL[] = {{ZOO_PERM_CREATE, ZOO_AUTH_IDS}};
-  struct ACL_vector CREATE_ONLY = {1, CREATE_ONLY_ACL};
-  int rc = zoo_create(zh,"/xyz","value", 5, &amp;CREATE_ONLY, ZOO_EPHEMERAL,
-                      buffer, sizeof(buffer)-1);
-
-  /** this operation will fail with a ZNOAUTH error */
-  int buflen= sizeof(buffer);
-  struct Stat stat;
-  rc = zoo_get(zh, "/xyz", 0, buffer, &amp;buflen, &amp;stat);
-  if (rc) {
-    fprintf(stderr, "Error %d for %s\n", rc, __LINE__);
-  }
-
-  zookeeper_close(zh);
-  return 0;
-}
-      </programlisting>
-    </section>
-    </section>
-  </section>
-
-  <section id="sc_ZooKeeperPluggableAuthentication">
-    <title>Pluggable ZooKeeper authentication</title>
-
-    <para>ZooKeeper runs in a variety of different environments with
-    various different authentication schemes, so it has a completely
-    pluggable authentication framework. Even the builtin authentication
-    schemes use the pluggable authentication framework.</para>
-
-    <para>To understand how the authentication framework works, first you must
-    understand the two main authentication operations. The framework 
-    first must authenticate the client. This is usually done as soon as
-    the client connects to a server and consists of validating information
-    sent from or gathered about a client and associating it with the connection.
-    The second operation handled by the framework is finding the entries in an
-    ACL that correspond to client. ACL entries are &lt;<emphasis>idspec, 
-    permissions</emphasis>&gt; pairs. The <emphasis>idspec</emphasis> may be
-    a simple string match against the authentication information associated
-    with the connection or it may be a expression that is evaluated against that
-    information. It is up to the implementation of the authentication plugin
-    to do the match. Here is the interface that an authentication plugin must
-    implement:</para>
-
-    <programlisting>
-public interface AuthenticationProvider {
-    String getScheme();
-    KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]);
-    boolean isValid(String id);
-    boolean matches(String id, String aclExpr);
-    boolean isAuthenticated();
-}
-    </programlisting>
-
-    <para>The first method <emphasis>getScheme</emphasis> returns the string
-    that identifies the plugin. Because we support multiple methods of authentication,
-    an authentication credential or an <emphasis>idspec</emphasis> will always be
-    prefixed with <emphasis>scheme:</emphasis>. The ZooKeeper server uses the scheme
-    returned by the authentication plugin to determine which ids the scheme
-    applies to.</para>
-
-    <para><emphasis>handleAuthentication</emphasis> is called when a client
-    sends authentication information to be associated with a connection. The
-    client specifies the scheme to which the information corresponds. The
-    ZooKeeper server passes the information to the authentication plugin whose
-    <emphasis>getScheme</emphasis> matches the scheme passed by the client. The
-    implementor of <emphasis>handleAuthentication</emphasis> will usually return
-    an error if it determines that the information is bad, or it will associate information
-    with the connection using <emphasis>cnxn.getAuthInfo().add(new Id(getScheme(), data))</emphasis>.
-    </para>
-
-    <para>The authentication plugin is involved in both setting and using ACLs. When an
-    ACL is set for a znode, the ZooKeeper server will pass the id part of the entry to
-    the <emphasis>isValid(String id)</emphasis> method. It is up to the plugin to verify
-    that the id has a correct form. For example, <emphasis>ip:172.16.0.0/16</emphasis>
-    is a valid id, but <emphasis>ip:host.com</emphasis> is not. If the new ACL includes
-    an "auth" entry, <emphasis>isAuthenticated</emphasis> is used to see if the 
-    authentication information for this scheme that is assocatied with the connection
-    should be added to the ACL. Some schemes
-    should not be included in auth. For example, the IP address of the client is not
-    considered as an id that should be added to the ACL if auth is specified.</para>
-
-    <para>ZooKeeper invokes
-    <emphasis>matches(String id, String aclExpr)</emphasis> when checking an ACL. It
-    needs to match authentication information of the client against the relevant ACL
-    entries. To find the entries which apply to the client, the ZooKeeper server will
-    find the scheme of each entry and if there is authentication information
-    from that client for that scheme, <emphasis>matches(String id, String aclExpr)</emphasis>
-    will be called with <emphasis>id</emphasis> set to the authentication information
-    that was previously added to the connection by <emphasis>handleAuthentication</emphasis> and
-    <emphasis>aclExpr</emphasis> set to the id of the ACL entry. The authentication plugin
-    uses its own logic and matching scheme to determine if <emphasis>id</emphasis> is included
-    in <emphasis>aclExpr</emphasis>. 
-    </para>
-
-    <para>There are two built in authentication plugins: <emphasis>ip</emphasis> and
-    <emphasis>digest</emphasis>. Additional plugins can adding using system properties. At
-    startup the ZooKeeper server will look for system properties that start with
-    "zookeeper.authProvider." and interpret the value of those properties as the class name
-    of an authentication plugin. These properties can be set using the
-    <emphasis>-Dzookeeeper.authProvider.X=com.f.MyAuth</emphasis> or adding entries such as
-    the following in the server configuration file:</para>
-
-    <programlisting>
-authProvider.1=com.f.MyAuth
-authProvider.2=com.f.MyAuth2
-    </programlisting>
- 
-    <para>Care should be taking to ensure that the suffix on the property is unique. If there are 
-    duplicates such as <emphasis>-Dzookeeeper.authProvider.X=com.f.MyAuth -Dzookeeper.authProvider.X=com.f.MyAuth2</emphasis>,
-    only one will be used. Also all servers must have the same plugins defined, otherwise clients using
-    the authentication schemes provided by the plugins will have problems connecting to some servers.
-    </para>
-  </section>
-      
-  <section id="ch_zkGuarantees">
-    <title>Consistency Guarantees</title>
-
-    <para>ZooKeeper is a high performance, scalable service. Both reads and
-    write operations are designed to be fast, though reads are faster than
-    writes. The reason for this is that in the case of reads, ZooKeeper can
-    serve older data, which in turn is due to ZooKeeper's consistency
-    guarantees:</para>
-
-    <variablelist>
-      <varlistentry>
-        <term>Sequential Consistency</term>
-
-        <listitem>
-          <para>Updates from a client will be applied in the order that they
-          were sent.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term>Atomicity</term>
-
-        <listitem>
-          <para>Updates either succeed or fail -- there are no partial
-          results.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term>Single System Image</term>
-
-        <listitem>
-          <para>A client will see the same view of the service regardless of
-          the server that it connects to.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term>Reliability</term>
-
-        <listitem>
-          <para>Once an update has been applied, it will persist from that
-          time forward until a client overwrites the update. This guarantee
-          has two corollaries:</para>
-
-          <orderedlist>
-            <listitem>
-              <para>If a client gets a successful return code, the update will
-              have been applied. On some failures (communication errors,
-              timeouts, etc) the client will not know if the update has
-              applied or not. We take steps to minimize the failures, but the
-              guarantee is only present with successful return codes.
-              (This is called the <emphasis>monotonicity condition</emphasis> in Paxos.)</para>
-            </listitem>
-
-            <listitem>
-              <para>Any updates that are seen by the client, through a read
-              request or successful update, will never be rolled back when
-              recovering from server failures.</para>
-            </listitem>
-          </orderedlist>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term>Timeliness</term>
-
-        <listitem>
-          <para>The clients view of the system is guaranteed to be up-to-date
-          within a certain time bound (on the order of tens of seconds).
-          Either system changes will be seen by a client within this bound, or
-          the client will detect a service outage.</para>
-        </listitem>
-      </varlistentry>
-    </variablelist>
-
-    <para>Using these consistency guarantees it is easy to build higher level
-    functions such as leader election, barriers, queues, and read/write
-    revocable locks solely at the ZooKeeper client (no additions needed to
-    ZooKeeper). See <ulink url="recipes.html">Recipes and Solutions</ulink>
-    for more details.</para>
-
-    <note>
-        <para>Sometimes developers mistakenly assume one other guarantee that
-        ZooKeeper does <emphasis>not</emphasis> in fact make. This is:</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>Simultaneously Consistent Cross-Client Views</term>
-
-            <listitem>
-              <para>ZooKeeper does not guarantee that at every instance in
-              time, two different clients will have identical views of
-              ZooKeeper data. Due to factors like network delays, one client
-              may perform an update before another client gets notified of the
-              change. Consider the scenario of two clients, A and B. If client
-              A sets the value of a znode /a from 0 to 1, then tells client B
-              to read /a, client B may read the old value of 0, depending on
-              which server it is connected to. If it
-              is important that Client A and Client B read the same value,
-              Client B should should call the <emphasis
-              role="bold">sync()</emphasis> method from the ZooKeeper API
-              method before it performs its read.</para>
-
-              <para>So, ZooKeeper by itself doesn't guarantee that changes occur 
-              synchronously across all servers, but ZooKeeper
-              primitives can be used to construct higher level functions that
-              provide useful client synchronization. (For more information,
-              see the <ulink
-              url="recipes.html">ZooKeeper Recipes</ulink>.
-              <emphasis>[tbd:..]</emphasis>).</para>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-      </note>
-  </section>
-
-  <section id="ch_bindings">
-    <title>Bindings</title>
-
-    <para>The ZooKeeper client libraries come in two languages: Java and C.
-    The following sections describe these.</para>
-
-    <section>
-      <title>Java Binding</title>
-
-      <para>There are two packages that make up the ZooKeeper Java binding:
-      <emphasis role="bold">org.apache.zookeeper</emphasis> and <emphasis
-      role="bold">org.apache.zookeeper.data</emphasis>. The rest of the
-      packages that make up ZooKeeper are used internally or are part of the
-      server implementation. The <emphasis
-      role="bold">org.apache.zookeeper.data</emphasis> package is made up of
-      generated classes that are used simply as containers.</para>
-
-      <para>The main class used by a ZooKeeper Java client is the <emphasis
-      role="bold">ZooKeeper</emphasis> class. Its two constructors differ only
-      by an optional session id and password. ZooKeeper supports session
-      recovery accross instances of a process. A Java program may save its
-      session id and password to stable storage, restart, and recover the
-      session that was used by the earlier instance of the program.</para>
-
-      <para>When a ZooKeeper object is created, two threads are created as
-      well: an IO thread and an event thread. All IO happens on the IO thread
-      (using Java NIO). All event callbacks happen on the event thread.
-      Session maintenance such as reconnecting to ZooKeeper servers and
-      maintaining heartbeat is done on the IO thread. Responses for
-      synchronous methods are also processed in the IO thread. All responses
-      to asynchronous methods and watch events are processed on the event
-      thread. There are a few things to notice that result from this
-      design:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para>All completions for asynchronous calls and watcher callbacks
-          will be made in order, one at a time. The caller can do any
-          processing they wish, but no other callbacks will be processed
-          during that time.</para>
-        </listitem>
-
-        <listitem>
-          <para>Callbacks do not block the processing of the IO thread or the
-          processing of the synchronous calls.</para>
-        </listitem>
-
-        <listitem>
-          <para>Synchronous calls may not return in the correct order. For
-          example, assume a client does the following processing: issues an
-          asynchronous read of node <emphasis role="bold">/a</emphasis> with
-          <emphasis>watch</emphasis> set to true, and then in the completion
-          callback of the read it does a synchronous read of <emphasis
-          role="bold">/a</emphasis>. (Maybe not good practice, but not illegal
-          either, and it makes for a simple example.)</para>
-
-          <para>Note that if there is a change to <emphasis
-          role="bold">/a</emphasis> between the asynchronous read and the
-          synchronous read, the client library will receive the watch event
-          saying <emphasis role="bold">/a</emphasis> changed before the
-          response for the synchronous read, but because the completion
-          callback is blocking the event queue, the synchronous read will
-          return with the new value of <emphasis role="bold">/a</emphasis>
-          before the watch event is processed.</para>
-        </listitem>
-      </itemizedlist>
-
-      <para>Finally, the rules associated with shutdown are straightforward:
-      once a ZooKeeper object is closed or receives a fatal event
-      (SESSION_EXPIRED and AUTH_FAILED), the ZooKeeper object becomes invalid.
-      On a close, the two threads shut down and any further access on zookeeper
-      handle is undefined behavior and should be avoided. </para>
-      <section id="sc_java_client_configuration">
-        <title><emphasis role="bold">Client Configuration Parameters</emphasis></title>
-        <para>
-            The following list contains configuration properties for the Java client. You can set any
-            of these properties using Java system properties. For server properties, please check the
-            following reference
-            <ulink url="zookeeperAdmin.html#sc_configuration">Server configuration section.</ulink>
-        </para>
-        <variablelist>
-            <varlistentry>
-                <term>zookeeper.sasl.client</term>
-                <listitem>
-                    <para>Set the value to <emphasis role="bold">false</emphasis> to disable
-                    SASL authentication. Default is <emphasis role="bold">true</emphasis>.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.sasl.clientconfig</term>
-                <listitem>
-                    <para>Specifies the context key in the JAAS login file. Default is "Client".</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.sasl.client.username</term>
-                <listitem>
-                    <para>Traditionally, a principal is divided into three parts: the primary, the instance, and the realm.
-                        The format of a typical Kerberos V5 principal is primary/instance@REALM.
-                        zookeeper.sasl.client.username specifies the primary part of the server principal. Default
-                        is "zookeeper". Instance part is derived from the server IP. Finally server's principal is
-                        username/IP@realm, where username is the value of zookeeper.sasl.client.username, IP is
-                        the server IP, and realm is the value of zookeeper.server.realm.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.server.realm</term>
-                <listitem>
-                    <para>Realm part of the server principal. By default it is the client principal realm.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.disableAutoWatchReset</term>
-                <listitem>
-                    <para>This switch controls whether automatic watch resetting is enabled. Clients automatically
-                        reset watches during session reconnect by default, this option allows the client to turn off
-                        this behavior by setting zookeeper.disableAutoWatchReset to <emphasis role="bold">true</emphasis>. 
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.client.secure</term>
-                <listitem>
-                    <para>
-                        If you want to connect to the server secure client port, you need to set this property to
-                        <emphasis role="bold">true</emphasis>
-                        on the client. This will connect to server using SSL with specified credentials. Note that
-                        it requires the Netty client.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.clientCnxnSocket</term>
-                <listitem>
-                    <para>
-                        Specifies which ClientCnxnSocket to be used. Possible values are
-                        <emphasis role="bold">org.apache.zookeeper.ClientCnxnSocketNIO</emphasis>
-                        and
-                        <emphasis role="bold">org.apache.zookeeper.ClientCnxnSocketNetty</emphasis>
-                        . Default is
-                        <emphasis role="bold">org.apache.zookeeper.ClientCnxnSocketNIO</emphasis>
-                        . If you want to connect to server's secure client port, you need to set this property to
-                        <emphasis role="bold">org.apache.zookeeper.ClientCnxnSocketNetty</emphasis>
-                        on client.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.ssl.keyStore.location and zookeeper.ssl.keyStore.password</term>
-                <listitem>
-                    <para>Specifies the file path to a JKS containing the local credentials to be used for SSL connections,
-                        and the password to unlock the file.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.ssl.trustStore.location and zookeeper.ssl.trustStore.password</term>
-                <listitem>
-                    <para>Specifies the file path to a JKS containing the remote credentials to be used for SSL connections,
-                        and the password to unlock the file.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>jute.maxbuffer</term>
-                <listitem>
-                    <para>It specifies the maximum size of the incoming data from the server. The default value is 4194304
-                        Bytes , or just 4 MB. This is really a sanity check. The ZooKeeper server is designed to store and send
-                        data on the order of kilobytes. If incoming data length is more than this value, an IOException
-                        is raised.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.kinit</term>
-                <listitem>
-                    <para>Specifies path to kinit binary. Default is "/usr/bin/kinit".</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>zookeeper.request.timeout</term>
-                <listitem>
-                <para>
-                  <emphasis role="bold">New in 3.6.0,3.5.5:</emphasis>
-                  If ZooKeeper server is not responding or if there is a delay in the
-                  network, ZooKeeper client java sync API waits infinitely for the
-                  response. To avoid this situation configure
-                  zookeeper.request.timeout. By default this feature is disabled and
-                  default value is 0. To enable this feature configure a positive
-                  integer value. for example to set value to 30 second configure
-                  zookeeper.request.timeout=30000.
-                </para>
-                <para>
-                    If response is not received within configured zookeeper.request.timeout
-                    then outgoing and pending requests are cancelled with
-                    org.apache.zookeeper.KeeperException.ConnectionLossException.
-                </para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </section>
-    </section>
-
-    <section>
-      <title>C Binding</title>
-
-      <para>The C binding has a single-threaded and multi-threaded library.
-      The multi-threaded library is easiest to use and is most similar to the
-      Java API. This library will create an IO thread and an event dispatch
-      thread for handling connection maintenance and callbacks. The
-      single-threaded library allows ZooKeeper to be used in event driven
-      applications by exposing the event loop used in the multi-threaded
-      library.</para>
-
-      <para>The package includes two shared libraries: zookeeper_st and
-      zookeeper_mt. The former only provides the asynchronous APIs and
-      callbacks for integrating into the application's event loop. The only
-      reason this library exists is to support the platforms were a
-      <emphasis>pthread</emphasis> library is not available or is unstable
-      (i.e. FreeBSD 4.x). In all other cases, application developers should
-      link with zookeeper_mt, as it includes support for both Sync and Async
-      API.</para>
-
-      <section>
-        <title>Installation</title>
-
-        <para>If you're building the client from a check-out from the Apache
-        repository, follow the steps outlined below. If you're building from a
-        project source package downloaded from apache, skip to step <emphasis
-        role="bold">3</emphasis>.</para>
-
-        <orderedlist>
-          <listitem>
-            <para>Run <command>ant compile_jute</command> from the ZooKeeper
-            top level directory (<filename>.../trunk</filename>).
-            This will create a directory named "generated" under
-            <filename>.../trunk/zookeeper-client/zookeeper-client-c</filename>.</para>
-          </listitem>
-
-          <listitem>
-            <para>Change directory to the<filename>.../trunk/zookeeper-client/zookeeper-client-c</filename>
-            and run <command>autoreconf -if</command> to bootstrap <emphasis
-            role="bold">autoconf</emphasis>, <emphasis
-            role="bold">automake</emphasis> and <emphasis
-            role="bold">libtool</emphasis>. Make sure you have <emphasis
-            role="bold">autoconf version 2.59</emphasis> or greater installed.
-            Skip to step<emphasis role="bold"> 4</emphasis>.</para>
-          </listitem>
-
-          <listitem>
-            <para>If you are building from a project source package,
-            unzip/untar the source tarball and cd to the<filename>
-            zookeeper-x.x.x/zookeeper-client/zookeeper-client-c</filename> directory.</para>
-          </listitem>
-
-          <listitem>
-            <para>Run <command>./configure &lt;your-options&gt;</command> to
-            generate the makefile. Here are some of options the <emphasis
-            role="bold">configure</emphasis> utility supports that can be
-            useful in this step:</para>
-
-            <itemizedlist>
-              <listitem>
-                <para><command>--enable-debug</command></para>
-
-                <para>Enables optimization and enables debug info compiler
-                options. (Disabled by default.)</para>
-              </listitem>
-
-              <listitem>
-                <para><command>--without-syncapi </command></para>
-
-                <para>Disables Sync API support; zookeeper_mt library won't be
-                built. (Enabled by default.)</para>
-              </listitem>
-
-              <listitem>
-                <para><command>--disable-static </command></para>
-
-                <para>Do not build static libraries. (Enabled by
-                default.)</para>
-              </listitem>
-
-              <listitem>
-                <para><command>--disable-shared</command></para>
-
-                <para>Do not build shared libraries. (Enabled by
-                default.)</para>
-              </listitem>
-            </itemizedlist>
-
-            <note>
-              <para>See INSTALL for general information about running
-              <emphasis role="bold">configure</emphasis>.</para>
-            </note>
-          </listitem>
-
-          <listitem>
-            <para>Run <command>make</command> or <command>make
-            install</command> to build the libraries and install them.</para>
-          </listitem>
-
-          <listitem>
-            <para>To generate doxygen documentation for the ZooKeeper API, run
-            <command>make doxygen-doc</command>. All documentation will be
-            placed in a new subfolder named docs. By default, this command
-            only generates HTML. For information on other document formats,
-            run <command>./configure --help</command></para>
-          </listitem>
-        </orderedlist>
-      </section>
-
-      <section>
-        <title>Building Your Own C Client</title>
-
-        <para>In order to be able to use the ZooKeeper C API in your application
-        you have to remember to</para>
-
-        <orderedlist>
-          <listitem>
-            <para>Include ZooKeeper header: #include
-              &lt;zookeeper/zookeeper.h&gt;</para>
-          </listitem>
-
-          <listitem>
-            <para>If you are building a multithreaded client, compile with
-            -DTHREADED compiler flag to enable the multi-threaded version of
-            the library, and then link against against the
-            <emphasis>zookeeper_mt</emphasis> library. If you are building a
-            single-threaded client, do not compile with -DTHREADED, and be
-            sure to link against the<emphasis> zookeeper_st
-            </emphasis>library.</para>
-          </listitem>
-        </orderedlist>
-
-        <note><para>See <filename>.../trunk/zookeeper-client/zookeeper-client-c/src/cli.c</filename>
-          for an example of a C client implementation</para>
-        </note>
-      </section>
-    </section>
-  </section>
-
-   <section id="ch_guideToZkOperations">
-    <title>Building Blocks: A Guide to ZooKeeper Operations</title>
-
-    <para>This section surveys all the operations a developer can perform
-    against a ZooKeeper server. It is lower level information than the earlier
-    concepts chapters in this manual, but higher level than the ZooKeeper API
-    Reference. It covers these topics:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para><xref linkend="sc_connectingToZk" /></para>
-      </listitem>
-    </itemizedlist>
-
-    <section id="sc_errorsZk">
-      <title>Handling Errors</title>
-
-      <para>Both the Java and C client bindings may report errors. The Java client binding does so by throwing KeeperException, calling code() on the exception will return the specific error code. The C client binding returns an error code as defined in the enum ZOO_ERRORS. API callbacks indicate result code for both language bindings. See the API documentation (javadoc for Java, doxygen for C) for full details on the possible errors and their meaning.</para>
-    </section>
-    
-    <section id="sc_connectingToZk">
-      <title>Connecting to ZooKeeper</title>
-
-      <para></para>
-    </section>
-    
-    <section id="sc_readOps">
-      <title>Read Operations</title>
-
-      <para></para>
-    </section>
-    
-    <section id="sc_writeOps">
-      <title>Write Operations</title>
-
-      <para></para>
-    </section>
-    
-    <section id="sc_handlingWatches">
-      <title>Handling Watches</title>
-
-      <para></para>
-    </section>
-    
-    <section id="sc_miscOps">
-      <title>Miscelleaneous ZooKeeper Operations</title>
-      <para></para>
-    </section>
-    
-
-  </section>
-
-  <section id="ch_programStructureWithExample">
-    <title>Program Structure, with Simple Example</title>
-
-    <para><emphasis>[tbd]</emphasis></para>
-  </section>
-
-  <section id="ch_gotchas">
-    <title>Gotchas: Common Problems and Troubleshooting</title>
-
-    <para>So now you know ZooKeeper. It's fast, simple, your application
-    works, but wait ... something's wrong. Here are some pitfalls that
-    ZooKeeper users fall into:</para>
-
-    <orderedlist>
-      <listitem>
-        <para>If you are using watches, you must look for the connected watch
-        event. When a ZooKeeper client disconnects from a server, you will
-        not receive notification of changes until reconnected. If you are
-        watching for a znode to come into existence, you will miss the event
-        if the znode is created and deleted while you are disconnected.</para>
-      </listitem>
-
-      <listitem>
-        <para>You must test ZooKeeper server failures. The ZooKeeper service
-        can survive failures as long as a majority of servers are active. The
-        question to ask is: can your application handle it? In the real world
-        a client's connection to ZooKeeper can break. (ZooKeeper server
-        failures and network partitions are common reasons for connection
-        loss.) The ZooKeeper client library takes care of recovering your
-        connection and letting you know what happened, but you must make sure
-        that you recover your state and any outstanding requests that failed.
-        Find out if you got it right in the test lab, not in production - test
-        with a ZooKeeper service made up of a several of servers and subject
-        them to reboots.</para>
-      </listitem>
-
-      <listitem>
-        <para>The list of ZooKeeper servers used by the client must match the
-        list of ZooKeeper servers that each ZooKeeper server has. Things can
-        work, although not optimally, if the client list is a subset of the
-        real list of ZooKeeper servers, but not if the client lists ZooKeeper
-        servers not in the ZooKeeper cluster.</para>
-      </listitem>
-
-      <listitem>
-        <para>Be careful where you put that transaction log. The most
-        performance-critical part of ZooKeeper is the transaction log.
-        ZooKeeper must sync transactions to media before it returns a
-        response. A dedicated transaction log device is key to consistent good
-        performance. Putting the log on a busy device will adversely effect
-        performance. If you only have one storage device, put trace files on
-        NFS and increase the snapshotCount; it doesn't eliminate the problem,
-        but it can mitigate it.</para>
-      </listitem>
-
-      <listitem>
-        <para>Set your Java max heap size correctly. It is very important to
-        <emphasis>avoid swapping.</emphasis> Going to disk unnecessarily will
-        almost certainly degrade your performance unacceptably. Remember, in
-        ZooKeeper, everything is ordered, so if one request hits the disk, all
-        other queued requests hit the disk.</para>
-
-        <para>To avoid swapping, try to set the heapsize to the amount of
-        physical memory you have, minus the amount needed by the OS and cache.
-        The best way to determine an optimal heap size for your configurations
-        is to <emphasis>run load tests</emphasis>. If for some reason you
-        can't, be conservative in your estimates and choose a number well
-        below the limit that would cause your machine to swap. For example, on
-        a 4G machine, a 3G heap is a conservative estimate to start
-        with.</para>
-      </listitem>
-    </orderedlist>
-  </section>
-
-  <appendix id="apx_linksToOtherInfo">
-    <title>Links to Other Information</title>
-
-    <para>Outside the formal documentation, there're several other sources of
-    information for ZooKeeper developers.</para>
-
-    <variablelist>
-      <varlistentry>
-        <term>ZooKeeper Whitepaper <emphasis>[tbd: find url]</emphasis></term>
-
-        <listitem>
-          <para>The definitive discussion of ZooKeeper design and performance,
-          by Yahoo! Research</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term>API Reference <emphasis>[tbd: find url]</emphasis></term>
-
-        <listitem>
-          <para>The complete reference to the ZooKeeper API</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><ulink
-        url="http://us.dl1.yimg.com/download.yahoo.com/dl/ydn/zookeeper.m4v">ZooKeeper
-        Talk at the Hadoup Summit 2008</ulink></term>
-
-        <listitem>
-          <para>A video introduction to ZooKeeper, by Benjamin Reed of Yahoo!
-          Research</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><ulink
-                url="https://cwiki.apache.org/confluence/display/ZOOKEEPER/Tutorial">Barrier and
-        Queue Tutorial</ulink></term>
-
-        <listitem>
-          <para>The excellent Java tutorial by Flavio Junqueira, implementing
-          simple barriers and producer-consumer queues using ZooKeeper.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><ulink
-                url="https://cwiki.apache.org/confluence/display/ZOOKEEPER/ZooKeeperArticles">ZooKeeper
-        - A Reliable, Scalable Distributed Coordination System</ulink></term>
-
-        <listitem>
-          <para>An article by Todd Hoff (07/15/2008)</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><ulink url="recipes.html">ZooKeeper Recipes</ulink></term>
-
-        <listitem>
-          <para>Pseudo-level discussion of the implementation of various
-          synchronization solutions with ZooKeeper: Event Handles, Queues,
-          Locks, and Two-phase Commits.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><emphasis>[tbd]</emphasis></term>
-
-        <listitem>
-          <para>Any other good sources anyone can think of...</para>
-        </listitem>
-      </varlistentry>
-    </variablelist>
-  </appendix>
-</article>


[14/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/CommonMessages_de.xml
----------------------------------------------------------------------
diff --git a/docs/skin/CommonMessages_de.xml b/docs/skin/CommonMessages_de.xml
deleted file mode 100644
index bc46119..0000000
--- a/docs/skin/CommonMessages_de.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/CommonMessages_en_US.xml
----------------------------------------------------------------------
diff --git a/docs/skin/CommonMessages_en_US.xml b/docs/skin/CommonMessages_en_US.xml
deleted file mode 100644
index 88dfe14..0000000
--- a/docs/skin/CommonMessages_en_US.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/CommonMessages_es.xml
----------------------------------------------------------------------
diff --git a/docs/skin/CommonMessages_es.xml b/docs/skin/CommonMessages_es.xml
deleted file mode 100644
index 63be671..0000000
--- a/docs/skin/CommonMessages_es.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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:">Tama�o del texto:</message>
-  <message key="Last Published:">Fecha de publicaci�n:</message>
-  <message key="Search">Buscar</message>
-  <message key="Search the site with">Buscar en</message>
-</catalogue>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/CommonMessages_fr.xml
----------------------------------------------------------------------
diff --git a/docs/skin/CommonMessages_fr.xml b/docs/skin/CommonMessages_fr.xml
deleted file mode 100644
index 622569a..0000000
--- a/docs/skin/CommonMessages_fr.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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:">Taille :</message>
-  <message key="Last Published:">Derni�re publication :</message>
-  <message key="Search">Rechercher</message>
-  <message key="Search the site with">Rechercher sur le site avec</message>
-</catalogue>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/basic.css
----------------------------------------------------------------------
diff --git a/docs/skin/basic.css b/docs/skin/basic.css
deleted file mode 100644
index 01c383d..0000000
--- a/docs/skin/basic.css
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
-* 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.
-*/
-/**
- * General
- */
-
-img { border: 0; }
-
-#content table {
-  border: 0;
-  width: 100%;
-}
-/*Hack to get IE to render the table at 100%*/
-* html #content table { margin-left: -3px; }
-
-#content th,
-#content td {
-  margin: 0;
-  padding: 0;
-  vertical-align: top;
-}
-
-.clearboth {
-  clear: both;
-}
-
-.note, .warning, .fixme {
-  clear:right;
-  border: solid black 1px;
-  margin: 1em 3em;
-}
-
-.note .label {
-  background: #369;
-  color: white;
-  font-weight: bold;
-  padding: 5px 10px;
-}
-.note .content {
-  background: #F0F0FF;
-  color: black;
-  line-height: 120%;
-  font-size: 90%;
-  padding: 5px 10px;
-}
-.warning .label {
-  background: #C00;
-  color: white;
-  font-weight: bold;
-  padding: 5px 10px;
-}
-.warning .content {
-  background: #FFF0F0;
-  color: black;
-  line-height: 120%;
-  font-size: 90%;
-  padding: 5px 10px;
-}
-.fixme .label {
-  background: #C6C600;
-  color: black;
-  font-weight: bold;
-  padding: 5px 10px;
-}
-.fixme .content {
-  padding: 5px 10px;
-}
-
-/**
- * Typography
- */
-
-body {
-  font-family: verdana, "Trebuchet MS", arial, helvetica, sans-serif;
-  font-size: 100%;
-}
-
-#content {
-  font-family: Georgia, Palatino, Times, serif;
-  font-size: 95%;
-}
-#tabs {
-  font-size: 70%;
-}
-#menu {
-  font-size: 80%;
-}
-#footer {
-  font-size: 70%;
-}
-
-h1, h2, h3, h4, h5, h6 {
-  font-family: "Trebuchet MS", verdana, arial, helvetica, sans-serif;
-  font-weight: bold;
-  margin-top: 1em;
-  margin-bottom: .5em;
-}
-
-h1 {
-    margin-top: 0;
-    margin-bottom: 1em;
-  font-size: 1.4em;
-}
-#content h1 {
-  font-size: 160%;
-  margin-bottom: .5em;
-}
-#menu h1 {
-  margin: 0;
-  padding: 10px;
-  background: #336699;
-  color: white;
-}
-h2 { font-size: 120%; }
-h3 { font-size: 100%; }
-h4 { font-size: 90%; }
-h5 { font-size: 80%; }
-h6 { font-size: 75%; }
-
-p {
-  line-height: 120%;
-  text-align: left;
-  margin-top: .5em;
-  margin-bottom: 1em;
-}
-
-#content li,
-#content th,
-#content td,
-#content li ul,
-#content li ol{
-  margin-top: .5em;
-  margin-bottom: .5em;
-}
-
-
-#content li li,
-#minitoc-area li{
-  margin-top: 0em;
-  margin-bottom: 0em;
-}
-
-#content .attribution {
-  text-align: right;
-  font-style: italic;
-  font-size: 85%;
-  margin-top: 1em;
-}
-
-.codefrag {
-  font-family: "Courier New", Courier, monospace;
-  font-size: 110%;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/breadcrumbs-optimized.js
----------------------------------------------------------------------
diff --git a/docs/skin/breadcrumbs-optimized.js b/docs/skin/breadcrumbs-optimized.js
deleted file mode 100644
index 507612a..0000000
--- a/docs/skin/breadcrumbs-optimized.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-* 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.
-*/
-var PREPREND_CRUMBS=new Array();
-var link1="@skinconfig.trail.link1.name@";
-var link2="@skinconfig.trail.link2.name@";
-var link3="@skinconfig.trail.link3.name@";
-if(!(link1=="")&&!link1.indexOf( "@" ) == 0){
-  PREPREND_CRUMBS.push( new Array( link1, @skinconfig.trail.link1.href@ ) ); }
-if(!(link2=="")&&!link2.indexOf( "@" ) == 0){
-  PREPREND_CRUMBS.push( new Array( link2, @skinconfig.trail.link2.href@ ) ); }
-if(!(link3=="")&&!link3.indexOf( "@" ) == 0){
-  PREPREND_CRUMBS.push( new Array( link3, @skinconfig.trail.link3.href@ ) ); }
-var DISPLAY_SEPARATOR=" &gt; ";
-var DISPLAY_PREPREND=" &gt; ";
-var DISPLAY_POSTPREND=":";
-var CSS_CLASS_CRUMB="breadcrumb";
-var CSS_CLASS_TRAIL="breadcrumbTrail";
-var CSS_CLASS_SEPARATOR="crumbSeparator";
-var FILE_EXTENSIONS=new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
-var PATH_SEPARATOR="/";
-
-function sc(s) {
-	var l=s.toLowerCase();
-	return l.substr(0,1).toUpperCase()+l.substr(1);
-}
-function getdirs() {
-	var t=document.location.pathname.split(PATH_SEPARATOR);
-	var lc=t[t.length-1];
-	for(var i=0;i < FILE_EXTENSIONS.length;i++)
-	{
-		if(lc.indexOf(FILE_EXTENSIONS[i]))
-			return t.slice(1,t.length-1); }
-	return t.slice(1,t.length);
-}
-function getcrumbs( d )
-{
-	var pre = "/";
-	var post = "/";
-	var c = new Array();
-	if( d != null )
-	{
-		for(var i=0;i < d.length;i++) {
-			pre+=d[i]+postfix;
-			c.push(new Array(d[i],pre)); }
-	}
-	if(PREPREND_CRUMBS.length > 0 )
-		return PREPREND_CRUMBS.concat( c );
-	return c;
-}
-function gettrail( c )
-{
-	var h=DISPLAY_PREPREND;
-	for(var i=0;i < c.length;i++)
-	{
-		h+='<a href="'+c[i][1]+'" >'+sc(c[i][0])+'</a>';
-		if(i!=(c.length-1))
-			h+=DISPLAY_SEPARATOR; }
-	return h+DISPLAY_POSTPREND;
-}
-
-function gettrailXHTML( c )
-{
-	var h='<span class="'+CSS_CLASS_TRAIL+'">'+DISPLAY_PREPREND;
-	for(var i=0;i < c.length;i++)
-	{
-		h+='<a href="'+c[i][1]+'" class="'+CSS_CLASS_CRUMB+'">'+sc(c[i][0])+'</a>';
-		if(i!=(c.length-1))
-			h+='<span class="'+CSS_CLASS_SEPARATOR+'">'+DISPLAY_SEPARATOR+'</span>'; }
-	return h+DISPLAY_POSTPREND+'</span>';
-}
-
-if(document.location.href.toLowerCase().indexOf("http://")==-1)
-	document.write(gettrail(getcrumbs()));
-else
-	document.write(gettrail(getcrumbs(getdirs())));
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/breadcrumbs.js
----------------------------------------------------------------------
diff --git a/docs/skin/breadcrumbs.js b/docs/skin/breadcrumbs.js
deleted file mode 100644
index aea80ec..0000000
--- a/docs/skin/breadcrumbs.js
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
-* 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.
-*/
-/**
- * This script, when included in a html file, builds a neat breadcrumb trail
- * based on its url. That is, if it doesn't contains bugs (I'm relatively
- * sure it does).
- *
- * Typical usage:
- * <script type="text/javascript" language="JavaScript" src="breadcrumbs.js"></script>
- */
-
-/**
- * IE 5 on Mac doesn't know Array.push.
- *
- * Implement it - courtesy to fritz.
- */
-var abc	= new Array();
-if (!abc.push) {
-  Array.prototype.push	= function(what){this[this.length]=what}
-}
-
-/* ========================================================================
-	CONSTANTS
-   ======================================================================== */
-
-/**
- * Two-dimensional array containing extra crumbs to place at the front of
- * the trail. Specify first the name of the crumb, then the URI that belongs
- * to it. You'll need to modify this for every domain or subdomain where
- * you use this script (you can leave it as an empty array if you wish)
- */
-var PREPREND_CRUMBS = new Array();
-
-var link1 = "@skinconfig.trail.link1.name@";
-var link2 = "@skinconfig.trail.link2.name@";
-var link3 = "@skinconfig.trail.link3.name@";
-
-var href1 = "@skinconfig.trail.link1.href@";
-var href2 = "@skinconfig.trail.link2.href@";
-var href3 = "@skinconfig.trail.link3.href@";
-
-   if(!(link1=="")&&!link1.indexOf( "@" ) == 0){
-     PREPREND_CRUMBS.push( new Array( link1, href1 ) );
-   }
-   if(!(link2=="")&&!link2.indexOf( "@" ) == 0){
-     PREPREND_CRUMBS.push( new Array( link2, href2 ) );
-   }
-   if(!(link3=="")&&!link3.indexOf( "@" ) == 0){
-     PREPREND_CRUMBS.push( new Array( link3, href3 ) );
-   }
-
-/**
- * String to include between crumbs:
- */
-var DISPLAY_SEPARATOR = " &gt; ";
-/**
- * String to include at the beginning of the trail
- */
-var DISPLAY_PREPREND = " &gt; ";
-/**
- * String to include at the end of the trail
- */
-var DISPLAY_POSTPREND = "";
-
-/**
- * CSS Class to use for a single crumb:
- */
-var CSS_CLASS_CRUMB = "breadcrumb";
-
-/**
- * CSS Class to use for the complete trail:
- */
-var CSS_CLASS_TRAIL = "breadcrumbTrail";
-
-/**
- * CSS Class to use for crumb separator:
- */
-var CSS_CLASS_SEPARATOR = "crumbSeparator";
-
-/**
- * Array of strings containing common file extensions. We use this to
- * determine what part of the url to ignore (if it contains one of the
- * string specified here, we ignore it).
- */
-var FILE_EXTENSIONS = new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
-
-/**
- * String that separates parts of the breadcrumb trail from each other.
- * When this is no longer a slash, I'm sure I'll be old and grey.
- */
-var PATH_SEPARATOR = "/";
-
-/* ========================================================================
-	UTILITY FUNCTIONS
-   ======================================================================== */
-/**
- * Capitalize first letter of the provided string and return the modified
- * string.
- */
-function sentenceCase( string )
-{        return string;
-	//var lower = string.toLowerCase();
-	//return lower.substr(0,1).toUpperCase() + lower.substr(1);
-}
-
-/**
- * Returns an array containing the names of all the directories in the
- * current document URL
- */
-function getDirectoriesInURL()
-{
-	var trail = document.location.pathname.split( PATH_SEPARATOR );
-
-	// check whether last section is a file or a directory
-	var lastcrumb = trail[trail.length-1];
-	for( var i = 0; i < FILE_EXTENSIONS.length; i++ )
-	{
-		if( lastcrumb.indexOf( FILE_EXTENSIONS[i] ) )
-		{
-			// it is, remove it and send results
-			return trail.slice( 1, trail.length-1 );
-		}
-	}
-
-	// it's not; send the trail unmodified
-	return trail.slice( 1, trail.length );
-}
-
-/* ========================================================================
-	BREADCRUMB FUNCTIONALITY
-   ======================================================================== */
-/**
- * Return a two-dimensional array describing the breadcrumbs based on the
- * array of directories passed in.
- */
-function getBreadcrumbs( dirs )
-{
-	var prefix = "/";
-	var postfix = "/";
-
-	// the array we will return
-	var crumbs = new Array();
-
-	if( dirs != null )
-	{
-		for( var i = 0; i < dirs.length; i++ )
-		{
-			prefix += dirs[i] + postfix;
-			crumbs.push( new Array( dirs[i], prefix ) );
-		}
-	}
-
-	// preprend the PREPREND_CRUMBS
-	if(PREPREND_CRUMBS.length > 0 )
-	{
-		return PREPREND_CRUMBS.concat( crumbs );
-	}
-
-	return crumbs;
-}
-
-/**
- * Return a string containing a simple text breadcrumb trail based on the
- * two-dimensional array passed in.
- */
-function getCrumbTrail( crumbs )
-{
-	var xhtml = DISPLAY_PREPREND;
-
-	for( var i = 0; i < crumbs.length; i++ )
-	{
-		xhtml += '<a href="' + crumbs[i][1] + '" >';
-		xhtml += unescape( crumbs[i][0] ) + '</a>';
-		if( i != (crumbs.length-1) )
-		{
-			xhtml += DISPLAY_SEPARATOR;
-		}
-	}
-
-	xhtml += DISPLAY_POSTPREND;
-
-	return xhtml;
-}
-
-/**
- * Return a string containing an XHTML breadcrumb trail based on the
- * two-dimensional array passed in.
- */
-function getCrumbTrailXHTML( crumbs )
-{
-	var xhtml = '<span class="' + CSS_CLASS_TRAIL  + '">';
-	xhtml += DISPLAY_PREPREND;
-
-	for( var i = 0; i < crumbs.length; i++ )
-	{
-		xhtml += '<a href="' + crumbs[i][1] + '" class="' + CSS_CLASS_CRUMB + '">';
-		xhtml += unescape( crumbs[i][0] ) + '</a>';
-		if( i != (crumbs.length-1) )
-		{
-			xhtml += '<span class="' + CSS_CLASS_SEPARATOR + '">' + DISPLAY_SEPARATOR + '</span>';
-		}
-	}
-
-	xhtml += DISPLAY_POSTPREND;
-	xhtml += '</span>';
-
-	return xhtml;
-}
-
-/* ========================================================================
-	PRINT BREADCRUMB TRAIL
-   ======================================================================== */
-
-// check if we're local; if so, only print the PREPREND_CRUMBS
-if( document.location.href.toLowerCase().indexOf( "http://" ) == -1 )
-{
-	document.write( getCrumbTrail( getBreadcrumbs() ) );
-}
-else
-{
-	document.write( getCrumbTrail( getBreadcrumbs( getDirectoriesInURL() ) ) );
-}
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/fontsize.js
----------------------------------------------------------------------
diff --git a/docs/skin/fontsize.js b/docs/skin/fontsize.js
deleted file mode 100644
index 11722bf..0000000
--- a/docs/skin/fontsize.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
-* 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.
-*/
-function init() 
-{ //embedded in the doc
-  //ndeSetTextSize();
-}
-
-function checkBrowser(){
-  if (!document.getElementsByTagName){
-    return true;
-  }
-  else{
-    return false;
-  }
-}
-
-
-function ndeSetTextSize(chgsize,rs) 
-{
-  var startSize;
-  var newSize;
-
-  if (!checkBrowser)
-  {
-    return;
-  }
-
-  startSize = parseInt(ndeGetDocTextSize());
-
-  if (!startSize)
-  {
-    startSize = 16;
-  }
-
-  switch (chgsize)
-  {
-  case 'incr':
-    newSize = startSize + 2;
-    break;
-
-  case 'decr':
-    newSize = startSize - 2;
-    break;
-
-  case 'reset':
-    if (rs) {newSize = rs;} else {newSize = 16;}
-    break;
-
-  default:
-    try{
-      newSize = parseInt(ndeReadCookie("nde-textsize"));
-    }
-    catch(e){
-      alert(e);
-    }
-    
-    if (!newSize || newSize == 'NaN')
-    {
-      newSize = startSize;
-    }
-    break;
-
-  }
-
-  if (newSize < 10) 
-  {
-    newSize = 10;
-  }
-
-  newSize += 'px';
-
-  document.getElementsByTagName('html')[0].style.fontSize = newSize;
-  document.getElementsByTagName('body')[0].style.fontSize = newSize;
-
-  ndeCreateCookie("nde-textsize", newSize, 365);
-}
-
-function ndeGetDocTextSize() 
-{
-  if (!checkBrowser)
-  {
-    return 0;
-  }
-
-  var size = 0;
-  var body = document.getElementsByTagName('body')[0];
-
-  if (body.style && body.style.fontSize)
-  {
-    size = body.style.fontSize;
-  }
-  else if (typeof(getComputedStyle) != 'undefined')
-  {
-    size = getComputedStyle(body,'').getPropertyValue('font-size');
-  }
-  else if (body.currentStyle)
-  {
-   size = body.currentStyle.fontSize;
-  }
-
-  //fix IE bug
-  if( isNaN(size)){
-    if(size.substring(size.length-1)=="%"){
-      return
-    }
-
-  }
-
-  return size;
-
-}
-
-
-
-function ndeCreateCookie(name,value,days) 
-{
-  var cookie = name + "=" + value + ";";
-
-  if (days) 
-  {
-    var date = new Date();
-    date.setTime(date.getTime()+(days*24*60*60*1000));
-    cookie += " expires=" + date.toGMTString() + ";";
-  }
-  cookie += " path=/";
-
-  document.cookie = cookie;
-
-}
-
-function ndeReadCookie(name) 
-{
-  var nameEQ = name + "=";
-  var ca = document.cookie.split(';');
-
- 
-  for(var i = 0; i < ca.length; i++) 
-  {
-    var c = ca[i];
-    while (c.charAt(0) == ' ') 
-    {
-      c = c.substring(1, c.length);
-    }
-
-    ctest = c.substring(0,name.length);
- 
-    if(ctest == name){
-      return c.substring(nameEQ.length,c.length);
-    }
-  }
-  return null;
-}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/getBlank.js
----------------------------------------------------------------------
diff --git a/docs/skin/getBlank.js b/docs/skin/getBlank.js
deleted file mode 100644
index d9978c0..0000000
--- a/docs/skin/getBlank.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* 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.
-*/
-/**
- * getBlank script - when included in a html file and called from a form text field, will set the value of this field to ""
- * if the text value is still the standard value.
- * getPrompt script - when included in a html file and called from a form text field, will set the value of this field to the prompt
- * if the text value is empty.
- *
- * Typical usage:
- * <script type="text/javascript" language="JavaScript" src="getBlank.js"></script>
- * <input type="text" id="query" value="Search the site:" onFocus="getBlank (this, 'Search the site:');" onBlur="getBlank (this, 'Search the site:');"/>
- */
-<!--
-function getBlank (form, stdValue){
-if (form.value == stdValue){
-	form.value = '';
-	}
-return true;
-}
-function getPrompt (form, stdValue){
-if (form.value == ''){
-	form.value = stdValue;
-	}
-return true;
-}
-//-->

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/getMenu.js
----------------------------------------------------------------------
diff --git a/docs/skin/getMenu.js b/docs/skin/getMenu.js
deleted file mode 100644
index b17aad6..0000000
--- a/docs/skin/getMenu.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-* 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.
-*/
-/**
- * This script, when included in a html file, can be used to make collapsible menus
- *
- * Typical usage:
- * <script type="text/javascript" language="JavaScript" src="menu.js"></script>
- */
-
-if (document.getElementById){ 
-  document.write('<style type="text/css">.menuitemgroup{display: none;}</style>')
-}
-
-
-function SwitchMenu(obj, thePath)
-{
-var open = 'url("'+thePath + 'images/chapter_open.gif")';
-var close = 'url("'+thePath + 'images/chapter.gif")';
-  if(document.getElementById)  {
-    var el = document.getElementById(obj);
-    var title = document.getElementById(obj+'Title');
-
-    if(el.style.display != "block"){ 
-      title.style.backgroundImage = open;
-      el.style.display = "block";
-    }else{
-      title.style.backgroundImage = close;
-      el.style.display = "none";
-    }
-  }// end -  if(document.getElementById) 
-}//end - function SwitchMenu(obj)

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/README.txt
----------------------------------------------------------------------
diff --git a/docs/skin/images/README.txt b/docs/skin/images/README.txt
deleted file mode 100644
index e0932f4..0000000
--- a/docs/skin/images/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-The images in this directory are used if the current skin lacks them.

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/add.jpg
----------------------------------------------------------------------
diff --git a/docs/skin/images/add.jpg b/docs/skin/images/add.jpg
deleted file mode 100644
index 06831ee..0000000
Binary files a/docs/skin/images/add.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/apache-thanks.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/apache-thanks.png b/docs/skin/images/apache-thanks.png
deleted file mode 100644
index c0bea09..0000000
Binary files a/docs/skin/images/apache-thanks.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/built-with-cocoon.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/built-with-cocoon.gif b/docs/skin/images/built-with-cocoon.gif
deleted file mode 100644
index 0b38f78..0000000
Binary files a/docs/skin/images/built-with-cocoon.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/built-with-forrest-button.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/built-with-forrest-button.png b/docs/skin/images/built-with-forrest-button.png
deleted file mode 100644
index 4a787ab..0000000
Binary files a/docs/skin/images/built-with-forrest-button.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/chapter.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/chapter.gif b/docs/skin/images/chapter.gif
deleted file mode 100644
index d3d8245..0000000
Binary files a/docs/skin/images/chapter.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/chapter_open.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/chapter_open.gif b/docs/skin/images/chapter_open.gif
deleted file mode 100644
index eecce18..0000000
Binary files a/docs/skin/images/chapter_open.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/current.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/current.gif b/docs/skin/images/current.gif
deleted file mode 100644
index fd82c08..0000000
Binary files a/docs/skin/images/current.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/error.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/error.png b/docs/skin/images/error.png
deleted file mode 100644
index b4fe06e..0000000
Binary files a/docs/skin/images/error.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/external-link.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/external-link.gif b/docs/skin/images/external-link.gif
deleted file mode 100644
index ff2f7b2..0000000
Binary files a/docs/skin/images/external-link.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/fix.jpg
----------------------------------------------------------------------
diff --git a/docs/skin/images/fix.jpg b/docs/skin/images/fix.jpg
deleted file mode 100644
index 1d6820b..0000000
Binary files a/docs/skin/images/fix.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/forrest-credit-logo.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/forrest-credit-logo.png b/docs/skin/images/forrest-credit-logo.png
deleted file mode 100644
index 8a63e42..0000000
Binary files a/docs/skin/images/forrest-credit-logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/hack.jpg
----------------------------------------------------------------------
diff --git a/docs/skin/images/hack.jpg b/docs/skin/images/hack.jpg
deleted file mode 100644
index f38d50f..0000000
Binary files a/docs/skin/images/hack.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/header_white_line.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/header_white_line.gif b/docs/skin/images/header_white_line.gif
deleted file mode 100644
index 369cae8..0000000
Binary files a/docs/skin/images/header_white_line.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/info.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/info.png b/docs/skin/images/info.png
deleted file mode 100644
index 2e53447..0000000
Binary files a/docs/skin/images/info.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/instruction_arrow.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/instruction_arrow.png b/docs/skin/images/instruction_arrow.png
deleted file mode 100644
index 0fbc724..0000000
Binary files a/docs/skin/images/instruction_arrow.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/label.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/label.gif b/docs/skin/images/label.gif
deleted file mode 100644
index c83a389..0000000
Binary files a/docs/skin/images/label.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/page.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/page.gif b/docs/skin/images/page.gif
deleted file mode 100644
index a144d32..0000000
Binary files a/docs/skin/images/page.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/pdfdoc.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/pdfdoc.gif b/docs/skin/images/pdfdoc.gif
deleted file mode 100644
index ec13eb5..0000000
Binary files a/docs/skin/images/pdfdoc.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/poddoc.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/poddoc.png b/docs/skin/images/poddoc.png
deleted file mode 100644
index a393df7..0000000
Binary files a/docs/skin/images/poddoc.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/printer.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/printer.gif b/docs/skin/images/printer.gif
deleted file mode 100644
index a8d0d41..0000000
Binary files a/docs/skin/images/printer.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png b/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png
deleted file mode 100644
index cdb460a..0000000
Binary files a/docs/skin/images/rc-b-l-15-1body-2menu-3menu.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png b/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png
deleted file mode 100644
index 3eff254..0000000
Binary files a/docs/skin/images/rc-b-r-15-1body-2menu-3menu.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png
deleted file mode 100644
index b175f27..0000000
Binary files a/docs/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png b/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png
deleted file mode 100644
index e9f4440..0000000
Binary files a/docs/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png
deleted file mode 100644
index f1e015b..0000000
Binary files a/docs/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png b/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png
deleted file mode 100644
index e9f4440..0000000
Binary files a/docs/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png b/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png
deleted file mode 100644
index 29388b5..0000000
Binary files a/docs/skin/images/rc-t-r-15-1body-2menu-3menu.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png b/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png
deleted file mode 100644
index 944ed73..0000000
Binary files a/docs/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png b/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png
deleted file mode 100644
index c4d4a8c..0000000
Binary files a/docs/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png b/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png
deleted file mode 100644
index 944ed73..0000000
Binary files a/docs/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/remove.jpg
----------------------------------------------------------------------
diff --git a/docs/skin/images/remove.jpg b/docs/skin/images/remove.jpg
deleted file mode 100644
index 8c9b9ef..0000000
Binary files a/docs/skin/images/remove.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/rss.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/rss.png b/docs/skin/images/rss.png
deleted file mode 100644
index f0796ac..0000000
Binary files a/docs/skin/images/rss.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/spacer.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/spacer.gif b/docs/skin/images/spacer.gif
deleted file mode 100644
index 35d42e8..0000000
Binary files a/docs/skin/images/spacer.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/success.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/success.png b/docs/skin/images/success.png
deleted file mode 100644
index 96fcfea..0000000
Binary files a/docs/skin/images/success.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/txtdoc.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/txtdoc.png b/docs/skin/images/txtdoc.png
deleted file mode 100644
index bf8b374..0000000
Binary files a/docs/skin/images/txtdoc.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/update.jpg
----------------------------------------------------------------------
diff --git a/docs/skin/images/update.jpg b/docs/skin/images/update.jpg
deleted file mode 100644
index beb9207..0000000
Binary files a/docs/skin/images/update.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/valid-html401.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/valid-html401.png b/docs/skin/images/valid-html401.png
deleted file mode 100644
index 3855210..0000000
Binary files a/docs/skin/images/valid-html401.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/vcss.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/vcss.png b/docs/skin/images/vcss.png
deleted file mode 100644
index 9b2f596..0000000
Binary files a/docs/skin/images/vcss.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/warning.png
----------------------------------------------------------------------
diff --git a/docs/skin/images/warning.png b/docs/skin/images/warning.png
deleted file mode 100644
index b81b2ce..0000000
Binary files a/docs/skin/images/warning.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/images/xmldoc.gif
----------------------------------------------------------------------
diff --git a/docs/skin/images/xmldoc.gif b/docs/skin/images/xmldoc.gif
deleted file mode 100644
index c92d9b9..0000000
Binary files a/docs/skin/images/xmldoc.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/menu.js
----------------------------------------------------------------------
diff --git a/docs/skin/menu.js b/docs/skin/menu.js
deleted file mode 100644
index 06ea471..0000000
--- a/docs/skin/menu.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-* 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.
-*/
-/**
- * This script, when included in a html file, can be used to make collapsible menus
- *
- * Typical usage:
- * <script type="text/javascript" language="JavaScript" src="menu.js"></script>
- */
-
-if (document.getElementById){ 
-  document.write('<style type="text/css">.menuitemgroup{display: none;}</style>')
-}
-
-function SwitchMenu(obj)
-{
-  if(document.getElementById)  {
-    var el = document.getElementById(obj);
-    var title = document.getElementById(obj+'Title');
-
-    if(obj.indexOf("_selected_")==0&&el.style.display == ""){
-      el.style.display = "block";
-      title.className = "pagegroupselected";
-    }
-
-    if(el.style.display != "block"){
-      el.style.display = "block";
-      title.className = "pagegroupopen";
-    }
-    else{
-      el.style.display = "none";
-      title.className = "pagegroup";
-    }
-  }// end -  if(document.getElementById) 
-}//end - function SwitchMenu(obj)

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/note.txt
----------------------------------------------------------------------
diff --git a/docs/skin/note.txt b/docs/skin/note.txt
deleted file mode 100644
index d34c8db..0000000
--- a/docs/skin/note.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-Notes for developer:
-
---Legend-------------------
-TODO -> blocker
-DONE -> blocker
-ToDo -> enhancement bug
-done -> enhancement bug
-
---Issues-------------------
-- the corner images should be rendered through svg with the header color.
--> DONE 
--> ToDo: get rid of the images and use only divs!
-
-- the menu points should be displayed "better". 
--> DONE
--- Use the krysalis-site menu approach for the overall menu display.
--> DONE
--- Use the old lenya innermenu approch to further enhance the menu .
--> DONE
-
-- the content area needs some attention.
--> DONE
--- introduce the heading scheme from krysalis (<headings type="clean|box|underlined"/>)
--> DONE 
--> ToDo: make box with round corners
--> done: make underlined with variable border height
--> ToDo: make underline with bottom round corner
--- introduce the toc for each html-page
--> DONE
--- introduce the external-link-images.
--> DONE
-
-- the publish note should be where now only a border is. 
-Like <div id="published"/>
--> DONE
-, but make it configurable.
--> DONE
-- footer needs some attention
--> DONE
--- the footer do not have the color profile! Enable it!
--> DONE
--- the footer should as well contain a feedback link. 
-See http://issues.apache.org/eyebrowse/ReadMsg?listName=forrest-user@xml.apache.org&msgNo=71
--> DONE
-
-- introduce credits alternativ location
--> DONE
-
-- border for published / breadtrail / menu /tab divs 
--> ToDo
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/print.css
----------------------------------------------------------------------
diff --git a/docs/skin/print.css b/docs/skin/print.css
deleted file mode 100644
index aaa9931..0000000
--- a/docs/skin/print.css
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-* 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.
-*/
-body {
-  font-family: Georgia, Palatino, serif;
-  font-size: 12pt;
-  background: white;
-}
-
-#tabs,
-#menu,
-#content .toc {
-  display: none;
-}
-
-#content {
-  width: auto;
-  padding: 0;
-  float: none !important;
-  color: black;
-  background: inherit;
-}
-
-a:link, a:visited {
-  color: #336699;
-  background: inherit;
-  text-decoration: underline;
-}
-
-#top .logo {
-  padding: 0;
-  margin: 0 0 2em 0;
-}
-
-#footer {
-  margin-top: 4em;
-}
-
-acronym {
-  border: 0;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/profile.css
----------------------------------------------------------------------
diff --git a/docs/skin/profile.css b/docs/skin/profile.css
deleted file mode 100644
index eefaa88..0000000
--- a/docs/skin/profile.css
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-/* ==================== aural ============================ */
-
-@media aural {
-  h1, h2, h3, h4, h5, h6 { voice-family: paul, male; stress: 20; richness: 90 }
-  h1 { pitch: x-low; pitch-range: 90 }
-  h2 { pitch: x-low; pitch-range: 80 }
-  h3 { pitch: low; pitch-range: 70 }
-  h4 { pitch: medium; pitch-range: 60 }
-  h5 { pitch: medium; pitch-range: 50 }
-  h6 { pitch: medium; pitch-range: 40 }
-  li, dt, dd { pitch: medium; richness: 60 }
-  dt { stress: 80 }
-  pre, code, tt { pitch: medium; pitch-range: 0; stress: 0; richness: 80 }
-  em { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
-  strong { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
-  dfn { pitch: high; pitch-range: 60; stress: 60 }
-  s, strike { richness: 0 }
-  i { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
-  b { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
-  u { richness: 0 }
-  
-  :link { voice-family: harry, male }
-  :visited { voice-family: betty, female }
-  :active { voice-family: betty, female; pitch-range: 80; pitch: x-high }
-}
-  
-a.external  {
-  padding: 0 20px 0px 0px;
-	display:inline;
-  background-repeat: no-repeat;
-	background-position: center right;
-	background-image: url(images/external-link.gif);
-}
-  
-#top          { background-color: #FFFFFF;}  
- 
-#top .header .current { background-color: #4C6C8F;} 
-#top .header .current a:link {  color: #ffffff;  }
-#top .header .current a:visited { color: #ffffff; }
-#top .header .current a:hover { color: #ffffff; }
- 
-#tabs li      { background-color: #E5E4D9 ;} 
-#tabs li a:link {  color: #000000;  }
-#tabs li a:visited { color: #000000; }
-#tabs li a:hover { color: #000000; }
-
-#level2tabs a.selected      { background-color: #4C6C8F ;} 
-#level2tabs a:link {  color: #ffffff;  }
-#level2tabs a:visited { color: #ffffff; }
-#level2tabs a:hover { color: #ffffff; }
-
-#level2tabs { background-color: #E5E4D9;}
-#level2tabs a.unselected:link {  color: #000000;  }
-#level2tabs a.unselected:visited { color: #000000; }
-#level2tabs a.unselected:hover { color: #000000; }
-
-.heading { background-color: #E5E4D9;} 
-
-.boxed { background-color: #E5E4D9;} 
-.underlined_5 	{border-bottom: solid 5px #E5E4D9;}
-.underlined_10 	{border-bottom: solid 10px #E5E4D9;}
-table caption { 
-background-color: #E5E4D9; 
-color: #000000;
-}
-    
-#feedback {
-color: #FFFFFF;
-background: #4C6C8F;
-text-align: center;
-}
-#feedback #feedbackto {
-color: #FFFFFF;
-}   
-
-#publishedStrip { 
-color: #FFFFFF;
-background: #4C6C8F; 
-}
-
-#publishedStrip { 
-color: #000000;
-background: #E5E4D9; 
-}
-
-#menu .menupagetitle  { background-color: #CFDCED;
-  color: #000000;}
-
-#menu           { border-color: #999999;}
-#menu .menupagetitle  { border-color: #999999;}
-#menu .menupageitemgroup  { border-color: #999999;}
-
-#menu      { background-color: #4C6C8F;} 
-#menu  {  color: #ffffff;} 
-#menu a:link {  color: #ffffff;} 
-#menu a:visited {  color: #ffffff;} 
-#menu a:hover {  
-background-color: #4C6C8F;
-color: #ffffff;} 
-
-#menu h1 {
-color: #000000;
-background-color: #cfdced;
-}   
- 
-#top .searchbox { 
-background-color: #E5E4D9 ;
-color: #000000; 
-} 
- 
-#menu .menupageitemgroup     { 
-background-color: #E5E4D9;
-}
-#menu .menupageitem {
-color: #000000;
-} 
-#menu .menupageitem a:link {  color: #000000;} 
-#menu .menupageitem a:visited {  color: #000000;} 
-#menu .menupageitem a:hover {  
-background-color: #E5E4D9;
-color: #000000;
-}
-
-body{ 
-background-color: #ffffff;
-color: #000000;
-} 
-a:link { color:#0000ff} 
-a:visited { color:#009999} 
-a:hover { color:#6587ff} 
-
- 
-.ForrestTable      { background-color: #ccc;} 
- 
-.ForrestTable td   { background-color: #ffffff;} 
- 
-.highlight        { background-color: #ffff00;} 
- 
-.fixme        { border-color: #c60;} 
- 
-.note         { border-color: #069;} 
- 
-.warning         { border-color: #900;} 
- 
-.code         { border-color: #a5b6c6;} 
- 
-#footer       { background-color: #E5E4D9;} 
-/* extra-css */
-    
-    p.quote {
-      margin-left: 2em;
-      padding: .5em;
-      background-color: #f0f0f0;
-      font-family: monospace;
-    }
-
-    pre.code {
-      margin-left: 0em;
-      padding: 0.5em;
-      background-color: #f0f0f0;
-      font-family: monospace;
-    }
-
-
-
-  
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/skin/prototype.js
----------------------------------------------------------------------
diff --git a/docs/skin/prototype.js b/docs/skin/prototype.js
deleted file mode 100644
index ed7d920..0000000
--- a/docs/skin/prototype.js
+++ /dev/null
@@ -1,1257 +0,0 @@
-/*  Prototype JavaScript framework, version 1.4.0_pre4
- *  (c) 2005 Sam Stephenson <sa...@conio.net>
- *
- *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
- *  against the source tree, available from the Prototype darcs repository. 
- *
- *  Prototype is freely distributable under the terms of an MIT-style license.
- *
- *  For details, see the Prototype web site: http://prototype.conio.net/
- *
-/*--------------------------------------------------------------------------*/
-
-var Prototype = {
-  Version: '1.4.0_pre4',
-  
-  emptyFunction: function() {},
-  K: function(x) {return x}
-}
-
-var Class = {
-  create: function() {
-    return function() { 
-      this.initialize.apply(this, arguments);
-    }
-  }
-}
-
-var Abstract = new Object();
-
-Object.extend = function(destination, source) {
-  for (property in source) {
-    destination[property] = source[property];
-  }
-  return destination;
-}
-
-Function.prototype.bind = function(object) {
-  var __method = this;
-  return function() {
-    return __method.apply(object, arguments);
-  }
-}
-
-Function.prototype.bindAsEventListener = function(object) {
-  var __method = this;
-  return function(event) {
-    return __method.call(object, event || window.event);
-  }
-}
-
-Number.prototype.toColorPart = function() {
-  var digits = this.toString(16);
-  if (this < 16) return '0' + digits;
-  return digits;
-}
-
-var Try = {
-  these: function() {
-    var returnValue;
-
-    for (var i = 0; i < arguments.length; i++) {
-      var lambda = arguments[i];
-      try {
-        returnValue = lambda();
-        break;
-      } catch (e) {}
-    }
-
-    return returnValue;
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
-  initialize: function(callback, frequency) {
-    this.callback = callback;
-    this.frequency = frequency;
-    this.currentlyExecuting = false;
-
-    this.registerCallback();
-  },
-
-  registerCallback: function() {
-    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
-  },
-
-  onTimerEvent: function() {
-    if (!this.currentlyExecuting) {
-      try { 
-        this.currentlyExecuting = true;
-        this.callback(); 
-      } finally { 
-        this.currentlyExecuting = false;
-      }
-    }
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-function $() {
-  var elements = new Array();
-
-  for (var i = 0; i < arguments.length; i++) {
-    var element = arguments[i];
-    if (typeof element == 'string')
-      element = document.getElementById(element);
-
-    if (arguments.length == 1) 
-      return element;
-
-    elements.push(element);
-  }
-
-  return elements;
-}
-
-if (!Array.prototype.push) {
-  Array.prototype.push = function() {
-		var startLength = this.length;
-		for (var i = 0; i < arguments.length; i++)
-      this[startLength + i] = arguments[i];
-	  return this.length;
-  }
-}
-
-if (!Function.prototype.apply) {
-  // Based on code from http://www.youngpup.net/
-  Function.prototype.apply = function(object, parameters) {
-    var parameterStrings = new Array();
-    if (!object)     object = window;
-    if (!parameters) parameters = new Array();
-    
-    for (var i = 0; i < parameters.length; i++)
-      parameterStrings[i] = 'parameters[' + i + ']';
-    
-    object.__apply__ = this;
-    var result = eval('object.__apply__(' + 
-      parameterStrings.join(', ') + ')');
-    object.__apply__ = null;
-    
-    return result;
-  }
-}
-
-Object.extend(String.prototype, {
-  stripTags: function() {
-    return this.replace(/<\/?[^>]+>/gi, '');
-  },
-
-  escapeHTML: function() {
-    var div = document.createElement('div');
-    var text = document.createTextNode(this);
-    div.appendChild(text);
-    return div.innerHTML;
-  },
-
-  unescapeHTML: function() {
-    var div = document.createElement('div');
-    div.innerHTML = this.stripTags();
-    return div.childNodes[0].nodeValue;
-  },
-  
-  parseQuery: function() {
-    var str = this;
-    if (str.substring(0,1) == '?') {
-      str = this.substring(1);
-    }
-    var result = {};
-    var pairs = str.split('&');
-    for (var i = 0; i < pairs.length; i++) {
-      var pair = pairs[i].split('=');
-      result[pair[0]] = pair[1];
-    }
-    return result;
-  }
-});
-
-
-var _break    = new Object();
-var _continue = new Object();
-
-var Enumerable = {
-  each: function(iterator) {
-    var index = 0;
-    try {
-      this._each(function(value) {
-        try {
-          iterator(value, index++);
-        } catch (e) {
-          if (e != _continue) throw e;
-        }
-      });
-    } catch (e) {
-      if (e != _break) throw e;
-    }
-  },
-  
-  all: function(iterator) {
-    var result = true;
-    this.each(function(value, index) {
-      if (!(result &= (iterator || Prototype.K)(value, index))) 
-        throw _break;
-    });
-    return result;
-  },
-  
-  any: function(iterator) {
-    var result = true;
-    this.each(function(value, index) {
-      if (result &= (iterator || Prototype.K)(value, index)) 
-        throw _break;
-    });
-    return result;
-  },
-  
-  collect: function(iterator) {
-    var results = [];
-    this.each(function(value, index) {
-      results.push(iterator(value, index));
-    });
-    return results;
-  },
-  
-  detect: function (iterator) {
-    var result;
-    this.each(function(value, index) {
-      if (iterator(value, index)) {
-        result = value;
-        throw _break;
-      }
-    });
-    return result;
-  },
-  
-  findAll: function(iterator) {
-    var results = [];
-    this.each(function(value, index) {
-      if (iterator(value, index))
-        results.push(value);
-    });
-    return results;
-  },
-  
-  grep: function(pattern, iterator) {
-    var results = [];
-    this.each(function(value, index) {
-      var stringValue = value.toString();
-      if (stringValue.match(pattern))
-        results.push((iterator || Prototype.K)(value, index));
-    })
-    return results;
-  },
-  
-  include: function(object) {
-    var found = false;
-    this.each(function(value) {
-      if (value == object) {
-        found = true;
-        throw _break;
-      }
-    });
-    return found;
-  },
-  
-  inject: function(memo, iterator) {
-    this.each(function(value, index) {
-      memo = iterator(memo, value, index);
-    });
-    return memo;
-  },
-  
-  invoke: function(method) {
-    var args = $A(arguments).slice(1);
-    return this.collect(function(value) {
-      return value[method].apply(value, args);
-    });
-  },
-  
-  max: function(iterator) {
-    var result;
-    this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
-      if (value >= (result || value))
-        result = value;
-    });
-    return result;
-  },
-  
-  min: function(iterator) {
-    var result;
-    this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
-      if (value <= (result || value))
-        result = value;
-    });
-    return result;
-  },
-  
-  partition: function(iterator) {
-    var trues = [], falses = [];
-    this.each(function(value, index) {
-      ((iterator || Prototype.K)(value, index) ? 
-        trues : falses).push(value);
-    });
-    return [trues, falses];
-  },
-  
-  pluck: function(property) {
-    var results = [];
-    this.each(function(value, index) {
-      results.push(value[property]);
-    });
-    return results;
-  },
-  
-  reject: function(iterator) {
-    var results = [];
-    this.each(function(value, index) {
-      if (!iterator(value, index))
-        results.push(value);
-    });
-    return results;
-  },
-  
-  sortBy: function(iterator) {
-    return this.collect(function(value, index) {
-      return {value: value, criteria: iterator(value, index)};
-    }).sort(function(left, right) {
-      var a = left.criteria, b = right.criteria;
-      return a < b ? -1 : a > b ? 1 : 0;
-    }).pluck('value');
-  },
-  
-  toArray: function() {
-    return this.collect(Prototype.K);
-  },
-  
-  zip: function() {
-    var iterator = Prototype.K, args = $A(arguments);
-    if (typeof args.last() == 'function')
-      iterator = args.pop();
-
-    var collections = [this].concat(args).map($A);
-    return this.map(function(value, index) {
-      iterator(value = collections.pluck(index));
-      return value;
-    });
-  }
-}
-
-Object.extend(Enumerable, {
-  map:     Enumerable.collect,
-  find:    Enumerable.detect,
-  select:  Enumerable.findAll,
-  member:  Enumerable.include,
-  entries: Enumerable.toArray
-});
-
-$A = Array.from = function(iterable) {
-  var results = [];
-  for (var i = 0; i < iterable.length; i++)
-    results.push(iterable[i]);
-  return results;
-}
-
-Object.extend(Array.prototype, {
-  _each: function(iterator) {
-    for (var i = 0; i < this.length; i++)
-      iterator(this[i]);
-  },
-  
-  first: function() {
-    return this[0];
-  },
-  
-  last: function() {
-    return this[this.length - 1];
-  }
-});
-
-Object.extend(Array.prototype, Enumerable);
-
-
-var Ajax = {
-  getTransport: function() {
-    return Try.these(
-      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
-      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
-      function() {return new XMLHttpRequest()}
-    ) || false;
-  }
-}
-
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
-  setOptions: function(options) {
-    this.options = {
-      method:       'post',
-      asynchronous: true,
-      parameters:   ''
-    }
-    Object.extend(this.options, options || {});
-  },
-
-  responseIsSuccess: function() {
-    return this.transport.status == undefined
-        || this.transport.status == 0 
-        || (this.transport.status >= 200 && this.transport.status < 300);
-  },
-
-  responseIsFailure: function() {
-    return !this.responseIsSuccess();
-  }
-}
-
-Ajax.Request = Class.create();
-Ajax.Request.Events = 
-  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
-  initialize: function(url, options) {
-    this.transport = Ajax.getTransport();
-    this.setOptions(options);
-    this.request(url);
-  },
-
-  request: function(url) {
-    var parameters = this.options.parameters || '';
-    if (parameters.length > 0) parameters += '&_=';
-
-    try {
-      if (this.options.method == 'get')
-        url += '?' + parameters;
-
-      this.transport.open(this.options.method, url,
-        this.options.asynchronous);
-
-      if (this.options.asynchronous) {
-        this.transport.onreadystatechange = this.onStateChange.bind(this);
-        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
-      }
-
-      this.setRequestHeaders();
-
-      var body = this.options.postBody ? this.options.postBody : parameters;
-      this.transport.send(this.options.method == 'post' ? body : null);
-
-    } catch (e) {
-    }
-  },
-
-  setRequestHeaders: function() {
-    var requestHeaders = 
-      ['X-Requested-With', 'XMLHttpRequest',
-       'X-Prototype-Version', Prototype.Version];
-
-    if (this.options.method == 'post') {
-      requestHeaders.push('Content-type', 
-        'application/x-www-form-urlencoded');
-
-      /* Force "Connection: close" for Mozilla browsers to work around
-       * a bug where XMLHttpReqeuest sends an incorrect Content-length
-       * header. See Mozilla Bugzilla #246651. 
-       */
-      if (this.transport.overrideMimeType)
-        requestHeaders.push('Connection', 'close');
-    }
-
-    if (this.options.requestHeaders)
-      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
-
-    for (var i = 0; i < requestHeaders.length; i += 2)
-      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
-  },
-
-  onStateChange: function() {
-    var readyState = this.transport.readyState;
-    if (readyState != 1)
-      this.respondToReadyState(this.transport.readyState);
-  },
-
-  respondToReadyState: function(readyState) {
-    var event = Ajax.Request.Events[readyState];
-
-    if (event == 'Complete')
-      (this.options['on' + this.transport.status]
-       || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
-       || Prototype.emptyFunction)(this.transport);
-
-    (this.options['on' + event] || Prototype.emptyFunction)(this.transport);
-
-    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
-    if (event == 'Complete')
-      this.transport.onreadystatechange = Prototype.emptyFunction;
-  }
-});
-
-Ajax.Updater = Class.create();
-Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
-
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
-  initialize: function(container, url, options) {
-    this.containers = {
-      success: container.success ? $(container.success) : $(container),
-      failure: container.failure ? $(container.failure) :
-        (container.success ? null : $(container))
-    }
-
-    this.transport = Ajax.getTransport();
-    this.setOptions(options);
-
-    var onComplete = this.options.onComplete || Prototype.emptyFunction;
-    this.options.onComplete = (function() {
-      this.updateContent();
-      onComplete(this.transport);
-    }).bind(this);
-
-    this.request(url);
-  },
-
-  updateContent: function() {
-    var receiver = this.responseIsSuccess() ?
-      this.containers.success : this.containers.failure;
-
-    var match    = new RegExp(Ajax.Updater.ScriptFragment, 'img');
-    var response = this.transport.responseText.replace(match, '');
-    var scripts  = this.transport.responseText.match(match);
-
-    if (receiver) {
-      if (this.options.insertion) {
-        new this.options.insertion(receiver, response);
-      } else {
-        receiver.innerHTML = response;
-      }
-    }
-
-    if (this.responseIsSuccess()) {
-      if (this.onComplete)
-        setTimeout((function() {this.onComplete(
-          this.transport)}).bind(this), 10);
-    }
-
-    if (this.options.evalScripts && scripts) {
-      match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
-      setTimeout((function() {
-        for (var i = 0; i < scripts.length; i++)
-          eval(scripts[i].match(match)[1]);
-      }).bind(this), 10);
-    }
-  }
-});
-
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
-  initialize: function(container, url, options) {
-    this.setOptions(options);
-    this.onComplete = this.options.onComplete;
-
-    this.frequency = (this.options.frequency || 2);
-    this.decay = 1;
-
-    this.updater = {};
-    this.container = container;
-    this.url = url;
-
-    this.start();
-  },
-
-  start: function() {
-    this.options.onComplete = this.updateComplete.bind(this);
-    this.onTimerEvent();
-  },
-
-  stop: function() {
-    this.updater.onComplete = undefined;
-    clearTimeout(this.timer);
-    (this.onComplete || Ajax.emptyFunction).apply(this, arguments);
-  },
-
-  updateComplete: function(request) {
-    if (this.options.decay) {
-      this.decay = (request.responseText == this.lastText ? 
-        this.decay * this.options.decay : 1);
-
-      this.lastText = request.responseText;
-    }
-    this.timer = setTimeout(this.onTimerEvent.bind(this), 
-      this.decay * this.frequency * 1000);
-  },
-
-  onTimerEvent: function() {
-    this.updater = new Ajax.Updater(this.container, this.url, this.options);
-  }
-});
-
-document.getElementsByClassName = function(className) {
-  var children = document.getElementsByTagName('*') || document.all;
-  var elements = new Array();
-  
-  for (var i = 0; i < children.length; i++) {
-    var child = children[i];
-    var classNames = child.className.split(' ');
-    for (var j = 0; j < classNames.length; j++) {
-      if (classNames[j] == className) {
-        elements.push(child);
-        break;
-      }
-    }
-  }
-  
-  return elements;
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Element) {
-  var Element = new Object();
-}
-
-Object.extend(Element, {
-  toggle: function() {
-    for (var i = 0; i < arguments.length; i++) {
-      var element = $(arguments[i]);
-      element.style.display = 
-        (element.style.display == 'none' ? '' : 'none');
-    }
-  },
-
-  hide: function() {
-    for (var i = 0; i < arguments.length; i++) {
-      var element = $(arguments[i]);
-      element.style.display = 'none';
-    }
-  },
-
-  show: function() {
-    for (var i = 0; i < arguments.length; i++) {
-      var element = $(arguments[i]);
-      element.style.display = '';
-    }
-  },
-
-  remove: function(element) {
-    element = $(element);
-    element.parentNode.removeChild(element);
-  },
-   
-  getHeight: function(element) {
-    element = $(element);
-    return element.offsetHeight; 
-  },
-
-  hasClassName: function(element, className) {
-    element = $(element);
-    if (!element)
-      return;
-    var a = element.className.split(' ');
-    for (var i = 0; i < a.length; i++) {
-      if (a[i] == className)
-        return true;
-    }
-    return false;
-  },
-
-  addClassName: function(element, className) {
-    element = $(element);
-    Element.removeClassName(element, className);
-    element.className += ' ' + className;
-  },
-
-  removeClassName: function(element, className) {
-    element = $(element);
-    if (!element)
-      return;
-    var newClassName = '';
-    var a = element.className.split(' ');
-    for (var i = 0; i < a.length; i++) {
-      if (a[i] != className) {
-        if (i > 0)
-          newClassName += ' ';
-        newClassName += a[i];
-      }
-    }
-    element.className = newClassName;
-  },
-  
-  // removes whitespace-only text node children
-  cleanWhitespace: function(element) {
-    var element = $(element);
-    for (var i = 0; i < element.childNodes.length; i++) {
-      var node = element.childNodes[i];
-      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 
-        Element.remove(node);
-    }
-  }
-});
-
-var Toggle = new Object();
-Toggle.display = Element.toggle;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.Insertion = function(adjacency) {
-  this.adjacency = adjacency;
-}
-
-Abstract.Insertion.prototype = {
-  initialize: function(element, content) {
-    this.element = $(element);
-    this.content = content;
-    
-    if (this.adjacency && this.element.insertAdjacentHTML) {
-      this.element.insertAdjacentHTML(this.adjacency, this.content);
-    } else {
-      this.range = this.element.ownerDocument.createRange();
-      if (this.initializeRange) this.initializeRange();
-      this.fragment = this.range.createContextualFragment(this.content);
-      this.insertContent();
-    }
-  }
-}
-
-var Insertion = new Object();
-
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
-  initializeRange: function() {
-    this.range.setStartBefore(this.element);
-  },
-  
-  insertContent: function() {
-    this.element.parentNode.insertBefore(this.fragment, this.element);
-  }
-});
-
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(true);
-  },
-  
-  insertContent: function() {  
-    this.element.insertBefore(this.fragment, this.element.firstChild);
-  }
-});
-
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(this.element);
-  },
-  
-  insertContent: function() {
-    this.element.appendChild(this.fragment);
-  }
-});
-
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
-  initializeRange: function() {
-    this.range.setStartAfter(this.element);
-  },
-  
-  insertContent: function() {
-    this.element.parentNode.insertBefore(this.fragment, 
-      this.element.nextSibling);
-  }
-});
-
-var Field = {
-  clear: function() {
-    for (var i = 0; i < arguments.length; i++)
-      $(arguments[i]).value = '';
-  },
-
-  focus: function(element) {
-    $(element).focus();
-  },
-  
-  present: function() {
-    for (var i = 0; i < arguments.length; i++)
-      if ($(arguments[i]).value == '') return false;
-    return true;
-  },
-  
-  select: function(element) {
-    $(element).select();
-  },
-   
-  activate: function(element) {
-    $(element).focus();
-    $(element).select();
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Form = {
-  serialize: function(form) {
-    var elements = Form.getElements($(form));
-    var queryComponents = new Array();
-    
-    for (var i = 0; i < elements.length; i++) {
-      var queryComponent = Form.Element.serialize(elements[i]);
-      if (queryComponent)
-        queryComponents.push(queryComponent);
-    }
-    
-    return queryComponents.join('&');
-  },
-  
-  getElements: function(form) {
-    var form = $(form);
-    var elements = new Array();
-
-    for (tagName in Form.Element.Serializers) {
-      var tagElements = form.getElementsByTagName(tagName);
-      for (var j = 0; j < tagElements.length; j++)
-        elements.push(tagElements[j]);
-    }
-    return elements;
-  },
-  
-  getInputs: function(form, typeName, name) {
-    var form = $(form);
-    var inputs = form.getElementsByTagName('input');
-    
-    if (!typeName && !name)
-      return inputs;
-      
-    var matchingInputs = new Array();
-    for (var i = 0; i < inputs.length; i++) {
-      var input = inputs[i];
-      if ((typeName && input.type != typeName) ||
-          (name && input.name != name)) 
-        continue;
-      matchingInputs.push(input);
-    }
-
-    return matchingInputs;
-  },
-
-  disable: function(form) {
-    var elements = Form.getElements(form);
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      element.blur();
-      element.disabled = 'true';
-    }
-  },
-
-  enable: function(form) {
-    var elements = Form.getElements(form);
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      element.disabled = '';
-    }
-  },
-
-  focusFirstElement: function(form) {
-    var form = $(form);
-    var elements = Form.getElements(form);
-    for (var i = 0; i < elements.length; i++) {
-      var element = elements[i];
-      if (element.type != 'hidden' && !element.disabled) {
-        Field.activate(element);
-        break;
-      }
-    }
-  },
-
-  reset: function(form) {
-    $(form).reset();
-  }
-}
-
-Form.Element = {
-  serialize: function(element) {
-    var element = $(element);
-    var method = element.tagName.toLowerCase();
-    var parameter = Form.Element.Serializers[method](element);
-    
-    if (parameter)
-      return encodeURIComponent(parameter[0]) + '=' + 
-        encodeURIComponent(parameter[1]);                   
-  },
-  
-  getValue: function(element) {
-    var element = $(element);
-    var method = element.tagName.toLowerCase();
-    var parameter = Form.Element.Serializers[method](element);
-    
-    if (parameter) 
-      return parameter[1];
-  }
-}
-
-Form.Element.Serializers = {
-  input: function(element) {
-    switch (element.type.toLowerCase()) {
-      case 'submit':
-      case 'hidden':
-      case 'password':
-      case 'text':
-        return Form.Element.Serializers.textarea(element);
-      case 'checkbox':  
-      case 'radio':
-        return Form.Element.Serializers.inputSelector(element);
-    }
-    return false;
-  },
-
-  inputSelector: function(element) {
-    if (element.checked)
-      return [element.name, element.value];
-  },
-
-  textarea: function(element) {
-    return [element.name, element.value];
-  },
-
-  select: function(element) {
-    var value = '';
-    if (element.type == 'select-one') {
-      var index = element.selectedIndex;
-      if (index >= 0)
-        value = element.options[index].value || element.options[index].text;
-    } else {
-      value = new Array();
-      for (var i = 0; i < element.length; i++) {
-        var opt = element.options[i];
-        if (opt.selected)
-          value.push(opt.value || opt.text);
-      }
-    }
-    return [element.name, value];
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var $F = Form.Element.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
-  initialize: function(element, frequency, callback) {
-    this.frequency = frequency;
-    this.element   = $(element);
-    this.callback  = callback;
-    
-    this.lastValue = this.getValue();
-    this.registerCallback();
-  },
-  
-  registerCallback: function() {
-    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
-  },
-  
-  onTimerEvent: function() {
-    var value = this.getValue();
-    if (this.lastValue != value) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  }
-}
-
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
-
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
-  initialize: function(element, callback) {
-    this.element  = $(element);
-    this.callback = callback;
-    
-    this.lastValue = this.getValue();
-    if (this.element.tagName.toLowerCase() == 'form')
-      this.registerFormCallbacks();
-    else
-      this.registerCallback(this.element);
-  },
-  
-  onElementEvent: function() {
-    var value = this.getValue();
-    if (this.lastValue != value) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  },
-  
-  registerFormCallbacks: function() {
-    var elements = Form.getElements(this.element);
-    for (var i = 0; i < elements.length; i++)
-      this.registerCallback(elements[i]);
-  },
-  
-  registerCallback: function(element) {
-    if (element.type) {
-      switch (element.type.toLowerCase()) {
-        case 'checkbox':  
-        case 'radio':
-          element.target = this;
-          element.prev_onclick = element.onclick || Prototype.emptyFunction;
-          element.onclick = function() {
-            this.prev_onclick(); 
-            this.target.onElementEvent();
-          }
-          break;
-        case 'password':
-        case 'text':
-        case 'textarea':
-        case 'select-one':
-        case 'select-multiple':
-          element.target = this;
-          element.prev_onchange = element.onchange || Prototype.emptyFunction;
-          element.onchange = function() {
-            this.prev_onchange(); 
-            this.target.onElementEvent();
-          }
-          break;
-      }
-    }    
-  }
-}
-
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
-
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-
-
-if (!window.Event) {
-  var Event = new Object();
-}
-
-Object.extend(Event, {
-  KEY_BACKSPACE: 8,
-  KEY_TAB:       9,
-  KEY_RETURN:   13,
-  KEY_ESC:      27,
-  KEY_LEFT:     37,
-  KEY_UP:       38,
-  KEY_RIGHT:    39,
-  KEY_DOWN:     40,
-  KEY_DELETE:   46,
-
-  element: function(event) {
-    return event.target || event.srcElement;
-  },
-
-  isLeftClick: function(event) {
-    return (((event.which) && (event.which == 1)) ||
-            ((event.button) && (event.button == 1)));
-  },
-
-  pointerX: function(event) {
-    return event.pageX || (event.clientX + 
-      (document.documentElement.scrollLeft || document.body.scrollLeft));
-  },
-
-  pointerY: function(event) {
-    return event.pageY || (event.clientY + 
-      (document.documentElement.scrollTop || document.body.scrollTop));
-  },
-
-  stop: function(event) {
-    if (event.preventDefault) { 
-      event.preventDefault(); 
-      event.stopPropagation(); 
-    } else {
-      event.returnValue = false;
-    }
-  },
-
-  // find the first node with the given tagName, starting from the
-  // node the event was triggered on; traverses the DOM upwards
-  findElement: function(event, tagName) {
-    var element = Event.element(event);
-    while (element.parentNode && (!element.tagName ||
-        (element.tagName.toUpperCase() != tagName.toUpperCase())))
-      element = element.parentNode;
-    return element;
-  },
-
-  observers: false,
-  
-  _observeAndCache: function(element, name, observer, useCapture) {
-    if (!this.observers) this.observers = [];
-    if (element.addEventListener) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.addEventListener(name, observer, useCapture);
-    } else if (element.attachEvent) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.attachEvent('on' + name, observer);
-    }
-  },
-  
-  unloadCache: function() {
-    if (!Event.observers) return;
-    for (var i = 0; i < Event.observers.length; i++) {
-      Event.stopObserving.apply(this, Event.observers[i]);
-      Event.observers[i][0] = null;
-    }
-    Event.observers = false;
-  },
-
-  observe: function(element, name, observer, useCapture) {
-    var element = $(element);
-    useCapture = useCapture || false;
-    
-    if (name == 'keypress' &&
-        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
-        || element.attachEvent))
-      name = 'keydown';
-    
-    this._observeAndCache(element, name, observer, useCapture);
-  },
-
-  stopObserving: function(element, name, observer, useCapture) {
-    var element = $(element);
-    useCapture = useCapture || false;
-    
-    if (name == 'keypress' &&
-        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
-        || element.detachEvent))
-      name = 'keydown';
-    
-    if (element.removeEventListener) {
-      element.removeEventListener(name, observer, useCapture);
-    } else if (element.detachEvent) {
-      element.detachEvent('on' + name, observer);
-    }
-  }
-});
-
-/* prevent memory leaks in IE */
-Event.observe(window, 'unload', Event.unloadCache, false);
-
-var Position = {
-
-  // set to true if needed, warning: firefox performance problems
-  // NOT neeeded for page scrolling, only if draggable contained in
-  // scrollable elements
-  includeScrollOffsets: false, 
-
-  // must be called before calling withinIncludingScrolloffset, every time the
-  // page is scrolled
-  prepare: function() {
-    this.deltaX =  window.pageXOffset 
-                || document.documentElement.scrollLeft 
-                || document.body.scrollLeft 
-                || 0;
-    this.deltaY =  window.pageYOffset 
-                || document.documentElement.scrollTop 
-                || document.body.scrollTop 
-                || 0;
-  },
-
-  realOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.scrollTop  || 0;
-      valueL += element.scrollLeft || 0; 
-      element = element.parentNode;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  cumulativeOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  // caches x/y coordinate pair to use with overlap
-  within: function(element, x, y) {
-    if (this.includeScrollOffsets)
-      return this.withinIncludingScrolloffsets(element, x, y);
-    this.xcomp = x;
-    this.ycomp = y;
-    this.offset = this.cumulativeOffset(element);
-
-    return (y >= this.offset[1] &&
-            y <  this.offset[1] + element.offsetHeight &&
-            x >= this.offset[0] && 
-            x <  this.offset[0] + element.offsetWidth);
-  },
-
-  withinIncludingScrolloffsets: function(element, x, y) {
-    var offsetcache = this.realOffset(element);
-
-    this.xcomp = x + offsetcache[0] - this.deltaX;
-    this.ycomp = y + offsetcache[1] - this.deltaY;
-    this.offset = this.cumulativeOffset(element);
-
-    return (this.ycomp >= this.offset[1] &&
-            this.ycomp <  this.offset[1] + element.offsetHeight &&
-            this.xcomp >= this.offset[0] && 
-            this.xcomp <  this.offset[0] + element.offsetWidth);
-  },
-
-  // within must be called directly before
-  overlap: function(mode, element) {  
-    if (!mode) return 0;  
-    if (mode == 'vertical') 
-      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 
-        element.offsetHeight;
-    if (mode == 'horizontal')
-      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 
-        element.offsetWidth;
-  },
-
-  clone: function(source, target) {
-    source = $(source);
-    target = $(target);
-    target.style.position = 'absolute';
-    var offsets = this.cumulativeOffset(source);
-    target.style.top    = offsets[1] + 'px';
-    target.style.left   = offsets[0] + 'px';
-    target.style.width  = source.offsetWidth + 'px';
-    target.style.height = source.offsetHeight + 'px';
-  }
-}


[07/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperStarted.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperStarted.html b/docs/zookeeperStarted.html
deleted file mode 100644
index 19be58d..0000000
--- a/docs/zookeeperStarted.html
+++ /dev/null
@@ -1,618 +0,0 @@
-<!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 Getting Started Guide</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Getting Started</div>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperStarted.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Getting Started Guide</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_GettingStarted">Getting Started: Coordinating Distributed Applications with
-      ZooKeeper</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_Prerequisites">Pre-requisites</a>
-</li>
-<li>
-<a href="#sc_Download">Download</a>
-</li>
-<li>
-<a href="#sc_InstallingSingleMode">Standalone Operation</a>
-</li>
-<li>
-<a href="#sc_FileManagement">Managing ZooKeeper Storage</a>
-</li>
-<li>
-<a href="#sc_ConnectingToZooKeeper">Connecting to ZooKeeper</a>
-</li>
-<li>
-<a href="#sc_ProgrammingToZooKeeper">Programming to ZooKeeper</a>
-</li>
-<li>
-<a href="#sc_RunningReplicatedZooKeeper">Running Replicated ZooKeeper</a>
-</li>
-<li>
-<a href="#Other+Optimizations">Other Optimizations</a>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_GettingStarted"></a>
-<h2 class="h3">Getting Started: Coordinating Distributed Applications with
-      ZooKeeper</h2>
-<div class="section">
-<p>This document contains information to get you started quickly with
-    ZooKeeper. It is aimed primarily at developers hoping to try it out, and
-    contains simple installation instructions for a single ZooKeeper server, a
-    few commands to verify that it is running, and a simple programming
-    example. Finally, as a convenience, there are a few sections regarding
-    more complicated installations, for example running replicated
-    deployments, and optimizing the transaction log. However for the complete
-    instructions for commercial deployments, please refer to the <a href="zookeeperAdmin.html">ZooKeeper
-    Administrator's Guide</a>.</p>
-<a name="sc_Prerequisites"></a>
-<h3 class="h4">Pre-requisites</h3>
-<p>See <a href="zookeeperAdmin.html#sc_systemReq">
-          System Requirements</a> in the Admin guide.</p>
-<a name="sc_Download"></a>
-<h3 class="h4">Download</h3>
-<p>To get a ZooKeeper distribution, download a recent
-        <a href="http://zookeeper.apache.org/releases.html">
-          stable</a> release from one of the Apache Download
-        Mirrors.</p>
-<a name="sc_InstallingSingleMode"></a>
-<h3 class="h4">Standalone Operation</h3>
-<p>Setting up a ZooKeeper server in standalone mode is
-      straightforward. The server is contained in a single JAR file,
-      so installation consists of creating a configuration.</p>
-<p>Once you've downloaded a stable ZooKeeper release unpack
-      it and cd to the root</p>
-<p>To start ZooKeeper you need a configuration file. Here is a sample,
-      create it in <strong>conf/zoo.cfg</strong>:</p>
-<pre class="code">
-tickTime=2000
-dataDir=/var/lib/zookeeper
-clientPort=2181
-</pre>
-<p>This file can be called anything, but for the sake of this
-      discussion call
-      it <strong>conf/zoo.cfg</strong>. Change the
-      value of <strong>dataDir</strong> to specify an
-      existing (empty to start with) directory.  Here are the meanings
-      for each of the fields:</p>
-<dl>
-        
-<dt>
-<term>
-<strong>tickTime</strong>
-</term>
-</dt>
-<dd>
-<p>the basic time unit in milliseconds used by ZooKeeper. It is
-            used to do heartbeats and the minimum session timeout will be
-            twice the tickTime.</p>
-</dd>
-      
-</dl>
-<dl>
-        
-<dt>
-<term>
-<strong>dataDir</strong>
-</term>
-</dt>
-<dd>
-<p>the location to store the in-memory database snapshots and,
-            unless specified otherwise, the transaction log of updates to the
-            database.</p>
-</dd>
-
-        
-<dt>
-<term>
-<strong>clientPort</strong>
-</term>
-</dt>
-<dd>
-<p>the port to listen for client connections</p>
-</dd>
-      
-</dl>
-<p>Now that you created the configuration file, you can start
-      ZooKeeper:</p>
-<pre class="code">bin/zkServer.sh start</pre>
-<p>ZooKeeper logs messages using log4j -- more detail
-      available in the
-      <a href="zookeeperProgrammers.html#Logging">Logging</a>
-      section of the Programmer's Guide. You will see log messages
-      coming to the console (default) and/or a log file depending on
-      the log4j configuration.</p>
-<p>The steps outlined here run ZooKeeper in standalone mode. There is
-      no replication, so if ZooKeeper process fails, the service will go down.
-      This is fine for most development situations, but to run ZooKeeper in
-      replicated mode, please see <a href="#sc_RunningReplicatedZooKeeper">Running Replicated
-      ZooKeeper</a>.</p>
-<a name="sc_FileManagement"></a>
-<h3 class="h4">Managing ZooKeeper Storage</h3>
-<p>For long running production systems ZooKeeper storage must
-      be managed externally (dataDir and logs). See the section on
-      <a href="zookeeperAdmin.html#sc_maintenance">maintenance</a> for
-      more details.</p>
-<a name="sc_ConnectingToZooKeeper"></a>
-<h3 class="h4">Connecting to ZooKeeper</h3>
-<pre class="code">$ bin/zkCli.sh -server 127.0.0.1:2181</pre>
-<p>This lets you perform simple, file-like operations.</p>
-<p>Once you have connected, you should see something like:
-        </p>
-<pre class="code">
-
-Connecting to localhost:2181
-log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
-log4j:WARN Please initialize the log4j system properly.
-Welcome to ZooKeeper!
-JLine support is enabled
-[zkshell: 0]
-        </pre>
-<p>
-        From the shell, type <span class="codefrag command">help</span> to get a listing of commands that can be executed from the client, as in:
-      </p>
-<pre class="code">
-
-[zkshell: 0] help
-ZooKeeper host:port cmd args
-        get path [watch]
-        ls path [watch]
-        set path data [version]
-        delquota [-n|-b] path
-        quit
-        printwatches on|off
-        create path data acl
-        stat path [watch]
-        listquota path
-        history
-        setAcl path acl
-        getAcl path
-        sync path
-        redo cmdno
-        addauth scheme auth
-        delete path [version]
-        deleteall path
-        setquota -n|-b val path
-
-        </pre>
-<p>From here, you can try a few simple commands to get a feel for this simple command line interface.  First, start by issuing the list command, as
-      in <span class="codefrag command">ls</span>, yielding:
-      </p>
-<pre class="code">
-
-[zkshell: 8] ls /
-[zookeeper]
-        </pre>
-<p>Next, create a new znode by running <span class="codefrag command">create /zk_test my_data</span>. This creates a new znode and associates the string "my_data" with the node.
-      You should see:</p>
-<pre class="code">
-
-[zkshell: 9] create /zk_test my_data
-Created /zk_test
-      </pre>
-<p>  Issue another <span class="codefrag command">ls /</span> command to see what the directory looks like:
-        </p>
-<pre class="code">
-
-[zkshell: 11] ls /
-[zookeeper, zk_test]
-
-        </pre>
-<p>
-      Notice that the zk_test directory has now been created.
-      </p>
-<p>Next, verify that the data was associated with the znode by running the <span class="codefrag command">get</span> command, as in:
-      </p>
-<pre class="code">
-
-[zkshell: 12] get /zk_test
-my_data
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 5
-mtime = Fri Jun 05 13:57:06 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 0
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 7
-numChildren = 0
-        </pre>
-<p>We can change the data associated with zk_test by issuing the <span class="codefrag command">set</span> command, as in:
-        </p>
-<pre class="code">
-
-[zkshell: 14] set /zk_test junk
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 6
-mtime = Fri Jun 05 14:01:52 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 1
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 4
-numChildren = 0
-[zkshell: 15] get /zk_test
-junk
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 6
-mtime = Fri Jun 05 14:01:52 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 1
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 4
-numChildren = 0
-      </pre>
-<p>
-       (Notice we did a <span class="codefrag command">get</span> after setting the data and it did, indeed, change.</p>
-<p>Finally, let's <span class="codefrag command">delete</span> the node by issuing:
-      </p>
-<pre class="code">
-
-[zkshell: 16] delete /zk_test
-[zkshell: 17] ls /
-[zookeeper]
-[zkshell: 18]
-</pre>
-<p>That's it for now.  To explore more, continue with the rest of this document and see the <a href="zookeeperProgrammers.html">Programmer's Guide</a>. </p>
-<a name="sc_ProgrammingToZooKeeper"></a>
-<h3 class="h4">Programming to ZooKeeper</h3>
-<p>ZooKeeper has a Java bindings and C bindings. They are
-      functionally equivalent. The C bindings exist in two variants: single
-      threaded and multi-threaded. These differ only in how the messaging loop
-      is done. For more information, see the <a href="zookeeperProgrammers.html#ch_programStructureWithExample">Programming
-      Examples in the ZooKeeper Programmer's Guide</a> for
-      sample code using of the different APIs.</p>
-<a name="sc_RunningReplicatedZooKeeper"></a>
-<h3 class="h4">Running Replicated ZooKeeper</h3>
-<p>Running ZooKeeper in standalone mode is convenient for evaluation,
-      some development, and testing. But in production, you should run
-      ZooKeeper in replicated mode. A replicated group of servers in the same
-      application is called a <em>quorum</em>, and in replicated
-      mode, all servers in the quorum have copies of the same configuration
-      file.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-      
-<p>
-         For replicated mode, a minimum of three servers are required,
-         and it is strongly recommended that you have an odd number of
-         servers. If you only have two servers, then you are in a
-         situation where if one of them fails, there are not enough
-         machines to form a majority quorum. Two servers is inherently
-         <strong>less</strong>
-         stable than a single server, because there are two single
-         points of failure.
-      </p>
-   
-</div>
-</div>
-<p>
-      The required
-      <strong>conf/zoo.cfg</strong>
-      file for replicated mode is similar to the one used in standalone
-      mode, but with a few differences. Here is an example:
-   </p>
-<pre class="code">
-tickTime=2000
-dataDir=/var/lib/zookeeper
-clientPort=2181
-initLimit=5
-syncLimit=2
-server.1=zoo1:2888:3888
-server.2=zoo2:2888:3888
-server.3=zoo3:2888:3888
-</pre>
-<p>The new entry, <strong>initLimit</strong> is
-      timeouts ZooKeeper uses to limit the length of time the ZooKeeper
-      servers in quorum have to connect to a leader. The entry <strong>syncLimit</strong> limits how far out of date a server can
-      be from a leader.</p>
-<p>With both of these timeouts, you specify the unit of time using
-      <strong>tickTime</strong>. In this example, the timeout
-      for initLimit is 5 ticks at 2000 milleseconds a tick, or 10
-      seconds.</p>
-<p>The entries of the form <em>server.X</em> list the
-      servers that make up the ZooKeeper service. When the server starts up,
-      it knows which server it is by looking for the file
-      <em>myid</em> in the data directory. That file has the 
-      contains the server number, in ASCII.</p>
-<p>Finally, note the two port numbers after each server
-       name: " 2888" and "3888". Peers use the former port to connect
-       to other peers. Such a connection is necessary so that peers
-       can communicate, for example, to agree upon the order of
-       updates. More specifically, a ZooKeeper server uses this port
-       to connect followers to the leader. When a new leader arises, a
-       follower opens a TCP connection to the leader using this
-       port. Because the default leader election also uses TCP, we
-       currently require another port for leader election. This is the
-       second port in the server entry.
-       </p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-        
-<p>If you want to test multiple servers on a single
-        machine, specify the servername
-        as <em>localhost</em> with unique quorum &amp;
-        leader election ports (i.e. 2888:3888, 2889:3889, 2890:3890 in
-        the example above) for each server.X in that server's config
-        file. Of course separate <em>dataDir</em>s and
-        distinct <em>clientPort</em>s are also necessary
-        (in the above replicated example, running on a
-        single <em>localhost</em>, you would still have
-        three config files).</p>
-        
-<p>Please be aware that setting up multiple servers on a single
-            machine will not create any redundancy. If something were to
-            happen which caused the machine to die, all of the zookeeper
-            servers would be offline. Full redundancy requires that each
-            server have its own machine. It must be a completely separate
-            physical server. Multiple virtual machines on the same physical
-            host are still vulnerable to the complete failure of that host.</p>
-      
-</div>
-</div>
-<a name="Other+Optimizations"></a>
-<h3 class="h4">Other Optimizations</h3>
-<p>There are a couple of other configuration parameters that can
-      greatly increase performance:</p>
-<ul>
-        
-<li>
-          
-<p>To get low latencies on updates it is important to
-          have a dedicated transaction log directory. By default
-          transaction logs are put in the same directory as the data
-          snapshots and <em>myid</em> file. The dataLogDir
-          parameters indicates a different directory to use for the
-          transaction logs.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<em>[tbd: what is the other config param?]</em>
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperStarted.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperStarted.pdf b/docs/zookeeperStarted.pdf
deleted file mode 100644
index eb07639..0000000
Binary files a/docs/zookeeperStarted.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperTutorial.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperTutorial.html b/docs/zookeeperTutorial.html
deleted file mode 100644
index 39bf10e..0000000
--- a/docs/zookeeperTutorial.html
+++ /dev/null
@@ -1,925 +0,0 @@
-<!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>Programming with ZooKeeper - A basic tutorial</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Barrier and Queue Tutorial</div>
-</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">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperTutorial.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>Programming with ZooKeeper - A basic tutorial</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_Introduction">Introduction</a>
-</li>
-<li>
-<a href="#sc_barriers">Barriers</a>
-</li>
-<li>
-<a href="#sc_producerConsumerQueues">Producer-Consumer Queues</a>
-</li>
-<li>
-<a href="#Complete+example">Complete example</a>
-<ul class="minitoc">
-<li>
-<a href="#Queue+test">Queue test</a>
-</li>
-<li>
-<a href="#Barrier+test">Barrier test</a>
-</li>
-<li>
-<a href="#sc_sourceListing">Source Listing</a>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_Introduction"></a>
-<h2 class="h3">Introduction</h2>
-<div class="section">
-<p>In this tutorial, we show simple implementations of barriers and 
-    producer-consumer queues using ZooKeeper. We call the respective classes Barrier and Queue. 
-    These examples assume that you have at least one ZooKeeper server running.</p>
-<p>Both primitives use the following common excerpt of code:</p>
-<pre class="code">
-    static ZooKeeper zk = null;
-    static Integer mutex;
-
-    String root;
-
-    SyncPrimitive(String address) {
-        if(zk == null){
-            try {
-                System.out.println("Starting ZK:");
-                zk = new ZooKeeper(address, 3000, this);
-                mutex = new Integer(-1);
-                System.out.println("Finished starting ZK: " + zk);
-            } catch (IOException e) {
-                System.out.println(e.toString());
-                zk = null;
-            }
-        }
-    }
-
-    synchronized public void process(WatchedEvent event) {
-        synchronized (mutex) {
-            mutex.notify();
-        }
-    }
-</pre>
-<p>Both classes extend SyncPrimitive. In this way, we execute steps that are 
-common to all primitives in the constructor of SyncPrimitive. To keep the examples 
-simple, we create a ZooKeeper object the first time we instantiate either a barrier 
-object or a queue object, and we declare a static variable that is a reference 
-to this object. The subsequent instances of Barrier and Queue check whether a 
-ZooKeeper object exists. Alternatively, we could have the application creating a
-ZooKeeper object and passing it to the constructor of Barrier and Queue.</p>
-<p>
-We use the process() method to process notifications triggered due to watches. 
-In the following discussion, we present code that sets watches. A watch is internal 
-structure that enables ZooKeeper to notify a client of a change to a node. For example, 
-if a client is waiting for other clients to leave a barrier, then it can set a watch and 
-wait for modifications to a particular node, which can indicate that it is the end of the wait. 
-This point becomes clear once we go over the examples.
-</p>
-</div>
-   
- 
-<a name="sc_barriers"></a>
-<h2 class="h3">Barriers</h2>
-<div class="section">
-<p>
- A barrier is a primitive that enables a group of processes to synchronize the 
- beginning and the end of a computation. The general idea of this implementation 
- is to have a barrier node that serves the purpose of being a parent for individual 
- process nodes. Suppose that we call the barrier node "/b1". Each process "p" then 
- creates a node "/b1/p". Once enough processes have created their corresponding 
- nodes, joined processes can start the computation.
- </p>
-<p>In this example, each process instantiates a Barrier object, and its constructor takes as parameters:</p>
-<ul>
-<li>
-<p>the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181")</p>
-</li>
-
-<li>
-<p>the path of the barrier node on ZooKeeper (e.g., "/b1")</p>
-</li>
-
-<li>
-<p>the size of the group of processes</p>
-</li>
-
-</ul>
-<p>The constructor of Barrier passes the address of the Zookeeper server to the 
-constructor of the parent class. The parent class creates a ZooKeeper instance if 
-one does not exist. The constructor of Barrier then creates a 
-barrier node on ZooKeeper, which is the parent node of all process nodes, and 
-we call root (<strong>Note:</strong> This is not the ZooKeeper root "/").</p>
-<pre class="code">
-        /**
-         * Barrier constructor
-         *
-         * @param address
-         * @param root
-         * @param size
-         */
-        Barrier(String address, String root, int size) {
-            super(address);
-            this.root = root;
-            this.size = size;
-
-            // Create barrier node
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-
-            // My node name
-            try {
-                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
-            } catch (UnknownHostException e) {
-                System.out.println(e.toString());
-            }
-
-        }
-</pre>
-<p>
-To enter the barrier, a process calls enter(). The process creates a node under 
-the root to represent it, using its host name to form the node name. It then wait 
-until enough processes have entered the barrier. A process does it by checking 
-the number of children the root node has with "getChildren()", and waiting for 
-notifications in the case it does not have enough. To receive a notification when 
-there is a change to the root node, a process has to set a watch, and does it 
-through the call to "getChildren()". In the code, we have that "getChildren()" 
-has two parameters. The first one states the node to read from, and the second is
-a boolean flag that enables the process to set a watch. In the code the flag is true.
-</p>
-<pre class="code">
-        /**
-         * Join barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean enter() throws KeeperException, InterruptedException{
-            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.EPHEMERAL_SEQUENTIAL);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-
-                    if (list.size() &lt; size) {
-                        mutex.wait();
-                    } else {
-                        return true;
-                    }
-                }
-            }
-        }
-</pre>
-<p>
-Note that enter() throws both KeeperException and InterruptedException, so it is 
-the responsibility of the application to catch and handle such exceptions.</p>
-<p>
-Once the computation is finished, a process calls leave() to leave the barrier. 
-First it deletes its corresponding node, and then it gets the children of the root 
-node. If there is at least one child, then it waits for a notification (obs: note 
-that the second parameter of the call to getChildren() is true, meaning that 
-ZooKeeper has to set a watch on the the root node). Upon reception of a notification, 
-it checks once more whether the root node has any children.</p>
-<pre class="code">
-        /**
-         * Wait until all reach barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean leave() throws KeeperException, InterruptedException{
-            zk.delete(root + "/" + name, 0);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                        if (list.size() &gt; 0) {
-                            mutex.wait();
-                        } else {
-                            return true;
-                        }
-                    }
-                }
-        }
-    }
-</pre>
-</div>
-
-<a name="sc_producerConsumerQueues"></a>
-<h2 class="h3">Producer-Consumer Queues</h2>
-<div class="section">
-<p>
-A producer-consumer queue is a distributed data structure that groups of processes 
-use to generate and consume items. Producer processes create new elements and add 
-them to the queue. Consumer processes remove elements from the list, and process them. 
-In this implementation, the elements are simple integers. The queue is represented 
-by a root node, and to add an element to the queue, a producer process creates a new node, 
-a child of the root node.
-</p>
-<p>
-The following excerpt of code corresponds to the constructor of the object. As 
-with Barrier objects, it first calls the constructor of the parent class, SyncPrimitive, 
-that creates a ZooKeeper object if one doesn't exist. It then verifies if the root 
-node of the queue exists, and creates if it doesn't.
-</p>
-<pre class="code">
-        /**
-         * Constructor of producer-consumer queue
-         *
-         * @param address
-         * @param name
-         */
-        Queue(String address, String name) {
-            super(address);
-            this.root = name;
-            // Create ZK node name
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-        }
-</pre>
-<p>
-A producer process calls "produce()" to add an element to the queue, and passes 
-an integer as an argument. To add an element to the queue, the method creates a 
-new node using "create()", and uses the SEQUENCE flag to instruct ZooKeeper to 
-append the value of the sequencer counter associated to the root node. In this way, 
-we impose a total order on the elements of the queue, thus guaranteeing that the 
-oldest element of the queue is the next one consumed.
-</p>
-<pre class="code">
-        /**
-         * Add element to the queue.
-         *
-         * @param i
-         * @return
-         */
-
-        boolean produce(int i) throws KeeperException, InterruptedException{
-            ByteBuffer b = ByteBuffer.allocate(4);
-            byte[] value;
-
-            // Add child with value i
-            b.putInt(i);
-            value = b.array();
-            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
-                        CreateMode.PERSISTENT_SEQUENTIAL);
-
-            return true;
-        }
-</pre>
-<p>
-To consume an element, a consumer process obtains the children of the root node, 
-reads the node with smallest counter value, and returns the element. Note that 
-if there is a conflict, then one of the two contending processes won't be able to 
-delete the node and the delete operation will throw an exception.</p>
-<p>
-A call to getChildren() returns the list of children in lexicographic order. 
-As lexicographic order does not necessary follow the numerical order of the counter 
-values, we need to decide which element is the smallest. To decide which one has 
-the smallest counter value, we traverse the list, and remove the prefix "element" 
-from each one.</p>
-<pre class="code">
-        /**
-         * Remove first element from the queue.
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-        int consume() throws KeeperException, InterruptedException{
-            int retvalue = -1;
-            Stat stat = null;
-
-            // Get the first element available
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                    if (list.size() == 0) {
-                        System.out.println("Going to wait");
-                        mutex.wait();
-                    } else {
-                        Integer min = new Integer(list.get(0).substring(7));
-                        for(String s : list){
-                            Integer tempValue = new Integer(s.substring(7));
-                            //System.out.println("Temporary value: " + tempValue);
-                            if(tempValue &lt; min) min = tempValue;
-                        }
-                        System.out.println("Temporary value: " + root + "/element" + min);
-                        byte[] b = zk.getData(root + "/element" + min,
-                                    false, stat);
-                        zk.delete(root + "/element" + min, 0);
-                        ByteBuffer buffer = ByteBuffer.wrap(b);
-                        retvalue = buffer.getInt();
-
-                        return retvalue;
-                    }
-                }
-            }
-        }
-    }
-</pre>
-</div>
-
-
-<a name="Complete+example"></a>
-<h2 class="h3">Complete example</h2>
-<div class="section">
-<p>
-In the following section you can find a complete command line application to demonstrate the above mentioned
-recipes. Use the following command to run it.
-</p>
-<pre class="code">
-ZOOBINDIR="[path_to_distro]/bin"
-. "$ZOOBINDIR"/zkEnv.sh
-java SyncPrimitive [Test Type] [ZK server] [No of elements] [Client type]
-</pre>
-<a name="Queue+test"></a>
-<h3 class="h4">Queue test</h3>
-<p>Start a producer to create 100 elements</p>
-<pre class="code">
-java SyncPrimitive qTest localhost 100 p
-</pre>
-<p>Start a consumer to consume 100 elements</p>
-<pre class="code">
-java SyncPrimitive qTest localhost 100 c
-</pre>
-<a name="Barrier+test"></a>
-<h3 class="h4">Barrier test</h3>
-<p>Start a barrier with 2 participants (start as many times as many participants you'd like to enter)</p>
-<pre class="code">
-java SyncPrimitive bTest localhost 2
-</pre>
-<a name="sc_sourceListing"></a>
-<h3 class="h4">Source Listing</h3>
-<div class="note example">
-<div class="label">SyncPrimitive.Java</div>
-<div class="content">
-
-<title>SyncPrimitive.Java</title>
-
-<pre class="code">
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Random;
-
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.ZooDefs.Ids;
-import org.apache.zookeeper.data.Stat;
-
-public class SyncPrimitive implements Watcher {
-
-    static ZooKeeper zk = null;
-    static Integer mutex;
-
-    String root;
-
-    SyncPrimitive(String address) {
-        if(zk == null){
-            try {
-                System.out.println("Starting ZK:");
-                zk = new ZooKeeper(address, 3000, this);
-                mutex = new Integer(-1);
-                System.out.println("Finished starting ZK: " + zk);
-            } catch (IOException e) {
-                System.out.println(e.toString());
-                zk = null;
-            }
-        }
-        //else mutex = new Integer(-1);
-    }
-
-    synchronized public void process(WatchedEvent event) {
-        synchronized (mutex) {
-            //System.out.println("Process: " + event.getType());
-            mutex.notify();
-        }
-    }
-
-    /**
-     * Barrier
-     */
-    static public class Barrier extends SyncPrimitive {
-        int size;
-        String name;
-
-        /**
-         * Barrier constructor
-         *
-         * @param address
-         * @param root
-         * @param size
-         */
-        Barrier(String address, String root, int size) {
-            super(address);
-            this.root = root;
-            this.size = size;
-
-            // Create barrier node
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-
-            // My node name
-            try {
-                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
-            } catch (UnknownHostException e) {
-                System.out.println(e.toString());
-            }
-
-        }
-
-        /**
-         * Join barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean enter() throws KeeperException, InterruptedException{
-            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.EPHEMERAL_SEQUENTIAL);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-
-                    if (list.size() &lt; size) {
-                        mutex.wait();
-                    } else {
-                        return true;
-                    }
-                }
-            }
-        }
-
-        /**
-         * Wait until all reach barrier
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-
-        boolean leave() throws KeeperException, InterruptedException{
-            zk.delete(root + "/" + name, 0);
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                        if (list.size() &gt; 0) {
-                            mutex.wait();
-                        } else {
-                            return true;
-                        }
-                    }
-                }
-        }
-    }
-
-    /**
-     * Producer-Consumer queue
-     */
-    static public class Queue extends SyncPrimitive {
-
-        /**
-         * Constructor of producer-consumer queue
-         *
-         * @param address
-         * @param name
-         */
-        Queue(String address, String name) {
-            super(address);
-            this.root = name;
-            // Create ZK node name
-            if (zk != null) {
-                try {
-                    Stat s = zk.exists(root, false);
-                    if (s == null) {
-                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
-                                CreateMode.PERSISTENT);
-                    }
-                } catch (KeeperException e) {
-                    System.out
-                            .println("Keeper exception when instantiating queue: "
-                                    + e.toString());
-                } catch (InterruptedException e) {
-                    System.out.println("Interrupted exception");
-                }
-            }
-        }
-
-        /**
-         * Add element to the queue.
-         *
-         * @param i
-         * @return
-         */
-
-        boolean produce(int i) throws KeeperException, InterruptedException{
-            ByteBuffer b = ByteBuffer.allocate(4);
-            byte[] value;
-
-            // Add child with value i
-            b.putInt(i);
-            value = b.array();
-            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
-                        CreateMode.PERSISTENT_SEQUENTIAL);
-
-            return true;
-        }
-
-
-        /**
-         * Remove first element from the queue.
-         *
-         * @return
-         * @throws KeeperException
-         * @throws InterruptedException
-         */
-        int consume() throws KeeperException, InterruptedException{
-            int retvalue = -1;
-            Stat stat = null;
-
-            // Get the first element available
-            while (true) {
-                synchronized (mutex) {
-                    List&lt;String&gt; list = zk.getChildren(root, true);
-                    if (list.size() == 0) {
-                        System.out.println("Going to wait");
-                        mutex.wait();
-                    } else {
-                        Integer min = new Integer(list.get(0).substring(7));
-                        String minNode = list.get(0);
-                        for(String s : list){
-                            Integer tempValue = new Integer(s.substring(7));
-                            //System.out.println("Temporary value: " + tempValue);
-                            if(tempValue &lt; min) {
-                                min = tempValue;
-                                minNode = s;
-                            }
-                        }
-                        System.out.println("Temporary value: " + root + "/" + minNode);
-                        byte[] b = zk.getData(root + "/" + minNode,
-                        false, stat);
-                        zk.delete(root + "/" + minNode, 0);
-                        ByteBuffer buffer = ByteBuffer.wrap(b);
-                        retvalue = buffer.getInt();
-
-                        return retvalue;
-                    }
-                }
-            }
-        }
-    }
-
-    public static void main(String args[]) {
-        if (args[0].equals("qTest"))
-            queueTest(args);
-        else
-            barrierTest(args);
-
-    }
-
-    public static void queueTest(String args[]) {
-        Queue q = new Queue(args[1], "/app1");
-
-        System.out.println("Input: " + args[1]);
-        int i;
-        Integer max = new Integer(args[2]);
-
-        if (args[3].equals("p")) {
-            System.out.println("Producer");
-            for (i = 0; i &lt; max; i++)
-                try{
-                    q.produce(10 + i);
-                } catch (KeeperException e){
-
-                } catch (InterruptedException e){
-
-                }
-        } else {
-            System.out.println("Consumer");
-
-            for (i = 0; i &lt; max; i++) {
-                try{
-                    int r = q.consume();
-                    System.out.println("Item: " + r);
-                } catch (KeeperException e){
-                    i--;
-                } catch (InterruptedException e){
-
-                }
-            }
-        }
-    }
-
-    public static void barrierTest(String args[]) {
-        Barrier b = new Barrier(args[1], "/b1", new Integer(args[2]));
-        try{
-            boolean flag = b.enter();
-            System.out.println("Entered barrier: " + args[2]);
-            if(!flag) System.out.println("Error when entering the barrier");
-        } catch (KeeperException e){
-
-        } catch (InterruptedException e){
-
-        }
-
-        // Generate random integer
-        Random rand = new Random();
-        int r = rand.nextInt(100);
-        // Loop for rand iterations
-        for (int i = 0; i &lt; r; i++) {
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException e) {
-
-            }
-        }
-        try{
-            b.leave();
-        } catch (KeeperException e){
-
-        } catch (InterruptedException e){
-
-        }
-        System.out.println("Left barrier");
-    }
-}
-</pre>
-</div>
-</div>
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperTutorial.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperTutorial.pdf b/docs/zookeeperTutorial.pdf
deleted file mode 100644
index 1a7fab8..0000000
Binary files a/docs/zookeeperTutorial.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/forrest.properties
----------------------------------------------------------------------
diff --git a/zookeeper-docs/forrest.properties b/zookeeper-docs/forrest.properties
deleted file mode 100644
index 70cf81d..0000000
--- a/zookeeper-docs/forrest.properties
+++ /dev/null
@@ -1,109 +0,0 @@
-# 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.
-
-##############
-# Properties used by forrest.build.xml for building the website
-# These are the defaults, un-comment them if you need to change them.
-##############
-
-# Prints out a summary of Forrest settings for this project
-#forrest.echo=true 
-
-# Project name (used to name .war file)
-#project.name=my-project
-
-# Specifies name of Forrest skin to use
-#project.skin=tigris
-#project.skin=pelt
-
-# comma separated list, file:// is supported
-#forrest.skins.descriptors=http://forrest.apache.org/skins/skins.xml,file:///c:/myskins/skins.xml
-
-##############
-# behavioural properties
-#project.menu-scheme=tab_attributes
-#project.menu-scheme=directories
-
-##############
-# layout properties
-
-# Properties that can be set to override the default locations
-#
-# Parent properties must be set. This usually means uncommenting
-# project.content-dir if any other property using it is uncommented
-
-#project.status=status.xml
-#project.content-dir=src/documentation
-project.configfile=${project.home}/src/documentation/conf/cli.xconf
-#project.raw-content-dir=${project.content-dir}/content
-#project.conf-dir=${project.content-dir}/conf
-#project.sitemap-dir=${project.content-dir}
-#project.xdocs-dir=${project.content-dir}/content/xdocs
-#project.resources-dir=${project.content-dir}/resources
-#project.stylesheets-dir=${project.resources-dir}/stylesheets
-#project.images-dir=${project.resources-dir}/images
-#project.schema-dir=${project.resources-dir}/schema
-#project.skins-dir=${project.content-dir}/skins
-#project.skinconf=${project.content-dir}/skinconf.xml
-#project.lib-dir=${project.content-dir}/lib
-#project.classes-dir=${project.content-dir}/classes
-#project.translations-dir=${project.content-dir}/translations
-
-##############
-# validation properties
-
-# This set of properties determine if validation is performed
-# Values are inherited unless overridden.
-# e.g. if forrest.validate=false then all others are false unless set to true.
-forrest.validate=true
-forrest.validate.xdocs=${forrest.validate}
-forrest.validate.skinconf=${forrest.validate}
-forrest.validate.stylesheets=${forrest.validate}
-forrest.validate.skins=${forrest.validate}
-forrest.validate.skins.stylesheets=${forrest.validate.skins}
-
-# Make Forrest work with JDK6
-forrest.validate.sitemap=false
-
-# *.failonerror=(true|false) - stop when an XML file is invalid
-forrest.validate.failonerror=true
-
-# *.excludes=(pattern) - comma-separated list of path patterns to not validate
-# e.g.
-#forrest.validate.xdocs.excludes=samples/subdir/**, samples/faq.xml
-#forrest.validate.xdocs.excludes=
-
-
-##############
-# General Forrest properties
-
-# The URL to start crawling from
-#project.start-uri=linkmap.html
-# Set logging level for messages printed to the console
-# (DEBUG, INFO, WARN, ERROR, FATAL_ERROR)
-#project.debuglevel=ERROR
-# Max memory to allocate to Java
-#forrest.maxmemory=64m
-# Any other arguments to pass to the JVM. For example, to run on an X-less
-# server, set to -Djava.awt.headless=true
-#forrest.jvmargs=
-# The bugtracking URL - the issue number will be appended
-#project.bugtracking-url=http://issues.apache.org/bugzilla/show_bug.cgi?id=
-#project.bugtracking-url=http://issues.apache.org/jira/browse/
-# The issues list as rss
-#project.issues-rss-url=
-#I18n Property only works for the "forrest run" target.
-#project.i18n=true
-
-project.required.plugins=org.apache.forrest.plugin.output.pdf,org.apache.forrest.plugin.input.simplifiedDocbook

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/README.txt
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/README.txt b/zookeeper-docs/src/documentation/README.txt
deleted file mode 100644
index 9bc261b..0000000
--- a/zookeeper-docs/src/documentation/README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is the base documentation directory.
-
-skinconf.xml     # This file customizes Forrest for your project. In it, you
-                 # tell forrest the project name, logo, copyright info, etc
-
-sitemap.xmap     # Optional. This sitemap is consulted before all core sitemaps.
-                 # See http://forrest.apache.org/docs/project-sitemap.html

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/TODO.txt
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/TODO.txt b/zookeeper-docs/src/documentation/TODO.txt
deleted file mode 100644
index 84e7dfa..0000000
--- a/zookeeper-docs/src/documentation/TODO.txt
+++ /dev/null
@@ -1,227 +0,0 @@
-This is a running list of todo documentation items. Feel free
-to add to the list or take on an item as you wish (in the form
-of a JIRA patch of course).
--------------------------------------------------------------
-
-recipes.xml:110:    
-[maybe an illustration would be nice for each recipe?]
-
-recipes.xml:167:                     
-"wait for each watch event". [how do you wait?]
-
-recipes.xml:457:          
-<remark>[tbd: myabe helpful to indicate which step this refers to?]</remark>
-
-zookeeperAdmin.xml:77:      
-because requires a majority <remark>[tbd: why?]</remark>, it is best to use...
-
-zookeeperAdmin.xml:112:   
- <screen>$yinst -i jdk-1.6.0.00_3 -br test  <remark>[y! prop - replace with open equiv]</remark></screen>
- 
-zookeeperAdmin.xml:99:         
-- use a maximum heap size of 3GB for a 4GB machine.  <remark>[tbd:  where would they do this? Environment variable, etc?]</remark>
-
-zookeeperAdmin.xml:120
-<screen>$ yinst install -nostart zookeeper_server <remark>[Y! prop - replace with open eq]</remark></screen>
-
-zookeeperAdmin.xml:171:              
-In Java, you can run the following command to execute simple operations:<remark> [tbd: also, maybe give some of those simple operations?]
-
-zookeeperAdmin.xml:194:          
-Running either program gives you a shell in which to execute simple file-system-like operations. <remark>[tbd: again, sample
-          operations?]
-
-zookeeperAdmin.xml:252:       
-If servers use different configuration files,
-care must be taken to ensure that the list of servers in all of the
-standard form, with legal values, etc]</remark>
-
-zookeeperAdmin.xml:408:
-(Note: The system property has no zookeeper
-prefix, and the configuration variable name is different from
-the system property. Yes - it's not consistent, and it's
-annoying.<remark> [tbd: is there any explanation for
-this?]</remark>)
-		
-zookeeperAdmin.xml:445:               When the election algorithm is
-                "0" a UDP port with the same port number as the port listed in
-                the <emphasis role="bold">server.num</emphasis> option will be
-                used. <remark>[tbd: should that be <emphasis
-                role="bold">server.id</emphasis>? Also, why isn't server.id
-                documented anywhere?]</remark>
-		
-zookeeperAdmin.xml:481:                The default to this option is yes, which
-                means that a leader will accept client connections.
-                <remark>[tbd: how do you specifiy which server is the
-                leader?]</remark>
-		
-zookeeperAdmin.xml:495		When the server
-                starts up, it determines which server it is by looking for the
-                file <filename>myid</filename> in the data directory.<remark>
-                [tdb: should we mention somewhere about creating this file,
-                myid, in the setup procedure?]</remark>
-		
-zookeeperAdmin.xml:508:               [tbd: is the next sentence explanation an of what the
-                election port or is it a description of a special case?]
-                </remark>If you want to test multiple servers on a single
-                machine, the individual choices of electionPort for each
-                server can be defined in each server's config files using the
-                line electionPort=xxxx to avoid clashes.
-		
-zookeeperAdmin.xml:524:               If followers fall too far behind a
-                leader, they will be dropped. <remark>[tbd: is this a correct
-                rewording: if followers fall beyond this limit, they are
-                dropped?]</remark>
-		
-zookeeperAdmin.xml:551:               ZooKeeper will not require updates
-                to be synced to the media. <remark>[tbd: useful because...,
-                dangerous because...]</remark>
-		
-zookeeperAdmin.xml:580:                Skips ACL checks. <remark>[tbd: when? where?]</remark>
-                
-zookeeperAdmin.xml:649:        <remark>[tbd: Patrick, Ben, et al: I believe the Message Broker
-        team does perform routine monitoring of Zookeeper. But I might be
-        wrong. To your knowledge, is there any monitoring of a Zookeeper
-        deployment that will a Zookeeper sys admin will want to do, outside of
-        Yahoo?]</remark>
-	
-zookeeperAdmin.xml:755:            Also,
-            the server lists in each Zookeeper server configuration file
-            should be consistent with one another. <remark>[tbd: I'm assuming
-            this last part is true. Is it?]</remark>
-	    
-zookeeperAdmin.xml:812:     For best results, take note of the following list of good
-      Zookeeper practices. <remark>[tbd: I just threw this section in. Do we
-      have list that is is different from the "things to avoid"? If not, I can
-      easily remove this section.]</remark>
-      
-
-zookeeperOver.xml:162:      Ephemeral nodes are useful when you
-      want to implement <remark>[tbd]</remark>.
-      
-zookeeperOver.xml:174:     And if the
-      connection between the client and one of the Zoo Keeper servers is
-      broken, the client will receive a local notification. These can be used
-      to <remark>[tbd]</remark>
-
-zookeeperOver.xml:215:            <para>For more information on these (guarantees), and how they can be used, see
-      <remark>[tbd]</remark></para>
-      
-zookeeperOver.xml:294:           <para><xref linkend="fg_zkComponents" /> shows the high-level components
-      of the ZooKeeper service. With the exception of the request processor,
-      <remark>[tbd: where does the request processor live?]</remark> 
-      
-zookeeperOver.xml:298:      <para><xref linkend="fg_zkComponents" /> shows the high-level components
-      of the ZooKeeper service. With the exception of the request processor,
-     each of
-      the servers that make up the ZooKeeper service replicates its own copy
-      of each of components. <remark>[tbd: I changed the wording in this
-      sentence from the white paper. Can someone please make sure it is still
-      correct?]</remark>
-      
-zookeeperOver.xml:342:      The programming interface to ZooKeeper is deliberately simple.
-      With it, however, you can implement higher order operations, such as
-      synchronizations primitives, group membership, ownership, etc. Some
-      distributed applications have used it to: <remark>[tbd: add uses from
-      white paper and video presentation.]</remark> 
-      
-
-zookeeperProgrammers.xml:94:              <listitem>
-        <para><xref linkend="ch_programStructureWithExample" />
-        <remark>[tbd]</remark></para>
-      </listitem>
-      
-zookeeperProgrammers.xml:115:     Also,
-    the <ulink url="#ch_programStructureWithExample">Simple Programmming
-    Example</ulink> <remark>[tbd]</remark> is helpful for understand the basic
-    structure of a ZooKeeper client application.
-    
-zookeeperProgrammers.xml:142:      The following characters are not
-				allowed  because <remark>[tbd:
-				do we need reasons?]</remark> 
-
-zookeeperProgrammers.xml:172:     If
-      the version it supplies doesn't match the actual version of the data,
-      the update will fail. (This behavior can be overridden. For more
-      information see... )<remark>[tbd... reference here to the section
-      describing the special version number -1]</remark>
-      
-zookeeperProgrammers.xml:197:        More information about watches can be
-        found in the section 
-	<ulink url="recipes.html#sc_recipes_Locks">
-	Zookeeper Watches</ulink>.
-        <remark>[tbd: fix this link] [tbd: Ben there is note from to emphasize
-        that "it is queued". What is "it" and is what we have here
-        sufficient?]</remark></para>
-	
-zookeeperProgrammers.xml:335:    it will send the session id as a part of the connection handshake.
-    As a security measure, the server creates a password for the session id
-    that any ZooKeeper server can validate. <remark>[tbd: note from Ben:
-    "perhaps capability is a better word." need clarification on that.]
-    </remark>
-    
-zookeeperProgrammers.xml:601:              <ulink
-              url="recipes.html#sc_recipes_Locks">Locks</ulink>
-              <remark>[tbd:...]</remark> in <ulink
-              url="recipes.html">Zookeeper Recipes</ulink>.
-              <remark>[tbd:..]</remark>).</para>
-	      
-zookeeperProgrammers.xml:766:             <para>See INSTALL for general information about running
-              <emphasis role="bold">configure</emphasis>. <remark>[tbd: what
-              is INSTALL? a directory? a file?]</remark></para>
-	     
-	      
-	      
-zookeeperProgrammers.xml:813:                <para>To verify that the node's been created:</para>
-
-        <para>You should see a list of node who are children of the root node
-        "/".</para><remark>[tbd: document all the cli commands (I think this is ben's comment)
-
-zookeeperProgrammers.xml:838:                <para>Refer to <xref linkend="ch_programStructureWithExample"/>for examples of usage in Java and C.
-        <remark>[tbd]</remark></para>
-
-zookeeperProgrammers.xml 847: <remark>[tbd: This is a new section. The below
-    is just placeholder. Eventually, a subsection on each of those operations, with a little
-    bit of illustrative code for each op.] </remark>
-    
-zookeeperProgrammers.xml:915:    Program Structure, with Simple Example</title>
-
-zookeeperProgrammers.xml:999:        <term>ZooKeeper Whitepaper <remark>[tbd: find url]</remark></term>
-
-zookeeperProgrammers.xml:1008:        <term>API Reference <remark>[tbd: find url]</remark></term>
-
-zookeeperProgrammers.xml:1062:        [tbd]</remark></term><listitem>
-          <para>Any other good sources anyone can think of...</para>
-        </listitem>
-
-zookeeperStarted.xml:73:            <para>[tbd: should we start w/ a word here about were to get the source,
-      exactly what to download, how to unpack it, and where to put it? Also,
-      does the user need to be in sudo, or can they be under their regular
-      login?]</para>
-      
-zookeeperStarted.xml:84:      <para>This should generate a JAR file called zookeeper.jar. To start
-      Zookeeper, compile and run zookeeper.jar. <emphasis>[tbd, some more
-      instruction here. Perhaps a command line? Are these two steps or
-      one?]</emphasis></para>
-      
-zookeeperStarted.xml:139:      <para>ZooKeeper logs messages using log4j -- more detail available in
-      the <ulink url="zookeeperProgrammers.html#Logging">Logging</ulink>
-      section of the Programmer's Guide.<remark revision="include_tbd">[tbd:
-      real reference needed]</remark> 
-      
-zookeeperStarted.xml:201:      The C bindings exist in two variants: single
-      threaded and multi-threaded. These differ only in how the messaging loop
-      is done. <remark>[tbd: what is the messaging loop? Do we talk about it
-      anywyhere? is this too much info for a getting started guide?]</remark>
-      
-zookeeperStarted.xml:217:      The entry <emphasis
-      role="bold">syncLimit</emphasis> limits how far out of date a server can
-      be from a leader. [TBD: someone please verify that the previous is
-      true.] 
-
-zookeeperStarted.xml:232:	These are the "electionPort" numbers of the servers (as opposed to
-      clientPorts), that is ports for <remark>[tbd: feedback need: what are
-      these ports, exactly?]
-      
-zookeeperStarted.xml:258:          <remark>[tbd: what is the other config param?
-          (I believe two are mentioned above.)]</remark>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/classes/CatalogManager.properties
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/classes/CatalogManager.properties b/zookeeper-docs/src/documentation/classes/CatalogManager.properties
deleted file mode 100644
index ac060b9..0000000
--- a/zookeeper-docs/src/documentation/classes/CatalogManager.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-# 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.
-
-#=======================================================================
-# CatalogManager.properties
-#
-# This is the default properties file for Apache Forrest.
-# This facilitates local configuration of application-specific catalogs.
-#
-# See the Apache Forrest documentation:
-# http://forrest.apache.org/docs/your-project.html
-# http://forrest.apache.org/docs/validation.html
-
-# verbosity ... level of messages for status/debug
-# See forrest/src/core/context/WEB-INF/cocoon.xconf
-
-# catalogs ... list of additional catalogs to load
-#  (Note that Apache Forrest will automatically load its own default catalog
-#  from src/core/context/resources/schema/catalog.xcat)
-# use full pathnames
-# pathname separator is always semi-colon (;) regardless of operating system
-# directory separator is always slash (/) regardless of operating system
-#
-#catalogs=/home/me/forrest/my-site/src/documentation/resources/schema/catalog.xcat
-catalogs=
-

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/conf/cli.xconf
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/conf/cli.xconf b/zookeeper-docs/src/documentation/conf/cli.xconf
deleted file mode 100644
index c671340..0000000
--- a/zookeeper-docs/src/documentation/conf/cli.xconf
+++ /dev/null
@@ -1,328 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  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.
--->
-<!--+
-    |  This is the Apache Cocoon command line configuration file.
-    |  Here you give the command line interface details of where
-    |  to find various aspects of your Cocoon installation.
-    |
-    |  If you wish, you can also use this file to specify the URIs
-    |  that you wish to generate.
-    |
-    |  The current configuration information in this file is for
-    |  building the Cocoon documentation. Therefore, all links here
-    |  are relative to the build context dir, which, in the build.xml
-    |  file, is set to ${build.context}
-    |
-    |  Options:
-    |    verbose:            increase amount of information presented
-    |                        to standard output (default: false)
-    |    follow-links:       whether linked pages should also be
-    |                        generated (default: true)
-    |    precompile-only:    precompile sitemaps and XSP pages, but
-    |                        do not generate any pages (default: false)
-    |    confirm-extensions: check the mime type for the generated page
-    |                        and adjust filename and links extensions
-    |                        to match the mime type
-    |                        (e.g. text/html->.html)
-    |
-    |  Note: Whilst using an xconf file to configure the Cocoon
-    |        Command Line gives access to more features, the use of
-    |        command line parameters is more stable, as there are
-    |        currently plans to improve the xconf format to allow
-    |        greater flexibility. If you require a stable and
-    |        consistent method for accessing the CLI, it is recommended
-    |        that you use the command line parameters to configure
-    |        the CLI. See documentation at:
-    |        http://cocoon.apache.org/2.1/userdocs/offline/
-    |        http://wiki.apache.org/cocoon/CommandLine
-    |
-    +-->
-
-<cocoon verbose="true"
-        follow-links="true"
-        precompile-only="false"
-        confirm-extensions="false">
-
-   <!--+
-       |  The context directory is usually the webapp directory
-       |  containing the sitemap.xmap file.
-       |
-       |  The config file is the cocoon.xconf file.
-       |
-       |  The work directory is used by Cocoon to store temporary
-       |  files and cache files.
-       |
-       |  The destination directory is where generated pages will
-       |  be written (assuming the 'simple' mapper is used, see
-       |  below)
-       +-->
-   <context-dir>.</context-dir>
-   <config-file>WEB-INF/cocoon.xconf</config-file>
-   <work-dir>../tmp/cocoon-work</work-dir>
-   <dest-dir>../site</dest-dir>
-
-   <!--+
-       |  A checksum file can be used to store checksums for pages
-       |  as they are generated. When the site is next generated,
-       |  files will not be written if their checksum has not changed.
-       |  This means that it will be easier to detect which files
-       |  need to be uploaded to a server, using the timestamp.
-       |
-       |  The default path is relative to the core webapp directory.
-       |  An asolute path can be used.
-       +-->
-   <!--   <checksums-uri>build/work/checksums</checksums-uri>-->
-
-   <!--+
-       | Broken link reporting options:
-       |   Report into a text file, one link per line:
-       |     <broken-links type="text" report="filename"/>
-       |   Report into an XML file:
-       |     <broken-links type="xml" report="filename"/>
-       |   Ignore broken links (default):
-       |     <broken-links type="none"/>
-       |
-       |   Two attributes to this node specify whether a page should
-       |   be generated when an error has occurred. 'generate' specifies
-       |   whether a page should be generated (default: true) and
-       |   extension specifies an extension that should be appended
-       |   to the generated page's filename (default: none)
-       |
-       |   Using this, a quick scan through the destination directory
-       |   will show broken links, by their filename extension.
-       +-->
-   <broken-links type="xml"
-                 file="../brokenlinks.xml"
-                 generate="false"
-                 extension=".error"
-                 show-referrers="true"/>
-
-   <!--+
-       |  Load classes at startup. This is necessary for generating
-       |  from sites that use SQL databases and JDBC.
-       |  The <load-class> element can be repeated if multiple classes
-       |  are needed.
-       +-->
-   <!--
-   <load-class>org.firebirdsql.jdbc.Driver</load-class>
-   -->
-
-   <!--+
-       |  Configures logging.
-       |  The 'log-kit' parameter specifies the location of the log kit
-       |  configuration file (usually called logkit.xconf.
-       |
-       |  Logger specifies the logging category (for all logging prior
-       |  to other Cocoon logging categories taking over)
-       |
-       |  Available log levels are:
-       |    DEBUG:        prints all level of log messages.
-       |    INFO:         prints all level of log messages except DEBUG
-       |                  ones.
-       |    WARN:         prints all level of log messages except DEBUG
-       |                  and INFO ones.
-       |    ERROR:        prints all level of log messages except DEBUG,
-       |                  INFO and WARN ones.
-       |    FATAL_ERROR:  prints only log messages of this level
-       +-->
-   <!-- <logging log-kit="WEB-INF/logkit.xconf" logger="cli" level="ERROR" /> -->
-
-   <!--+
-       |  Specifies the filename to be appended to URIs that
-       |  refer to a directory (i.e. end with a forward slash).
-       +-->
-   <default-filename>index.html</default-filename>
-
-   <!--+
-       |  Specifies a user agent string to the sitemap when
-       |  generating the site.
-       |
-       |  A generic term for a web browser is "user agent". Any
-       |  user agent, when connecting to a web server, will provide
-       |  a string to identify itself (e.g. as Internet Explorer or
-       |  Mozilla). It is possible to have Cocoon serve different
-       |  content depending upon the user agent string provided by
-       |  the browser. If your site does this, then you may want to
-       |  use this <user-agent> entry to provide a 'fake' user agent
-       |  to Cocoon, so that it generates the correct version of your
-       |  site.
-       |
-       |  For most sites, this can be ignored.
-       +-->
-   <!--
-   <user-agent>Cocoon Command Line Environment 2.1</user-agent>
-   -->
-
-   <!--+
-       |  Specifies an accept string to the sitemap when generating
-       |  the site.
-       |  User agents can specify to an HTTP server what types of content
-       |  (by mime-type) they are able to receive. E.g. a browser may be
-       |  able to handle jpegs, but not pngs. The HTTP accept header
-       |  allows the server to take the browser's capabilities into account,
-       |  and only send back content that it can handle.
-       |
-       |  For most sites, this can be ignored.
-       +-->
-
-   <accept>*/*</accept>
-
-   <!--+
-       | Specifies which URIs should be included or excluded, according
-       | to wildcard patterns.
-       |
-       | These includes/excludes are only relevant when you are following
-       | links. A link URI must match an include pattern (if one is given)
-       | and not match an exclude pattern, if it is to be followed by
-       | Cocoon. It can be useful, for example, where there are links in
-       | your site to pages that are not generated by Cocoon, such as
-       | references to api-documentation.
-       |
-       | By default, all URIs are included. If both include and exclude
-       | patterns are specified, a URI is first checked against the
-       | include patterns, and then against the exclude patterns.
-       |
-       | Multiple patterns can be given, using muliple include or exclude
-       | nodes.
-       |
-       | The order of the elements is not significant, as only the first
-       | successful match of each category is used.
-       |
-       | Currently, only the complete source URI can be matched (including
-       | any URI prefix). Future plans include destination URI matching
-       | and regexp matching. If you have requirements for these, contact
-       | dev@cocoon.apache.org.
-       +-->
-
-   <exclude pattern="**/"/>
-   <exclude pattern="**apidocs**"/>
-   <exclude pattern="api/**"/>
-
-   <!-- ZOOKEEPER-2364 - we build our own release notes separately -->
-   <exclude pattern="releasenotes.**"/>
-
-<!--
-  This is a workaround for FOR-284 "link rewriting broken when
-  linking to xml source views which contain site: links".
-  See the explanation there and in declare-broken-site-links.xsl
--->
-   <exclude pattern="site:**"/>
-   <exclude pattern="ext:**"/>
-   <exclude pattern="lm:**"/>
-   <exclude pattern="**/site:**"/>
-   <exclude pattern="**/ext:**"/>
-   <exclude pattern="**/lm:**"/>
-
-   <!-- Exclude tokens used in URLs to ASF mirrors (interpreted by a CGI) -->
-   <exclude pattern="[preferred]/**"/>
-   <exclude pattern="[location]"/>
-
-   <!--   <include-links extension=".html"/>-->
-
-   <!--+
-       |  <uri> nodes specify the URIs that should be generated, and
-       |  where required, what should be done with the generated pages.
-       |  They describe the way the URI of the generated file is created
-       |  from the source page's URI. There are three ways that a generated
-       |  file URI can be created: append, replace and insert.
-       |
-       |  The "type" attribute specifies one of (append|replace|insert):
-       |
-       |  append:
-       |  Append the generated page's URI to the end of the source URI:
-       |
-       |   <uri type="append" src-prefix="documents/" src="index.html"
-       |   dest="build/dest/"/>
-       |
-       |  This means that
-       |   (1) the "documents/index.html" page is generated
-       |   (2) the file will be written to "build/dest/documents/index.html"
-       |
-       |  replace:
-       |  Completely ignore the generated page's URI - just
-       |  use the destination URI:
-       |
-       |   <uri type="replace" src-prefix="documents/" src="index.html"
-       |   dest="build/dest/docs.html"/>
-       |
-       |  This means that
-       |   (1) the "documents/index.html" page is generated
-       |   (2) the result is written to "build/dest/docs.html"
-       |   (3) this works only for "single" pages - and not when links
-       |       are followed
-       |
-       |  insert:
-       |  Insert generated page's URI into the destination
-       |  URI at the point marked with a * (example uses fictional
-       |  zip protocol)
-       |
-       |   <uri type="insert" src-prefix="documents/" src="index.html"
-       |   dest="zip://*.zip/page.html"/>
-       |
-       |  This means that
-       |   (1)
-       |
-       |  In any of these scenarios, if the dest attribute is omitted,
-       |  the value provided globally using the <dest-dir> node will
-       |  be used instead.
-       +-->
-   <!--
-   <uri type="replace"
-        src-prefix="samples/"
-        src="hello-world/hello.html"
-        dest="build/dest/hello-world.html"/>
-   -->
-
-   <!--+
-       | <uri> nodes can be grouped together in a <uris> node. This
-       | enables a group of URIs to share properties. The following
-       | properties can be set for a group of URIs:
-       |   * follow-links:       should pages be crawled for links
-       |   * confirm-extensions: should file extensions be checked
-       |                         for the correct mime type
-       |   * src-prefix:         all source URIs should be
-       |                         pre-pended with this prefix before
-       |                         generation. The prefix is not
-       |                         included when calculating the
-       |                         destination URI
-       |   * dest:               the base destination URI to be
-       |                         shared by all pages in this group
-       |   * type:               the method to be used to calculate
-       |                         the destination URI. See above
-       |                         section on <uri> node for details.
-       |
-       | Each <uris> node can have a name attribute. When a name
-       | attribute has been specified, the -n switch on the command
-       | line can be used to tell Cocoon to only process the URIs
-       | within this URI group. When no -n switch is given, all
-       | <uris> nodes are processed. Thus, one xconf file can be
-       | used to manage multiple sites.
-       +-->
-   <!--
-   <uris name="mirrors" follow-links="false">
-     <uri type="append" src="mirrors.html"/>
-   </uris>
-   -->
-
-   <!--+
-       |  File containing URIs (plain text, one per line).
-       +-->
-   <!--
-   <uri-file>uris.txt</uri-file>
-   -->
-</cocoon>


[17/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

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

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperStarted.pdf
----------------------------------------------------------------------
diff --git a/docs/bookkeeperStarted.pdf b/docs/bookkeeperStarted.pdf
deleted file mode 100644
index 42e4987..0000000
Binary files a/docs/bookkeeperStarted.pdf and /dev/null differ

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

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperStream.pdf
----------------------------------------------------------------------
diff --git a/docs/bookkeeperStream.pdf b/docs/bookkeeperStream.pdf
deleted file mode 100644
index 87aad97..0000000
Binary files a/docs/bookkeeperStream.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/broken-links.xml
----------------------------------------------------------------------
diff --git a/docs/broken-links.xml b/docs/broken-links.xml
deleted file mode 100644
index f95aa9b..0000000
--- a/docs/broken-links.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<broken-links>
-</broken-links>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/2pc.jpg
----------------------------------------------------------------------
diff --git a/docs/images/2pc.jpg b/docs/images/2pc.jpg
deleted file mode 100644
index fe4488f..0000000
Binary files a/docs/images/2pc.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/bk-overview.jpg
----------------------------------------------------------------------
diff --git a/docs/images/bk-overview.jpg b/docs/images/bk-overview.jpg
deleted file mode 100644
index 6e12fb4..0000000
Binary files a/docs/images/bk-overview.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/built-with-forrest-button.png
----------------------------------------------------------------------
diff --git a/docs/images/built-with-forrest-button.png b/docs/images/built-with-forrest-button.png
deleted file mode 100644
index 4a787ab..0000000
Binary files a/docs/images/built-with-forrest-button.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/favicon.ico
----------------------------------------------------------------------
diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico
deleted file mode 100644
index 161bcf7..0000000
Binary files a/docs/images/favicon.ico and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/hadoop-logo.jpg
----------------------------------------------------------------------
diff --git a/docs/images/hadoop-logo.jpg b/docs/images/hadoop-logo.jpg
deleted file mode 100644
index 809525d..0000000
Binary files a/docs/images/hadoop-logo.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/instruction_arrow.png
----------------------------------------------------------------------
diff --git a/docs/images/instruction_arrow.png b/docs/images/instruction_arrow.png
deleted file mode 100644
index 0fbc724..0000000
Binary files a/docs/images/instruction_arrow.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/state_dia.jpg
----------------------------------------------------------------------
diff --git a/docs/images/state_dia.jpg b/docs/images/state_dia.jpg
deleted file mode 100644
index b6f4a8b..0000000
Binary files a/docs/images/state_dia.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zkcomponents.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zkcomponents.jpg b/docs/images/zkcomponents.jpg
deleted file mode 100644
index 7690578..0000000
Binary files a/docs/images/zkcomponents.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zknamespace.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zknamespace.jpg b/docs/images/zknamespace.jpg
deleted file mode 100644
index 05534bc..0000000
Binary files a/docs/images/zknamespace.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zkperfRW-3.2.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zkperfRW-3.2.jpg b/docs/images/zkperfRW-3.2.jpg
deleted file mode 100644
index 594b50b..0000000
Binary files a/docs/images/zkperfRW-3.2.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zkperfRW.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zkperfRW.jpg b/docs/images/zkperfRW.jpg
deleted file mode 100644
index ad3019f..0000000
Binary files a/docs/images/zkperfRW.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zkperfreliability.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zkperfreliability.jpg b/docs/images/zkperfreliability.jpg
deleted file mode 100644
index 232bba8..0000000
Binary files a/docs/images/zkperfreliability.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zkservice.jpg
----------------------------------------------------------------------
diff --git a/docs/images/zkservice.jpg b/docs/images/zkservice.jpg
deleted file mode 100644
index 1ec9154..0000000
Binary files a/docs/images/zkservice.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/images/zookeeper_small.gif
----------------------------------------------------------------------
diff --git a/docs/images/zookeeper_small.gif b/docs/images/zookeeper_small.gif
deleted file mode 100644
index 4e8014f..0000000
Binary files a/docs/images/zookeeper_small.gif and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/index.html
----------------------------------------------------------------------
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index 8174a86..0000000
--- a/docs/index.html
+++ /dev/null
@@ -1,352 +0,0 @@
-<!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: Because Coordinating Distributed Systems is a Zoo</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Welcome</div>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit">
-<hr>
-<a href="http://forrest.apache.org/"><img border="0" title="Built with Apache Forrest" alt="Built with Apache Forrest - logo" src="images/built-with-forrest-button.png" style="width: 88px;height: 31px;"></a>
-</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="index.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper: Because Coordinating Distributed Systems is a Zoo</h1>
-<div id="front-matter"></div>
-    
-<p>ZooKeeper is a high-performance coordination service for
-      distributed applications.  It exposes common services - such as
-      naming, configuration management, synchronization, and group
-      services - in a simple interface so you don't have to write them
-      from scratch.  You can use it off-the-shelf to implement
-      consensus, group management, leader election, and presence
-      protocols. And you can build on it for your own, specific needs.
-    </p>
-
-    
-<p>
-      The following documents describe concepts and procedures to get
-      you started using ZooKeeper. If you have more questions, please
-      ask the <a href="http://zookeeper.apache.org/mailing_lists.html">mailing list</a> or browse the
-      archives.
-    </p>
-    
-<ul>
-
-      
-<li>
-<strong>ZooKeeper Overview</strong>
-<p>Technical Overview Documents for Client Developers, Adminstrators, and Contributors</p>
-      
-<ul>
-<li>
-<a href="zookeeperOver.html">Overview</a> - a bird's eye view of ZooKeeper, including design concepts and architecture</li>
-      
-<li>
-<a href="zookeeperStarted.html">Getting Started</a> - a tutorial-style guide for developers to install, run, and program to ZooKeeper</li>
-      
-<li>
-<a href="releasenotes.html">Release Notes</a> - new developer and user facing features, improvements, and incompatibilities</li>
-      
-</ul>
-      
-</li>
-      
-      
-<li>
-<strong>Developers</strong>
-<p> Documents for Developers using the ZooKeeper Client API</p>
-      
-<ul>
-            
-<li>
-<a href="api/index.html">API Docs</a> - the technical reference to ZooKeeper Client APIs</li>
-      
-<li>
-<a href="zookeeperProgrammers.html">Programmer's Guide</a> - a client application developer's guide to ZooKeeper</li>
-      
-<li>
-<a href="javaExample.html">ZooKeeper Java Example</a> - a simple Zookeeper client appplication, written in Java</li>
-      
-<li>
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a> - sample implementations of barriers and queues</li>  
-      
-<li>
-<a href="recipes.html">ZooKeeper Recipes</a> - higher level solutions to common problems in distributed applications</li>
-      
-</ul>
-      
-</li>
-      
-      
-<li>
-<strong>Administrators &amp; Operators</strong> 
-<p> Documents for Administrators and Operations Engineers of ZooKeeper Deployments</p>
-      
-<ul>
-      
-<li>
-<a href="zookeeperAdmin.html">Administrator's Guide</a> - a guide for system administrators and anyone else who might deploy ZooKeeper</li>
-      
-<li>
-<a href="zookeeperQuotas.html">Quota Guide</a> - a guide for system administrators on Quotas in ZooKeeper. </li>
-      
-<li>
-<a href="zookeeperJMX.html">JMX</a> - how to enable JMX in ZooKeeper</li>
-      
-<li>
-<a href="zookeeperHierarchicalQuorums.html">Hierarchical quorums</a>
-</li>
-      
-<li>
-<a href="zookeeperObservers.html">Observers</a> - non-voting ensemble members that easily improve ZooKeeper's scalability</li>
-      
-<li>
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</a> - a guide on how to use dynamic reconfiguration in ZooKeeper</li>
-      
-</ul>
-      
-</li>
-      
-      
-<li>
-<strong>Contributors</strong>
-<p> Documents for Developers Contributing to the ZooKeeper Open Source Project</p>
-      
-<ul>
-      
-<li>
-<a href="zookeeperInternals.html">ZooKeeper Internals</a> - assorted topics on the inner workings of ZooKeeper</li>
-      
-</ul>
-      
-</li>
-      
-      
-<li>
-<strong>Miscellaneous ZooKeeper Documentation</strong>
-      
-<ul>
-      
-<li>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</li>
-      
-<li>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</li>    
-      
-</ul>
-      
-</li>
-    
-</ul>
-  
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<div id="logos"></div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/index.pdf
----------------------------------------------------------------------
diff --git a/docs/index.pdf b/docs/index.pdf
deleted file mode 100644
index 9ffd60f..0000000
Binary files a/docs/index.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/javaExample.html
----------------------------------------------------------------------
diff --git a/docs/javaExample.html b/docs/javaExample.html
deleted file mode 100644
index 12bb13b..0000000
--- a/docs/javaExample.html
+++ /dev/null
@@ -1,900 +0,0 @@
-<!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 Java Example</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Java Example</div>
-</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">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="javaExample.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Java Example</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_Introduction">A Simple Watch Client</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_requirements">Requirements</a>
-</li>
-<li>
-<a href="#sc_design">Program Design</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_executor">The Executor Class</a>
-</li>
-<li>
-<a href="#sc_DataMonitor">The DataMonitor Class</a>
-</li>
-<li>
-<a href="#sc_completeSourceCode">Complete Source Listings</a>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-<a name="ch_Introduction"></a>
-<h2 class="h3">A Simple Watch Client</h2>
-<div class="section">
-<p>To introduce you to the ZooKeeper Java API, we develop here a very simple 
-    watch client. This ZooKeeper client watches a ZooKeeper node for changes 
-    and responds to by starting or stopping a program.</p>
-<a name="sc_requirements"></a>
-<h3 class="h4">Requirements</h3>
-<p>The client has four requirements:</p>
-<ul>
-<li>
-<p>It takes as parameters:</p>
-        
-<ul>
-        
-<li>
-<p>the address of the ZooKeeper service</p>
-</li>
-        
-<li>
-<p>the name of a znode - the one to be watched</p>
-</li>
-        
-<li>
-<p>the name of a file to write the output to</p>
-</li>
-        
-<li>
-<p>an executable with arguments.</p>
-</li>
-</ul>
-</li>
-    
-<li>
-<p>It fetches the data associated with the znode and starts the executable.</p>
-</li>
-    
-<li>
-<p>If the znode changes, the client refetches the contents and restarts the executable.</p>
-</li>
-    
-<li>
-<p>If the znode disappears, the client kills the executable.</p>
-</li>
-</ul>
-<a name="sc_design"></a>
-<h3 class="h4">Program Design</h3>
-<p>Conventionally, ZooKeeper applications are broken into two units, one which maintains the connection, 
-   and the other which monitors data.  In this application, the class called the <strong>Executor</strong> 
-   maintains the ZooKeeper connection, and the class called the  <strong>DataMonitor</strong> monitors the data
-   in the ZooKeeper tree. Also, Executor contains the main thread and contains the execution logic.
-   It is responsible for what little user interaction there is, as well as interaction with the exectuable program you
-   pass in as an argument and which the sample (per the requirements) shuts down and restarts, according to the 
-   state of the znode.</p>
-</div>
-
-   
-<a name="sc_executor"></a>
-<h2 class="h3">The Executor Class</h2>
-<div class="section">
-<p>The Executor object is the primary container of the sample application. It contains 
-    both the <strong>ZooKeeper</strong> object, <strong>DataMonitor</strong>, as described above in 
-    <a href="#sc_design">Program Design</a>.  </p>
-<pre class="code">
-    // from the Executor class...
-    
-    public static void main(String[] args) {
-        if (args.length &lt; 4) {
-            System.err
-                    .println("USAGE: Executor hostPort znode filename program [args ...]");
-            System.exit(2);
-        }
-        String hostPort = args[0];
-        String znode = args[1];
-        String filename = args[2];
-        String exec[] = new String[args.length - 3];
-        System.arraycopy(args, 3, exec, 0, exec.length);
-        try {
-            new Executor(hostPort, znode, filename, exec).run();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public Executor(String hostPort, String znode, String filename,
-            String exec[]) throws KeeperException, IOException {
-        this.filename = filename;
-        this.exec = exec;
-        zk = new ZooKeeper(hostPort, 3000, this);
-        dm = new DataMonitor(zk, znode, null, this);
-    }
-
-    public void run() {
-        try {
-            synchronized (this) {
-                while (!dm.dead) {
-                    wait();
-                }
-            }
-        } catch (InterruptedException e) {
-        }
-    }
-</pre>
-<p>
-    Recall that the Executor's job is to start and stop the executable whose name you pass in on the command line. 
-    It does this in response to events fired by the ZooKeeper object. As you can see in the code above, the Executor passes
-    a reference to itself as the Watcher argument in the ZooKeeper constructor. It also passes a reference to itself
-    as DataMonitorListener argument to the DataMonitor constructor. Per the Executor's definition, it implements both these
-    interfaces:
-    </p>
-<pre class="code">
-public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener {
-...</pre>
-<p>The <strong>Watcher</strong> interface is defined by the ZooKeeper Java API.
-    ZooKeeper uses it to communicate back to its container. It supports only one method, <span class="codefrag command">process()</span>, and ZooKeeper uses 
-    it to communciates generic events that the main thread would be intersted in, such as the state of the ZooKeeper connection or the ZooKeeper session.The Executor 
-    in this example simply forwards those events down to the DataMonitor to decide what to do with them. It does this simply to illustrate
-    the point that, by convention, the Executor or some Executor-like object "owns" the ZooKeeper connection, but it is free to delegate the events to other
-    events to other objects. It also uses this as the default channel on which to fire watch events. (More on this later.)</p>
-<pre class="code">
-    public void process(WatchedEvent event) {
-        dm.process(event);
-    }
-</pre>
-<p>The <strong>DataMonitorListener</strong> 
-    interface, on the other hand, is not part of the the ZooKeeper API. It is a completely custom interface, 
-    designed for this sample application. The DataMonitor object uses it to communicate back to its container, which
-    is also the the Executor object.The DataMonitorListener interface looks like this:</p>
-<pre class="code">
-public interface DataMonitorListener {
-    /**
-    * The existence status of the node has changed.
-    */
-    void exists(byte data[]);
-
-    /**
-    * The ZooKeeper session is no longer valid.
-    * 
-    * @param rc
-    * the ZooKeeper reason code
-    */
-    void closing(int rc);
-}
-</pre>
-<p>This interface is defined in the DataMonitor class and implemented in the Executor class. 
-    When <span class="codefrag command">Executor.exists()</span> is invoked,
-    the Executor decides whether to start up or shut down per the requirements. Recall that the requires say to kill the executable when the 
-    znode ceases to <em>exist</em>. </p>
-<p>When <span class="codefrag command">Executor.closing()</span>
-    is invoked, the Executor decides whether or not to shut itself down in response to the ZooKeeper connection permanently disappearing.</p>
-<p>As you might have guessed, DataMonitor is the object that invokes 
-    these methods, in response to changes in ZooKeeper's state.</p>
-<p>Here are Executor's implementation of 
-    <span class="codefrag command">DataMonitorListener.exists()</span> and <span class="codefrag command">DataMonitorListener.closing</span>:
-    </p>
-<pre class="code">
-public void exists( byte[] data ) {
-    if (data == null) {
-        if (child != null) {
-            System.out.println("Killing process");
-            child.destroy();
-            try {
-                child.waitFor();
-            } catch (InterruptedException e) {
-            }
-        }
-        child = null;
-    } else {
-        if (child != null) {
-            System.out.println("Stopping child");
-            child.destroy();
-            try {
-               child.waitFor();
-            } catch (InterruptedException e) {
-            e.printStackTrace();
-            }
-        }
-        try {
-            FileOutputStream fos = new FileOutputStream(filename);
-            fos.write(data);
-            fos.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        try {
-            System.out.println("Starting child");
-            child = Runtime.getRuntime().exec(exec);
-            new StreamWriter(child.getInputStream(), System.out);
-            new StreamWriter(child.getErrorStream(), System.err);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-}
-
-public void closing(int rc) {
-    synchronized (this) {
-        notifyAll();
-    }
-}
-</pre>
-</div>
-
-<a name="sc_DataMonitor"></a>
-<h2 class="h3">The DataMonitor Class</h2>
-<div class="section">
-<p>
-The DataMonitor class has the meat of the ZooKeeper logic. It is mostly 
-asynchronous and event driven. DataMonitor kicks things off in the constructor with:</p>
-<pre class="code">
-public DataMonitor(ZooKeeper zk, String znode, Watcher chainedWatcher,
-        DataMonitorListener listener) {
-    this.zk = zk;
-    this.znode = znode;
-    this.chainedWatcher = chainedWatcher;
-    this.listener = listener;
-    
-    // Get things started by checking if the node exists. We are going
-    // to be completely event driven
-    <strong>zk.exists(znode, true, this, null);</strong>
-}
-</pre>
-<p>The call to <span class="codefrag command">ZooKeeper.exists()</span> checks for the existence of the znode, 
-sets a watch, and passes a reference to itself (<span class="codefrag command">this</span>)
-as the completion callback object. In this sense, it kicks things off, since the
-real processing happens when the watch is triggered.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-
-<p>Don't confuse the completion callback with the watch callback. The <span class="codefrag command">ZooKeeper.exists()</span> 
-completion callback, which happens to be the method <span class="codefrag command">StatCallback.processResult()</span> implemented 
-in the DataMonitor object, is invoked when the asynchronous <em>setting of the watch</em> operation 
-(by <span class="codefrag command">ZooKeeper.exists()</span>) completes on the server. </p>
-
-<p>
-The triggering of the watch, on the other hand, sends an event to the <em>Executor</em> object, since
-the Executor registered as the Watcher of the ZooKeeper object.</p>
-
-
-<p>As an aside, you might note that the DataMonitor could also register itself as the Watcher
-for this particular watch event. This is new to ZooKeeper 3.0.0 (the support of multiple Watchers). In this
-example, however, DataMonitor does not register as the Watcher.</p>
-
-</div>
-</div>
-<p>When the <span class="codefrag command">ZooKeeper.exists()</span> operation completes on the server, the ZooKeeper API invokes this completion callback on 
-the client:</p>
-<pre class="code">
-public void processResult(int rc, String path, Object ctx, Stat stat) {
-    boolean exists;
-    switch (rc) {
-    case Code.Ok:
-        exists = true;
-        break;
-    case Code.NoNode:
-        exists = false;
-        break;
-    case Code.SessionExpired:
-    case Code.NoAuth:
-        dead = true;
-        listener.closing(rc);
-        return;
-    default:
-        // Retry errors
-        zk.exists(znode, true, this, null);
-        return;
-    }
- 
-    byte b[] = null;
-    if (exists) {
-        try {
-            <strong>b = zk.getData(znode, false, null);</strong>
-        } catch (KeeperException e) {
-            // We don't need to worry about recovering now. The watch
-            // callbacks will kick off any exception handling
-            e.printStackTrace();
-        } catch (InterruptedException e) {
-            return;
-        }
-    }     
-    if ((b == null &amp;&amp; b != prevData)
-            || (b != null &amp;&amp; !Arrays.equals(prevData, b))) {
-        <strong>listener.exists(b);</strong>
-        prevData = b;
-    }
-}
-</pre>
-<p>
-The code first checks the error codes for znode existence, fatal errors, and 
-recoverable errors. If the file (or znode) exists, it gets the data from the znode, and 
-then invoke the exists() callback of Executor if the state has changed. Note, 
-it doesn't have to do any Exception processing for the getData call because it 
-has watches pending for anything that could cause an error: if the node is deleted 
-before it calls <span class="codefrag command">ZooKeeper.getData()</span>, the watch event set by 
-the <span class="codefrag command">ZooKeeper.exists()</span> triggers a callback; 
-if there is a communication error, a connection watch event fires when 
-the connection comes back up.
-</p>
-<p>Finally, notice how DataMonitor processes watch events: </p>
-<pre class="code">
-    public void process(WatchedEvent event) {
-        String path = event.getPath();
-        if (event.getType() == Event.EventType.None) {
-            // We are are being told that the state of the
-            // connection has changed
-            switch (event.getState()) {
-            case SyncConnected:
-                // In this particular example we don't need to do anything
-                // here - watches are automatically re-registered with 
-                // server and any watches triggered while the client was 
-                // disconnected will be delivered (in order of course)
-                break;
-            case Expired:
-                // It's all over
-                dead = true;
-                listener.closing(KeeperException.Code.SessionExpired);
-                break;
-            }
-        } else {
-            if (path != null &amp;&amp; path.equals(znode)) {
-                // Something has changed on the node, let's find out
-                zk.exists(znode, true, this, null);
-            }
-        }
-        if (chainedWatcher != null) {
-            chainedWatcher.process(event);
-        }
-    }
-</pre>
-<p>
-If the client-side ZooKeeper libraries can re-establish the
-communication channel (SyncConnected event) to ZooKeeper before
-session expiration (Expired event) all of the session's watches will
-automatically be re-established with the server (auto-reset of watches
-is new in ZooKeeper 3.0.0). See <a href="zookeeperProgrammers.html#ch_zkWatches">ZooKeeper Watches</a>
-in the programmer guide for more on this. A bit lower down in this
-function, when DataMonitor gets an event for a znode, it calls
-<span class="codefrag command">ZooKeeper.exists()</span> to find out what has changed.
-</p>
-</div>
-
-
-<a name="sc_completeSourceCode"></a>
-<h2 class="h3">Complete Source Listings</h2>
-<div class="section">
-<div class="note example">
-<div class="label">Executor.java</div>
-<div class="content">
-<title>Executor.java</title>
-<pre class="code">
-/**
- * A simple example program to use DataMonitor to start and
- * stop executables based on a znode. The program watches the
- * specified znode and saves the data that corresponds to the
- * znode in the filesystem. It also starts the specified program
- * with the specified arguments when the znode exists and kills
- * the program if the znode goes away.
- */
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-
-public class Executor
-    implements Watcher, Runnable, DataMonitor.DataMonitorListener
-{
-    String znode;
-
-    DataMonitor dm;
-
-    ZooKeeper zk;
-
-    String filename;
-
-    String exec[];
-
-    Process child;
-
-    public Executor(String hostPort, String znode, String filename,
-            String exec[]) throws KeeperException, IOException {
-        this.filename = filename;
-        this.exec = exec;
-        zk = new ZooKeeper(hostPort, 3000, this);
-        dm = new DataMonitor(zk, znode, null, this);
-    }
-
-    /**
-     * @param args
-     */
-    public static void main(String[] args) {
-        if (args.length &lt; 4) {
-            System.err
-                    .println("USAGE: Executor hostPort znode filename program [args ...]");
-            System.exit(2);
-        }
-        String hostPort = args[0];
-        String znode = args[1];
-        String filename = args[2];
-        String exec[] = new String[args.length - 3];
-        System.arraycopy(args, 3, exec, 0, exec.length);
-        try {
-            new Executor(hostPort, znode, filename, exec).run();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /***************************************************************************
-     * We do process any events ourselves, we just need to forward them on.
-     *
-     * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.proto.WatcherEvent)
-     */
-    public void process(WatchedEvent event) {
-        dm.process(event);
-    }
-
-    public void run() {
-        try {
-            synchronized (this) {
-                while (!dm.dead) {
-                    wait();
-                }
-            }
-        } catch (InterruptedException e) {
-        }
-    }
-
-    public void closing(int rc) {
-        synchronized (this) {
-            notifyAll();
-        }
-    }
-
-    static class StreamWriter extends Thread {
-        OutputStream os;
-
-        InputStream is;
-
-        StreamWriter(InputStream is, OutputStream os) {
-            this.is = is;
-            this.os = os;
-            start();
-        }
-
-        public void run() {
-            byte b[] = new byte[80];
-            int rc;
-            try {
-                while ((rc = is.read(b)) &gt; 0) {
-                    os.write(b, 0, rc);
-                }
-            } catch (IOException e) {
-            }
-
-        }
-    }
-
-    public void exists(byte[] data) {
-        if (data == null) {
-            if (child != null) {
-                System.out.println("Killing process");
-                child.destroy();
-                try {
-                    child.waitFor();
-                } catch (InterruptedException e) {
-                }
-            }
-            child = null;
-        } else {
-            if (child != null) {
-                System.out.println("Stopping child");
-                child.destroy();
-                try {
-                    child.waitFor();
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }
-            try {
-                FileOutputStream fos = new FileOutputStream(filename);
-                fos.write(data);
-                fos.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-            try {
-                System.out.println("Starting child");
-                child = Runtime.getRuntime().exec(exec);
-                new StreamWriter(child.getInputStream(), System.out);
-                new StreamWriter(child.getErrorStream(), System.err);
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-}
-</pre>
-	
-
-</div>
-</div>
-<div class="note example">
-<div class="label">DataMonitor.java</div>
-<div class="content">
-	
-<title>DataMonitor.java</title>
-	
-<pre class="code">
-/**
- * A simple class that monitors the data and existence of a ZooKeeper
- * node. It uses asynchronous ZooKeeper APIs.
- */
-import java.util.Arrays;
-
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.AsyncCallback.StatCallback;
-import org.apache.zookeeper.KeeperException.Code;
-import org.apache.zookeeper.data.Stat;
-
-public class DataMonitor implements Watcher, StatCallback {
-
-    ZooKeeper zk;
-
-    String znode;
-
-    Watcher chainedWatcher;
-
-    boolean dead;
-
-    DataMonitorListener listener;
-
-    byte prevData[];
-
-    public DataMonitor(ZooKeeper zk, String znode, Watcher chainedWatcher,
-            DataMonitorListener listener) {
-        this.zk = zk;
-        this.znode = znode;
-        this.chainedWatcher = chainedWatcher;
-        this.listener = listener;
-        // Get things started by checking if the node exists. We are going
-        // to be completely event driven
-        zk.exists(znode, true, this, null);
-    }
-
-    /**
-     * Other classes use the DataMonitor by implementing this method
-     */
-    public interface DataMonitorListener {
-        /**
-         * The existence status of the node has changed.
-         */
-        void exists(byte data[]);
-
-        /**
-         * The ZooKeeper session is no longer valid.
-         *
-         * @param rc
-         *                the ZooKeeper reason code
-         */
-        void closing(int rc);
-    }
-
-    public void process(WatchedEvent event) {
-        String path = event.getPath();
-        if (event.getType() == Event.EventType.None) {
-            // We are are being told that the state of the
-            // connection has changed
-            switch (event.getState()) {
-            case SyncConnected:
-                // In this particular example we don't need to do anything
-                // here - watches are automatically re-registered with 
-                // server and any watches triggered while the client was 
-                // disconnected will be delivered (in order of course)
-                break;
-            case Expired:
-                // It's all over
-                dead = true;
-                listener.closing(KeeperException.Code.SessionExpired);
-                break;
-            }
-        } else {
-            if (path != null &amp;&amp; path.equals(znode)) {
-                // Something has changed on the node, let's find out
-                zk.exists(znode, true, this, null);
-            }
-        }
-        if (chainedWatcher != null) {
-            chainedWatcher.process(event);
-        }
-    }
-
-    public void processResult(int rc, String path, Object ctx, Stat stat) {
-        boolean exists;
-        switch (rc) {
-        case Code.Ok:
-            exists = true;
-            break;
-        case Code.NoNode:
-            exists = false;
-            break;
-        case Code.SessionExpired:
-        case Code.NoAuth:
-            dead = true;
-            listener.closing(rc);
-            return;
-        default:
-            // Retry errors
-            zk.exists(znode, true, this, null);
-            return;
-        }
-
-        byte b[] = null;
-        if (exists) {
-            try {
-                b = zk.getData(znode, false, null);
-            } catch (KeeperException e) {
-                // We don't need to worry about recovering now. The watch
-                // callbacks will kick off any exception handling
-                e.printStackTrace();
-            } catch (InterruptedException e) {
-                return;
-            }
-        }
-        if ((b == null &amp;&amp; b != prevData)
-                || (b != null &amp;&amp; !Arrays.equals(prevData, b))) {
-            listener.exists(b);
-            prevData = b;
-        }
-    }
-}
-</pre>
-
-</div>
-</div>
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/javaExample.pdf
----------------------------------------------------------------------
diff --git a/docs/javaExample.pdf b/docs/javaExample.pdf
deleted file mode 100644
index fb9d678..0000000
Binary files a/docs/javaExample.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/linkmap.html
----------------------------------------------------------------------
diff --git a/docs/linkmap.html b/docs/linkmap.html
deleted file mode 100644
index b1f888f..0000000
--- a/docs/linkmap.html
+++ /dev/null
@@ -1,394 +0,0 @@
-<!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>Site Linkmap Table of Contents</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 Documentation</a>
-</li>
-</ul>
-<!--+
-    |end Tabs
-    +-->
-</div>
-</div>
-<div id="main">
-<div id="publishedStrip">
-<!--+
-    |start Subtabs
-    +-->
-<div id="level2tabs"></div>
-<!--+
-    |end Endtabs
-    +-->
-<script type="text/javascript"><!--
-document.write("Last Published: " + document.lastModified);
-//  --></script>
-</div>
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-
-             &nbsp;
-           </div>
-<!--+
-    |start Menu, mainarea
-    +-->
-<!--+
-    |start Menu
-    +-->
-<div id="menu">
-<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
-<div id="menu_1.1" class="menuitemgroup">
-<div class="menuitem">
-<a href="index.html">Welcome</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="linkmap.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>Site Linkmap Table of Contents</h1>
-<div id="front-matter"></div>
-<p>
-          This is a map of the complete site and its structure.
-        </p>
-<ul>
-<li>
-<a>ZooKeeper</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>site</em>
-</li>
-<ul>
-
-  
-<ul>
-<li>
-<a>Overview</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
-</li>
-<ul> 
-    
-<ul>
-<li>
-<a href="index.html">Welcome</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>welcome</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="zookeeperOver.html">Overview</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>overview</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="zookeeperStarted.html">Getting Started</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>started</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="releasenotes.html">Release Notes</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>relnotes</em>
-</li>
-</ul>
-  
-</ul>
-</ul>
-  
-  
-<ul>
-<li>
-<a>Developer</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
-</li>
-<ul>
-    
-<ul>
-<li>
-<a href="api/index.html">API Docs</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>api</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>program</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="javaExample.html">Java Example</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javaEx</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>barTutor</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="recipes.html">Recipes</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>recipes</em>
-</li>
-</ul>
-  
-</ul>
-</ul>
-  
-  
-<ul>
-<li>
-<a>Admin &amp; Ops</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
-</li>
-<ul>
-      
-<ul>
-<li>
-<a href="zookeeperAdmin.html">Administrator's Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>admin</em>
-</li>
-</ul>
-      
-<ul>
-<li>
-<a href="zookeeperQuotas.html">Quota Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>quota</em>
-</li>
-</ul>
-      
-<ul>
-<li>
-<a href="zookeeperJMX.html">JMX</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>jmx</em>
-</li>
-</ul>
-      
-<ul>
-<li>
-<a href="zookeeperObservers.html">Observers Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>observers</em>
-</li>
-</ul>
-      
-<ul>
-<li>
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>reconfig</em>
-</li>
-</ul>
-  
-</ul>
-</ul>
-  
-  
-<ul>
-<li>
-<a>Contributor</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
-</li>
-<ul>
-      
-<ul>
-<li>
-<a href="zookeeperInternals.html">ZooKeeper Internals</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>internals</em>
-</li>
-</ul>
-  
-</ul>
-</ul>
-  
-  
-<ul>
-<li>
-<a>Miscellaneous</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
-</li>
-<ul>
-    
-<ul>
-<li>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>wiki</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>faq</em>
-</li>
-</ul>
-    
-<ul>
-<li>
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>lists</em>
-</li>
-</ul>
-    
-  
-</ul>
-</ul>
-  
-  
-
-  
- 
-
-</ul>
-</ul>
-</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/linkmap.pdf
----------------------------------------------------------------------
diff --git a/docs/linkmap.pdf b/docs/linkmap.pdf
deleted file mode 100644
index 89ae180..0000000
Binary files a/docs/linkmap.pdf and /dev/null differ


[08/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperQuotas.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperQuotas.html b/docs/zookeeperQuotas.html
deleted file mode 100644
index a2d96a2..0000000
--- a/docs/zookeeperQuotas.html
+++ /dev/null
@@ -1,278 +0,0 @@
-<!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 Quota'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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<div class="menuitem">
-<a href="zookeeperAdmin.html">Administrator's Guide</a>
-</div>
-<div class="menupage">
-<div class="menupagetitle">Quota Guide</div>
-</div>
-<div class="menuitem">
-<a href="zookeeperJMX.html">JMX</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperObservers.html">Observers Guide</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperQuotas.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Quota's Guide</h1>
-<h3>A Guide to Deployment and Administration</h3>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#zookeeper_quotas">Quotas</a>
-<ul class="minitoc">
-<li>
-<a href="#Setting+Quotas">Setting Quotas</a>
-</li>
-<li>
-<a href="#Listing+Quotas">Listing Quotas</a>
-</li>
-<li>
-<a href="#Deleting+Quotas"> Deleting Quotas</a>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-	
-	
-	
-	
-<a name="zookeeper_quotas"></a>
-<h2 class="h3">Quotas</h2>
-<div class="section">
-<p> ZooKeeper has both namespace and bytes quotas. You can use the ZooKeeperMain class to setup quotas.
-	ZooKeeper prints <em>WARN</em> messages if users exceed the quota assigned to them. The messages 
-	are printed in the log of the ZooKeeper. 
-	</p>
-<p>
-<span class="codefrag computeroutput">$ bin/zkCli.sh -server host:port</span>
-</p>
-<p> The above command gives you a command line option of using quotas.</p>
-<a name="Setting+Quotas"></a>
-<h3 class="h4">Setting Quotas</h3>
-<p>You can use 
-	 <em>setquota</em> to set a quota on a ZooKeeper node. It has an option of setting quota with
-	  -n (for namespace)
-	 and -b (for bytes). </p>
-<p> The ZooKeeper quota are stored in ZooKeeper itself in /zookeeper/quota. To disable other people from
-	changing the quota's set the ACL for /zookeeper/quota such that only admins are able to read and write to it.
-	</p>
-<a name="Listing+Quotas"></a>
-<h3 class="h4">Listing Quotas</h3>
-<p> You can use
-	<em>listquota</em> to list a quota on a ZooKeeper node.
-	</p>
-<a name="Deleting+Quotas"></a>
-<h3 class="h4"> Deleting Quotas</h3>
-<p> You can use
-	<em>delquota</em> to delete quota on a ZooKeeper node.
-	</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperQuotas.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperQuotas.pdf b/docs/zookeeperQuotas.pdf
deleted file mode 100644
index b0d7029..0000000
Binary files a/docs/zookeeperQuotas.pdf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperReconfig.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperReconfig.html b/docs/zookeeperReconfig.html
deleted file mode 100644
index 5078192..0000000
--- a/docs/zookeeperReconfig.html
+++ /dev/null
@@ -1,1250 +0,0 @@
-<!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 Dynamic Reconfiguration</title>
-<link type="text/css" href="skin/basic.css" rel="stylesheet">
-<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
-<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
-<link type="text/css" href="skin/profile.css" rel="stylesheet">
-<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
-<link rel="shortcut icon" href="images/favicon.ico">
-</head>
-<body onload="init()">
-<script type="text/javascript">ndeSetTextSize();</script>
-<div id="top">
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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');">Admin &amp; Ops</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<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 class="menupage">
-<div class="menupagetitle">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperReconfig.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Dynamic Reconfiguration</h1>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#ch_reconfig_intro">Overview</a>
-</li>
-<li>
-<a href="#ch_reconfig_format">Changes to Configuration Format</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_reconfig_clientport">Specifying the client port</a>
-</li>
-<li>
-<a href="#sc_reconfig_standaloneEnabled">The standaloneEnabled flag</a>
-</li>
-<li>
-<a href="#sc_reconfig_reconfigEnabled">The reconfigEnabled flag</a>
-</li>
-<li>
-<a href="#sc_reconfig_file">Dynamic configuration file</a>
-</li>
-<li>
-<a href="#sc_reconfig_backward">Backward compatibility</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_reconfig_upgrade">Upgrading to 3.5.0</a>
-</li>
-<li>
-<a href="#ch_reconfig_dyn">Dynamic Reconfiguration of the ZooKeeper Ensemble</a>
-<ul class="minitoc">
-<li>
-<a href="#ch_reconfig_api">API</a>
-</li>
-<li>
-<a href="#sc_reconfig_access_control">Security</a>
-</li>
-<li>
-<a href="#sc_reconfig_retrieving">Retrieving the current dynamic configuration</a>
-</li>
-<li>
-<a href="#sc_reconfig_modifying">Modifying the current dynamic configuration</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_reconfig_general">General</a>
-</li>
-<li>
-<a href="#sc_reconfig_incremental">Incremental mode</a>
-</li>
-<li>
-<a href="#sc_reconfig_nonincremental">Non-incremental mode</a>
-</li>
-<li>
-<a href="#sc_reconfig_conditional">Conditional reconfig</a>
-</li>
-<li>
-<a href="#sc_reconfig_errors">Error conditions</a>
-</li>
-<li>
-<a href="#sc_reconfig_additional">Additional comments</a>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_reconfig_rebalancing">Rebalancing Client Connections</a>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-  
-<a name="ch_reconfig_intro"></a>
-<h2 class="h3">Overview</h2>
-<div class="section">
-<p>Prior to the 3.5.0 release, the membership and all other configuration
-      parameters of Zookeeper were static - loaded during boot and immutable at
-      runtime. Operators resorted to ''rolling restarts'' - a manually intensive
-      and error-prone method of changing the configuration that has caused data
-      loss and inconsistency in production.</p>
-<p>Starting with 3.5.0, &ldquo;rolling restarts&rdquo; are no longer needed!
-      ZooKeeper comes with full support for automated configuration changes: the
-      set of Zookeeper servers, their roles (participant / observer), all ports,
-      and even the quorum system can be changed dynamically, without service
-      interruption and while maintaining data consistency. Reconfigurations are
-      performed immediately, just like other operations in ZooKeeper. Multiple
-      changes can be done using a single reconfiguration command. The dynamic
-      reconfiguration functionality does not limit operation concurrency, does
-      not require client operations to be stopped during reconfigurations, has a
-      very simple interface for administrators and no added complexity to other
-      client operations.</p>
-<p>New client-side features allow clients to find out about configuration
-      changes and to update the connection string (list of servers and their
-      client ports) stored in their ZooKeeper handle. A probabilistic algorithm
-      is used to rebalance clients across the new configuration servers while
-      keeping the extent of client migrations proportional to the change in
-      ensemble membership.</p>
-<p>This document provides the administrator manual for reconfiguration.
-      For a detailed description of the reconfiguration algorithms, performance
-      measurements, and more, please see our paper:</p>
-<dl>
-      
-<dt>
-<term>Shraer, A., Reed, B., Malkhi, D., Junqueira, F. Dynamic
-          Reconfiguration of Primary/Backup Clusters. In <em>USENIX Annual
-          Technical Conference (ATC) </em>(2012), 425-437</term>
-</dt>
-<dd>
-<p>Links: <a href="https://www.usenix.org/system/files/conference/atc12/atc12-final74.pdf">paper (pdf)</a>, <a href="https://www.usenix.org/sites/default/files/conference/protected-files/shraer_atc12_slides.pdf">slides (pdf)</a>, <a href="https://www.usenix.org/conference/atc12/technical-sessions/presentation/shraer">video</a>, <a href="http://www.slideshare.net/Hadoop_Summit/dynamic-reconfiguration-of-zookeeper">hadoop summit slides</a>
-</p>
-</dd>
-    
-</dl>
-<p>
-<strong>Note:</strong> Starting with 3.5.3, the dynamic reconfiguration
-      feature is disabled by default, and has to be explicitly turned on via
-      <a href="zookeeperAdmin.html#sc_advancedConfiguration">
-        reconfigEnabled </a> configuration option.
-    </p>
-</div>
-  
-<a name="ch_reconfig_format"></a>
-<h2 class="h3">Changes to Configuration Format</h2>
-<div class="section">
-<a name="sc_reconfig_clientport"></a>
-<h3 class="h4">Specifying the client port</h3>
-<p>A client port of a server is the port on which the server accepts
-        client connection requests. Starting with 3.5.0 the
-        <em>clientPort</em> and <em>clientPortAddress
-        </em> configuration parameters should no longer be used. Instead,
-        this information is now part of the server keyword specification, which
-        becomes as follows:</p>
-<p>
-<span class="codefrag computeroutput">server.&lt;positive id&gt; = &lt;address1&gt;:&lt;port1&gt;:&lt;port2&gt;[:role];[&lt;client port address&gt;:]&lt;client port&gt;</span>
-</p>
-<p>The client port specification is to the right of the semicolon. The
-        client port address is optional, and if not specified it defaults to
-        "0.0.0.0". As usual, role is also optional, it can be
-        <em>participant</em> or <em>observer</em>
-        (<em>participant</em> by default).</p>
-<p> Examples of legal server statements: </p>
-<ul>
-        
-<li>
-          
-<p>
-<span class="codefrag computeroutput">server.5 = 125.23.63.23:1234:1235;1236</span>
-</p>
-        
-</li>
-        
-<li>
-          
-<p>
-<span class="codefrag computeroutput">server.5 = 125.23.63.23:1234:1235:participant;1236</span>
-</p>
-        
-</li>
-        
-<li>
-          
-<p>
-<span class="codefrag computeroutput">server.5 = 125.23.63.23:1234:1235:observer;1236</span>
-</p>
-        
-</li>
-        
-<li>
-          
-<p>
-<span class="codefrag computeroutput">server.5 = 125.23.63.23:1234:1235;125.23.63.24:1236</span>
-</p>
-        
-</li>
-        
-<li>
-          
-<p>
-<span class="codefrag computeroutput">server.5 = 125.23.63.23:1234:1235:participant;125.23.63.23:1236</span>
-</p>
-        
-</li>
-      
-</ul>
-<a name="sc_reconfig_standaloneEnabled"></a>
-<h3 class="h4">The standaloneEnabled flag</h3>
-<p>Prior to 3.5.0, one could run ZooKeeper in Standalone mode or in a
-        Distributed mode. These are separate implementation stacks, and
-        switching between them during run time is not possible. By default (for
-        backward compatibility) <em>standaloneEnabled</em> is set to
-        <em>true</em>. The consequence of using this default is that
-        if started with a single server the ensemble will not be allowed to
-        grow, and if started with more than one server it will not be allowed to
-        shrink to contain fewer than two participants.</p>
-<p>Setting the flag to <em>false</em> instructs the system
-        to run the Distributed software stack even if there is only a single
-        participant in the ensemble. To achieve this the (static) configuration
-        file should contain:</p>
-<p>
-<span class="codefrag computeroutput">standaloneEnabled=false</span>
-</p>
-<p>With this setting it is possible to start a ZooKeeper ensemble
-        containing a single participant and to dynamically grow it by adding
-        more servers. Similarly, it is possible to shrink an ensemble so that
-        just a single participant remains, by removing servers.</p>
-<p>Since running the Distributed mode allows more flexibility, we
-        recommend setting the flag to <em>false</em>. We expect that
-        the legacy Standalone mode will be deprecated in the future.</p>
-<a name="sc_reconfig_reconfigEnabled"></a>
-<h3 class="h4">The reconfigEnabled flag</h3>
-<p>Starting with 3.5.0 and prior to 3.5.3, there is no way to disable
-        dynamic reconfiguration feature. We would like to offer the option of
-        disabling reconfiguration feature because with reconfiguration enabled,
-        we have a security concern that a malicious actor can make arbitrary changes
-        to the configuration of a ZooKeeper ensemble, including adding a compromised
-        server to the ensemble. We prefer to leave to the discretion of the user to
-        decide whether to enable it or not and make sure that the appropriate security
-        measure are in place. So in 3.5.3 the <a href="zookeeperAdmin.html#sc_advancedConfiguration">
-          reconfigEnabled </a> configuration option is introduced
-        such that the reconfiguration feature can be completely disabled and any attempts
-        to reconfigure a cluster through reconfig API with or without authentication
-        will fail by default, unless <strong>reconfigEnabled</strong> is set to
-        <strong>true</strong>.
-      </p>
-<p>To set the option to true, the configuration file (zoo.cfg) should contain:</p>
-<p>
-<span class="codefrag computeroutput">reconfigEnabled=true</span>
-</p>
-<a name="sc_reconfig_file"></a>
-<h3 class="h4">Dynamic configuration file</h3>
-<p>Starting with 3.5.0 we're distinguishing between dynamic
-        configuration parameters, which can be changed during runtime, and
-        static configuration parameters, which are read from a configuration
-        file when a server boots and don't change during its execution. For now,
-        the following configuration keywords are considered part of the dynamic
-        configuration: <em>server</em>, <em>group</em>
-        and <em>weight</em>.</p>
-<p>Dynamic configuration parameters are stored in a separate file on
-        the server (which we call the dynamic configuration file). This file is
-        linked from the static config file using the new
-        <em>dynamicConfigFile</em> keyword.</p>
-<p>
-<strong>Example</strong>
-</p>
-<div class="note example">
-<div class="label">zoo_replicated1.cfg</div>
-<div class="content">
-        
-<title>zoo_replicated1.cfg</title>
-        
-<pre class="code">tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-dynamicConfigFile=/zookeeper/conf/zoo_replicated1.cfg.dynamic</pre>
-      
-</div>
-</div>
-<div class="note example">
-<div class="label">zoo_replicated1.cfg.dynamic</div>
-<div class="content">
-        
-<title>zoo_replicated1.cfg.dynamic</title>
-        
-<pre class="code">server.1=125.23.63.23:2780:2783:participant;2791
-server.2=125.23.63.24:2781:2784:participant;2792
-server.3=125.23.63.25:2782:2785:participant;2793</pre>
-      
-</div>
-</div>
-<p>When the ensemble configuration changes, the static configuration
-        parameters remain the same. The dynamic parameters are pushed by
-        ZooKeeper and overwrite the dynamic configuration files on all servers.
-        Thus, the dynamic configuration files on the different servers are
-        usually identical (they can only differ momentarily when a
-        reconfiguration is in progress, or if a new configuration hasn't
-        propagated yet to some of the servers). Once created, the dynamic
-        configuration file should not be manually altered. Changed are only made
-        through the new reconfiguration commands outlined below. Note that
-        changing the config of an offline cluster could result in an
-        inconsistency with respect to configuration information stored in the
-        ZooKeeper log (and the special configuration znode, populated from the
-        log) and is therefore highly discouraged.</p>
-<p>
-<strong>Example 2</strong>
-</p>
-<p>Users may prefer to initially specify a single configuration file.
-        The following is thus also legal:</p>
-<div class="note example">
-<div class="label">zoo_replicated1.cfg</div>
-<div class="content">
-        
-<title>zoo_replicated1.cfg</title>
-        
-<pre class="code">tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-clientPort=<strong>2791</strong>  // note that this line is now redundant and therefore not recommended
-server.1=125.23.63.23:2780:2783:participant;<strong>2791</strong>
-server.2=125.23.63.24:2781:2784:participant;2792
-server.3=125.23.63.25:2782:2785:participant;2793</pre>
-      
-</div>
-</div>
-<p>The configuration files on each server will be automatically split
-        into dynamic and static files, if they are not already in this format.
-        So the configuration file above will be automatically transformed into
-        the two files in Example 1. Note that the clientPort and
-        clientPortAddress lines (if specified) will be automatically removed
-        during this process, if they are redundant (as in the example above).
-        The original static configuration file is backed up (in a .bak
-        file).</p>
-<a name="sc_reconfig_backward"></a>
-<h3 class="h4">Backward compatibility</h3>
-<p>We still support the old configuration format. For example, the
-        following configuration file is acceptable (but not recommended):</p>
-<div class="note example">
-<div class="label">zoo_replicated1.cfg</div>
-<div class="content">
-        
-<title>zoo_replicated1.cfg</title>
-        
-<pre class="code">tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-clientPort=2791
-server.1=125.23.63.23:2780:2783:participant
-server.2=125.23.63.24:2781:2784:participant
-server.3=125.23.63.25:2782:2785:participant</pre>
-      
-</div>
-</div>
-<p>During boot, a dynamic configuration file is created and contains
-        the dynamic part of the configuration as explained earlier. In this
-        case, however, the line "clientPort=2791" will remain in the static
-        configuration file of server 1 since it is not redundant -- it was not
-        specified as part of the "server.1=..." using the format explained in
-        the section <a href="#ch_reconfig_format">Changes to Configuration Format</a>. If a reconfiguration
-        is invoked that sets the client port of server 1, we remove
-        "clientPort=2791" from the static configuration file (the dynamic file
-        now contain this information as part of the specification of server
-        1).</p>
-</div>
-  
-<a name="ch_reconfig_upgrade"></a>
-<h2 class="h3">Upgrading to 3.5.0</h2>
-<div class="section">
-<p>Upgrading a running ZooKeeper ensemble to 3.5.0 should be done only
-      after upgrading your ensemble to the 3.4.6 release. Note that this is only
-      necessary for rolling upgrades (if you're fine with shutting down the
-      system completely, you don't have to go through 3.4.6). If you attempt a
-      rolling upgrade without going through 3.4.6 (for example from 3.4.5), you
-      may get the following error:</p>
-<pre class="code">2013-01-30 11:32:10,663 [myid:2] - INFO [localhost/127.0.0.1:2784:QuorumCnxManager$Listener@498] - Received connection request /127.0.0.1:60876
-2013-01-30 11:32:10,663 [myid:2] - WARN [localhost/127.0.0.1:2784:QuorumCnxManager@349] - Invalid server id: -65536</pre>
-<p>During a rolling upgrade, each server is taken down in turn and
-      rebooted with the new 3.5.0 binaries. Before starting the server with
-      3.5.0 binaries, we highly recommend updating the configuration file so
-      that all server statements "server.x=..." contain client ports (see the
-      section <a href="#sc_reconfig_clientport">Specifying the client port</a>). As explained earlier
-      you may leave the configuration in a single file, as well as leave the
-      clientPort/clientPortAddress statements (although if you specify client
-      ports in the new format, these statements are now redundant).</p>
-</div>
-
-  
-<a name="ch_reconfig_dyn"></a>
-<h2 class="h3">Dynamic Reconfiguration of the ZooKeeper Ensemble</h2>
-<div class="section">
-<p>The ZooKeeper Java and C API were extended with getConfig and reconfig
-      commands that facilitate reconfiguration. Both commands have a synchronous
-      (blocking) variant and an asynchronous one. We demonstrate these commands
-      here using the Java CLI, but note that you can similarly use the C CLI or
-      invoke the commands directly from a program just like any other ZooKeeper
-      command.</p>
-<a name="ch_reconfig_api"></a>
-<h3 class="h4">API</h3>
-<p>There are two sets of APIs for both Java and C client.
-      </p>
-<dl>
-        
-<dt>
-<term>
-<strong>Reconfiguration API</strong>
-</term>
-</dt>
-<dd>
-<p>Reconfiguration API is used to reconfigure the ZooKeeper cluster.
-              Starting with 3.5.3, reconfiguration Java APIs are moved into ZooKeeperAdmin class
-              from ZooKeeper class, and use of this API requires ACL setup and user
-              authentication (see <a href="#sc_reconfig_access_control">Security</a> for more information.).
-            </p>
-<p>Note: for temporary backward compatibility, the reconfig() APIs will remain in ZooKeeper.java
-              where they were for a few alpha versions of 3.5.x. However, these APIs are deprecated and users
-              should move to the reconfigure() APIs in ZooKeeperAdmin.java.
-            </p>
-</dd>
-
-        
-<dt>
-<term>
-<strong>Get Configuration API</strong>
-</term>
-</dt>
-<dd>
-<p>Get configuration APIs are used to retrieve ZooKeeper cluster configuration information
-              stored in /zookeeper/config znode. Use of this API does not require specific setup or authentication,
-            because /zookeeper/config is readable to any users.</p>
-</dd>
-      
-</dl>
-<a name="sc_reconfig_access_control"></a>
-<h3 class="h4">Security</h3>
-<p>Prior to <strong>3.5.3</strong>, there is no enforced security mechanism
-        over reconfig so any ZooKeeper clients that can connect to ZooKeeper server ensemble
-        will have the ability to change the state of a ZooKeeper cluster via reconfig.
-        It is thus possible for a malicious client to add compromised server to an ensemble,
-        e.g., add a compromised server, or remove legitimate servers.
-        Cases like these could be security vulnerabilities on a case by case basis.
-      </p>
-<p>To address this security concern, we introduced access control over reconfig
-        starting from <strong>3.5.3</strong> such that only a specific set of users
-        can use reconfig commands or APIs, and these users need be configured explicitly. In addition,
-        the setup of ZooKeeper cluster must enable authentication so ZooKeeper clients can be authenticated.
-      </p>
-<p>
-        We also provides an escape hatch for users who operate and interact with a ZooKeeper ensemble in a secured
-        environment (i.e. behind company firewall). For those users who want to use reconfiguration feature but
-        don't want the overhead of configuring an explicit list of authorized user for reconfig access checks,
-        they can set <a href="zookeeperAdmin.html#sc_authOptions">"skipACL"</a> to "yes" which will
-        skip ACL check and allow any user to reconfigure cluster.
-      </p>
-<p>
-        Overall, ZooKeeper provides flexible configuration options for the reconfigure feature
-        that allow a user to choose based on user's security requirement.
-        We leave to the discretion of the user to decide appropriate security measure are in place.
-      </p>
-<dl>
-        
-<dt>
-<term>
-<strong>Access Control</strong>
-</term>
-</dt>
-<dd>
-<p>The dynamic configuration is stored in a special znode
-              ZooDefs.CONFIG_NODE = /zookeeper/config. This node by default is read only
-              for all users, except super user and users that's explicitly configured for write
-              access.
-            </p>
-<p>Clients that need to use reconfig commands or reconfig API should be configured as users
-              that have write access to CONFIG_NODE. By default, only the super user has full control including
-              write access to CONFIG_NODE. Additional users can be granted write access through superuser
-              by setting an ACL that has write permission associated with specified user.
-            </p>
-<p>A few examples of how to setup ACLs and use reconfiguration API with authentication can be found in
-              ReconfigExceptionTest.java and TestReconfigServer.cc.</p>
-</dd>
-
-        
-<dt>
-<term>
-<strong>Authentication</strong>
-</term>
-</dt>
-<dd>
-<p>Authentication of users is orthogonal to the access control and is delegated to
-              existing authentication mechanism supported by ZooKeeper's pluggable authentication schemes.
-              See <a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zookeeper+and+SASL">ZooKeeper and SASL</a> for more details on this topic.
-            </p>
-</dd>
-
-        
-<dt>
-<term>
-<strong>Disable ACL check</strong>
-</term>
-</dt>
-<dd>
-<p>
-              ZooKeeper supports <a href="zookeeperAdmin.html#sc_authOptions">"skipACL"</a> option such that ACL
-              check will be completely skipped, if skipACL is set to "yes". In such cases any unauthenticated
-              users can use reconfig API.
-            </p>
-</dd>
-      
-</dl>
-<a name="sc_reconfig_retrieving"></a>
-<h3 class="h4">Retrieving the current dynamic configuration</h3>
-<p>The dynamic configuration is stored in a special znode
-        ZooDefs.CONFIG_NODE = /zookeeper/config. The new
-        <span class="codefrag command">config</span> CLI command reads this znode (currently it is
-        simply a wrapper to <span class="codefrag command">get /zookeeper/config</span>). As with
-        normal reads, to retrieve the latest committed value you should do a
-        <span class="codefrag command">sync</span> first.</p>
-<pre class="code">[zk: 127.0.0.1:2791(CONNECTED) 3] config
-server.1=localhost:2780:2783:participant;localhost:2791
-server.2=localhost:2781:2784:participant;localhost:2792
-server.3=localhost:2782:2785:participant;localhost:2793
-<strong>version=400000003</strong>
-</pre>
-<p>Notice the last line of the output. This is the configuration
-        version. The version equals to the zxid of the reconfiguration command
-        which created this configuration. The version of the first established
-        configuration equals to the zxid of the NEWLEADER message sent by the
-        first successfully established leader. When a configuration is written
-        to a dynamic configuration file, the version automatically becomes part
-        of the filename and the static configuration file is updated with the
-        path to the new dynamic configuration file. Configuration files
-        corresponding to earlier versions are retained for backup
-        purposes.</p>
-<p>During boot time the version (if it exists) is extracted from the
-        filename. The version should never be altered manually by users or the
-        system administrator. It is used by the system to know which
-        configuration is most up-to-date. Manipulating it manually can result in
-        data loss and inconsistency.</p>
-<p>Just like a <span class="codefrag command">get</span> command, the
-        <span class="codefrag command">config</span> CLI command accepts the <span class="codefrag option">-w</span>
-        flag for setting a watch on the znode, and <span class="codefrag option">-s</span> flag for
-        displaying the Stats of the znode. It additionally accepts a new flag
-        <span class="codefrag option">-c</span> which outputs only the version and the client
-        connection string corresponding to the current configuration. For
-        example, for the configuration above we would get:</p>
-<pre class="code">[zk: 127.0.0.1:2791(CONNECTED) 17] config -c
-400000003 localhost:2791,localhost:2793,localhost:2792</pre>
-<p>Note that when using the API directly, this command is called
-        <span class="codefrag command">getConfig</span>.</p>
-<p>As any read command it returns the configuration known to the
-        follower to which your client is connected, which may be slightly
-        out-of-date. One can use the <span class="codefrag command">sync</span> command for
-        stronger guarantees. For example using the Java API:</p>
-<pre class="code">zk.sync(ZooDefs.CONFIG_NODE, void_callback, context);
-zk.getConfig(watcher, callback, context);</pre>
-<p>Note: in 3.5.0 it doesn't really matter which path is passed to the
-        <span class="codefrag command">sync() </span> command as all the server's state is brought
-        up to date with the leader (so one could use a different path instead of
-        ZooDefs.CONFIG_NODE). However, this may change in the future.</p>
-<a name="sc_reconfig_modifying"></a>
-<h3 class="h4">Modifying the current dynamic configuration</h3>
-<p>Modifying the configuration is done through the
-        <span class="codefrag command">reconfig</span> command. There are two modes of
-        reconfiguration: incremental and non-incremental (bulk). The
-        non-incremental simply specifies the new dynamic configuration of the
-        system. The incremental specifies changes to the current configuration.
-        The <span class="codefrag command">reconfig</span> command returns the new
-        configuration.</p>
-<p>A few examples are in: <span class="codefrag filename">ReconfigTest.java</span>,
-        <span class="codefrag filename">ReconfigRecoveryTest.java</span> and
-        <span class="codefrag filename">TestReconfigServer.cc</span>.</p>
-<a name="sc_reconfig_general"></a>
-<h4>General</h4>
-<p>
-<strong>Removing servers:</strong> Any server can
-          be removed, including the leader (although removing the leader will
-          result in a short unavailability, see Figures 6 and 8 in the <a href="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters">paper</a>). The server will not be shut-down automatically.
-          Instead, it becomes a "non-voting follower". This is somewhat similar
-          to an observer in that its votes don't count towards the Quorum of
-          votes necessary to commit operations. However, unlike a non-voting
-          follower, an observer doesn't actually see any operation proposals and
-          does not ACK them. Thus a non-voting follower has a more significant
-          negative effect on system throughput compared to an observer.
-          Non-voting follower mode should only be used as a temporary mode,
-          before shutting the server down, or adding it as a follower or as an
-          observer to the ensemble. We do not shut the server down automatically
-          for two main reasons. The first reason is that we do not want all the
-          clients connected to this server to be immediately disconnected,
-          causing a flood of connection requests to other servers. Instead, it
-          is better if each client decides when to migrate independently. The
-          second reason is that removing a server may sometimes (rarely) be
-          necessary in order to change it from "observer" to "participant" (this
-          is explained in the section <a href="#sc_reconfig_additional">Additional comments</a>).</p>
-<p>Note that the new configuration should have some minimal number of
-          participants in order to be considered legal. If the proposed change
-          would leave the cluster with less than 2 participants and standalone
-          mode is enabled (standaloneEnabled=true, see the section <a href="#sc_reconfig_standaloneEnabled">The standaloneEnabled flag</a>), the reconfig will not be
-          processed (BadArgumentsException). If standalone mode is disabled
-          (standaloneEnabled=false) then its legal to remain with 1 or more
-          participants.</p>
-<p>
-<strong>Adding servers:</strong> Before a
-          reconfiguration is invoked, the administrator must make sure that a
-          quorum (majority) of participants from the new configuration are
-          already connected and synced with the current leader. To achieve this
-          we need to connect a new joining server to the leader before it is
-          officially part of the ensemble. This is done by starting the joining
-          server using an initial list of servers which is technically not a
-          legal configuration of the system but (a) contains the joiner, and (b)
-          gives sufficient information to the joiner in order for it to find and
-          connect to the current leader. We list a few different options of
-          doing this safely.</p>
-<ol>
-          
-<li>
-            
-<p>Initial configuration of joiners is comprised of servers in
-              the last committed configuration and one or more joiners, where
-              <strong>joiners are listed as observers.</strong>
-              For example, if servers D and E are added at the same time to (A,
-              B, C) and server C is being removed, the initial configuration of
-              D could be (A, B, C, D) or (A, B, C, D, E), where D and E are
-              listed as observers. Similarly, the configuration of E could be
-              (A, B, C, E) or (A, B, C, D, E), where D and E are listed as
-              observers. <strong>Note that listing the joiners as
-              observers will not actually make them observers - it will only
-              prevent them from accidentally forming a quorum with other
-              joiners.</strong> Instead, they will contact the servers in the
-              current configuration and adopt the last committed configuration
-              (A, B, C), where the joiners are absent. Configuration files of
-              joiners are backed up and replaced automatically as this happens.
-              After connecting to the current leader, joiners become non-voting
-              followers until the system is reconfigured and they are added to
-              the ensemble (as participant or observer, as appropriate).</p>
-          
-</li>
-          
-<li>
-            
-<p>Initial configuration of each joiner is comprised of servers
-              in the last committed configuration + <strong>the
-              joiner itself, listed as a participant.</strong> For example, to
-              add a new server D to a configuration consisting of servers (A, B,
-              C), the administrator can start D using an initial configuration
-              file consisting of servers (A, B, C, D). If both D and E are added
-              at the same time to (A, B, C), the initial configuration of D
-              could be (A, B, C, D) and the configuration of E could be (A, B,
-              C, E). Similarly, if D is added and C is removed at the same time,
-              the initial configuration of D could be (A, B, C, D). Never list
-              more than one joiner as participant in the initial configuration
-              (see warning below).</p>
-          
-</li>
-          
-<li>
-            
-<p>Whether listing the joiner as an observer or as participant,
-              it is also fine not to list all the current configuration servers,
-              as long as the current leader is in the list. For example, when
-              adding D we could start D with a configuration file consisting of
-              just (A, D) if A is the current leader. however this is more
-              fragile since if A fails before D officially joins the ensemble, D
-              doesn&rsquo;t know anyone else and therefore the administrator will have
-              to intervene and restart D with another server list.</p>
-          
-</li>
-        
-</ol>
-<div class="note">
-<div class="label">Warning</div>
-<div class="content">
-          
-<title>Warning</title>
-          
-<p>Never specify more than one joining server in the same initial
-            configuration as participants. Currently, the joining servers don&rsquo;t
-            know that they are joining an existing ensemble; if multiple joiners
-            are listed as participants they may form an independent quorum
-            creating a split-brain situation such as processing operations
-            independently from your main ensemble. It is OK to list multiple
-            joiners as observers in an initial config.</p>
-        
-</div>
-</div>
-<p>If the configuration of existing servers changes or they become unavailable
-          before the joiner succeeds to connect and learn obout configuration changes, the
-          joiner may need to be restarted with an updated configuration file in order to be
-          able to connect.</p>
-<p>Finally, note that once connected to the leader, a joiner adopts
-          the last committed configuration, in which it is absent (the initial
-          config of the joiner is backed up before being rewritten). If the
-          joiner restarts in this state, it will not be able to boot since it is
-          absent from its configuration file. In order to start it you&rsquo;ll once
-          again have to specify an initial configuration.</p>
-<p>
-<strong>Modifying server parameters:</strong> One
-          can modify any of the ports of a server, or its role
-          (participant/observer) by adding it to the ensemble with different
-          parameters. This works in both the incremental and the bulk
-          reconfiguration modes. It is not necessary to remove the server and
-          then add it back; just specify the new parameters as if the server is
-          not yet in the system. The server will detect the configuration change
-          and perform the necessary adjustments. See an example in the section
-          <a href="#sc_reconfig_incremental">Incremental mode</a> and an exception to this
-          rule in the section <a href="#sc_reconfig_additional">Additional comments</a>.</p>
-<p>It is also possible to change the Quorum System used by the
-          ensemble (for example, change the Majority Quorum System to a
-          Hierarchical Quorum System on the fly). This, however, is only allowed
-          using the bulk (non-incremental) reconfiguration mode. In general,
-          incremental reconfiguration only works with the Majority Quorum
-          System. Bulk reconfiguration works with both Hierarchical and Majority
-          Quorum Systems.</p>
-<p>
-<strong>Performance Impact:</strong> There is
-          practically no performance impact when removing a follower, since it
-          is not being automatically shut down (the effect of removal is that
-          the server's votes are no longer being counted). When adding a server,
-          there is no leader change and no noticeable performance disruption.
-          For details and graphs please see Figures 6, 7 and 8 in the <a href="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters">paper</a>.</p>
-<p>The most significant disruption will happen when a leader change
-          is caused, in one of the following cases:</p>
-<ol>
-          
-<li>
-            
-<p>Leader is removed from the ensemble.</p>
-          
-</li>
-          
-<li>
-            
-<p>Leader's role is changed from participant to observer.</p>
-          
-</li>
-          
-<li>
-            
-<p>The port used by the leader to send transactions to others
-              (quorum port) is modified.</p>
-          
-</li>
-        
-</ol>
-<p>In these cases we perform a leader hand-off where the old leader
-          nominates a new leader. The resulting unavailability is usually
-          shorter than when a leader crashes since detecting leader failure is
-          unnecessary and electing a new leader can usually be avoided during a
-          hand-off (see Figures 6 and 8 in the <a href="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters">paper</a>).</p>
-<p>When the client port of a server is modified, it does not drop
-          existing client connections. New connections to the server will have
-          to use the new client port.</p>
-<p>
-<strong>Progress guarantees:</strong> Up to the
-          invocation of the reconfig operation, a quorum of the old
-          configuration is required to be available and connected for ZooKeeper
-          to be able to make progress. Once reconfig is invoked, a quorum of
-          both the old and of the new configurations must be available. The
-          final transition happens once (a) the new configuration is activated,
-          and (b) all operations scheduled before the new configuration is
-          activated by the leader are committed. Once (a) and (b) happen, only a
-          quorum of the new configuration is required. Note, however, that
-          neither (a) nor (b) are visible to a client. Specifically, when a
-          reconfiguration operation commits, it only means that an activation
-          message was sent out by the leader. It does not necessarily mean that
-          a quorum of the new configuration got this message (which is required
-          in order to activate it) or that (b) has happened. If one wants to
-          make sure that both (a) and (b) has already occurred (for example, in
-          order to know that it is safe to shut down old servers that were
-          removed), one can simply invoke an update
-          (<span class="codefrag command">set-data</span>, or some other quorum operation, but not
-          a <span class="codefrag command">sync</span>) and wait for it to commit. An alternative
-          way to achieve this was to introduce another round to the
-          reconfiguration protocol (which, for simplicity and compatibility with
-          Zab, we decided to avoid).</p>
-<a name="sc_reconfig_incremental"></a>
-<h4>Incremental mode</h4>
-<p>The incremental mode allows adding and removing servers to the
-          current configuration. Multiple changes are allowed. For
-          example:</p>
-<p>
-<span class="codefrag userinput">&gt; reconfig -remove 3 -add
-          server.5=125.23.63.23:1234:1235;1236</span>
-</p>
-<p>Both the add and the remove options get a list of comma separated
-          arguments (no spaces):</p>
-<p>
-<span class="codefrag userinput">&gt; reconfig -remove 3,4 -add
-          server.5=localhost:2111:2112;2113,6=localhost:2114:2115:observer;2116</span>
-</p>
-<p>The format of the server statement is exactly the same as
-          described in the section <a href="#sc_reconfig_clientport">Specifying the client port</a> and
-          includes the client port. Notice that here instead of "server.5=" you
-          can just say "5=". In the example above, if server 5 is already in the
-          system, but has different ports or is not an observer, it is updated
-          and once the configuration commits becomes an observer and starts
-          using these new ports. This is an easy way to turn participants into
-          observers and vise versa or change any of their ports, without
-          rebooting the server.</p>
-<p>ZooKeeper supports two types of Quorum Systems &ndash; the simple
-          Majority system (where the leader commits operations after receiving
-          ACKs from a majority of voters) and a more complex Hierarchical
-          system, where votes of different servers have different weights and
-          servers are divided into voting groups. Currently, incremental
-          reconfiguration is allowed only if the last proposed configuration
-          known to the leader uses a Majority Quorum System
-          (BadArgumentsException is thrown otherwise).</p>
-<p>Incremental mode - examples using the Java API:</p>
-<pre class="code">List&lt;String&gt; leavingServers = new ArrayList&lt;String&gt;();
-leavingServers.add("1");
-leavingServers.add("2");
-byte[] config = zk.reconfig(null, leavingServers, null, -1, new Stat());</pre>
-<pre class="code">List&lt;String&gt; leavingServers = new ArrayList&lt;String&gt;();
-List&lt;String&gt; joiningServers = new ArrayList&lt;String&gt;();
-leavingServers.add("1");
-joiningServers.add("server.4=localhost:1234:1235;1236");
-byte[] config = zk.reconfig(joiningServers, leavingServers, null, -1, new Stat());
-
-String configStr = new String(config);
-System.out.println(configStr);</pre>
-<p>There is also an asynchronous API, and an API accepting comma
-          separated Strings instead of List&lt;String&gt;. See
-          zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java.</p>
-<a name="sc_reconfig_nonincremental"></a>
-<h4>Non-incremental mode</h4>
-<p>The second mode of reconfiguration is non-incremental, whereby a
-          client gives a complete specification of the new dynamic system
-          configuration. The new configuration can either be given in place or
-          read from a file:</p>
-<p>
-<span class="codefrag userinput">&gt; reconfig -file newconfig.cfg
-          </span>//newconfig.cfg is a dynamic config file, see <a href="#sc_reconfig_file">Dynamic configuration file</a>
-</p>
-<p>
-<span class="codefrag userinput">&gt; reconfig -members
-          server.1=125.23.63.23:2780:2783:participant;2791,server.2=125.23.63.24:2781:2784:participant;2792,server.3=125.23.63.25:2782:2785:participant;2793</span>
-</p>
-<p>The new configuration may use a different Quorum System. For
-          example, you may specify a Hierarchical Quorum System even if the
-          current ensemble uses a Majority Quorum System.</p>
-<p>Bulk mode - example using the Java API:</p>
-<pre class="code">ArrayList&lt;String&gt; newMembers = new ArrayList&lt;String&gt;();
-newMembers.add("server.1=1111:1234:1235;1236");
-newMembers.add("server.2=1112:1237:1238;1239");
-newMembers.add("server.3=1114:1240:1241:observer;1242");
-
-byte[] config = zk.reconfig(null, null, newMembers, -1, new Stat());
-
-String configStr = new String(config);
-System.out.println(configStr);</pre>
-<p>There is also an asynchronous API, and an API accepting comma
-          separated String containing the new members instead of
-          List&lt;String&gt;. See
-          zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java.</p>
-<a name="sc_reconfig_conditional"></a>
-<h4>Conditional reconfig</h4>
-<p>Sometimes (especially in non-incremental mode) a new proposed
-          configuration depends on what the client "believes" to be the current
-          configuration, and should be applied only to that configuration.
-          Specifically, the <span class="codefrag command">reconfig</span> succeeds only if the
-          last configuration at the leader has the specified version.</p>
-<p>
-<span class="codefrag userinput">&gt; reconfig -file &lt;filename&gt; -v &lt;version&gt;</span>
-</p>
-<p>In the previously listed Java examples, instead of -1 one could
-          specify a configuration version to condition the
-          reconfiguration.</p>
-<a name="sc_reconfig_errors"></a>
-<h4>Error conditions</h4>
-<p>In addition to normal ZooKeeper error conditions, a
-          reconfiguration may fail for the following reasons:</p>
-<ol>
-          
-<li>
-            
-<p>another reconfig is currently in progress
-              (ReconfigInProgress)</p>
-          
-</li>
-          
-<li>
-            
-<p>the proposed change would leave the cluster with less than 2
-              participants, in case standalone mode is enabled, or, if
-              standalone mode is disabled then its legal to remain with 1 or
-              more participants (BadArgumentsException)</p>
-          
-</li>
-          
-<li>
-            
-<p>no quorum of the new configuration was connected and
-              up-to-date with the leader when the reconfiguration processing
-              began (NewConfigNoQuorum)</p>
-          
-</li>
-          
-<li>
-            
-<p>
-<span class="codefrag userinput">-v x</span> was specified, but the version
-              <span class="codefrag userinput">y</span> of the latest configuration is not
-              <span class="codefrag userinput">x</span> (BadVersionException)</p>
-          
-</li>
-          
-<li>
-            
-<p>an incremental reconfiguration was requested but the last
-              configuration at the leader uses a Quorum System which is
-              different from the Majority system (BadArgumentsException)</p>
-          
-</li>
-          
-<li>
-            
-<p>syntax error (BadArgumentsException)</p>
-          
-</li>
-          
-<li>
-            
-<p>I/O exception when reading the configuration from a file
-              (BadArgumentsException)</p>
-          
-</li>
-        
-</ol>
-<p>Most of these are illustrated by test-cases in
-          <span class="codefrag filename">ReconfigFailureCases.java</span>.</p>
-<a name="sc_reconfig_additional"></a>
-<h4>Additional comments</h4>
-<p>
-<strong>Liveness:</strong> To better understand
-          the difference between incremental and non-incremental
-          reconfiguration, suppose that client C1 adds server D to the system
-          while a different client C2 adds server E. With the non-incremental
-          mode, each client would first invoke <span class="codefrag command">config</span> to find
-          out the current configuration, and then locally create a new list of
-          servers by adding its own suggested server. The new configuration can
-          then be submitted using the non-incremental
-          <span class="codefrag command">reconfig</span> command. After both reconfigurations
-          complete, only one of E or D will be added (not both), depending on
-          which client's request arrives second to the leader, overwriting the
-          previous configuration. The other client can repeat the process until
-          its change takes effect. This method guarantees system-wide progress
-          (i.e., for one of the clients), but does not ensure that every client
-          succeeds. To have more control C2 may request to only execute the
-          reconfiguration in case the version of the current configuration
-          hasn't changed, as explained in the section <a href="#sc_reconfig_conditional">Conditional reconfig</a>. In this way it may avoid blindly
-          overwriting the configuration of C1 if C1's configuration reached the
-          leader first.</p>
-<p>With incremental reconfiguration, both changes will take effect as
-          they are simply applied by the leader one after the other to the
-          current configuration, whatever that is (assuming that the second
-          reconfig request reaches the leader after it sends a commit message
-          for the first reconfig request -- currently the leader will refuse to
-          propose a reconfiguration if another one is already pending). Since
-          both clients are guaranteed to make progress, this method guarantees
-          stronger liveness. In practice, multiple concurrent reconfigurations
-          are probably rare. Non-incremental reconfiguration is currently the
-          only way to dynamically change the Quorum System. Incremental
-          configuration is currently only allowed with the Majority Quorum
-          System.</p>
-<p>
-<strong>Changing an observer into a
-          follower:</strong> Clearly, changing a server that participates in
-          voting into an observer may fail if error (2) occurs, i.e., if fewer
-          than the minimal allowed number of participants would remain. However,
-          converting an observer into a participant may sometimes fail for a
-          more subtle reason: Suppose, for example, that the current
-          configuration is (A, B, C, D), where A is the leader, B and C are
-          followers and D is an observer. In addition, suppose that B has
-          crashed. If a reconfiguration is submitted where D is said to become a
-          follower, it will fail with error (3) since in this configuration, a
-          majority of voters in the new configuration (any 3 voters), must be
-          connected and up-to-date with the leader. An observer cannot
-          acknowledge the history prefix sent during reconfiguration, and
-          therefore it does not count towards these 3 required servers and the
-          reconfiguration will be aborted. In case this happens, a client can
-          achieve the same task by two reconfig commands: first invoke a
-          reconfig to remove D from the configuration and then invoke a second
-          command to add it back as a participant (follower). During the
-          intermediate state D is a non-voting follower and can ACK the state
-          transfer performed during the second reconfig comand.</p>
-</div>
-  
-<a name="ch_reconfig_rebalancing"></a>
-<h2 class="h3">Rebalancing Client Connections</h2>
-<div class="section">
-<p>When a ZooKeeper cluster is started, if each client is given the same
-      connection string (list of servers), the client will randomly choose a
-      server in the list to connect to, which makes the expected number of
-      client connections per server the same for each of the servers. We
-      implemented a method that preserves this property when the set of servers
-      changes through reconfiguration. See Sections 4 and 5.1 in the <a href="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters">paper</a>.</p>
-<p>In order for the method to work, all clients must subscribe to
-      configuration changes (by setting a watch on /zookeeper/config either
-      directly or through the <span class="codefrag command">getConfig</span> API command). When
-      the watch is triggered, the client should read the new configuration by
-      invoking <span class="codefrag command">sync</span> and <span class="codefrag command">getConfig</span> and if
-      the configuration is indeed new invoke the
-      <span class="codefrag command">updateServerList</span> API command. To avoid mass client
-      migration at the same time, it is better to have each client sleep a
-      random short period of time before invoking
-      <span class="codefrag command">updateServerList</span>.</p>
-<p>A few examples can be found in:
-      <span class="codefrag filename">StaticHostProviderTest.java</span> and
-      <span class="codefrag filename">TestReconfig.cc</span>
-</p>
-<p>Example (this is not a recipe, but a simplified example just to
-      explain the general idea):</p>
-<pre class="code">
-public void process(WatchedEvent event) {
-    synchronized (this) {
-        if (event.getType() == EventType.None) {
-            connected = (event.getState() == KeeperState.SyncConnected);
-            notifyAll();
-        } else if (event.getPath()!=null &amp;&amp;  event.getPath().equals(ZooDefs.CONFIG_NODE)) {
-            // in prod code never block the event thread!
-            zk.sync(ZooDefs.CONFIG_NODE, this, null);
-            zk.getConfig(this, this, null);
-        }
-    }
-}
-public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
-    if (path!=null &amp;&amp;  path.equals(ZooDefs.CONFIG_NODE)) {
-        String config[] = ConfigUtils.getClientConfigStr(new String(data)).split(" ");   // similar to config -c
-        long version = Long.parseLong(config[0], 16);
-        if (this.configVersion == null){
-             this.configVersion = version;
-        } else if (version &gt; this.configVersion) {
-            hostList = config[1];
-            try {
-                // the following command is not blocking but may cause the client to close the socket and
-                // migrate to a different server. In practice its better to wait a short period of time, chosen
-                // randomly, so that different clients migrate at different times
-                zk.updateServerList(hostList);
-            } catch (IOException e) {
-                System.err.println("Error updating server list");
-                e.printStackTrace();
-            }
-            this.configVersion = version;
-} } }</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperReconfig.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperReconfig.pdf b/docs/zookeeperReconfig.pdf
deleted file mode 100644
index d91638a..0000000
Binary files a/docs/zookeeperReconfig.pdf and /dev/null differ


[09/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperProgrammers.html
----------------------------------------------------------------------
diff --git a/docs/zookeeperProgrammers.html b/docs/zookeeperProgrammers.html
deleted file mode 100644
index a78b89d..0000000
--- a/docs/zookeeperProgrammers.html
+++ /dev/null
@@ -1,2517 +0,0 @@
-<!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 Programmer'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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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="menupage">
-<div class="menupagetitle">Programmer's Guide</div>
-</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">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="zookeeperProgrammers.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
-        PDF</a>
-</div>
-<h1>ZooKeeper Programmer's Guide</h1>
-<h3>Developing Distributed Applications that use ZooKeeper</h3>
-<div id="front-matter">
-<div id="minitoc-area">
-<ul class="minitoc">
-<li>
-<a href="#_introduction">Introduction</a>
-</li>
-<li>
-<a href="#ch_zkDataModel">The ZooKeeper Data Model</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_zkDataModel_znodes">ZNodes</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_zkDataMode_watches">Watches</a>
-</li>
-<li>
-<a href="#Data+Access">Data Access</a>
-</li>
-<li>
-<a href="#Ephemeral+Nodes">Ephemeral Nodes</a>
-</li>
-<li>
-<a href="#Sequence+Nodes+--+Unique+Naming">Sequence Nodes -- Unique Naming</a>
-</li>
-<li>
-<a href="#Container+Nodes">Container Nodes</a>
-</li>
-<li>
-<a href="#TTL+Nodes">TTL Nodes</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_timeInZk">Time in ZooKeeper</a>
-</li>
-<li>
-<a href="#sc_zkStatStructure">ZooKeeper Stat Structure</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_zkSessions">ZooKeeper Sessions</a>
-</li>
-<li>
-<a href="#ch_zkWatches">ZooKeeper Watches</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_WatchSemantics">Semantics of Watches</a>
-</li>
-<li>
-<a href="#sc_WatchRemoval">Remove Watches</a>
-</li>
-<li>
-<a href="#sc_WatchGuarantees">What ZooKeeper Guarantees about Watches</a>
-</li>
-<li>
-<a href="#sc_WatchRememberThese">Things to Remember about Watches</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_ZooKeeperAccessControl">ZooKeeper access control using ACLs</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_ACLPermissions">ACL Permissions</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_BuiltinACLSchemes">Builtin ACL Schemes</a>
-</li>
-<li>
-<a href="#ZooKeeper+C+client+API">ZooKeeper C client API</a>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li>
-<a href="#sc_ZooKeeperPluggableAuthentication">Pluggable ZooKeeper authentication</a>
-</li>
-<li>
-<a href="#ch_zkGuarantees">Consistency Guarantees</a>
-</li>
-<li>
-<a href="#ch_bindings">Bindings</a>
-<ul class="minitoc">
-<li>
-<a href="#Java+Binding">Java Binding</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_java_client_configuration">Client Configuration Parameters</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#C+Binding">C Binding</a>
-<ul class="minitoc">
-<li>
-<a href="#Installation">Installation</a>
-</li>
-<li>
-<a href="#Building+Your+Own+C+Client">Building Your Own C Client</a>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_guideToZkOperations">Building Blocks: A Guide to ZooKeeper Operations</a>
-<ul class="minitoc">
-<li>
-<a href="#sc_errorsZk">Handling Errors</a>
-</li>
-<li>
-<a href="#sc_connectingToZk">Connecting to ZooKeeper</a>
-</li>
-<li>
-<a href="#sc_readOps">Read Operations</a>
-</li>
-<li>
-<a href="#sc_writeOps">Write Operations</a>
-</li>
-<li>
-<a href="#sc_handlingWatches">Handling Watches</a>
-</li>
-<li>
-<a href="#sc_miscOps">Miscelleaneous ZooKeeper Operations</a>
-</li>
-</ul>
-</li>
-<li>
-<a href="#ch_programStructureWithExample">Program Structure, with Simple Example</a>
-</li>
-<li>
-<a href="#ch_gotchas">Gotchas: Common Problems and Troubleshooting</a>
-</li>
-</ul>
-</div>
-</div>
-  
-
-  
-
-  
-
-  
-<a name="_introduction"></a>
-<h2 class="h3">Introduction</h2>
-<div class="section">
-<p>This document is a guide for developers wishing to create
-    distributed applications that take advantage of ZooKeeper's coordination
-    services. It contains conceptual and practical information.</p>
-<p>The first four sections of this guide present higher level
-    discussions of various ZooKeeper concepts. These are necessary both for an
-    understanding of how ZooKeeper works as well how to work with it. It does
-    not contain source code, but it does assume a familiarity with the
-    problems associated with distributed computing. The sections in this first
-    group are:</p>
-<ul>
-      
-<li>
-        
-<p>
-<a href="#ch_zkDataModel">The ZooKeeper Data Model</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_zkSessions">ZooKeeper Sessions</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_zkWatches">ZooKeeper Watches</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_zkGuarantees">Consistency Guarantees</a>
-</p>
-      
-</li>
-    
-</ul>
-<p>The next four sections provide practical programming
-    information. These are:</p>
-<ul>
-      
-<li>
-        
-<p>
-<a href="#ch_guideToZkOperations">Building Blocks: A Guide to ZooKeeper Operations</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_bindings">Bindings</a>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_programStructureWithExample">Program Structure, with Simple Example</a>
-        <em>[tbd]</em>
-</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<a href="#ch_gotchas">Gotchas: Common Problems and Troubleshooting</a>
-</p>
-      
-</li>
-    
-</ul>
-<p>The book concludes with an <a href="#apx_linksToOtherInfo">appendix</a> containing links to other
-    useful, ZooKeeper-related information.</p>
-<p>Most of information in this document is written to be accessible as
-    stand-alone reference material. However, before starting your first
-    ZooKeeper application, you should probably at least read the chaptes on
-    the <a href="#ch_zkDataModel">ZooKeeper Data Model</a> and <a href="#ch_guideToZkOperations">ZooKeeper Basic Operations</a>. Also,
-    the <a href="#ch_programStructureWithExample">Simple Programmming
-    Example</a> <em>[tbd]</em> is helpful for understanding the basic
-    structure of a ZooKeeper client application.</p>
-</div>
-
-  
-<a name="ch_zkDataModel"></a>
-<h2 class="h3">The ZooKeeper Data Model</h2>
-<div class="section">
-<p>ZooKeeper has a hierarchal name space, much like a distributed file
-    system. The only difference is that each node in the namespace can have
-    data associated with it as well as children. It is like having a file
-    system that allows a file to also be a directory. Paths to nodes are
-    always expressed as canonical, absolute, slash-separated paths; there are
-    no relative reference. Any unicode character can be used in a path subject
-    to the following constraints:</p>
-<ul>
-      
-<li>
-        
-<p>The null character (\u0000) cannot be part of a path name. (This
-        causes problems with the C binding.)</p>
-      
-</li>
-
-      
-<li>
-        
-<p>The following characters can't be used because they don't
-        display well, or render in confusing ways: \u0001 - \u001F and \u007F
-        - \u009F.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>The following characters are not allowed: \ud800 - uF8FF,
-        \uFFF0 - uFFFF.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>The "." character can be used as part of another name, but "."
-        and ".." cannot alone be used to indicate a node along a path,
-        because ZooKeeper doesn't use relative paths. The following would be
-        invalid: "/a/b/./c" or "/a/b/../c".</p>
-      
-</li>
-
-      
-<li>
-        
-<p>The token "zookeeper" is reserved.</p>
-      
-</li>
-    
-</ul>
-<a name="sc_zkDataModel_znodes"></a>
-<h3 class="h4">ZNodes</h3>
-<p>Every node in a ZooKeeper tree is referred to as a
-      <em>znode</em>. Znodes maintain a stat structure that
-      includes version numbers for data changes, acl changes. The stat
-      structure also has timestamps. The version number, together with the
-      timestamp, allows ZooKeeper to validate the cache and to coordinate
-      updates. Each time a znode's data changes, the version number increases.
-      For instance, whenever a client retrieves data, it also receives the
-      version of the data. And when a client performs an update or a delete,
-      it must supply the version of the data of the znode it is changing. If
-      the version it supplies doesn't match the actual version of the data,
-      the update will fail. (This behavior can be overridden. For more
-      information see... )<em>[tbd...]</em>
-</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-        
-<p>In distributed application engineering, the word
-        <em>node</em> can refer to a generic host machine, a
-        server, a member of an ensemble, a client process, etc. In the ZooKeeper
-        documentation, <em>znodes</em> refer to the data nodes.
-        <em>Servers</em>  refer to machines that make up the
-        ZooKeeper service; <em>quorum peers</em> refer to the
-        servers that make up an ensemble; client refers to any host or process
-        which uses a ZooKeeper service.</p>
-      
-</div>
-</div>
-<p>Znodes are the main enitity that a programmer access. They have
-      several characteristics that are worth mentioning here.</p>
-<a name="sc_zkDataMode_watches"></a>
-<h4>Watches</h4>
-<p>Clients can set watches on znodes. Changes to that znode trigger
-        the watch and then clear the watch. When a watch triggers, ZooKeeper
-        sends the client a notification. More information about watches can be
-        found in the section 
-	    <a href="#ch_zkWatches">ZooKeeper Watches</a>.</p>
-<a name="Data+Access"></a>
-<h4>Data Access</h4>
-<p>The data stored at each znode in a namespace is read and written
-        atomically. Reads get all the data bytes associated with a znode and a
-        write replaces all the data. Each node has an Access Control List
-        (ACL) that restricts who can do what.</p>
-<p>ZooKeeper was not designed to be a general database or large
-        object store. Instead, it manages coordination data. This data can
-        come in the form of configuration, status information, rendezvous, etc.
-        A common property of the various forms of coordination data is that
-        they are relatively small: measured in kilobytes.
-        The ZooKeeper client and the server implementations have sanity checks
-        to ensure that znodes have less than 1M of data, but the data should
-        be much less than that on average. Operating on relatively large data
-        sizes will cause some operations to take much more time than others and
-        will affect the latencies of some operations because of the extra time
-        needed to move more data over the network and onto storage media. If
-        large data storage is needed, the usually pattern of dealing with such
-        data is to store it on a bulk storage system, such as NFS or HDFS, and
-        store pointers to the storage locations in ZooKeeper.</p>
-<a name="Ephemeral+Nodes"></a>
-<h4>Ephemeral Nodes</h4>
-<p>ZooKeeper also has the notion of ephemeral nodes. These znodes
-        exists as long as the session that created the znode is active. When
-        the session ends the znode is deleted. Because of this behavior
-        ephemeral znodes are not allowed to have children.</p>
-<a name="Sequence+Nodes+--+Unique+Naming"></a>
-<h4>Sequence Nodes -- Unique Naming</h4>
-<p>When creating a znode you can also request that
-        ZooKeeper append a monotonically increasing counter to the end
-        of path. This counter is unique to the parent znode. The
-        counter has a format of %010d -- that is 10 digits with 0
-        (zero) padding (the counter is formatted in this way to
-        simplify sorting), i.e. "&lt;path&gt;0000000001". See
-        <a href="recipes.html#sc_recipes_Queues">Queue
-        Recipe</a> for an example use of this feature. Note: the
-        counter used to store the next sequence number is a signed int
-        (4bytes) maintained by the parent node, the counter will
-        overflow when incremented beyond 2147483647 (resulting in a
-        name "&lt;path&gt;-2147483648").</p>
-<a name="Container+Nodes"></a>
-<h4>Container Nodes</h4>
-<p>
-<strong>Added in 3.5.3</strong>
-</p>
-<p>ZooKeeper has the notion of container znodes. Container znodes are
-          special purpose znodes useful for recipes such as leader, lock, etc.
-          When the last child of a container is deleted, the container becomes
-          a candidate to be deleted by the server at some point in the future.</p>
-<p>Given this property, you should be prepared to get
-          KeeperException.NoNodeException when creating children inside of
-          container znodes. i.e. when creating child znodes inside of container znodes
-          always check for KeeperException.NoNodeException and recreate the container
-          znode when it occurs.</p>
-<a name="TTL+Nodes"></a>
-<h4>TTL Nodes</h4>
-<p>
-<strong>Added in 3.5.3</strong>
-</p>
-<p>When creating PERSISTENT or PERSISTENT_SEQUENTIAL znodes,
-          you can optionally set a TTL in milliseconds for the znode. If the znode
-          is not modified within the TTL and has no children it will become a candidate
-          to be deleted by the server at some point in the future.</p>
-<p>Note: TTL Nodes must be enabled via System property as
-        they are disabled by default. See the <a href="zookeeperAdmin.html#sc_configuration">Administrator's
-        Guide</a> for details. If you attempt to create TTL Nodes without the proper System property set the server
-        will throw <em>KeeperException.UnimplementedException</em>.</p>
-<a name="sc_timeInZk"></a>
-<h3 class="h4">Time in ZooKeeper</h3>
-<p>ZooKeeper tracks time multiple ways:</p>
-<ul>
-        
-<li>
-          
-<p>
-<strong>Zxid</strong>
-</p>
-
-          
-<p>Every change to the ZooKeeper state receives a stamp in the
-          form of a <em>zxid</em> (ZooKeeper Transaction Id).
-          This exposes the total ordering of all changes to ZooKeeper. Each
-          change will have a unique zxid and if zxid1 is smaller than zxid2
-          then zxid1 happened before zxid2.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>Version numbers</strong>
-</p>
-
-          
-<p>Every change to a node will cause an increase to one of the
-          version numbers of that node. The three version numbers are version
-          (number of changes to the data of a znode), cversion (number of
-          changes to the children of a znode), and aversion (number of changes
-          to the ACL of a znode).</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>Ticks</strong>
-</p>
-
-          
-<p>When using multi-server ZooKeeper, servers use ticks to define
-          timing of events such as status uploads, session timeouts,
-          connection timeouts between peers, etc. The tick time is only
-          indirectly exposed through the minimum session timeout (2 times the
-          tick time); if a client requests a session timeout less than the
-          minimum session timeout, the server will tell the client that the
-          session timeout is actually the minimum session timeout.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>Real time</strong>
-</p>
-
-          
-<p>ZooKeeper doesn't use real time, or clock time, at all except
-          to put timestamps into the stat structure on znode creation and
-          znode modification.</p>
-        
-</li>
-      
-</ul>
-<a name="sc_zkStatStructure"></a>
-<h3 class="h4">ZooKeeper Stat Structure</h3>
-<p>The Stat structure for each znode in ZooKeeper is made up of the
-      following fields:</p>
-<ul>
-        
-<li>
-          
-<p>
-<strong>czxid</strong>
-</p>
-
-          
-<p>The zxid of the change that caused this znode to be
-          created.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>mzxid</strong>
-</p>
-
-          
-<p>The zxid of the change that last modified this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>pzxid</strong>
-</p>
-
-          
-<p>The zxid of the change that last modified children of this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>ctime</strong>
-</p>
-
-          
-<p>The time in milliseconds from epoch when this znode was
-          created.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>mtime</strong>
-</p>
-
-          
-<p>The time in milliseconds from epoch when this znode was last
-          modified.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>version</strong>
-</p>
-
-          
-<p>The number of changes to the data of this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>cversion</strong>
-</p>
-
-          
-<p>The number of changes to the children of this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>aversion</strong>
-</p>
-
-          
-<p>The number of changes to the ACL of this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>ephemeralOwner</strong>
-</p>
-
-          
-<p>The session id of the owner of this znode if the znode is an
-          ephemeral node. If it is not an ephemeral node, it will be
-          zero.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>dataLength</strong>
-</p>
-
-          
-<p>The length of the data field of this znode.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>
-<strong>numChildren</strong>
-</p>
-
-          
-<p>The number of children of this znode.</p>
-        
-</li>
-
-      
-</ul>
-</div>
-
-  
-<a name="ch_zkSessions"></a>
-<h2 class="h3">ZooKeeper Sessions</h2>
-<div class="section">
-<p>A ZooKeeper client establishes a session with the ZooKeeper
-    service by creating a handle to the service using a language
-    binding. Once created, the handle starts of in the CONNECTING state
-    and the client library tries to connect to one of the servers that
-    make up the ZooKeeper service at which point it switches to the
-    CONNECTED state. During normal operation will be in one of these
-    two states. If an unrecoverable error occurs, such as session
-    expiration or authentication failure, or if the application explicitly
-    closes the handle, the handle will move to the CLOSED state.
-    The following figure shows the possible state transitions of a
-    ZooKeeper client:</p>
-<img alt="" src="images/state_dia.jpg"><p>To create a client session the application code must provide
-    a connection string containing a comma separated list of host:port pairs,
-    each corresponding to a ZooKeeper server (e.g. "127.0.0.1:4545" or
-    "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"). The ZooKeeper
-    client library will pick an arbitrary server and try to connect to
-    it. If this connection fails, or if the client becomes
-    disconnected from the server for any reason, the client will
-    automatically try the next server in the list, until a connection
-    is (re-)established.</p>
-<p> 
-<strong>Added in 3.2.0</strong>: An
-    optional "chroot" suffix may also be appended to the connection
-    string. This will run the client commands while interpreting all
-    paths relative to this root (similar to the unix chroot
-    command). If used the example would look like:
-    "127.0.0.1:4545/app/a" or
-    "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" where the
-    client would be rooted at "/app/a" and all paths would be relative
-    to this root - ie getting/setting/etc...  "/foo/bar" would result
-    in operations being run on "/app/a/foo/bar" (from the server
-    perspective). This feature is particularly useful in multi-tenant
-    environments where each user of a particular ZooKeeper service
-    could be rooted differently. This makes re-use much simpler as
-    each user can code his/her application as if it were rooted at
-    "/", while actual location (say /app/a) could be determined at
-    deployment time.</p>
-<p>When a client gets a handle to the ZooKeeper service,
-    ZooKeeper creates a ZooKeeper session, represented as a 64-bit
-    number, that it assigns to the client. If the client connects to a
-    different ZooKeeper server, it will send the session id as a part
-    of the connection handshake.  As a security measure, the server
-    creates a password for the session id that any ZooKeeper server
-    can validate.The password is sent to the client with the session
-    id when the client establishes the session. The client sends this
-    password with the session id whenever it reestablishes the session
-    with a new server.</p>
-<p>One of the parameters to the ZooKeeper client library call
-    to create a ZooKeeper session is the session timeout in
-    milliseconds. The client sends a requested timeout, the server
-    responds with the timeout that it can give the client. The current
-    implementation requires that the timeout be a minimum of 2 times
-    the tickTime (as set in the server configuration) and a maximum of
-    20 times the tickTime. The ZooKeeper client API allows access to
-    the negotiated timeout.</p>
-<p>When a client (session) becomes partitioned from the ZK
-    serving cluster it will begin searching the list of servers that
-    were specified during session creation. Eventually, when
-    connectivity between the client and at least one of the servers is
-    re-established, the session will either again transition to the
-    "connected" state (if reconnected within the session timeout
-    value) or it will transition to the "expired" state (if
-    reconnected after the session timeout). It is not advisable to
-    create a new session object (a new ZooKeeper.class or zookeeper
-    handle in the c binding) for disconnection. The ZK client library
-    will handle reconnect for you. In particular we have heuristics
-    built into the client library to handle things like "herd effect",
-    etc... Only create a new session when you are notified of session
-    expiration (mandatory).</p>
-<p>Session expiration is managed by the ZooKeeper cluster
-    itself, not by the client. When the ZK client establishes a
-    session with the cluster it provides a "timeout" value detailed
-    above. This value is used by the cluster to determine when the
-    client's session expires. Expirations happens when the cluster
-    does not hear from the client within the specified session timeout
-    period (i.e. no heartbeat). At session expiration the cluster will
-    delete any/all ephemeral nodes owned by that session and
-    immediately notify any/all connected clients of the change (anyone
-    watching those znodes). At this point the client of the expired
-    session is still disconnected from the cluster, it will not be
-    notified of the session expiration until/unless it is able to
-    re-establish a connection to the cluster. The client will stay in
-    disconnected state until the TCP connection is re-established with
-    the cluster, at which point the watcher of the expired session
-    will receive the "session expired" notification.</p>
-<p>Example state transitions for an expired session as seen by
-    the expired session's watcher:</p>
-<ol>
-      
-<li>
-<p>'connected' : session is established and client
-      is communicating with cluster (client/server communication is
-      operating properly)</p>
-</li>
-      
-<li>
-<p>.... client is partitioned from the
-      cluster</p>
-</li>
-      
-<li>
-<p>'disconnected' : client has lost connectivity
-      with the cluster</p>
-</li>
-      
-<li>
-<p>.... time elapses, after 'timeout' period the
-      cluster expires the session, nothing is seen by client as it is
-      disconnected from cluster</p>
-</li>
-      
-<li>
-<p>.... time elapses, the client regains network
-      level connectivity with the cluster</p>
-</li>
-      
-<li>
-<p>'expired' : eventually the client reconnects to
-      the cluster, it is then notified of the
-      expiration</p>
-</li>
-    
-</ol>
-<p>Another parameter to the ZooKeeper session establishment
-    call is the default watcher. Watchers are notified when any state
-    change occurs in the client. For example if the client loses
-    connectivity to the server the client will be notified, or if the
-    client's session expires, etc... This watcher should consider the
-    initial state to be disconnected (i.e. before any state changes
-    events are sent to the watcher by the client lib). In the case of
-    a new connection, the first event sent to the watcher is typically
-    the session connection event.</p>
-<p>The session is kept alive by requests sent by the client. If
-    the session is idle for a period of time that would timeout the
-    session, the client will send a PING request to keep the session
-    alive. This PING request not only allows the ZooKeeper server to
-    know that the client is still active, but it also allows the
-    client to verify that its connection to the ZooKeeper server is
-    still active. The timing of the PING is conservative enough to
-    ensure reasonable time to detect a dead connection and reconnect
-    to a new server.</p>
-<p>
-      Once a connection to the server is successfully established
-      (connected) there are basically two cases where the client lib generates
-      connectionloss (the result code in c binding, exception in Java -- see 
-      the API documentation for binding specific details) when either a synchronous or
-      asynchronous operation is performed and one of the following holds:
-    </p>
-<ol>
-      
-<li>
-<p>The application calls an operation on a session that is no
-      longer alive/valid</p>
-</li>
-      
-<li>
-<p>The ZooKeeper client disconnects from a server when there
-      are pending operations to that server, i.e., there is a pending asynchronous call.
-      </p>
-</li>
-    
-</ol>
-<p> 
-<strong>Added in 3.2.0 -- SessionMovedException</strong>. There is an internal
-      exception that is generally not seen by clients called the SessionMovedException.
-      This exception occurs because a request was received on a connection for a session
-      which has been reestablished on a different server. The normal cause of this error is
-      a client that sends a request to a server, but the network packet gets delayed, so
-      the client times out and connects to a new server. When the delayed packet arrives at
-      the first server, the old server detects that the session has moved, and closes the
-      client connection. Clients normally do not see this error since they do not read
-      from those old connections. (Old connections are usually closed.) One situation in which this
-      condition can be seen is when two clients try to reestablish the same connection using
-      a saved session id and password. One of the clients will reestablish the connection
-      and the second client will be disconnected (causing the pair to attempt to re-establish
-      its connection/session indefinitely).</p>
-<p> 
-<strong>Updating the list of servers</strong>.  We allow a client to 
-      update the connection string by providing a new comma separated list of host:port pairs, 
-      each corresponding to a ZooKeeper server. The function invokes a probabilistic load-balancing 
-      algorithm which may cause the client to disconnect from its current host with the goal
-      to achieve expected uniform number of connections per server in the new list. 
-      In case the current host to which the client is connected is not in the new list
-      this call will always cause the connection to be dropped. Otherwise, the decision
-	  is based on whether the number of servers has increased or decreased and by how much.	
-	</p>
-<p>
-      For example, if the previous connection string contained 3 hosts and now the list contains
-      these 3 hosts and 2 more hosts, 40% of clients connected to each of the 3 hosts will
-      move to one of the new hosts in order to balance the load. The algorithm will cause the client 
-      to drop its connection to the current host to which it is connected with probability 0.4 and in this 
-	  case cause the client to connect to one of the 2 new hosts, chosen at random.
-    </p>
-<p>
-	  Another example -- suppose we have 5 hosts and now update the list to remove 2 of the hosts, 
-	  the clients connected to the 3 remaining hosts will stay connected, whereas all clients connected 
-	  to the 2 removed hosts will need to move to one of the 3 hosts, chosen at random. If the connection
-	  is dropped, the client moves to a special mode where he chooses a new server to connect to using the
-	  probabilistic algorithm, and not just round robin. 
-    </p>
-<p>
-	  In the first example, each client decides to disconnect with probability 0.4 but once the decision is
-	  made, it will try to connect to a random new server and only if it cannot connect to any of the new 
-	  servers will it try to connect to the old ones. After finding a server, or trying all servers in the 
-	  new list and failing to connect, the client moves back to the normal mode of operation where it picks
-	  an arbitrary server from the connectString and attempt to connect to it. If that fails, is will continue
-	  trying different random servers in round robin. (see above the algorithm used to initially choose a server)
-    </p>
-</div>
-
-  
-<a name="ch_zkWatches"></a>
-<h2 class="h3">ZooKeeper Watches</h2>
-<div class="section">
-<p>All of the read operations in ZooKeeper - <strong>getData()</strong>, <strong>getChildren()</strong>, and <strong>exists()</strong> - have the option of setting a watch as a
-    side effect. Here is ZooKeeper's definition of a watch: a watch event is
-    one-time trigger, sent to the client that set the watch, which occurs when
-    the data for which the watch was set changes. There are three key points
-    to consider in this definition of a watch:</p>
-<ul>
-      
-<li>
-        
-<p>
-<strong>One-time trigger</strong>
-</p>
-
-        
-<p>One watch event will be sent to the client when the data has changed.
-        For example, if a client does a getData("/znode1", true) and later the
-        data for /znode1 is changed or deleted, the client will get a watch
-        event for /znode1. If /znode1 changes again, no watch event will be
-        sent unless the client has done another read that sets a new
-        watch.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<strong>Sent to the client</strong>
-</p>
-
-        
-<p>This implies that an event is on the way to the client, but may
-        not reach the client before the successful return code to the change
-        operation reaches the client that initiated the change. Watches are
-        sent asynchronously to watchers. ZooKeeper provides an ordering
-        guarantee: a client will never see a change for which it has set a
-        watch until it first sees the watch event. Network delays or other
-        factors may cause different clients to see watches and return codes
-        from updates at different times. The key point is that everything seen
-        by the different clients will have a consistent order.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>
-<strong>The data for which the watch was
-        set</strong>
-</p>
-
-        
-<p>This refers to the different ways a node can change.  It
-        helps to think of ZooKeeper as maintaining two lists of
-        watches: data watches and child watches.  getData() and
-        exists() set data watches. getChildren() sets child
-        watches. Alternatively, it may help to think of watches being
-        set according to the kind of data returned. getData() and
-        exists() return information about the data of the node,
-        whereas getChildren() returns a list of children.  Thus,
-        setData() will trigger data watches for the znode being set
-        (assuming the set is successful). A successful create() will
-        trigger a data watch for the znode being created and a child
-        watch for the parent znode. A successful delete() will trigger
-        both a data watch and a child watch (since there can be no
-        more children) for a znode being deleted as well as a child
-        watch for the parent znode.</p>
-      
-</li>
-    
-</ul>
-<p>Watches are maintained locally at the ZooKeeper server to which the
-    client is connected. This allows watches to be lightweight to set,
-    maintain, and dispatch. When a client connects to a new server, the watch
-    will be triggered for any session events. Watches will not be received
-    while disconnected from a server. When a client reconnects, any previously
-    registered watches will be reregistered and triggered if needed. In
-    general this all occurs transparently. There is one case where a watch
-    may be missed: a watch for the existence of a znode not yet created will
-    be missed if the znode is created and deleted while disconnected.</p>
-<a name="sc_WatchSemantics"></a>
-<h3 class="h4">Semantics of Watches</h3>
-<p> We can set watches with the three calls that read the state of 
-	  ZooKeeper: exists, getData, and getChildren. The following list details
-	  the events that a watch can trigger and the calls that enable them:
-	  </p>
-<ul>
-        
-<li>
-          
-<p>
-<strong>Created event:</strong>
-</p>
-          
-<p>Enabled with a call to exists.</p>
-        
-</li>
-        
-        
-<li>
-          
-<p>
-<strong>Deleted event:</strong>
-</p>
-          
-<p>Enabled with a call to exists, getData, and getChildren.</p>
-        
-</li>
-        
-        
-<li>
-          
-<p>
-<strong>Changed event:</strong>
-</p>
-          
-<p>Enabled with a call to exists and getData.</p>
-        
-</li>
-        
-        
-<li>
-          
-<p>
-<strong>Child event:</strong>
-</p>
-          
-<p>Enabled with a call to getChildren.</p>
-        
-</li>
-      
-</ul>
-<a name="sc_WatchRemoval"></a>
-<h3 class="h4">Remove Watches</h3>
-<p>We can remove the watches registered on a znode with a call to 
-      removeWatches. Also, a ZooKeeper client can remove watches locally even
-      if there is no server connection by setting the local flag to true. The 
-      following list details the events which will be triggered after the 
-      successful watch removal.
-      </p>
-<ul>
-        
-<li>
-          
-<p>
-<strong>Child Remove event:</strong>
-</p>
-          
-<p>Watcher which was added with a call to getChildren.</p>
-        
-</li>
-        
-        
-<li>
-          
-<p>
-<strong>Data Remove event:</strong>
-</p>
-          
-<p>Watcher which was added with a call to exists or getData.</p>
-        
-</li>
-      
-</ul>
-<a name="sc_WatchGuarantees"></a>
-<h3 class="h4">What ZooKeeper Guarantees about Watches</h3>
-<p>With regard to watches, ZooKeeper maintains these
-      guarantees:</p>
-<ul>
-        
-<li>
-          
-<p>Watches are ordered with respect to other events, other
-          watches, and asynchronous replies. The ZooKeeper client libraries
-          ensures that everything is dispatched in order.</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>A client will see a watch event for a znode it is watching
-          before seeing the new data that corresponds to that znode.</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>The order of watch events from ZooKeeper corresponds to the
-          order of the updates as seen by the ZooKeeper service.</p>
-        
-</li>
-      
-</ul>
-<a name="sc_WatchRememberThese"></a>
-<h3 class="h4">Things to Remember about Watches</h3>
-<ul>
-        
-<li>
-          
-<p>Watches are one time triggers; if you get a watch event and
-          you want to get notified of future changes, you must set another
-          watch.</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>Because watches are one time triggers and there is latency
-          between getting the event and sending a new request to get a watch
-          you cannot reliably see every change that happens to a node in
-          ZooKeeper. Be prepared to handle the case where the znode changes
-          multiple times between getting the event and setting the watch
-          again. (You may not care, but at least realize it may
-          happen.)</p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>A watch object, or function/context pair, will only be
-          triggered once for a given notification. For example, if the same
-          watch object is registered for an exists and a getData call for the
-          same file and that file is then deleted, the watch object would
-          only be invoked once with the deletion notification for the file.
-          </p>
-        
-</li>
-      
-</ul>
-<ul>
-        
-<li>
-          
-<p>When you disconnect from a server (for example, when the
-          server fails), you will not get any watches until the connection
-          is reestablished. For this reason session events are sent to all
-          outstanding watch handlers. Use session events to go into a safe
-          mode: you will not be receiving events while disconnected, so your
-          process should act conservatively in that mode.</p>
-        
-</li>
-      
-</ul>
-</div>
-
-  
-<a name="sc_ZooKeeperAccessControl"></a>
-<h2 class="h3">ZooKeeper access control using ACLs</h2>
-<div class="section">
-<p>ZooKeeper uses ACLs to control access to its znodes (the
-    data nodes of a ZooKeeper data tree). The ACL implementation is
-    quite similar to UNIX file access permissions: it employs
-    permission bits to allow/disallow various operations against a
-    node and the scope to which the bits apply. Unlike standard UNIX
-    permissions, a ZooKeeper node is not limited by the three standard
-    scopes for user (owner of the file), group, and world
-    (other). ZooKeeper does not have a notion of an owner of a
-    znode. Instead, an ACL specifies sets of ids and permissions that
-    are associated with those ids.</p>
-<p>Note also that an ACL pertains only to a specific znode. In
-    particular it does not apply to children. For example, if
-    <em>/app</em> is only readable by ip:172.16.16.1 and
-    <em>/app/status</em> is world readable, anyone will
-    be able to read <em>/app/status</em>; ACLs are not
-    recursive.</p>
-<p>ZooKeeper supports pluggable authentication schemes. Ids are
-    specified using the form <em>scheme:expression</em>,
-    where <em>scheme</em> is the authentication scheme
-    that the id corresponds to. The set of valid expressions are defined
-    by the scheme. For example, <em>ip:172.16.16.1</em> is
-    an id for a host with the address <em>172.16.16.1</em>
-    using the <em>ip</em> scheme, whereas <em>digest:bob:password</em>
-    is an id for the user with the name of <em>bob</em> using
-    the <em>digest</em> scheme.</p>
-<p>When a client connects to ZooKeeper and authenticates
-    itself, ZooKeeper associates all the ids that correspond to a
-    client with the clients connection. These ids are checked against
-    the ACLs of znodes when a clients tries to access a node. ACLs are
-    made up of pairs of <em>(scheme:expression,
-    perms)</em>. The format of
-    the <em>expression</em> is specific to the scheme. For
-    example, the pair <em>(ip:19.22.0.0/16, READ)</em>
-    gives the <em>READ</em> permission to any clients with
-    an IP address that starts with 19.22.</p>
-<a name="sc_ACLPermissions"></a>
-<h3 class="h4">ACL Permissions</h3>
-<p>ZooKeeper supports the following permissions:</p>
-<ul>
-        
-<li>
-<p>
-<strong>CREATE</strong>: you can create a child node</p>
-</li>
-        
-<li>
-<p>
-<strong>READ</strong>: you can get data from a node and list its children.</p>
-</li>
-        
-<li>
-<p>
-<strong>WRITE</strong>: you can set data for a node</p>
-</li>
-        
-<li>
-<p>
-<strong>DELETE</strong>: you can delete a child node</p>
-</li>
-        
-<li>
-<p>
-<strong>ADMIN</strong>: you can set permissions</p>
-</li>
-      
-</ul>
-<p>The <em>CREATE</em>
-      and <em>DELETE</em> permissions have been broken out
-      of the <em>WRITE</em> permission for finer grained
-      access controls. The cases for <em>CREATE</em>
-      and <em>DELETE</em> are the following:</p>
-<p>You want A to be able to do a set on a ZooKeeper node, but
-      not be able to <em>CREATE</em>
-      or <em>DELETE</em> children.</p>
-<p>
-<em>CREATE</em>
-      without <em>DELETE</em>: clients create requests by
-      creating ZooKeeper nodes in a parent directory. You want all
-      clients to be able to add, but only request processor can
-      delete. (This is kind of like the APPEND permission for
-      files.)</p>
-<p>Also, the <em>ADMIN</em> permission is there
-      since ZooKeeper doesn&rsquo;t have a notion of file owner. In some
-      sense the <em>ADMIN</em> permission designates the
-      entity as the owner. ZooKeeper doesn&rsquo;t support the LOOKUP
-      permission (execute permission bit on directories to allow you
-      to LOOKUP even though you can't list the directory). Everyone
-      implicitly has LOOKUP permission. This allows you to stat a
-      node, but nothing more. (The problem is, if you want to call
-      zoo_exists() on a node that doesn't exist, there is no
-      permission to check.)</p>
-<a name="sc_BuiltinACLSchemes"></a>
-<h4>Builtin ACL Schemes</h4>
-<p>ZooKeeeper has the following built in schemes:</p>
-<ul>
-        
-<li>
-<p>
-<strong>world</strong> has a
-        single id, <em>anyone</em>, that represents
-        anyone.</p>
-</li>
-
-        
-<li>
-<p>
-<strong>auth</strong> is a special
-        scheme which ignores any provided expression and instead uses the current user,
-        credentials, and scheme. Any expression (whether <em>user</em> like with SASL
-        authentication or <em>user:password</em> like with DIGEST authentication) provided is ignored
-        by the ZooKeeper server when persisting the ACL. However, the expression must still be
-        provided in the ACL because the ACL must match the form <em>scheme:expression:perms</em>.
-        This scheme is provided as a convenience as it is a common use-case for
-        a user to create a znode and then restrict access to that znode to only that user.
-        If there is no authenticated user, setting an ACL with the auth scheme will fail.
-        </p>
-</li>
-
-        
-<li>
-<p>
-<strong>digest</strong> uses
-        a <em>username:password</em> string to generate
-        MD5 hash which is then used as an ACL ID
-        identity. Authentication is done by sending
-        the <em>username:password</em> in clear text. When
-        used in the ACL the expression will be
-        the <em>username:base64</em>
-        encoded <em>SHA1</em>
-        password <em>digest</em>.</p>
-        
-</li>
-
-        
-<li>
-<p>
-<strong>ip</strong> uses the
-        client host IP as an ACL ID identity. The ACL expression is of
-        the form <em>addr/bits</em> where the most
-        significant <em>bits</em>
-        of <em>addr</em> are matched against the most
-        significant <em>bits</em> of the client host
-        IP.</p>
-</li>
-
-        
-<li>
-<p>
-<strong>x509</strong> uses the client
-        X500 Principal as an ACL ID identity. The ACL expression is the exact
-        X500 Principal name of a client. When using the secure port, clients
-        are automatically authenticated and their auth info for the x509 scheme
-        is set.</p>
-</li>
-
-      
-</ul>
-<a name="ZooKeeper+C+client+API"></a>
-<h4>ZooKeeper C client API</h4>
-<p>The following constants are provided by the ZooKeeper C
-      library:</p>
-<ul>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_READ; //can read node&rsquo;s value and list its children</p>
-</li>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_WRITE;// can set the node&rsquo;s value</p>
-</li>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_CREATE; //can create children</p>
-</li>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_DELETE;// can delete children</p>
-</li>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_ADMIN; //can execute set_acl()</p>
-</li>
-        
-<li>
-<p>
-<em>const</em> <em>int</em> ZOO_PERM_ALL;// all of the above flags OR&rsquo;d together</p>
-</li>
-      
-</ul>
-<p>The following are the standard ACL IDs:</p>
-<ul>
-        
-<li>
-<p>
-<em>struct</em> Id ZOO_ANYONE_ID_UNSAFE; //(&lsquo;world&rsquo;,&rsquo;anyone&rsquo;)</p>
-</li>
-        
-<li>
-<p>
-<em>struct</em> Id ZOO_AUTH_IDS;// (&lsquo;auth&rsquo;,&rsquo;&rsquo;)</p>
-</li>
-      
-</ul>
-<p>ZOO_AUTH_IDS empty identity string should be interpreted as &ldquo;the identity of the creator&rdquo;.</p>
-<p>ZooKeeper client comes with three standard ACLs:</p>
-<ul>
-        
-<li>
-<p>
-<em>struct</em> ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)</p>
-</li>
-        
-<li>
-<p>
-<em>struct</em> ACL_vector ZOO_READ_ACL_UNSAFE;// (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)</p>
-</li>
-        
-<li>
-<p>
-<em>struct</em> ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL,ZOO_AUTH_IDS)</p>
-</li>
-      
-</ul>
-<p>The ZOO_OPEN_ACL_UNSAFE is completely open free for all
-      ACL: any application can execute any operation on the node and
-      can create, list and delete its children. The
-      ZOO_READ_ACL_UNSAFE is read-only access for any
-      application. CREATE_ALL_ACL grants all permissions to the
-      creator of the node. The creator must have been authenticated by
-      the server (for example, using &ldquo;<em>digest</em>&rdquo;
-      scheme) before it can create nodes with this ACL.</p>
-<p>The following ZooKeeper operations deal with ACLs:</p>
-<ul>
-<li>
-          
-<p>
-<em>int</em> <em>zoo_add_auth</em>
-            (zhandle_t *zh,<em>const</em> <em>char</em>*
-            scheme,<em>const</em> <em>char</em>*
-            cert, <em>int</em> certLen, void_completion_t
-            completion, <em>const</em> <em>void</em>
-            *data);</p>
-      
-</li>
-</ul>
-<p>The application uses the zoo_add_auth function to
-      authenticate itself to the server. The function can be called
-      multiple times if the application wants to authenticate using
-      different schemes and/or identities.</p>
-<ul>
-<li>
-          
-<p>
-<em>int</em> <em>zoo_create</em>
-            (zhandle_t *zh, <em>const</em> <em>char</em>
-            *path, <em>const</em> <em>char</em>
-            *value,<em>int</em>
-            valuelen, <em>const</em> <em>struct</em>
-            ACL_vector *acl, <em>int</em>
-            flags,<em>char</em>
-            *realpath, <em>int</em>
-            max_realpath_len);</p>
-      
-</li>
-</ul>
-<p>zoo_create(...) operation creates a new node. The acl
-      parameter is a list of ACLs associated with the node. The parent
-      node must have the CREATE permission bit set.</p>
-<ul>
-<li>
-          
-<p>
-<em>int</em> <em>zoo_get_acl</em>
-            (zhandle_t *zh, <em>const</em> <em>char</em>
-            *path,<em>struct</em> ACL_vector
-            *acl, <em>struct</em> Stat *stat);</p>
-      
-</li>
-</ul>
-<p>This operation returns a node&rsquo;s ACL info.</p>
-<ul>
-<li>
-          
-<p>
-<em>int</em> <em>zoo_set_acl</em>
-            (zhandle_t *zh, <em>const</em> <em>char</em>
-            *path, <em>int</em>
-            version,<em>const</em> <em>struct</em>
-            ACL_vector *acl);</p>
-      
-</li>
-</ul>
-<p>This function replaces node&rsquo;s ACL list with a new one. The
-      node must have the ADMIN permission set.</p>
-<p>Here is a sample code that makes use of the above APIs to
-      authenticate itself using the &ldquo;<em>foo</em>&rdquo; scheme
-      and create an ephemeral node &ldquo;/xyz&rdquo; with create-only
-      permissions.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-<p>This is a very simple example which is intended to show
-        how to interact with ZooKeeper ACLs
-        specifically. See <span class="codefrag filename">.../trunk/zookeeper-client/zookeeper-client-c/src/cli.c</span>
-        for an example of a C client implementation</p>
-      
-</div>
-</div>
-<pre class="code">
-#include &lt;string.h&gt;
-#include &lt;errno.h&gt;
-
-#include "zookeeper.h"
-
-static zhandle_t *zh;
-
-/**
- * In this example this method gets the cert for your
- *   environment -- you must provide
- */
-char *foo_get_cert_once(char* id) { return 0; }
-
-/** Watcher function -- empty for this example, not something you should
- * do in real code */
-void watcher(zhandle_t *zzh, int type, int state, const char *path,
-             void *watcherCtx) {}
-
-int main(int argc, char argv) {
-  char buffer[512];
-  char p[2048];
-  char *cert=0;
-  char appId[64];
-
-  strcpy(appId, "example.foo_test");
-  cert = foo_get_cert_once(appId);
-  if(cert!=0) {
-    fprintf(stderr,
-            "Certificate for appid [%s] is [%s]\n",appId,cert);
-    strncpy(p,cert, sizeof(p)-1);
-    free(cert);
-  } else {
-    fprintf(stderr, "Certificate for appid [%s] not found\n",appId);
-    strcpy(p, "dummy");
-  }
-
-  zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);
-
-  zh = zookeeper_init("localhost:3181", watcher, 10000, 0, 0, 0);
-  if (!zh) {
-    return errno;
-  }
-  if(zoo_add_auth(zh,"foo",p,strlen(p),0,0)!=ZOK)
-    return 2;
-
-  struct ACL CREATE_ONLY_ACL[] = {{ZOO_PERM_CREATE, ZOO_AUTH_IDS}};
-  struct ACL_vector CREATE_ONLY = {1, CREATE_ONLY_ACL};
-  int rc = zoo_create(zh,"/xyz","value", 5, &amp;CREATE_ONLY, ZOO_EPHEMERAL,
-                      buffer, sizeof(buffer)-1);
-
-  /** this operation will fail with a ZNOAUTH error */
-  int buflen= sizeof(buffer);
-  struct Stat stat;
-  rc = zoo_get(zh, "/xyz", 0, buffer, &amp;buflen, &amp;stat);
-  if (rc) {
-    fprintf(stderr, "Error %d for %s\n", rc, __LINE__);
-  }
-
-  zookeeper_close(zh);
-  return 0;
-}
-      </pre>
-</div>
-
-  
-<a name="sc_ZooKeeperPluggableAuthentication"></a>
-<h2 class="h3">Pluggable ZooKeeper authentication</h2>
-<div class="section">
-<p>ZooKeeper runs in a variety of different environments with
-    various different authentication schemes, so it has a completely
-    pluggable authentication framework. Even the builtin authentication
-    schemes use the pluggable authentication framework.</p>
-<p>To understand how the authentication framework works, first you must
-    understand the two main authentication operations. The framework 
-    first must authenticate the client. This is usually done as soon as
-    the client connects to a server and consists of validating information
-    sent from or gathered about a client and associating it with the connection.
-    The second operation handled by the framework is finding the entries in an
-    ACL that correspond to client. ACL entries are &lt;<em>idspec, 
-    permissions</em>&gt; pairs. The <em>idspec</em> may be
-    a simple string match against the authentication information associated
-    with the connection or it may be a expression that is evaluated against that
-    information. It is up to the implementation of the authentication plugin
-    to do the match. Here is the interface that an authentication plugin must
-    implement:</p>
-<pre class="code">
-public interface AuthenticationProvider {
-    String getScheme();
-    KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]);
-    boolean isValid(String id);
-    boolean matches(String id, String aclExpr);
-    boolean isAuthenticated();
-}
-    </pre>
-<p>The first method <em>getScheme</em> returns the string
-    that identifies the plugin. Because we support multiple methods of authentication,
-    an authentication credential or an <em>idspec</em> will always be
-    prefixed with <em>scheme:</em>. The ZooKeeper server uses the scheme
-    returned by the authentication plugin to determine which ids the scheme
-    applies to.</p>
-<p>
-<em>handleAuthentication</em> is called when a client
-    sends authentication information to be associated with a connection. The
-    client specifies the scheme to which the information corresponds. The
-    ZooKeeper server passes the information to the authentication plugin whose
-    <em>getScheme</em> matches the scheme passed by the client. The
-    implementor of <em>handleAuthentication</em> will usually return
-    an error if it determines that the information is bad, or it will associate information
-    with the connection using <em>cnxn.getAuthInfo().add(new Id(getScheme(), data))</em>.
-    </p>
-<p>The authentication plugin is involved in both setting and using ACLs. When an
-    ACL is set for a znode, the ZooKeeper server will pass the id part of the entry to
-    the <em>isValid(String id)</em> method. It is up to the plugin to verify
-    that the id has a correct form. For example, <em>ip:172.16.0.0/16</em>
-    is a valid id, but <em>ip:host.com</em> is not. If the new ACL includes
-    an "auth" entry, <em>isAuthenticated</em> is used to see if the 
-    authentication information for this scheme that is assocatied with the connection
-    should be added to the ACL. Some schemes
-    should not be included in auth. For example, the IP address of the client is not
-    considered as an id that should be added to the ACL if auth is specified.</p>
-<p>ZooKeeper invokes
-    <em>matches(String id, String aclExpr)</em> when checking an ACL. It
-    needs to match authentication information of the client against the relevant ACL
-    entries. To find the entries which apply to the client, the ZooKeeper server will
-    find the scheme of each entry and if there is authentication information
-    from that client for that scheme, <em>matches(String id, String aclExpr)</em>
-    will be called with <em>id</em> set to the authentication information
-    that was previously added to the connection by <em>handleAuthentication</em> and
-    <em>aclExpr</em> set to the id of the ACL entry. The authentication plugin
-    uses its own logic and matching scheme to determine if <em>id</em> is included
-    in <em>aclExpr</em>. 
-    </p>
-<p>There are two built in authentication plugins: <em>ip</em> and
-    <em>digest</em>. Additional plugins can adding using system properties. At
-    startup the ZooKeeper server will look for system properties that start with
-    "zookeeper.authProvider." and interpret the value of those properties as the class name
-    of an authentication plugin. These properties can be set using the
-    <em>-Dzookeeeper.authProvider.X=com.f.MyAuth</em> or adding entries such as
-    the following in the server configuration file:</p>
-<pre class="code">
-authProvider.1=com.f.MyAuth
-authProvider.2=com.f.MyAuth2
-    </pre>
-<p>Care should be taking to ensure that the suffix on the property is unique. If there are 
-    duplicates such as <em>-Dzookeeeper.authProvider.X=com.f.MyAuth -Dzookeeper.authProvider.X=com.f.MyAuth2</em>,
-    only one will be used. Also all servers must have the same plugins defined, otherwise clients using
-    the authentication schemes provided by the plugins will have problems connecting to some servers.
-    </p>
-</div>
-      
-  
-<a name="ch_zkGuarantees"></a>
-<h2 class="h3">Consistency Guarantees</h2>
-<div class="section">
-<p>ZooKeeper is a high performance, scalable service. Both reads and
-    write operations are designed to be fast, though reads are faster than
-    writes. The reason for this is that in the case of reads, ZooKeeper can
-    serve older data, which in turn is due to ZooKeeper's consistency
-    guarantees:</p>
-<dl>
-      
-<dt>
-<term>Sequential Consistency</term>
-</dt>
-<dd>
-<p>Updates from a client will be applied in the order that they
-          were sent.</p>
-</dd>
-
-      
-<dt>
-<term>Atomicity</term>
-</dt>
-<dd>
-<p>Updates either succeed or fail -- there are no partial
-          results.</p>
-</dd>
-
-      
-<dt>
-<term>Single System Image</term>
-</dt>
-<dd>
-<p>A client will see the same view of the service regardless of
-          the server that it connects to.</p>
-</dd>
-
-      
-<dt>
-<term>Reliability</term>
-</dt>
-<dd>
-<p>Once an update has been applied, it will persist from that
-          time forward until a client overwrites the update. This guarantee
-          has two corollaries:</p>
-<ol>
-            
-<li>
-              
-<p>If a client gets a successful return code, the update will
-              have been applied. On some failures (communication errors,
-              timeouts, etc) the client will not know if the update has
-              applied or not. We take steps to minimize the failures, but the
-              guarantee is only present with successful return codes.
-              (This is called the <em>monotonicity condition</em> in Paxos.)</p>
-            
-</li>
-
-            
-<li>
-              
-<p>Any updates that are seen by the client, through a read
-              request or successful update, will never be rolled back when
-              recovering from server failures.</p>
-            
-</li>
-          
-</ol>
-</dd>
-
-      
-<dt>
-<term>Timeliness</term>
-</dt>
-<dd>
-<p>The clients view of the system is guaranteed to be up-to-date
-          within a certain time bound (on the order of tens of seconds).
-          Either system changes will be seen by a client within this bound, or
-          the client will detect a service outage.</p>
-</dd>
-    
-</dl>
-<p>Using these consistency guarantees it is easy to build higher level
-    functions such as leader election, barriers, queues, and read/write
-    revocable locks solely at the ZooKeeper client (no additions needed to
-    ZooKeeper). See <a href="recipes.html">Recipes and Solutions</a>
-    for more details.</p>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-        
-<p>Sometimes developers mistakenly assume one other guarantee that
-        ZooKeeper does <em>not</em> in fact make. This is:</p>
-
-        
-<dl>
-          
-<dt>
-<term>Simultaneously Consistent Cross-Client Views</term>
-</dt>
-<dd>
-<p>ZooKeeper does not guarantee that at every instance in
-              time, two different clients will have identical views of
-              ZooKeeper data. Due to factors like network delays, one client
-              may perform an update before another client gets notified of the
-              change. Consider the scenario of two clients, A and B. If client
-              A sets the value of a znode /a from 0 to 1, then tells client B
-              to read /a, client B may read the old value of 0, depending on
-              which server it is connected to. If it
-              is important that Client A and Client B read the same value,
-              Client B should should call the <strong>sync()</strong> method from the ZooKeeper API
-              method before it performs its read.</p>
-<p>So, ZooKeeper by itself doesn't guarantee that changes occur 
-              synchronously across all servers, but ZooKeeper
-              primitives can be used to construct higher level functions that
-              provide useful client synchronization. (For more information,
-              see the <a href="recipes.html">ZooKeeper Recipes</a>.
-              <em>[tbd:..]</em>).</p>
-</dd>
-        
-</dl>
-      
-</div>
-</div>
-</div>
-
-  
-<a name="ch_bindings"></a>
-<h2 class="h3">Bindings</h2>
-<div class="section">
-<p>The ZooKeeper client libraries come in two languages: Java and C.
-    The following sections describe these.</p>
-<a name="Java+Binding"></a>
-<h3 class="h4">Java Binding</h3>
-<p>There are two packages that make up the ZooKeeper Java binding:
-      <strong>org.apache.zookeeper</strong> and <strong>org.apache.zookeeper.data</strong>. The rest of the
-      packages that make up ZooKeeper are used internally or are part of the
-      server implementation. The <strong>org.apache.zookeeper.data</strong> package is made up of
-      generated classes that are used simply as containers.</p>
-<p>The main class used by a ZooKeeper Java client is the <strong>ZooKeeper</strong> class. Its two constructors differ only
-      by an optional session id and password. ZooKeeper supports session
-      recovery accross instances of a process. A Java program may save its
-      session id and password to stable storage, restart, and recover the
-      session that was used by the earlier instance of the program.</p>
-<p>When a ZooKeeper object is created, two threads are created as
-      well: an IO thread and an event thread. All IO happens on the IO thread
-      (using Java NIO). All event callbacks happen on the event thread.
-      Session maintenance such as reconnecting to ZooKeeper servers and
-      maintaining heartbeat is done on the IO thread. Responses for
-      synchronous methods are also processed in the IO thread. All responses
-      to asynchronous methods and watch events are processed on the event
-      thread. There are a few things to notice that result from this
-      design:</p>
-<ul>
-        
-<li>
-          
-<p>All completions for asynchronous calls and watcher callbacks
-          will be made in order, one at a time. The caller can do any
-          processing they wish, but no other callbacks will be processed
-          during that time.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Callbacks do not block the processing of the IO thread or the
-          processing of the synchronous calls.</p>
-        
-</li>
-
-        
-<li>
-          
-<p>Synchronous calls may not return in the correct order. For
-          example, assume a client does the following processing: issues an
-          asynchronous read of node <strong>/a</strong> with
-          <em>watch</em> set to true, and then in the completion
-          callback of the read it does a synchronous read of <strong>/a</strong>. (Maybe not good practice, but not illegal
-          either, and it makes for a simple example.)</p>
-
-          
-<p>Note that if there is a change to <strong>/a</strong> between the asynchronous read and the
-          synchronous read, the client library will receive the watch event
-          saying <strong>/a</strong> changed before the
-          response for the synchronous read, but because the completion
-          callback is blocking the event queue, the synchronous read will
-          return with the new value of <strong>/a</strong>
-          before the watch event is processed.</p>
-        
-</li>
-      
-</ul>
-<p>Finally, the rules associated with shutdown are straightforward:
-      once a ZooKeeper object is closed or receives a fatal event
-      (SESSION_EXPIRED and AUTH_FAILED), the ZooKeeper object becomes invalid.
-      On a close, the two threads shut down and any further access on zookeeper
-      handle is undefined behavior and should be avoided. </p>
-<a name="sc_java_client_configuration"></a>
-<h4>Client Configuration Parameters</h4>
-<p>
-            The following list contains configuration properties for the Java client. You can set any
-            of these properties using Java system properties. For server properties, please check the
-            following reference
-            <a href="zookeeperAdmin.html#sc_configuration">Server configuration section.</a>
-        
-</p>
-<dl>
-            
-<dt>
-<term>zookeeper.sasl.client</term>
-</dt>
-<dd>
-<p>Set the value to <strong>false</strong> to disable
-                    SASL authentication. Default is <strong>true</strong>.</p>
-</dd>
-            
-<dt>
-<term>zookeeper.sasl.clientconfig</term>
-</dt>
-<dd>
-<p>Specifies the context key in the JAAS login file. Default is "Client".</p>
-</dd>
-            
-<dt>
-<term>zookeeper.sasl.client.username</term>
-</dt>
-<dd>
-<p>Traditionally, a principal is divided into three parts: the primary, the instance, and the realm.
-                        The format of a typical Kerberos V5 principal is primary/instance@REALM.
-                        zookeeper.sasl.client.username specifies the primary part of the server principal. Default
-                        is "zookeeper". Instance part is derived from the server IP. Finally server's principal is
-                        username/IP@realm, where username is the value of zookeeper.sasl.client.username, IP is
-                        the server IP, and realm is the value of zookeeper.server.realm.</p>
-</dd>
-            
-<dt>
-<term>zookeeper.server.realm</term>
-</dt>
-<dd>
-<p>Realm part of the server principal. By default it is the client principal realm.</p>
-</dd>
-            
-<dt>
-<term>zookeeper.disableAutoWatchReset</term>
-</dt>
-<dd>
-<p>This switch controls whether automatic watch resetting is enabled. Clients automatically
-                        reset watches during session reconnect by default, this option allows the client to turn off
-                        this behavior by setting zookeeper.disableAutoWatchReset to <strong>true</strong>. 
-                    </p>
-</dd>
-            
-<dt>
-<term>zookeeper.client.secure</term>
-</dt>
-<dd>
-<p>
-                        If you want to connect to the server secure client port, you need to set this property to
-                        <strong>true</strong>
-                        on the client. This will connect to server using SSL with specified credentials. Note that
-                        it requires the Netty client.
-                    </p>
-</dd>
-            
-<dt>
-<term>zookeeper.clientCnxnSocket</term>
-</dt>
-<dd>
-<p>
-                        Specifies which ClientCnxnSocket to be used. Possible values are
-                        <strong>org.apache.zookeeper.ClientCnxnSocketNIO</strong>
-                        and
-                        <strong>org.apache.zookeeper.ClientCnxnSocketNetty</strong>
-                        . Default is
-                        <strong>org.apache.zookeeper.ClientCnxnSocketNIO</strong>
-                        . If you want to connect to server's secure client port, you need to set this property to
-                        <strong>org.apache.zookeeper.ClientCnxnSocketNetty</strong>
-                        on client.
-                    </p>
-</dd>
-            
-<dt>
-<term>zookeeper.ssl.keyStore.location and zookeeper.ssl.keyStore.password</term>
-</dt>
-<dd>
-<p>Specifies the file path to a JKS containing the local credentials to be used for SSL connections,
-                        and the password to unlock the file.
-                    </p>
-</dd>
-            
-<dt>
-<term>zookeeper.ssl.trustStore.location and zookeeper.ssl.trustStore.password</term>
-</dt>
-<dd>
-<p>Specifies the file path to a JKS containing the remote credentials to be used for SSL connections,
-                        and the password to unlock the file.
-                    </p>
-</dd>
-            
-<dt>
-<term>jute.maxbuffer</term>
-</dt>
-<dd>
-<p>It specifies the maximum size of the incoming data from the server. The default value is 4194304
-                        Bytes , or just 4 MB. This is really a sanity check. The ZooKeeper server is designed to store and send
-                        data on the order of kilobytes. If incoming data length is more than this value, an IOException
-                        is raised.</p>
-</dd>
-            
-<dt>
-<term>zookeeper.kinit</term>
-</dt>
-<dd>
-<p>Specifies path to kinit binary. Default is "/usr/bin/kinit".</p>
-</dd>
-        
-</dl>
-<a name="C+Binding"></a>
-<h3 class="h4">C Binding</h3>
-<p>The C binding has a single-threaded and multi-threaded library.
-      The multi-threaded library is easiest to use and is most similar to the
-      Java API. This library will create an IO thread and an event dispatch
-      thread for handling connection maintenance and callbacks. The
-      single-threaded library allows ZooKeeper to be used in event driven
-      applications by exposing the event loop used in the multi-threaded
-      library.</p>
-<p>The package includes two shared libraries: zookeeper_st and
-      zookeeper_mt. The former only provides the asynchronous APIs and
-      callbacks for integrating into the application's event loop. The only
-      reason this library exists is to support the platforms were a
-      <em>pthread</em> library is not available or is unstable
-      (i.e. FreeBSD 4.x). In all other cases, application developers should
-      link with zookeeper_mt, as it includes support for both Sync and Async
-      API.</p>
-<a name="Installation"></a>
-<h4>Installation</h4>
-<p>If you're building the client from a check-out from the Apache
-        repository, follow the steps outlined below. If you're building from a
-        project source package downloaded from apache, skip to step <strong>3</strong>.</p>
-<ol>
-          
-<li>
-            
-<p>Run <span class="codefrag command">ant compile_jute</span> from the ZooKeeper
-            top level directory (<span class="codefrag filename">.../trunk</span>).
-            This will create a directory named "generated" under
-            <span class="codefrag filename">.../trunk/zookeeper-client/zookeeper-client-c</span>.</p>
-          
-</li>
-
-          
-<li>
-            
-<p>Change directory to the<span class="codefrag filename">.../trunk/zookeeper-client/zookeeper-client-c</span>
-            and run <span class="codefrag command">autoreconf -if</span> to bootstrap <strong>autoconf</strong>, <strong>automake</strong> and <strong>libtool</strong>. Make sure you have <strong>autoconf version 2.59</strong> or greater installed.
-            Skip to step<strong> 4</strong>.</p>
-          
-</li>
-
-          
-<li>
-            
-<p>If you are building from a project source package,
-            unzip/untar the source tarball and cd to the<span class="codefrag filename">
-            zookeeper-x.x.x/zookeeper-client/zookeeper-client-c</span> directory.</p>
-          
-</li>
-
-          
-<li>
-            
-<p>Run <span class="codefrag command">./configure &lt;your-options&gt;</span> to
-            generate the makefile. Here are some of options the <strong>configure</strong> utility supports that can be
-            useful in this step:</p>
-
-            
-<ul>
-              
-<li>
-                
-<p>
-<span class="codefrag command">--enable-debug</span>
-</p>
-
-                
-<p>Enables optimization and enables debug info compiler
-                options. (Disabled by default.)</p>
-              
-</li>
-
-              
-<li>
-                
-<p>
-<span class="codefrag command">--without-syncapi </span>
-</p>
-
-                
-<p>Disables Sync API support; zookeeper_mt library won't be
-                built. (Enabled by default.)</p>
-              
-</li>
-
-              
-<li>
-                
-<p>
-<span class="codefrag command">--disable-static </span>
-</p>
-
-                
-<p>Do not build static libraries. (Enabled by
-                default.)</p>
-              
-</li>
-
-              
-<li>
-                
-<p>
-<span class="codefrag command">--disable-shared</span>
-</p>
-
-                
-<p>Do not build shared libraries. (Enabled by
-                default.)</p>
-              
-</li>
-            
-</ul>
-
-            
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-              
-<p>See INSTALL for general information about running
-              <strong>configure</strong>.</p>
-            
-</div>
-</div>
-          
-</li>
-
-          
-<li>
-            
-<p>Run <span class="codefrag command">make</span> or <span class="codefrag command">make
-            install</span> to build the libraries and install them.</p>
-          
-</li>
-
-          
-<li>
-            
-<p>To generate doxygen documentation for the ZooKeeper API, run
-            <span class="codefrag command">make doxygen-doc</span>. All documentation will be
-            placed in a new subfolder named docs. By default, this command
-            only generates HTML. For information on other document formats,
-            run <span class="codefrag command">./configure --help</span>
-</p>
-          
-</li>
-        
-</ol>
-<a name="Building+Your+Own+C+Client"></a>
-<h4>Building Your Own C Client</h4>
-<p>In order to be able to use the ZooKeeper C API in your application
-        you have to remember to</p>
-<ol>
-          
-<li>
-            
-<p>Include ZooKeeper header: #include
-              &lt;zookeeper/zookeeper.h&gt;</p>
-          
-</li>
-
-          
-<li>
-            
-<p>If you are building a multithreaded client, compile with
-            -DTHREADED compiler flag to enable the multi-threaded version of
-            the library, and then link against against the
-            <em>zookeeper_mt</em> library. If you are building a
-            single-threaded client, do not compile with -DTHREADED, and be
-            sure to link against the<em> zookeeper_st
-            </em>library.</p>
-          
-</li>
-        
-</ol>
-<div class="note">
-<div class="label">Note</div>
-<div class="content">
-<p>See <span class="codefrag filename">.../trunk/zookeeper-client/zookeeper-client-c/src/cli.c</span>
-          for an example of a C client implementation</p>
-        
-</div>
-</div>
-</div>
-
-   
-<a name="ch_guideToZkOperations"></a>
-<h2 class="h3">Building Blocks: A Guide to ZooKeeper Operations</h2>
-<div class="section">
-<p>This section surveys all the operations a developer can perform
-    against a ZooKeeper server. It is lower level information than the earlier
-    concepts chapters in this manual, but higher level than the ZooKeeper API
-    Reference. It covers these topics:</p>
-<ul>
-      
-<li>
-        
-<p>
-<a href="#sc_connectingToZk">Connecting to ZooKeeper</a>
-</p>
-      
-</li>
-    
-</ul>
-<a name="sc_errorsZk"></a>
-<h3 class="h4">Handling Errors</h3>
-<p>Both the Java and C client bindings may report errors. The Java client binding does so by throwing KeeperException, calling code() on the exception will return the specific error code. The C client binding returns an error code as defined in the enum ZOO_ERRORS. API callbacks indicate result code for both language bindings. See the API documentation (javadoc for Java, doxygen for C) for full details on the possible errors and their meaning.</p>
-<a name="sc_connectingToZk"></a>
-<h3 class="h4">Connecting to ZooKeeper</h3>
-<p></p>
-<a name="sc_readOps"></a>
-<h3 class="h4">Read Operations</h3>
-<p></p>
-<a name="sc_writeOps"></a>
-<h3 class="h4">Write Operations</h3>
-<p></p>
-<a name="sc_handlingWatches"></a>
-<h3 class="h4">Handling Watches</h3>
-<p></p>
-<a name="sc_miscOps"></a>
-<h3 class="h4">Miscelleaneous ZooKeeper Operations</h3>
-<p></p>
-</div>
-
-  
-<a name="ch_programStructureWithExample"></a>
-<h2 class="h3">Program Structure, with Simple Example</h2>
-<div class="section">
-<p>
-<em>[tbd]</em>
-</p>
-</div>
-
-  
-<a name="ch_gotchas"></a>
-<h2 class="h3">Gotchas: Common Problems and Troubleshooting</h2>
-<div class="section">
-<p>So now you know ZooKeeper. It's fast, simple, your application
-    works, but wait ... something's wrong. Here are some pitfalls that
-    ZooKeeper users fall into:</p>
-<ol>
-      
-<li>
-        
-<p>If you are using watches, you must look for the connected watch
-        event. When a ZooKeeper client disconnects from a server, you will
-        not receive notification of changes until reconnected. If you are
-        watching for a znode to come into existence, you will miss the event
-        if the znode is created and deleted while you are disconnected.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>You must test ZooKeeper server failures. The ZooKeeper service
-        can survive failures as long as a majority of servers are active. The
-        question to ask is: can your application handle it? In the real world
-        a client's connection to ZooKeeper can break. (ZooKeeper server
-        failures and network partitions are common reasons for connection
-        loss.) The ZooKeeper client library takes care of recovering your
-        connection and letting you know what happened, but you must make sure
-        that you recover your state and any outstanding requests that failed.
-        Find out if you got it right in the test lab, not in production - test
-        with a ZooKeeper service made up of a several of servers and subject
-        them to reboots.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>The list of ZooKeeper servers used by the client must match the
-        list of ZooKeeper servers that each ZooKeeper server has. Things can
-        work, although not optimally, if the client list is a subset of the
-        real list of ZooKeeper servers, but not if the client lists ZooKeeper
-        servers not in the ZooKeeper cluster.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>Be careful where you put that transaction log. The most
-        performance-critical part of ZooKeeper is the transaction log.
-        ZooKeeper must sync transactions to media before it returns a
-        response. A dedicated transaction log device is key to consistent good
-        performance. Putting the log on a busy device will adversely effect
-        performance. If you only have one storage device, put trace files on
-        NFS and increase the snapshotCount; it doesn't eliminate the problem,
-        but it can mitigate it.</p>
-      
-</li>
-
-      
-<li>
-        
-<p>Set your Java max heap size correctly. It is very important to
-        <em>avoid swapping.</em> Going to disk unnecessarily will
-        almost certainly degrade your performance unacceptably. Remember, in
-        ZooKeeper, everything is ordered, so if one request hits the disk, all
-        other queued requests hit the disk.</p>
-
-        
-<p>To avoid swapping, try to set the heapsize to the amount of
-        physical memory you have, minus the amount needed by the OS and cache.
-        The best way to determine an optimal heap size for your configurations
-        is to <em>run load tests</em>. If for some reason you
-        can't, be conservative in your estimates and choose a number well
-        below the limit that would cause your machine to swap. For example, on
-        a 4G machine, a 3G heap is a conservative estimate to start
-        with.</p>
-      
-</li>
-    
-</ol>
-</div>
-
-  
-<a name="apx_linksToOtherInfo"></a>
-<appendix id="apx_linksToOtherInfo">
-    
-<title>Links to Other Information</title>
-
-    
-<p>Outside the formal documentation, there're several other sources of
-    information for ZooKeeper developers.</p>
-
-    
-<dl>
-      
-<dt>
-<term>ZooKeeper Whitepaper <em>[tbd: find url]</em>
-</term>
-</dt>
-<dd>
-<p>The definitive discussion of ZooKeeper design and performance,
-          by Yahoo! Research</p>
-</dd>
-
-      
-<dt>
-<term>API Reference <em>[tbd: find url]</em>
-</term>
-</dt>
-<dd>
-<p>The complete reference to the ZooKeeper API</p>
-</dd>
-
-      
-<dt>
-<term>
-<a href="http://us.dl1.yimg.com/download.yahoo.com/dl/ydn/zookeeper.m4v">ZooKeeper
-        Talk at the Hadoup Summit 2008</a>
-</term>
-</dt>
-<dd>
-<p>A video introduction to ZooKeeper, by Benjamin Reed of Yahoo!
-          Research</p>
-</dd>
-
-      
-<dt>
-<term>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/Tutorial">Barrier and
-        Queue Tutorial</a>
-</term>
-</dt>
-<dd>
-<p>The excellent Java tutorial by Flavio Junqueira, implementing
-          simple barriers and producer-consumer queues using ZooKeeper.</p>
-</dd>
-
-      
-<dt>
-<term>
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/ZooKeeperArticles">ZooKeeper
-        - A Reliable, Scalable Distributed Coordination System</a>
-</term>
-</dt>
-<dd>
-<p>An article by Todd Hoff (07/15/2008)</p>
-</dd>
-
-      
-<dt>
-<term>
-<a href="recipes.html">ZooKeeper Recipes</a>
-</term>
-</dt>
-<dd>
-<p>Pseudo-level discussion of the implementation of various
-          synchronization solutions with ZooKeeper: Event Handles, Queues,
-          Locks, and Two-phase Commits.</p>
-</dd>
-
-      
-<dt>
-<term>
-<em>[tbd]</em>
-</term>
-</dt>
-<dd>
-<p>Any other good sources anyone can think of...</p>
-</dd>
-    
-</dl>
-  
-</appendix>
-
-<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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/zookeeperProgrammers.pdf
----------------------------------------------------------------------
diff --git a/docs/zookeeperProgrammers.pdf b/docs/zookeeperProgrammers.pdf
deleted file mode 100644
index dfd6f9c..0000000
Binary files a/docs/zookeeperProgrammers.pdf and /dev/null differ


[04/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml
deleted file mode 100644
index f71c4a8..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperHierarchicalQuorums.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?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="zk_HierarchicalQuorums">
-  <title>Introduction to hierarchical quorums</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 document contains information about hierarchical quorums.</para>
-    </abstract>
-  </articleinfo>
-
-    <para>
-    This document gives an example of how to use hierarchical quorums. The basic idea is
-    very simple. First, we split servers into groups, and add a line for each group listing
-    the servers that form this group. Next we have to assign a weight to each server.  
-    </para>
-    
-    <para>
-    The following example shows how to configure a system with three groups of three servers
-    each, and we assign a weight of 1 to each server:
-    </para>
-    
-    <programlisting>
-    group.1=1:2:3
-    group.2=4:5:6
-    group.3=7:8:9
-   
-    weight.1=1
-    weight.2=1
-    weight.3=1
-    weight.4=1
-    weight.5=1
-    weight.6=1
-    weight.7=1
-    weight.8=1
-    weight.9=1
- 	</programlisting>
-
-	<para>    
-    When running the system, we are able to form a quorum once we have a majority of votes from
-    a majority of non-zero-weight groups. Groups that have zero weight are discarded and not
-    considered when forming quorums. Looking at the example, we are able to form a quorum once
-    we have votes from at least two servers from each of two different groups.
-    </para> 
- </article>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperInternals.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperInternals.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperInternals.xml
deleted file mode 100644
index 7815bc1..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperInternals.xml
+++ /dev/null
@@ -1,487 +0,0 @@
-<?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="ar_ZooKeeperInternals">
-  <title>ZooKeeper Internals</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 article contains topics which discuss the inner workings of
-       ZooKeeper. So far, that's logging and atomic broadcast. </para>
-
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_Introduction">
-    <title>Introduction</title>
-
-    <para>This document contains information on the inner workings of ZooKeeper. 
-    So far, it discusses these topics:
-    </para>
-
-<itemizedlist>    
-<listitem><para><xref linkend="sc_atomicBroadcast"/></para></listitem>
-<listitem><para><xref linkend="sc_logging"/></para></listitem>
-</itemizedlist>
-
-</section>
-
-<section id="sc_atomicBroadcast">
-<title>Atomic Broadcast</title>
-
-<para>
-At the heart of ZooKeeper is an atomic messaging system that keeps all of the servers in sync.</para>
-
-<section id="sc_guaranteesPropertiesDefinitions"><title>Guarantees, Properties, and Definitions</title>
-<para>
-The specific guarantees provided by the messaging system used by ZooKeeper are the following:</para>
-
-<variablelist>
-
-<varlistentry><term><emphasis >Reliable delivery</emphasis></term>
-<listitem><para>If a message, m, is delivered 
-by one server, it will be eventually delivered by all servers.</para></listitem></varlistentry>
-
-<varlistentry><term><emphasis >Total order</emphasis></term>
-<listitem><para> If a message is 
-delivered before message b by one server, a will be delivered before b by all 
-servers. If a and b are delivered messages, either a will be delivered before b 
-or b will be delivered before a.</para></listitem></varlistentry>
-
-<varlistentry><term><emphasis >Causal order</emphasis> </term>
-
-<listitem><para>
-If a message b is sent after a message a has been delivered by the sender of b, 
-a must be ordered before b. If a sender sends c after sending b, c must be ordered after b.
-</para></listitem></varlistentry>
-
-</variablelist>
-
-
-<para>
-The ZooKeeper messaging system also needs to be efficient, reliable, and easy to 
-implement and maintain. We make heavy use of messaging, so we need the system to 
-be able to handle thousands of requests per second. Although we can require at 
-least k+1 correct servers to send new messages, we must be able to recover from 
-correlated failures such as power outages. When we implemented the system we had 
-little time and few engineering resources, so we needed a protocol that is 
-accessible to engineers and is easy to implement. We found that our protocol 
-satisfied all of these goals.
-
-</para>
-
-<para>
-Our protocol assumes that we can construct point-to-point FIFO channels between 
-the servers. While similar services usually assume message delivery that can 
-lose or reorder messages, our assumption of FIFO channels is very practical 
-given that we use TCP for communication. Specifically we rely on the following property of TCP:</para>
-
-<variablelist>
-
-<varlistentry>
-<term><emphasis >Ordered delivery</emphasis></term>
-<listitem><para>Data is delivered in the same order it is sent and a message m is 
-delivered only after all messages sent before m have been delivered. 
-(The corollary to this is that if message m is lost all messages after m will be lost.)</para></listitem></varlistentry>
-
-<varlistentry><term><emphasis >No message after close</emphasis></term>
-<listitem><para>Once a FIFO channel is closed, no messages will be received from it.</para></listitem></varlistentry>
-
-</variablelist>
-
-<para>
-FLP proved that consensus cannot be achieved in asynchronous distributed systems 
-if failures are possible. To ensure we achieve consensus in the presence of failures 
-we use timeouts. However, we rely on times for liveness not for correctness. So, 
-if timeouts stop working (clocks malfunction for example) the messaging system may 
-hang, but it will not violate its guarantees.</para>
-
-<para>When describing the ZooKeeper messaging protocol we will talk of packets, 
-proposals, and messages:</para>
-<variablelist>
-<varlistentry><term><emphasis >Packet</emphasis></term>
-<listitem><para>a sequence of bytes sent through a FIFO channel</para></listitem></varlistentry><varlistentry>
-
-<term><emphasis >Proposal</emphasis></term>
-<listitem><para>a unit of agreement. Proposals are agreed upon by exchanging packets 
-with a quorum of ZooKeeper servers. Most proposals contain messages, however the 
-NEW_LEADER proposal is an example of a proposal that does not correspond to a message.</para></listitem>
-</varlistentry><varlistentry>
-
-<term><emphasis >Message</emphasis></term>
-<listitem><para>a sequence of bytes to be atomically broadcast to all ZooKeeper 
-servers. A message put into a proposal and agreed upon before it is delivered.</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-<para>
-As stated above, ZooKeeper guarantees a total order of messages, and it also 
-guarantees a total order of proposals. ZooKeeper exposes the total ordering using
-a ZooKeeper transaction id (<emphasis>zxid</emphasis>). All proposals will be stamped with a zxid when 
-it is proposed and exactly reflects the total ordering. Proposals are sent to all 
-ZooKeeper servers and committed when a quorum of them acknowledge the proposal. 
-If a proposal contains a message, the message will be delivered when the proposal 
-is committed. Acknowledgement means the server has recorded the proposal to persistent storage. 
-Our quorums have the requirement that any pair of quorum must have at least one server 
-in common. We ensure this by requiring that all quorums have size (<emphasis>n/2+1</emphasis>) where 
-n is the number of servers that make up a ZooKeeper service.
-</para>
-
-<para>
-The zxid has two parts: the epoch and a counter. In our implementation the zxid 
-is a 64-bit number. We use the high order 32-bits for the epoch and the low order 
-32-bits for the counter. Because it has two parts represent the zxid both as a 
-number and as a pair of integers, (<emphasis>epoch, count</emphasis>). The epoch number represents a 
-change in leadership. Each time a new leader comes into power it will have its 
-own epoch number. We have a simple algorithm to assign a unique zxid to a proposal: 
-the leader simply increments the zxid to obtain a unique zxid for each proposal. 
-<emphasis>Leadership activation will ensure that only one leader uses a given epoch, so our 
-simple algorithm guarantees that every proposal will have a unique id.</emphasis>
-</para>
-
-<para>
-ZooKeeper messaging consists of two phases:</para>
-
-<variablelist>
-<varlistentry><term><emphasis >Leader activation</emphasis></term>
-<listitem><para>In this phase a leader establishes the correct state of the system 
-and gets ready to start making proposals.</para></listitem>
-</varlistentry>
-
-<varlistentry><term><emphasis >Active messaging</emphasis></term>
-<listitem><para>In this phase a leader accepts messages to propose and coordinates message delivery.</para></listitem>
-</varlistentry>
-</variablelist>
-
-<para>
-ZooKeeper is a holistic protocol. We do not focus on individual proposals, rather 
-look at the stream of proposals as a whole. Our strict ordering allows us to do this 
-efficiently and greatly simplifies our protocol. Leadership activation embodies 
-this holistic concept. A leader becomes active only when a quorum of followers 
-(The leader counts as a follower as well. You can always vote for yourself ) has synced 
-up with the leader, they have the same state. This state consists of all of the 
-proposals that the leader believes have been committed and the proposal to follow 
-the leader, the NEW_LEADER proposal. (Hopefully you are thinking to 
-yourself, <emphasis>Does the set of proposals that the leader believes has been committed 
-included all the proposals that really have been committed?</emphasis> The answer is <emphasis>yes</emphasis>. 
-Below, we make clear why.)
-</para>
-
-</section>
-
-<section id="sc_leaderElection">
-
-<title>Leader Activation</title>
-<para>
-Leader activation includes leader election. We currently have two leader election 
-algorithms in ZooKeeper: LeaderElection and FastLeaderElection (AuthFastLeaderElection 
-is a variant of FastLeaderElection that uses UDP and allows servers to perform a simple
-form of authentication to avoid IP spoofing). ZooKeeper messaging doesn't care about the 
-exact method of electing a leader has long as the following holds:
-</para>
-
-<itemizedlist>
-
-<listitem><para>The leader has seen the highest zxid of all the followers.</para></listitem>
-<listitem><para>A quorum of servers have committed to following the leader.</para></listitem>
-
-</itemizedlist>
-
-<para>
-Of these two requirements only the first, the highest zxid amoung the followers 
-needs to hold for correct operation. The second requirement, a quorum of followers, 
-just needs to hold with high probability. We are going to recheck the second requirement, 
-so if a failure happens during or after the leader election and quorum is lost, 
-we will recover by abandoning leader activation and running another election.
-</para>
-
-<para>
-After leader election a single server will be designated as a leader and start 
-waiting for followers to connect. The rest of the servers will try to connect to 
-the leader. The leader will sync up with followers by sending any proposals they 
-are missing, or if a follower is missing too many proposals, it will send a full 
-snapshot of the state to the follower.
-</para>
-
-<para>
-There is a corner case in which a follower that has proposals, U, not seen 
-by a leader arrives. Proposals are seen in order, so the proposals of U will have a zxids 
-higher than zxids seen by the leader. The follower must have arrived after the 
-leader election, otherwise the follower would have been elected leader given that 
-it has seen a higher zxid. Since committed proposals must be seen by a quorum of 
-servers, and a quorum of servers that elected the leader did not see U, the proposals 
-of you have not been committed, so they can be discarded. When the follower connects 
-to the leader, the leader will tell the follower to discard U.
-</para>
-
-<para>
-A new leader establishes a zxid to start using for new proposals by getting the 
-epoch, e, of the highest zxid it has seen and setting the next zxid to use to be 
-(e+1, 0), fter the leader syncs with a follower, it will propose a NEW_LEADER 
-proposal. Once the NEW_LEADER proposal has been committed, the leader will activate 
-and start receiving and issuing proposals.
-</para>
-
-<para>
-It all sounds complicated but here are the basic rules of operation during leader 
-activation:
-</para>
-
-<itemizedlist>
-<listitem><para>A follower will ACK the NEW_LEADER proposal after it has synced with the leader.</para></listitem>
-<listitem><para>A follower will only ACK a NEW_LEADER proposal with a given zxid from a single server.</para></listitem>
-<listitem><para>A new leader will COMMIT the NEW_LEADER proposal when a quorum of followers have ACKed it.</para></listitem>
-<listitem><para>A follower will commit any state it received from the leader when the NEW_LEADER proposal is COMMIT.</para></listitem>
-<listitem><para>A new leader will not accept new proposals until the NEW_LEADER proposal has been COMMITED.</para></listitem>
-</itemizedlist>
-
-<para>
-If leader election terminates erroneously, we don't have a problem since the 
-NEW_LEADER proposal will not be committed since the leader will not have quorum. 
-When this happens, the leader and any remaining followers will timeout and go back 
-to leader election.
-</para>
-
-</section>
-
-<section id="sc_activeMessaging">
-<title>Active Messaging</title>
-<para>
-Leader Activation does all the heavy lifting. Once the leader is coronated he can 
-start blasting out proposals. As long as he remains the leader no other leader can 
-emerge since no other leader will be able to get a quorum of followers. If a new 
-leader does emerge, 
-it means that the leader has lost quorum, and the new leader will clean up any 
-mess left over during her leadership activation.
-</para>
-
-<para>ZooKeeper messaging operates similar to a classic two-phase commit.</para>
-
-<mediaobject id="fg_2phaseCommit" >
-  <imageobject>
-    <imagedata fileref="images/2pc.jpg"/>
-  </imageobject>
-</mediaobject>
-
-<para>
-All communication channels are FIFO, so everything is done in order. Specifically 
-the following operating constraints are observed:</para>
-
-<itemizedlist>
-
-<listitem><para>The leader sends proposals to all followers using 
-the same order. Moreover, this order follows the order in which requests have been 
-received. Because we use FIFO channels this means that followers also receive proposals in order.
-</para></listitem>
-
-<listitem><para>Followers process messages in the order they are received. This 
-means that messages will be ACKed in order and the leader will receive ACKs from 
-followers in order, due to the FIFO channels. It also means that if message $m$ 
-has been written to non-volatile storage, all messages that were proposed before 
-$m$ have been written to non-volatile storage.</para></listitem>
-
-<listitem><para>The leader will issue a COMMIT to all followers as soon as a 
-quorum of followers have ACKed a message. Since messages are ACKed in order, 
-COMMITs will be sent by the leader as received by the followers in order.</para></listitem>
-
-<listitem><para>COMMITs are processed in order. Followers deliver a proposals 
-message when that proposal is committed.</para></listitem>
-
-</itemizedlist>
-
-</section>
-
-<section id="sc_summary">
-<title>Summary</title>
-<para>So there you go. Why does it work? Specifically, why does a set of proposals 
-believed by a new leader always contain any proposal that has actually been committed? 
-First, all proposals have a unique zxid, so unlike other protocols, we never have 
-to worry about two different values being proposed for the same zxid; followers 
-(a leader is also a follower) see and record proposals in order; proposals are 
-committed in order; there is only one active leader at a time since followers only 
-follow a single leader at a time; a new leader has seen all committed proposals 
-from the previous epoch since it has seen the highest zxid from a quorum of servers; 
-any uncommited proposals from a previous epoch seen by a new leader will be committed 
-by that leader before it becomes active.</para></section>
-
-<section id="sc_comparisons"><title>Comparisons</title>
-<para>
-Isn't this just Multi-Paxos? No, Multi-Paxos requires some way of assuring that 
-there is only a single coordinator. We do not count on such assurances. Instead 
-we use the leader activation to recover from leadership change or old leaders 
-believing they are still active.
-</para>
-
-<para>
-Isn't this just Paxos? Your active messaging phase looks just like phase 2 of Paxos? 
-Actually, to us active messaging looks just like 2 phase commit without the need to 
-handle aborts. Active messaging is different from both in the sense that it has 
-cross proposal ordering requirements. If we do not maintain strict FIFO ordering of 
-all packets, it all falls apart. Also, our leader activation phase is different from 
-both of them. In particular, our use of epochs allows us to skip blocks of uncommitted
-proposals and to not worry about duplicate proposals for a given zxid.
-</para>
-
-</section>
-
-</section>
-
-<section id="sc_quorum">
-<title>Quorums</title>
-
-<para>
-Atomic broadcast and leader election use the notion of quorum to guarantee a consistent
-view of the system. By default, ZooKeeper uses majority quorums, which means that every
-voting that happens in one of these protocols requires a majority to vote on. One example is
-acknowledging a leader proposal: the leader can only commit once it receives an
-acknowledgement from a quorum of servers.
-</para>
-
-<para>
-If we extract the properties that we really need from our use of majorities, we have that we only
-need to guarantee that groups of processes used to validate an operation by voting (e.g., acknowledging
-a leader proposal) pairwise intersect in at least one server. Using majorities guarantees such a property.
-However, there are other ways of constructing quorums different from majorities. For example, we can assign
-weights to the votes of servers, and say that the votes of some servers are more important. To obtain a quorum,
-we get enough votes so that the sum of weights of all votes is larger than half of the total sum of all weights.    
-</para>
-
-<para>
-A different construction that uses weights and is useful in wide-area deployments (co-locations) is a hierarchical
-one. With this construction, we split the servers into disjoint groups and assign weights to processes. To form 
-a quorum, we have to get a hold of enough servers from a majority of groups G, such that for each group g in G,
-the sum of votes from g is larger than half of the sum of weights in g. Interestingly, this construction enables
-smaller quorums. If we have, for example, 9 servers, we split them into 3 groups, and assign a weight of 1 to each
-server, then we are able to form quorums of size 4. Note that two subsets of processes composed each of a majority
-of servers from each of a majority of groups necessarily have a non-empty intersection. It is reasonable to expect
-that a majority of co-locations will have a majority of servers available with high probability. 
-</para>  
-
-<para>
-With ZooKeeper, we provide a user with the ability of configuring servers to use majority quorums, weights, or a 
-hierarchy of groups.
-</para>
-</section>
-
-<section id="sc_logging">
-
-<title>Logging</title>
-<para>
-Zookeeper uses 
-<ulink url="http://www.slf4j.org/index.html">slf4j</ulink> as an abstraction layer for logging. 
-<ulink url="http://logging.apache.org/log4j">log4j</ulink> in version 1.2 is chosen as the final logging implementation for now.
-For better embedding support, it is planned in the future to leave the decision of choosing the final logging implementation to the end user.
-Therefore, always use the slf4j api to write log statements in the code, but configure log4j for how to log at runtime.
-Note that slf4j has no FATAL level, former messages at FATAL level have been moved to ERROR level. 
-For information on configuring log4j for
-ZooKeeper, see the <ulink url="zookeeperAdmin.html#sc_logging">Logging</ulink> section 
-of the <ulink url="zookeeperAdmin.html">ZooKeeper Administrator's Guide.</ulink>
-
-</para>
-
-<section id="sc_developerGuidelines"><title>Developer Guidelines</title>
-
-<para>Please follow the  
-<ulink url="http://www.slf4j.org/manual.html">slf4j manual</ulink> when creating log statements within code.
-Also read the
-<ulink url="http://www.slf4j.org/faq.html#logging_performance">FAQ on performance</ulink>
-, when creating log statements. Patch reviewers will look for the following:</para>
-<section id="sc_rightLevel"><title>Logging at the Right Level</title>
-<para>
-There are several levels of logging in slf4j. 
-It's important to pick the right one. In order of higher to lower severity:</para>
-<orderedlist>
-   <listitem><para>ERROR level designates error events that might still allow the application to continue running.</para></listitem>
-   <listitem><para>WARN level designates potentially harmful situations.</para></listitem>
-   <listitem><para>INFO level designates informational messages that highlight the progress of the application at coarse-grained level.</para></listitem>
-   <listitem><para>DEBUG Level designates fine-grained informational events that are most useful to debug an application.</para></listitem>
-   <listitem><para>TRACE Level designates finer-grained informational events than the DEBUG.</para></listitem>
-</orderedlist>
-
-<para>
-ZooKeeper is typically run in production such that log messages of INFO level 
-severity and higher (more severe) are output to the log.</para>
-
-
-</section>
-
-<section id="sc_slf4jIdioms"><title>Use of Standard slf4j Idioms</title>
-
-<para><emphasis>Static Message Logging</emphasis></para>
-<programlisting>
-LOG.debug("process completed successfully!");
-</programlisting>
-
-<para>
-However when creating parameterized messages are required, use formatting anchors.
-</para>
-
-<programlisting>
-LOG.debug("got {} messages in {} minutes",new Object[]{count,time});    
-</programlisting>
-
-
-<para><emphasis>Naming</emphasis></para>
-
-<para>
-Loggers should be named after the class in which they are used.
-</para>
-
-<programlisting>
-public class Foo {
-    private static final Logger LOG = LoggerFactory.getLogger(Foo.class);
-    ....
-    public Foo() {
-       LOG.info("constructing Foo");
-</programlisting>
-
-<para><emphasis>Exception handling</emphasis></para>
-<programlisting>
-try {
-  // code
-} catch (XYZException e) {
-  // do this
-  LOG.error("Something bad happened", e);
-  // don't do this (generally)
-  // LOG.error(e);
-  // why? because "don't do" case hides the stack trace
- 
-  // continue process here as you need... recover or (re)throw
-}
-</programlisting>
-</section>
-</section>
-
-</section>
-
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperJMX.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperJMX.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperJMX.xml
deleted file mode 100644
index f0ea636..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperJMX.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?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_zookeeperjmx">
-  <title>ZooKeeper JMX</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>ZooKeeper support for JMX</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_jmx">
-    <title>JMX</title>
-    <para>Apache ZooKeeper has extensive support for JMX, allowing you
-    to view and manage a ZooKeeper serving ensemble.</para>
-
-    <para>This document assumes that you have basic knowledge of
-    JMX. See <ulink
-    url="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">
-    Sun JMX Technology</ulink> page to get started with JMX.
-    </para>
-
-    <para>See the <ulink
-    url="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html">
-    JMX Management Guide</ulink> for details on setting up local and
-    remote management of VM instances. By default the included
-    <emphasis>zkServer.sh</emphasis> supports only local management -
-    review the linked document to enable support for remote management
-    (beyond the scope of this document).
-    </para>
-
-  </section>
-
-  <section id="ch_starting">
-    <title>Starting ZooKeeper with JMX enabled</title>
-
-    <para>The class
-      <emphasis>org.apache.zookeeper.server.quorum.QuorumPeerMain</emphasis>
-      will start a JMX manageable ZooKeeper server. This class
-      registers the proper MBeans during initalization to support JMX
-      monitoring and management of the
-      instance. See <emphasis>bin/zkServer.sh</emphasis> for one
-      example of starting ZooKeeper using QuorumPeerMain.</para>
-  </section>
-
-  <section id="ch_console">
-    <title>Run a JMX console</title>
-
-    <para>There are a number of JMX consoles available which can connect
-      to the running server. For this example we will use Sun's
-      <emphasis>jconsole</emphasis>.</para>
-
-    <para>The Java JDK ships with a simple JMX console
-      named <ulink url="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</ulink>
-      which can be used to connect to ZooKeeper and inspect a running
-      server. Once you've started ZooKeeper using QuorumPeerMain
-      start <emphasis>jconsole</emphasis>, which typically resides in
-      <emphasis>JDK_HOME/bin/jconsole</emphasis></para>
-
-    <para>When the "new connection" window is displayed either connect
-      to local process (if jconsole started on same host as Server) or
-      use the remote process connection.</para>
-
-    <para>By default the "overview" tab for the VM is displayed (this
-      is a great way to get insight into the VM btw). Select
-      the "MBeans" tab.</para>
-
-    <para>You should now see <emphasis>org.apache.ZooKeeperService</emphasis>
-      on the left hand side. Expand this item and depending on how you've
-      started the server you will be able to monitor and manage various
-      service related features.</para>
-
-    <para>Also note that ZooKeeper will register log4j MBeans as
-    well. In the same section along the left hand side you will see
-    "log4j". Expand that to manage log4j through JMX. Of particular
-    interest is the ability to dynamically change the logging levels
-    used by editing the appender and root thresholds. Log4j MBean
-    registration can be disabled by passing
-    <emphasis>-Dzookeeper.jmx.log4j.disable=true</emphasis> to the JVM
-    when starting ZooKeeper.
-    </para>
-
-  </section>
-
-  <section id="ch_reference">
-    <title>ZooKeeper MBean Reference</title>
-
-    <para>This table details JMX for a server participating in a
-    replicated ZooKeeper ensemble (ie not standalone). This is the
-    typical case for a production environment.</para>
-
-    <table>
-      <title>MBeans, their names and description</title>
-
-      <tgroup cols='4'>
-        <thead>
-          <row>
-            <entry>MBean</entry>
-            <entry>MBean Object Name</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>Quorum</entry>
-            <entry>ReplicatedServer_id&lt;#&gt;</entry>
-            <entry>Represents the Quorum, or Ensemble - parent of all
-            cluster members. Note that the object name includes the
-            "myid" of the server (name suffix) that your JMX agent has
-            connected to.</entry>
-          </row>
-          <row>
-            <entry>LocalPeer|RemotePeer</entry>
-            <entry>replica.&lt;#&gt;</entry>
-            <entry>Represents a local or remote peer (ie server
-            participating in the ensemble). Note that the object name
-            includes the "myid" of the server (name suffix).</entry>
-          </row>
-          <row>
-            <entry>LeaderElection</entry>
-            <entry>LeaderElection</entry>
-            <entry>Represents a ZooKeeper cluster leader election which is
-            in progress. Provides information about the election, such as
-            when it started.</entry>
-          </row>
-          <row>
-            <entry>Leader</entry>
-            <entry>Leader</entry>
-            <entry>Indicates that the parent replica is the leader and
-            provides attributes/operations for that server. Note that
-            Leader is a subclass of ZooKeeperServer, so it provides
-            all of the information normally associated with a
-            ZooKeeperServer node.</entry>
-          </row>
-          <row>
-            <entry>Follower</entry>
-            <entry>Follower</entry>
-            <entry>Indicates that the parent replica is a follower and
-            provides attributes/operations for that server. Note that
-            Follower is a subclass of ZooKeeperServer, so it provides
-            all of the information normally associated with a
-            ZooKeeperServer node.</entry>
-          </row>
-          <row>
-            <entry>DataTree</entry>
-            <entry>InMemoryDataTree</entry>
-            <entry>Statistics on the in memory znode database, also
-            operations to access finer (and more computationally
-            intensive) statistics on the data (such as ephemeral
-            count). InMemoryDataTrees are children of ZooKeeperServer
-            nodes.</entry>
-          </row>
-          <row>
-            <entry>ServerCnxn</entry>
-            <entry>&lt;session_id&gt;</entry>
-            <entry>Statistics on each client connection, also
-            operations on those connections (such as
-            termination). Note the object name is the session id of
-            the connection in hex form.</entry>
-          </row>
-    </tbody></tgroup></table>
-
-    <para>This table details JMX for a standalone server. Typically
-    standalone is only used in development situations.</para>
-
-    <table>
-      <title>MBeans, their names and description</title>
-
-      <tgroup cols='4'>
-        <thead>
-          <row>
-            <entry>MBean</entry>
-            <entry>MBean Object Name</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>ZooKeeperServer</entry>
-            <entry>StandaloneServer_port&lt;#&gt;</entry>
-            <entry>Statistics on the running server, also operations
-            to reset these attributes. Note that the object name
-            includes the client port of the server (name
-            suffix).</entry>
-          </row>
-          <row>
-            <entry>DataTree</entry>
-            <entry>InMemoryDataTree</entry>
-            <entry>Statistics on the in memory znode database, also
-            operations to access finer (and more computationally
-            intensive) statistics on the data (such as ephemeral
-            count).</entry>
-          </row>
-          <row>
-            <entry>ServerCnxn</entry>
-            <entry>&lt;session_id&gt;</entry>
-            <entry>Statistics on each client connection, also
-            operations on those connections (such as
-            termination). Note the object name is the session id of
-            the connection in hex form.</entry>
-          </row>
-    </tbody></tgroup></table>
-
-  </section>
-
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperObservers.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperObservers.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperObservers.xml
deleted file mode 100644
index fab6769..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperObservers.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?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>ZooKeeper Observers</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 information about using non-voting servers, or
-      observers in your ZooKeeper ensembles.</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_Introduction">
-    <title>Observers: Scaling ZooKeeper Without Hurting Write Performance
-      </title>
-    <para>
-      Although ZooKeeper performs very well by having clients connect directly
-      to voting members of the ensemble, this architecture makes it hard to
-      scale out to huge numbers of clients. The problem is that as we add more
-      voting members, the write performance drops. This is due to the fact that
-      a write operation requires the agreement of (in general) at least half the
-      nodes in an ensemble and therefore the cost of a vote can increase
-      significantly as more voters are added.
-    </para>
-    <para>
-      We have introduced a new type of ZooKeeper node called
-      an <emphasis>Observer</emphasis> which helps address this problem and
-      further improves ZooKeeper's scalability. Observers are non-voting members
-      of an ensemble which only hear the results of votes, not the agreement
-      protocol that leads up to them. Other than this simple distinction,
-      Observers function exactly the same as Followers - clients may connect to
-      them and send read and write requests to them. Observers forward these
-      requests to the Leader like Followers do, but they then simply wait to
-      hear the result of the vote. Because of this, we can increase the number
-      of Observers as much as we like without harming the performance of votes.
-    </para>
-    <para>
-      Observers have other advantages. Because they do not vote, they are not a
-      critical part of the ZooKeeper ensemble. Therefore they can fail, or be
-      disconnected from the cluster, without harming the availability of the
-      ZooKeeper service. The benefit to the user is that Observers may connect
-      over less reliable network links than Followers. In fact, Observers may be
-      used to talk to a ZooKeeper server from another data center. Clients of
-      the Observer will see fast reads, as all reads are served locally, and
-      writes result in minimal network traffic as the number of messages
-      required in the absence of the vote protocol is smaller.
-    </para>
-  </section>
-  <section id="sc_UsingObservers">
-    <title>How to use Observers</title>
-    <para>Setting up a ZooKeeper ensemble that uses Observers is very simple,
-    and requires just two changes to your config files. Firstly, in the config
-    file of every node that is to be an Observer, you must place this line:
-    </para>
-    <programlisting>
-      peerType=observer
-    </programlisting>
-    
-    <para>
-      This line tells ZooKeeper that the server is to be an Observer. Secondly,
-      in every server config file, you must add :observer to the server
-      definition line of each Observer. For example:
-    </para>
-    
-    <programlisting>
-      server.1:localhost:2181:3181:observer
-    </programlisting>
-    
-    <para>
-      This tells every other server that server.1 is an Observer, and that they
-      should not expect it to vote. This is all the configuration you need to do
-      to add an Observer to your ZooKeeper cluster. Now you can connect to it as
-      though it were an ordinary Follower. Try it out, by running:</para>
-    <programlisting>
-      $ bin/zkCli.sh -server localhost:2181
-    </programlisting>
-    <para>
-      where localhost:2181 is the hostname and port number of the Observer as
-      specified in every config file. You should see a command line prompt
-      through which you can issue commands like <emphasis>ls</emphasis> to query
-      the ZooKeeper service.
-    </para>
-  </section>
-  
-  <section id="ch_UseCases">
-    <title>Example use cases</title>
-    <para>
-      Two example use cases for Observers are listed below. In fact, wherever
-      you wish to scale the number of clients of your ZooKeeper ensemble, or
-      where you wish to insulate the critical part of an ensemble from the load
-      of dealing with client requests, Observers are a good architectural
-      choice.
-    </para>
-    <itemizedlist>
-      <listitem>
-	<para> As a datacenter bridge: Forming a ZK ensemble between two
-	datacenters is a problematic endeavour as the high variance in latency
-	between the datacenters could lead to false positive failure detection
-	and partitioning. However if the ensemble runs entirely in one
-	datacenter, and the second datacenter runs only Observers, partitions
-	aren't problematic as the ensemble remains connected. Clients of the
-	Observers may still see and issue proposals.</para>
-      </listitem>
-      <listitem>
-	<para>As a link to a message bus: Some companies have expressed an
-	interest in using ZK as a component of a persistent reliable message
-	bus. Observers would give a natural integration point for this work: a
-	plug-in mechanism could be used to attach the stream of proposals an
-	Observer sees to a publish-subscribe system, again without loading the
-	core ensemble.
-	</para>
-      </listitem>
-    </itemizedlist>
-  </section>
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml
deleted file mode 100644
index a2445b1..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOtherInfo.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?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_OtherInfo">
-  <title>ZooKeeper</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> currently empty </para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_placeholder">
-    <title>Other Info</title>
-    <para> currently empty </para>
-  </section>
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOver.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOver.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperOver.xml
deleted file mode 100644
index f972657..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperOver.xml
+++ /dev/null
@@ -1,464 +0,0 @@
-<?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_Overview">
-  <title>ZooKeeper</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 document contains overview information about ZooKeeper. It
-      discusses design goals, key concepts, implementation, and
-      performance.</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_DesignOverview">
-    <title>ZooKeeper: A Distributed Coordination Service for Distributed
-    Applications</title>
-
-    <para>ZooKeeper is a distributed, open-source coordination service for
-    distributed applications. It exposes a simple set of primitives that
-    distributed applications can build upon to implement higher level services
-    for synchronization, configuration maintenance, and groups and naming. It
-    is designed to be easy to program to, and uses a data model styled after
-    the familiar directory tree structure of file systems. It runs in Java and
-    has bindings for both Java and C.</para>
-
-    <para>Coordination services are notoriously hard to get right. They are
-    especially prone to errors such as race conditions and deadlock. The
-    motivation behind ZooKeeper is to relieve distributed applications the
-    responsibility of implementing coordination services from scratch.</para>
-
-    <section id="sc_designGoals">
-      <title>Design Goals</title>
-
-      <para><emphasis role="bold">ZooKeeper is simple.</emphasis> ZooKeeper
-      allows distributed processes to coordinate with each other through a
-      shared hierarchal namespace which is organized similarly to a standard
-      file system. The name space consists of data registers - called znodes,
-      in ZooKeeper parlance - and these are similar to files and directories.
-      Unlike a typical file system, which is designed for storage, ZooKeeper
-      data is kept in-memory, which means ZooKeeper can achieve high
-      throughput and low latency numbers.</para>
-
-      <para>The ZooKeeper implementation puts a premium on high performance,
-      highly available, strictly ordered access. The performance aspects of
-      ZooKeeper means it can be used in large, distributed systems. The
-      reliability aspects keep it from being a single point of failure. The
-      strict ordering means that sophisticated synchronization primitives can
-      be implemented at the client.</para>
-
-      <para><emphasis role="bold">ZooKeeper is replicated.</emphasis> Like the
-      distributed processes it coordinates, ZooKeeper itself is intended to be
-      replicated over a sets of hosts called an ensemble.</para>
-
-      <figure>
-        <title>ZooKeeper Service</title>
-
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/zkservice.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure>
-
-      <para>The servers that make up the ZooKeeper service must all know about
-      each other. They maintain an in-memory image of state, along with a
-      transaction logs and snapshots in a persistent store. As long as a
-      majority of the servers are available, the ZooKeeper service will be
-      available.</para>
-
-      <para>Clients connect to a single ZooKeeper server. The client maintains
-      a TCP connection through which it sends requests, gets responses, gets
-      watch events, and sends heart beats. If the TCP connection to the server
-      breaks, the client will connect to a different server.</para>
-
-      <para><emphasis role="bold">ZooKeeper is ordered.</emphasis> ZooKeeper
-      stamps each update with a number that reflects the order of all
-      ZooKeeper transactions. Subsequent operations can use the order to
-      implement higher-level abstractions, such as synchronization
-      primitives.</para>
-
-      <para><emphasis role="bold">ZooKeeper is fast.</emphasis> It is
-      especially fast in "read-dominant" workloads. ZooKeeper applications run
-      on thousands of machines, and it performs best where reads are more
-      common than writes, at ratios of around 10:1.</para>
-    </section>
-
-    <section id="sc_dataModelNameSpace">
-      <title>Data model and the hierarchical namespace</title>
-
-      <para>The name space provided by ZooKeeper is much like that of a
-      standard file system. A name is a sequence of path elements separated by
-      a slash (/). Every node in ZooKeeper's name space is identified by a
-      path.</para>
-
-      <figure>
-        <title>ZooKeeper's Hierarchical Namespace</title>
-
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/zknamespace.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure>
-    </section>
-
-    <section>
-      <title>Nodes and ephemeral nodes</title>
-
-      <para>Unlike standard file systems, each node in a ZooKeeper
-      namespace can have data associated with it as well as children. It is
-      like having a file-system that allows a file to also be a directory.
-      (ZooKeeper was designed to store coordination data: status information,
-      configuration, location information, etc., so the data stored at each
-      node is usually small, in the byte to kilobyte range.) We use the term
-      <emphasis>znode</emphasis> to make it clear that we are talking about
-      ZooKeeper data nodes.</para>
-
-      <para>Znodes maintain a stat structure that includes version numbers for
-      data changes, ACL changes, and timestamps, to allow cache validations
-      and coordinated updates. Each time a znode's data changes, the version
-      number increases. For instance, whenever a client retrieves data it also
-      receives the version of the data.</para>
-
-      <para>The data stored at each znode in a namespace is read and written
-      atomically. Reads get all the data bytes associated with a znode and a
-      write replaces all the data. Each node has an Access Control List (ACL)
-      that restricts who can do what.</para>
-
-      <para>ZooKeeper also has the notion of ephemeral nodes. These znodes
-      exists as long as the session that created the znode is active. When the
-      session ends the znode is deleted. Ephemeral nodes are useful when you
-      want to implement <emphasis>[tbd]</emphasis>.</para>
-    </section>
-
-    <section>
-      <title>Conditional updates and watches</title>
-
-      <para>ZooKeeper supports the concept of <emphasis>watches</emphasis>.
-      Clients can set a watch on a znode. A watch will be triggered and
-      removed when the znode changes. When a watch is triggered, the client
-      receives a packet saying that the znode has changed. If the
-      connection between the client and one of the Zoo Keeper servers is
-      broken, the client will receive a local notification. These can be used
-      to <emphasis>[tbd]</emphasis>.</para>
-    </section>
-
-    <section>
-      <title>Guarantees</title>
-
-      <para>ZooKeeper is very fast and very simple. Since its goal, though, is
-      to be a basis for the construction of more complicated services, such as
-      synchronization, it provides a set of guarantees. These are:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para>Sequential Consistency - Updates from a client will be applied
-          in the order that they were sent.</para>
-        </listitem>
-
-        <listitem>
-          <para>Atomicity - Updates either succeed or fail. No partial
-          results.</para>
-        </listitem>
-
-        <listitem>
-          <para>Single System Image - A client will see the same view of the
-          service regardless of the server that it connects to.</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>Reliability - Once an update has been applied, it will persist
-          from that time forward until a client overwrites the update.</para>
-        </listitem>
-      </itemizedlist>
-
-      <itemizedlist>
-        <listitem>
-          <para>Timeliness - The clients view of the system is guaranteed to
-          be up-to-date within a certain time bound.</para>
-        </listitem>
-      </itemizedlist>
-
-      <para>For more information on these, and how they can be used, see
-      <emphasis>[tbd]</emphasis></para>
-    </section>
-
-    <section>
-      <title>Simple API</title>
-
-      <para>One of the design goals of ZooKeeper is provide a very simple
-      programming interface. As a result, it supports only these
-      operations:</para>
-
-      <variablelist>
-        <varlistentry>
-          <term>create</term>
-
-          <listitem>
-            <para>creates a node at a location in the tree</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>delete</term>
-
-          <listitem>
-            <para>deletes a node</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>exists</term>
-
-          <listitem>
-            <para>tests if a node exists at a location</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>get data</term>
-
-          <listitem>
-            <para>reads the data from a node</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>set data</term>
-
-          <listitem>
-            <para>writes data to a node</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>get children</term>
-
-          <listitem>
-            <para>retrieves a list of children of a node</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term>sync</term>
-
-          <listitem>
-            <para>waits for data to be propagated</para>
-          </listitem>
-        </varlistentry>
-      </variablelist>
-
-      <para>For a more in-depth discussion on these, and how they can be used
-      to implement higher level operations, please refer to
-      <emphasis>[tbd]</emphasis></para>
-    </section>
-
-    <section>
-      <title>Implementation</title>
-
-      <para><xref linkend="fg_zkComponents" /> shows the high-level components
-      of the ZooKeeper service. With the exception of the request processor,
-     each of
-      the servers that make up the ZooKeeper service replicates its own copy
-      of each of the components.</para>
-
-      <figure id="fg_zkComponents">
-        <title>ZooKeeper Components</title>
-
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/zkcomponents.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure>
-
-      <para>The replicated database is an in-memory database containing the
-      entire data tree. Updates are logged to disk for recoverability, and
-      writes are serialized to disk before they are applied to the in-memory
-      database.</para>
-
-      <para>Every ZooKeeper server services clients. Clients connect to
-      exactly one server to submit irequests. Read requests are serviced from
-      the local replica of each server database. Requests that change the
-      state of the service, write requests, are processed by an agreement
-      protocol.</para>
-
-      <para>As part of the agreement protocol all write requests from clients
-      are forwarded to a single server, called the
-      <emphasis>leader</emphasis>. The rest of the ZooKeeper servers, called
-      <emphasis>followers</emphasis>, receive message proposals from the
-      leader and agree upon message delivery. The messaging layer takes care
-      of replacing leaders on failures and syncing followers with
-      leaders.</para>
-
-      <para>ZooKeeper uses a custom atomic messaging protocol. Since the
-      messaging layer is atomic, ZooKeeper can guarantee that the local
-      replicas never diverge. When the leader receives a write request, it
-      calculates what the state of the system is when the write is to be
-      applied and transforms this into a transaction that captures this new
-      state.</para>
-    </section>
-
-    <section>
-      <title>Uses</title>
-
-      <para>The programming interface to ZooKeeper is deliberately simple.
-      With it, however, you can implement higher order operations, such as
-      synchronizations primitives, group membership, ownership, etc. Some
-      distributed applications have used it to: <emphasis>[tbd: add uses from
-      white paper and video presentation.]</emphasis> For more information, see
-      <emphasis>[tbd]</emphasis></para>
-    </section>
-
-    <section>
-      <title>Performance</title>
-
-      <para>ZooKeeper is designed to be highly performant. But is it? The
-      results of the ZooKeeper's development team at Yahoo! Research indicate
-      that it is. (See <xref linkend="fg_zkPerfRW" />.) It is especially high
-      performance in applications where reads outnumber writes, since writes
-      involve synchronizing the state of all servers. (Reads outnumbering
-      writes is typically the case for a coordination service.)</para>
-
-      <figure id="fg_zkPerfRW">
-        <title>ZooKeeper Throughput as the Read-Write Ratio Varies</title>
-
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/zkperfRW-3.2.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure>
-      <para>The figure <xref linkend="fg_zkPerfRW"/> is a throughput
-      graph of ZooKeeper release 3.2 running on servers with dual 2Ghz
-      Xeon and two SATA 15K RPM drives.  One drive was used as a
-      dedicated ZooKeeper log device. The snapshots were written to
-      the OS drive. Write requests were 1K writes and the reads were
-      1K reads.  "Servers" indicate the size of the ZooKeeper
-      ensemble, the number of servers that make up the
-      service. Approximately 30 other servers were used to simulate
-      the clients. The ZooKeeper ensemble was configured such that
-      leaders do not allow connections from clients.</para>
-
-      <note><para>In version 3.2 r/w performance improved by ~2x
-      compared to the <ulink
-      url="http://zookeeper.apache.org/docs/r3.1.1/zookeeperOver.html#Performance">previous
-      3.1 release</ulink>.</para></note>
-
-      <para>Benchmarks also indicate that it is reliable, too. <xref
-      linkend="fg_zkPerfReliability" /> shows how a deployment responds to
-      various failures. The events marked in the figure are the
-      following:</para>
-
-      <orderedlist>
-        <listitem>
-          <para>Failure and recovery of a follower</para>
-        </listitem>
-
-        <listitem>
-          <para>Failure and recovery of a different follower</para>
-        </listitem>
-
-        <listitem>
-          <para>Failure of the leader</para>
-        </listitem>
-
-        <listitem>
-          <para>Failure and recovery of two followers</para>
-        </listitem>
-
-        <listitem>
-          <para>Failure of another leader</para>
-        </listitem>
-      </orderedlist>
-    </section>
-
-    <section>
-      <title>Reliability</title>
-
-      <para>To show the behavior of the system over time as
-        failures are injected we ran a ZooKeeper service made up of
-        7 machines. We ran the same saturation benchmark as before,
-        but this time we kept the write percentage at a constant
-        30%, which is a conservative ratio of our expected
-        workloads.
-      </para>
-      <figure id="fg_zkPerfReliability">
-        <title>Reliability in the Presence of Errors</title>
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/zkperfreliability.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure>
-
-      <para>The are a few important observations from this graph. First, if
-      followers fail and recover quickly, then ZooKeeper is able to sustain a
-      high throughput despite the failure. But maybe more importantly, the
-      leader election algorithm allows for the system to recover fast enough
-      to prevent throughput from dropping substantially. In our observations,
-      ZooKeeper takes less than 200ms to elect a new leader. Third, as
-      followers recover, ZooKeeper is able to raise throughput again once they
-      start processing requests.</para>
-    </section>
-
-    <section>
-      <title>The ZooKeeper Project</title>
-
-      <para>ZooKeeper has been
-          <ulink url="https://cwiki.apache.org/confluence/display/ZOOKEEPER/PoweredBy">
-          successfully used
-        </ulink>
-        in many industrial applications.  It is used at Yahoo! as the
-        coordination and failure recovery service for Yahoo! Message
-        Broker, which is a highly scalable publish-subscribe system
-        managing thousands of topics for replication and data
-        delivery.  It is used by the Fetching Service for Yahoo!
-        crawler, where it also manages failure recovery. A number of
-        Yahoo! advertising systems also use ZooKeeper to implement
-        reliable services.
-      </para>
-
-      <para>All users and developers are encouraged to join the
-        community and contribute their expertise. See the
-        <ulink url="http://zookeeper.apache.org/">
-          Zookeeper Project on Apache
-        </ulink>
-        for more information.
-      </para>
-    </section>
-  </section>
-</article>


[02/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperQuotas.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperQuotas.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperQuotas.xml
deleted file mode 100644
index 7668e6a..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperQuotas.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?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_Quota">
-	<title>ZooKeeper Quota's Guide</title>
-	<subtitle>A Guide to Deployment and Administration</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 ZooKeeper. It also discusses best
-				practices and common problems.</para>
-		</abstract>
-	</articleinfo>
-	<section id="zookeeper_quotas">
-	<title>Quotas</title>
-	<para> ZooKeeper has both namespace and bytes quotas. You can use the ZooKeeperMain class to setup quotas.
-	ZooKeeper prints <emphasis>WARN</emphasis> messages if users exceed the quota assigned to them. The messages 
-	are printed in the log of the ZooKeeper. 
-	</para>
-	<para><computeroutput>$ bin/zkCli.sh -server host:port</computeroutput></para>
-	 <para> The above command gives you a command line option of using quotas.</para>
-	 <section>
-	 <title>Setting Quotas</title>
-	<para>You can use 
-	 <emphasis>setquota</emphasis> to set a quota on a ZooKeeper node. It has an option of setting quota with
-	  -n (for namespace)
-	 and -b (for bytes). </para>
-	<para> The ZooKeeper quota are stored in ZooKeeper itself in /zookeeper/quota. To disable other people from
-	changing the quota's set the ACL for /zookeeper/quota such that only admins are able to read and write to it.
-	</para>
-	</section>
-	<section>
-	<title>Listing Quotas</title>
-	<para> You can use
-	<emphasis>listquota</emphasis> to list a quota on a ZooKeeper node.
-	</para>
-	</section>
-	<section>
-	<title> Deleting Quotas</title>
-	<para> You can use
-	<emphasis>delquota</emphasis> to delete quota on a ZooKeeper node.
-	</para>
-	</section>
-	</section>
-	</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperReconfig.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperReconfig.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperReconfig.xml
deleted file mode 100644
index ae22951..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperReconfig.xml
+++ /dev/null
@@ -1,883 +0,0 @@
-<?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="ar_reconfig">
-  <title>ZooKeeper Dynamic Reconfiguration</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 document contains information about Dynamic Reconfiguration in
-        ZooKeeper.</para>
-    </abstract>
-  </articleinfo>
-  <section id="ch_reconfig_intro">
-    <title>Overview</title>
-    <para>Prior to the 3.5.0 release, the membership and all other configuration
-      parameters of Zookeeper were static - loaded during boot and immutable at
-      runtime. Operators resorted to ''rolling restarts'' - a manually intensive
-      and error-prone method of changing the configuration that has caused data
-      loss and inconsistency in production.</para>
-    <para>Starting with 3.5.0, “rolling restarts” are no longer needed!
-      ZooKeeper comes with full support for automated configuration changes: the
-      set of Zookeeper servers, their roles (participant / observer), all ports,
-      and even the quorum system can be changed dynamically, without service
-      interruption and while maintaining data consistency. Reconfigurations are
-      performed immediately, just like other operations in ZooKeeper. Multiple
-      changes can be done using a single reconfiguration command. The dynamic
-      reconfiguration functionality does not limit operation concurrency, does
-      not require client operations to be stopped during reconfigurations, has a
-      very simple interface for administrators and no added complexity to other
-      client operations.</para>
-    <para>New client-side features allow clients to find out about configuration
-      changes and to update the connection string (list of servers and their
-      client ports) stored in their ZooKeeper handle. A probabilistic algorithm
-      is used to rebalance clients across the new configuration servers while
-      keeping the extent of client migrations proportional to the change in
-      ensemble membership.</para>
-    <para>This document provides the administrator manual for reconfiguration.
-      For a detailed description of the reconfiguration algorithms, performance
-      measurements, and more, please see our paper:</para>
-    <variablelist>
-      <varlistentry>
-        <term>Shraer, A., Reed, B., Malkhi, D., Junqueira, F. Dynamic
-          Reconfiguration of Primary/Backup Clusters. In <emphasis>USENIX Annual
-          Technical Conference (ATC) </emphasis>(2012), 425-437</term>
-        <listitem>
-          <para>Links: <ulink
-            url="https://www.usenix.org/system/files/conference/atc12/atc12-final74.pdf"
-            >paper (pdf)</ulink>, <ulink
-            url="https://www.usenix.org/sites/default/files/conference/protected-files/shraer_atc12_slides.pdf"
-            >slides (pdf)</ulink>, <ulink
-            url="https://www.usenix.org/conference/atc12/technical-sessions/presentation/shraer"
-            >video</ulink>, <ulink
-            url="http://www.slideshare.net/Hadoop_Summit/dynamic-reconfiguration-of-zookeeper"
-            >hadoop summit slides</ulink></para>
-        </listitem>
-      </varlistentry>
-    </variablelist>
-    <para><emphasis role="bold">Note:</emphasis> Starting with 3.5.3, the dynamic reconfiguration
-      feature is disabled by default, and has to be explicitly turned on via
-      <ulink url="zookeeperAdmin.html#sc_advancedConfiguration">
-        reconfigEnabled </ulink> configuration option.
-    </para>
-  </section>
-  <section id="ch_reconfig_format">
-    <title>Changes to Configuration Format</title>
-    <section id="sc_reconfig_clientport">
-      <title>Specifying the client port</title>
-      <para>A client port of a server is the port on which the server accepts
-        client connection requests. Starting with 3.5.0 the
-        <emphasis>clientPort</emphasis> and <emphasis>clientPortAddress
-        </emphasis> configuration parameters should no longer be used. Instead,
-        this information is now part of the server keyword specification, which
-        becomes as follows:</para>
-      <para><computeroutput><![CDATA[server.<positive id> = <address1>:<port1>:<port2>[:role];[<client port address>:]<client port>]]></computeroutput></para>
-      <para>The client port specification is to the right of the semicolon. The
-        client port address is optional, and if not specified it defaults to
-        "0.0.0.0". As usual, role is also optional, it can be
-        <emphasis>participant</emphasis> or <emphasis>observer</emphasis>
-        (<emphasis>participant</emphasis> by default).</para>
-      <para> Examples of legal server statements: </para>
-      <itemizedlist>
-        <listitem>
-          <para><computeroutput>server.5 = 125.23.63.23:1234:1235;1236</computeroutput></para>
-        </listitem>
-        <listitem>
-          <para><computeroutput>server.5 = 125.23.63.23:1234:1235:participant;1236</computeroutput></para>
-        </listitem>
-        <listitem>
-          <para><computeroutput>server.5 = 125.23.63.23:1234:1235:observer;1236</computeroutput></para>
-        </listitem>
-        <listitem>
-          <para><computeroutput>server.5 = 125.23.63.23:1234:1235;125.23.63.24:1236</computeroutput></para>
-        </listitem>
-        <listitem>
-          <para><computeroutput>server.5 = 125.23.63.23:1234:1235:participant;125.23.63.23:1236</computeroutput></para>
-        </listitem>
-      </itemizedlist>
-    </section>
-    <section id="sc_reconfig_standaloneEnabled">
-      <title>The <emphasis>standaloneEnabled</emphasis> flag</title>
-      <para>Prior to 3.5.0, one could run ZooKeeper in Standalone mode or in a
-        Distributed mode. These are separate implementation stacks, and
-        switching between them during run time is not possible. By default (for
-        backward compatibility) <emphasis>standaloneEnabled</emphasis> is set to
-        <emphasis>true</emphasis>. The consequence of using this default is that
-        if started with a single server the ensemble will not be allowed to
-        grow, and if started with more than one server it will not be allowed to
-        shrink to contain fewer than two participants.</para>
-      <para>Setting the flag to <emphasis>false</emphasis> instructs the system
-        to run the Distributed software stack even if there is only a single
-        participant in the ensemble. To achieve this the (static) configuration
-        file should contain:</para>
-      <para><computeroutput>standaloneEnabled=false</computeroutput></para>
-      <para>With this setting it is possible to start a ZooKeeper ensemble
-        containing a single participant and to dynamically grow it by adding
-        more servers. Similarly, it is possible to shrink an ensemble so that
-        just a single participant remains, by removing servers.</para>
-      <para>Since running the Distributed mode allows more flexibility, we
-        recommend setting the flag to <emphasis>false</emphasis>. We expect that
-        the legacy Standalone mode will be deprecated in the future.</para>
-    </section>
-    <section id="sc_reconfig_reconfigEnabled">
-      <title>The <emphasis>reconfigEnabled</emphasis> flag</title>
-      <para>Starting with 3.5.0 and prior to 3.5.3, there is no way to disable
-        dynamic reconfiguration feature. We would like to offer the option of
-        disabling reconfiguration feature because with reconfiguration enabled,
-        we have a security concern that a malicious actor can make arbitrary changes
-        to the configuration of a ZooKeeper ensemble, including adding a compromised
-        server to the ensemble. We prefer to leave to the discretion of the user to
-        decide whether to enable it or not and make sure that the appropriate security
-        measure are in place. So in 3.5.3 the <ulink url="zookeeperAdmin.html#sc_advancedConfiguration">
-          reconfigEnabled </ulink> configuration option is introduced
-        such that the reconfiguration feature can be completely disabled and any attempts
-        to reconfigure a cluster through reconfig API with or without authentication
-        will fail by default, unless <emphasis role="bold">reconfigEnabled</emphasis> is set to
-        <emphasis role="bold">true</emphasis>.
-      </para>
-      <para>To set the option to true, the configuration file (zoo.cfg) should contain:</para>
-      <para><computeroutput>reconfigEnabled=true</computeroutput></para>
-    </section>
-    <section id="sc_reconfig_file">
-      <title>Dynamic configuration file</title>
-      <para>Starting with 3.5.0 we're distinguishing between dynamic
-        configuration parameters, which can be changed during runtime, and
-        static configuration parameters, which are read from a configuration
-        file when a server boots and don't change during its execution. For now,
-        the following configuration keywords are considered part of the dynamic
-        configuration: <emphasis>server</emphasis>, <emphasis>group</emphasis>
-        and <emphasis>weight</emphasis>.</para>
-      <para>Dynamic configuration parameters are stored in a separate file on
-        the server (which we call the dynamic configuration file). This file is
-        linked from the static config file using the new
-        <emphasis>dynamicConfigFile</emphasis> keyword.</para>
-      <para><emphasis role="bold">Example</emphasis></para>
-      <example>
-        <title>zoo_replicated1.cfg</title>
-        <programlisting>tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-dynamicConfigFile=/zookeeper/conf/zoo_replicated1.cfg.dynamic</programlisting>
-      </example>
-      <example>
-        <title>zoo_replicated1.cfg.dynamic</title>
-        <programlisting>server.1=125.23.63.23:2780:2783:participant;2791
-server.2=125.23.63.24:2781:2784:participant;2792
-server.3=125.23.63.25:2782:2785:participant;2793</programlisting>
-      </example>
-      <para>When the ensemble configuration changes, the static configuration
-        parameters remain the same. The dynamic parameters are pushed by
-        ZooKeeper and overwrite the dynamic configuration files on all servers.
-        Thus, the dynamic configuration files on the different servers are
-        usually identical (they can only differ momentarily when a
-        reconfiguration is in progress, or if a new configuration hasn't
-        propagated yet to some of the servers). Once created, the dynamic
-        configuration file should not be manually altered. Changed are only made
-        through the new reconfiguration commands outlined below. Note that
-        changing the config of an offline cluster could result in an
-        inconsistency with respect to configuration information stored in the
-        ZooKeeper log (and the special configuration znode, populated from the
-        log) and is therefore highly discouraged.</para>
-      <para><emphasis role="bold">Example 2</emphasis></para>
-      <para>Users may prefer to initially specify a single configuration file.
-        The following is thus also legal:</para>
-      <example>
-        <title>zoo_replicated1.cfg</title>
-        <programlisting>tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-clientPort=<emphasis role="bold">2791</emphasis>  // note that this line is now redundant and therefore not recommended
-server.1=125.23.63.23:2780:2783:participant;<emphasis role="bold">2791</emphasis>
-server.2=125.23.63.24:2781:2784:participant;2792
-server.3=125.23.63.25:2782:2785:participant;2793</programlisting>
-      </example>
-      <para>The configuration files on each server will be automatically split
-        into dynamic and static files, if they are not already in this format.
-        So the configuration file above will be automatically transformed into
-        the two files in Example 1. Note that the clientPort and
-        clientPortAddress lines (if specified) will be automatically removed
-        during this process, if they are redundant (as in the example above).
-        The original static configuration file is backed up (in a .bak
-        file).</para>
-    </section>
-    <section id="sc_reconfig_backward">
-      <title>Backward compatibility</title>
-      <para>We still support the old configuration format. For example, the
-        following configuration file is acceptable (but not recommended):</para>
-      <example>
-        <title>zoo_replicated1.cfg</title>
-        <programlisting>tickTime=2000
-dataDir=/zookeeper/data/zookeeper1
-initLimit=5
-syncLimit=2
-clientPort=2791
-server.1=125.23.63.23:2780:2783:participant
-server.2=125.23.63.24:2781:2784:participant
-server.3=125.23.63.25:2782:2785:participant</programlisting>
-      </example>
-      <para>During boot, a dynamic configuration file is created and contains
-        the dynamic part of the configuration as explained earlier. In this
-        case, however, the line "clientPort=2791" will remain in the static
-        configuration file of server 1 since it is not redundant -- it was not
-        specified as part of the "server.1=..." using the format explained in
-        the section <xref linkend="ch_reconfig_format"/>. If a reconfiguration
-        is invoked that sets the client port of server 1, we remove
-        "clientPort=2791" from the static configuration file (the dynamic file
-        now contain this information as part of the specification of server
-        1).</para>
-    </section>
-  </section>
-  <section id="ch_reconfig_upgrade">
-    <title>Upgrading to 3.5.0</title>
-    <para>Upgrading a running ZooKeeper ensemble to 3.5.0 should be done only
-      after upgrading your ensemble to the 3.4.6 release. Note that this is only
-      necessary for rolling upgrades (if you're fine with shutting down the
-      system completely, you don't have to go through 3.4.6). If you attempt a
-      rolling upgrade without going through 3.4.6 (for example from 3.4.5), you
-      may get the following error:</para>
-    <programlisting>2013-01-30 11:32:10,663 [myid:2] - INFO [localhost/127.0.0.1:2784:QuorumCnxManager$Listener@498] - Received connection request /127.0.0.1:60876
-2013-01-30 11:32:10,663 [myid:2] - WARN [localhost/127.0.0.1:2784:QuorumCnxManager@349] - Invalid server id: -65536</programlisting>
-    <para>During a rolling upgrade, each server is taken down in turn and
-      rebooted with the new 3.5.0 binaries. Before starting the server with
-      3.5.0 binaries, we highly recommend updating the configuration file so
-      that all server statements "server.x=..." contain client ports (see the
-      section <xref linkend="sc_reconfig_clientport"/>). As explained earlier
-      you may leave the configuration in a single file, as well as leave the
-      clientPort/clientPortAddress statements (although if you specify client
-      ports in the new format, these statements are now redundant).</para>
-  </section>
-
-  <section id="ch_reconfig_dyn">
-    <title>Dynamic Reconfiguration of the ZooKeeper Ensemble</title>
-    <para>The ZooKeeper Java and C API were extended with getConfig and reconfig
-      commands that facilitate reconfiguration. Both commands have a synchronous
-      (blocking) variant and an asynchronous one. We demonstrate these commands
-      here using the Java CLI, but note that you can similarly use the C CLI or
-      invoke the commands directly from a program just like any other ZooKeeper
-      command.</para>
-
-    <section id="ch_reconfig_api">
-      <title>API</title>
-      <para>There are two sets of APIs for both Java and C client.
-      </para>
-      <variablelist>
-        <varlistentry>
-          <term><emphasis role="bold">Reconfiguration API</emphasis></term>
-
-          <listitem>
-            <para>Reconfiguration API is used to reconfigure the ZooKeeper cluster.
-              Starting with 3.5.3, reconfiguration Java APIs are moved into ZooKeeperAdmin class
-              from ZooKeeper class, and use of this API requires ACL setup and user
-              authentication (see <xref linkend="sc_reconfig_access_control"/> for more information.).
-            </para>
-
-            <para>Note: for temporary backward compatibility, the reconfig() APIs will remain in ZooKeeper.java
-              where they were for a few alpha versions of 3.5.x. However, these APIs are deprecated and users
-              should move to the reconfigure() APIs in ZooKeeperAdmin.java.
-            </para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term><emphasis role="bold">Get Configuration API</emphasis></term>
-          <listitem>
-            <para>Get configuration APIs are used to retrieve ZooKeeper cluster configuration information
-              stored in /zookeeper/config znode. Use of this API does not require specific setup or authentication,
-            because /zookeeper/config is readable to any users.</para>
-          </listitem>
-        </varlistentry>
-      </variablelist>
-    </section>
-
-    <section id="sc_reconfig_access_control">
-      <title>Security</title>
-      <para>Prior to <emphasis role="bold">3.5.3</emphasis>, there is no enforced security mechanism
-        over reconfig so any ZooKeeper clients that can connect to ZooKeeper server ensemble
-        will have the ability to change the state of a ZooKeeper cluster via reconfig.
-        It is thus possible for a malicious client to add compromised server to an ensemble,
-        e.g., add a compromised server, or remove legitimate servers.
-        Cases like these could be security vulnerabilities on a case by case basis.
-      </para>
-      <para>To address this security concern, we introduced access control over reconfig
-        starting from <emphasis role="bold">3.5.3</emphasis> such that only a specific set of users
-        can use reconfig commands or APIs, and these users need be configured explicitly. In addition,
-        the setup of ZooKeeper cluster must enable authentication so ZooKeeper clients can be authenticated.
-      </para>
-      <para>
-        We also provides an escape hatch for users who operate and interact with a ZooKeeper ensemble in a secured
-        environment (i.e. behind company firewall). For those users who want to use reconfiguration feature but
-        don't want the overhead of configuring an explicit list of authorized user for reconfig access checks,
-        they can set <ulink url="zookeeperAdmin.html#sc_authOptions">"skipACL"</ulink> to "yes" which will
-        skip ACL check and allow any user to reconfigure cluster.
-      </para>
-      <para>
-        Overall, ZooKeeper provides flexible configuration options for the reconfigure feature
-        that allow a user to choose based on user's security requirement.
-        We leave to the discretion of the user to decide appropriate security measure are in place.
-      </para>
-      <variablelist>
-        <varlistentry>
-          <term><emphasis role="bold">Access Control</emphasis></term>
-
-          <listitem>
-            <para>The dynamic configuration is stored in a special znode
-              ZooDefs.CONFIG_NODE = /zookeeper/config. This node by default is read only
-              for all users, except super user and users that's explicitly configured for write
-              access.
-            </para>
-
-            <para>Clients that need to use reconfig commands or reconfig API should be configured as users
-              that have write access to CONFIG_NODE. By default, only the super user has full control including
-              write access to CONFIG_NODE. Additional users can be granted write access through superuser
-              by setting an ACL that has write permission associated with specified user.
-            </para>
-
-            <para>A few examples of how to setup ACLs and use reconfiguration API with authentication can be found in
-              ReconfigExceptionTest.java and TestReconfigServer.cc.</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term><emphasis role="bold">Authentication</emphasis></term>
-
-          <listitem>
-            <para>Authentication of users is orthogonal to the access control and is delegated to
-              existing authentication mechanism supported by ZooKeeper's pluggable authentication schemes.
-              See <ulink
-                      url="https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zookeeper+and+SASL"
-              >ZooKeeper and SASL</ulink> for more details on this topic.
-            </para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term><emphasis role="bold">Disable ACL check</emphasis></term>
-          <listitem>
-            <para>
-              ZooKeeper supports <ulink
-                    url="zookeeperAdmin.html#sc_authOptions">"skipACL"</ulink> option such that ACL
-              check will be completely skipped, if skipACL is set to "yes". In such cases any unauthenticated
-              users can use reconfig API.
-            </para>
-          </listitem>
-        </varlistentry>
-      </variablelist>
-    </section>
-
-    <section id="sc_reconfig_retrieving">
-      <title>Retrieving the current dynamic configuration</title>
-      <para>The dynamic configuration is stored in a special znode
-        ZooDefs.CONFIG_NODE = /zookeeper/config. The new
-        <command>config</command> CLI command reads this znode (currently it is
-        simply a wrapper to <command>get /zookeeper/config</command>). As with
-        normal reads, to retrieve the latest committed value you should do a
-        <command>sync</command> first.</para>
-      <programlisting>[zk: 127.0.0.1:2791(CONNECTED) 3] config
-server.1=localhost:2780:2783:participant;localhost:2791
-server.2=localhost:2781:2784:participant;localhost:2792
-server.3=localhost:2782:2785:participant;localhost:2793
-<emphasis role="bold">version=400000003</emphasis></programlisting>
-      <para>Notice the last line of the output. This is the configuration
-        version. The version equals to the zxid of the reconfiguration command
-        which created this configuration. The version of the first established
-        configuration equals to the zxid of the NEWLEADER message sent by the
-        first successfully established leader. When a configuration is written
-        to a dynamic configuration file, the version automatically becomes part
-        of the filename and the static configuration file is updated with the
-        path to the new dynamic configuration file. Configuration files
-        corresponding to earlier versions are retained for backup
-        purposes.</para>
-      <para>During boot time the version (if it exists) is extracted from the
-        filename. The version should never be altered manually by users or the
-        system administrator. It is used by the system to know which
-        configuration is most up-to-date. Manipulating it manually can result in
-        data loss and inconsistency.</para>
-      <para>Just like a <command>get</command> command, the
-        <command>config</command> CLI command accepts the <option>-w</option>
-        flag for setting a watch on the znode, and <option>-s</option> flag for
-        displaying the Stats of the znode. It additionally accepts a new flag
-        <option>-c</option> which outputs only the version and the client
-        connection string corresponding to the current configuration. For
-        example, for the configuration above we would get:</para>
-      <programlisting>[zk: 127.0.0.1:2791(CONNECTED) 17] config -c
-400000003 localhost:2791,localhost:2793,localhost:2792</programlisting>
-      <para>Note that when using the API directly, this command is called
-        <command>getConfig</command>.</para>
-      <para>As any read command it returns the configuration known to the
-        follower to which your client is connected, which may be slightly
-        out-of-date. One can use the <command>sync</command> command for
-        stronger guarantees. For example using the Java API:</para>
-      <programlisting>zk.sync(ZooDefs.CONFIG_NODE, void_callback, context);
-zk.getConfig(watcher, callback, context);</programlisting>
-      <para>Note: in 3.5.0 it doesn't really matter which path is passed to the
-        <command>sync() </command> command as all the server's state is brought
-        up to date with the leader (so one could use a different path instead of
-        ZooDefs.CONFIG_NODE). However, this may change in the future.</para>
-    </section>
-    <section id="sc_reconfig_modifying">
-      <title>Modifying the current dynamic configuration</title>
-      <para>Modifying the configuration is done through the
-        <command>reconfig</command> command. There are two modes of
-        reconfiguration: incremental and non-incremental (bulk). The
-        non-incremental simply specifies the new dynamic configuration of the
-        system. The incremental specifies changes to the current configuration.
-        The <command>reconfig</command> command returns the new
-        configuration.</para>
-      <para>A few examples are in: <filename>ReconfigTest.java</filename>,
-        <filename>ReconfigRecoveryTest.java</filename> and
-        <filename>TestReconfigServer.cc</filename>.</para>
-      <section id="sc_reconfig_general">
-        <title>General</title>
-        <para><emphasis role="bold">Removing servers:</emphasis> Any server can
-          be removed, including the leader (although removing the leader will
-          result in a short unavailability, see Figures 6 and 8 in the <ulink
-          url="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters"
-          >paper</ulink>). The server will not be shut-down automatically.
-          Instead, it becomes a "non-voting follower". This is somewhat similar
-          to an observer in that its votes don't count towards the Quorum of
-          votes necessary to commit operations. However, unlike a non-voting
-          follower, an observer doesn't actually see any operation proposals and
-          does not ACK them. Thus a non-voting follower has a more significant
-          negative effect on system throughput compared to an observer.
-          Non-voting follower mode should only be used as a temporary mode,
-          before shutting the server down, or adding it as a follower or as an
-          observer to the ensemble. We do not shut the server down automatically
-          for two main reasons. The first reason is that we do not want all the
-          clients connected to this server to be immediately disconnected,
-          causing a flood of connection requests to other servers. Instead, it
-          is better if each client decides when to migrate independently. The
-          second reason is that removing a server may sometimes (rarely) be
-          necessary in order to change it from "observer" to "participant" (this
-          is explained in the section <xref linkend="sc_reconfig_additional"
-          />).</para>
-        <para>Note that the new configuration should have some minimal number of
-          participants in order to be considered legal. If the proposed change
-          would leave the cluster with less than 2 participants and standalone
-          mode is enabled (standaloneEnabled=true, see the section <xref
-          linkend="sc_reconfig_standaloneEnabled"/>), the reconfig will not be
-          processed (BadArgumentsException). If standalone mode is disabled
-          (standaloneEnabled=false) then its legal to remain with 1 or more
-          participants.</para>
-        <para><emphasis role="bold">Adding servers:</emphasis> Before a
-          reconfiguration is invoked, the administrator must make sure that a
-          quorum (majority) of participants from the new configuration are
-          already connected and synced with the current leader. To achieve this
-          we need to connect a new joining server to the leader before it is
-          officially part of the ensemble. This is done by starting the joining
-          server using an initial list of servers which is technically not a
-          legal configuration of the system but (a) contains the joiner, and (b)
-          gives sufficient information to the joiner in order for it to find and
-          connect to the current leader. We list a few different options of
-          doing this safely.</para>
-        <orderedlist>
-          <listitem>
-            <para>Initial configuration of joiners is comprised of servers in
-              the last committed configuration and one or more joiners, where
-              <emphasis role="bold">joiners are listed as observers.</emphasis>
-              For example, if servers D and E are added at the same time to (A,
-              B, C) and server C is being removed, the initial configuration of
-              D could be (A, B, C, D) or (A, B, C, D, E), where D and E are
-              listed as observers. Similarly, the configuration of E could be
-              (A, B, C, E) or (A, B, C, D, E), where D and E are listed as
-              observers. <emphasis role="bold">Note that listing the joiners as
-              observers will not actually make them observers - it will only
-              prevent them from accidentally forming a quorum with other
-              joiners.</emphasis> Instead, they will contact the servers in the
-              current configuration and adopt the last committed configuration
-              (A, B, C), where the joiners are absent. Configuration files of
-              joiners are backed up and replaced automatically as this happens.
-              After connecting to the current leader, joiners become non-voting
-              followers until the system is reconfigured and they are added to
-              the ensemble (as participant or observer, as appropriate).</para>
-          </listitem>
-          <listitem>
-            <para>Initial configuration of each joiner is comprised of servers
-              in the last committed configuration + <emphasis role="bold">the
-              joiner itself, listed as a participant.</emphasis> For example, to
-              add a new server D to a configuration consisting of servers (A, B,
-              C), the administrator can start D using an initial configuration
-              file consisting of servers (A, B, C, D). If both D and E are added
-              at the same time to (A, B, C), the initial configuration of D
-              could be (A, B, C, D) and the configuration of E could be (A, B,
-              C, E). Similarly, if D is added and C is removed at the same time,
-              the initial configuration of D could be (A, B, C, D). Never list
-              more than one joiner as participant in the initial configuration
-              (see warning below).</para>
-          </listitem>
-          <listitem>
-            <para>Whether listing the joiner as an observer or as participant,
-              it is also fine not to list all the current configuration servers,
-              as long as the current leader is in the list. For example, when
-              adding D we could start D with a configuration file consisting of
-              just (A, D) if A is the current leader. however this is more
-              fragile since if A fails before D officially joins the ensemble, D
-              doesn’t know anyone else and therefore the administrator will have
-              to intervene and restart D with another server list.</para>
-          </listitem>
-        </orderedlist>
-        <note>
-          <title>Warning</title>
-          <para>Never specify more than one joining server in the same initial
-            configuration as participants. Currently, the joining servers don’t
-            know that they are joining an existing ensemble; if multiple joiners
-            are listed as participants they may form an independent quorum
-            creating a split-brain situation such as processing operations
-            independently from your main ensemble. It is OK to list multiple
-            joiners as observers in an initial config.</para>
-        </note>
-        <para>If the configuration of existing servers changes or they become unavailable
-          before the joiner succeeds to connect and learn obout configuration changes, the
-          joiner may need to be restarted with an updated configuration file in order to be
-          able to connect.</para>
-        <para>Finally, note that once connected to the leader, a joiner adopts
-          the last committed configuration, in which it is absent (the initial
-          config of the joiner is backed up before being rewritten). If the
-          joiner restarts in this state, it will not be able to boot since it is
-          absent from its configuration file. In order to start it you’ll once
-          again have to specify an initial configuration.</para>
-        <para><emphasis role="bold">Modifying server parameters:</emphasis> One
-          can modify any of the ports of a server, or its role
-          (participant/observer) by adding it to the ensemble with different
-          parameters. This works in both the incremental and the bulk
-          reconfiguration modes. It is not necessary to remove the server and
-          then add it back; just specify the new parameters as if the server is
-          not yet in the system. The server will detect the configuration change
-          and perform the necessary adjustments. See an example in the section
-          <xref linkend="sc_reconfig_incremental"/> and an exception to this
-          rule in the section <xref linkend="sc_reconfig_additional"/>.</para>
-        <para>It is also possible to change the Quorum System used by the
-          ensemble (for example, change the Majority Quorum System to a
-          Hierarchical Quorum System on the fly). This, however, is only allowed
-          using the bulk (non-incremental) reconfiguration mode. In general,
-          incremental reconfiguration only works with the Majority Quorum
-          System. Bulk reconfiguration works with both Hierarchical and Majority
-          Quorum Systems.</para>
-        <para><emphasis role="bold">Performance Impact:</emphasis> There is
-          practically no performance impact when removing a follower, since it
-          is not being automatically shut down (the effect of removal is that
-          the server's votes are no longer being counted). When adding a server,
-          there is no leader change and no noticeable performance disruption.
-          For details and graphs please see Figures 6, 7 and 8 in the <ulink
-          url="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters"
-          >paper</ulink>.</para>
-        <para>The most significant disruption will happen when a leader change
-          is caused, in one of the following cases:</para>
-        <orderedlist>
-          <listitem>
-            <para>Leader is removed from the ensemble.</para>
-          </listitem>
-          <listitem>
-            <para>Leader's role is changed from participant to observer.</para>
-          </listitem>
-          <listitem>
-            <para>The port used by the leader to send transactions to others
-              (quorum port) is modified.</para>
-          </listitem>
-        </orderedlist>
-        <para>In these cases we perform a leader hand-off where the old leader
-          nominates a new leader. The resulting unavailability is usually
-          shorter than when a leader crashes since detecting leader failure is
-          unnecessary and electing a new leader can usually be avoided during a
-          hand-off (see Figures 6 and 8 in the <ulink
-          url="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters"
-          >paper</ulink>).</para>
-        <para>When the client port of a server is modified, it does not drop
-          existing client connections. New connections to the server will have
-          to use the new client port.</para>
-        <para><emphasis role="bold">Progress guarantees:</emphasis> Up to the
-          invocation of the reconfig operation, a quorum of the old
-          configuration is required to be available and connected for ZooKeeper
-          to be able to make progress. Once reconfig is invoked, a quorum of
-          both the old and of the new configurations must be available. The
-          final transition happens once (a) the new configuration is activated,
-          and (b) all operations scheduled before the new configuration is
-          activated by the leader are committed. Once (a) and (b) happen, only a
-          quorum of the new configuration is required. Note, however, that
-          neither (a) nor (b) are visible to a client. Specifically, when a
-          reconfiguration operation commits, it only means that an activation
-          message was sent out by the leader. It does not necessarily mean that
-          a quorum of the new configuration got this message (which is required
-          in order to activate it) or that (b) has happened. If one wants to
-          make sure that both (a) and (b) has already occurred (for example, in
-          order to know that it is safe to shut down old servers that were
-          removed), one can simply invoke an update
-          (<command>set-data</command>, or some other quorum operation, but not
-          a <command>sync</command>) and wait for it to commit. An alternative
-          way to achieve this was to introduce another round to the
-          reconfiguration protocol (which, for simplicity and compatibility with
-          Zab, we decided to avoid).</para>
-      </section>
-      <section id="sc_reconfig_incremental">
-        <title>Incremental mode</title>
-        <para>The incremental mode allows adding and removing servers to the
-          current configuration. Multiple changes are allowed. For
-          example:</para>
-        <para><userinput>&gt; reconfig -remove 3 -add
-          server.5=125.23.63.23:1234:1235;1236</userinput></para>
-        <para>Both the add and the remove options get a list of comma separated
-          arguments (no spaces):</para>
-        <para><userinput>&gt; reconfig -remove 3,4 -add
-          server.5=localhost:2111:2112;2113,6=localhost:2114:2115:observer;2116</userinput></para>
-        <para>The format of the server statement is exactly the same as
-          described in the section <xref linkend="sc_reconfig_clientport"/> and
-          includes the client port. Notice that here instead of "server.5=" you
-          can just say "5=". In the example above, if server 5 is already in the
-          system, but has different ports or is not an observer, it is updated
-          and once the configuration commits becomes an observer and starts
-          using these new ports. This is an easy way to turn participants into
-          observers and vise versa or change any of their ports, without
-          rebooting the server.</para>
-        <para>ZooKeeper supports two types of Quorum Systems – the simple
-          Majority system (where the leader commits operations after receiving
-          ACKs from a majority of voters) and a more complex Hierarchical
-          system, where votes of different servers have different weights and
-          servers are divided into voting groups. Currently, incremental
-          reconfiguration is allowed only if the last proposed configuration
-          known to the leader uses a Majority Quorum System
-          (BadArgumentsException is thrown otherwise).</para>
-        <para>Incremental mode - examples using the Java API:</para>
-        <programlisting><![CDATA[List<String> leavingServers = new ArrayList<String>();
-leavingServers.add("1");
-leavingServers.add("2");
-byte[] config = zk.reconfig(null, leavingServers, null, -1, new Stat());]]></programlisting>
-
-        <programlisting><![CDATA[List<String> leavingServers = new ArrayList<String>();
-List<String> joiningServers = new ArrayList<String>();
-leavingServers.add("1");
-joiningServers.add("server.4=localhost:1234:1235;1236");
-byte[] config = zk.reconfig(joiningServers, leavingServers, null, -1, new Stat());
-
-String configStr = new String(config);
-System.out.println(configStr);]]></programlisting>
-        <para>There is also an asynchronous API, and an API accepting comma
-          separated Strings instead of List&lt;String&gt;. See
-          zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java.</para>
-      </section>
-      <section id="sc_reconfig_nonincremental">
-        <title>Non-incremental mode</title>
-        <para>The second mode of reconfiguration is non-incremental, whereby a
-          client gives a complete specification of the new dynamic system
-          configuration. The new configuration can either be given in place or
-          read from a file:</para>
-        <para><userinput>&gt; reconfig -file newconfig.cfg
-          </userinput>//newconfig.cfg is a dynamic config file, see <xref
-          linkend="sc_reconfig_file"/></para>
-        <para><userinput>&gt; reconfig -members
-          server.1=125.23.63.23:2780:2783:participant;2791,server.2=125.23.63.24:2781:2784:participant;2792,server.3=125.23.63.25:2782:2785:participant;2793</userinput></para>
-        <para>The new configuration may use a different Quorum System. For
-          example, you may specify a Hierarchical Quorum System even if the
-          current ensemble uses a Majority Quorum System.</para>
-        <para>Bulk mode - example using the Java API:</para>
-        <programlisting><![CDATA[ArrayList<String> newMembers = new ArrayList<String>();
-newMembers.add("server.1=1111:1234:1235;1236");
-newMembers.add("server.2=1112:1237:1238;1239");
-newMembers.add("server.3=1114:1240:1241:observer;1242");
-
-byte[] config = zk.reconfig(null, null, newMembers, -1, new Stat());
-
-String configStr = new String(config);
-System.out.println(configStr);]]></programlisting>
-        <para>There is also an asynchronous API, and an API accepting comma
-          separated String containing the new members instead of
-          List&lt;String&gt;. See
-          zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java.</para>
-      </section>
-      <section id="sc_reconfig_conditional">
-        <title>Conditional reconfig</title>
-        <para>Sometimes (especially in non-incremental mode) a new proposed
-          configuration depends on what the client "believes" to be the current
-          configuration, and should be applied only to that configuration.
-          Specifically, the <command>reconfig</command> succeeds only if the
-          last configuration at the leader has the specified version.</para>
-        <para><userinput><![CDATA[> reconfig -file <filename> -v <version>]]></userinput></para>
-        <para>In the previously listed Java examples, instead of -1 one could
-          specify a configuration version to condition the
-          reconfiguration.</para>
-      </section>
-      <section id="sc_reconfig_errors">
-        <title>Error conditions</title>
-        <para>In addition to normal ZooKeeper error conditions, a
-          reconfiguration may fail for the following reasons:</para>
-        <orderedlist>
-          <listitem>
-            <para>another reconfig is currently in progress
-              (ReconfigInProgress)</para>
-          </listitem>
-          <listitem>
-            <para>the proposed change would leave the cluster with less than 2
-              participants, in case standalone mode is enabled, or, if
-              standalone mode is disabled then its legal to remain with 1 or
-              more participants (BadArgumentsException)</para>
-          </listitem>
-          <listitem>
-            <para>no quorum of the new configuration was connected and
-              up-to-date with the leader when the reconfiguration processing
-              began (NewConfigNoQuorum)</para>
-          </listitem>
-          <listitem>
-            <para><userinput>-v x</userinput> was specified, but the version
-              <userinput>y</userinput> of the latest configuration is not
-              <userinput>x</userinput> (BadVersionException)</para>
-          </listitem>
-          <listitem>
-            <para>an incremental reconfiguration was requested but the last
-              configuration at the leader uses a Quorum System which is
-              different from the Majority system (BadArgumentsException)</para>
-          </listitem>
-          <listitem>
-            <para>syntax error (BadArgumentsException)</para>
-          </listitem>
-          <listitem>
-            <para>I/O exception when reading the configuration from a file
-              (BadArgumentsException)</para>
-          </listitem>
-        </orderedlist>
-        <para>Most of these are illustrated by test-cases in
-          <filename>ReconfigFailureCases.java</filename>.</para>
-      </section>
-      <section id="sc_reconfig_additional">
-        <title>Additional comments</title>
-        <para><emphasis role="bold">Liveness:</emphasis> To better understand
-          the difference between incremental and non-incremental
-          reconfiguration, suppose that client C1 adds server D to the system
-          while a different client C2 adds server E. With the non-incremental
-          mode, each client would first invoke <command>config</command> to find
-          out the current configuration, and then locally create a new list of
-          servers by adding its own suggested server. The new configuration can
-          then be submitted using the non-incremental
-          <command>reconfig</command> command. After both reconfigurations
-          complete, only one of E or D will be added (not both), depending on
-          which client's request arrives second to the leader, overwriting the
-          previous configuration. The other client can repeat the process until
-          its change takes effect. This method guarantees system-wide progress
-          (i.e., for one of the clients), but does not ensure that every client
-          succeeds. To have more control C2 may request to only execute the
-          reconfiguration in case the version of the current configuration
-          hasn't changed, as explained in the section <xref
-          linkend="sc_reconfig_conditional"/>. In this way it may avoid blindly
-          overwriting the configuration of C1 if C1's configuration reached the
-          leader first.</para>
-        <para>With incremental reconfiguration, both changes will take effect as
-          they are simply applied by the leader one after the other to the
-          current configuration, whatever that is (assuming that the second
-          reconfig request reaches the leader after it sends a commit message
-          for the first reconfig request -- currently the leader will refuse to
-          propose a reconfiguration if another one is already pending). Since
-          both clients are guaranteed to make progress, this method guarantees
-          stronger liveness. In practice, multiple concurrent reconfigurations
-          are probably rare. Non-incremental reconfiguration is currently the
-          only way to dynamically change the Quorum System. Incremental
-          configuration is currently only allowed with the Majority Quorum
-          System.</para>
-        <para><emphasis role="bold">Changing an observer into a
-          follower:</emphasis> Clearly, changing a server that participates in
-          voting into an observer may fail if error (2) occurs, i.e., if fewer
-          than the minimal allowed number of participants would remain. However,
-          converting an observer into a participant may sometimes fail for a
-          more subtle reason: Suppose, for example, that the current
-          configuration is (A, B, C, D), where A is the leader, B and C are
-          followers and D is an observer. In addition, suppose that B has
-          crashed. If a reconfiguration is submitted where D is said to become a
-          follower, it will fail with error (3) since in this configuration, a
-          majority of voters in the new configuration (any 3 voters), must be
-          connected and up-to-date with the leader. An observer cannot
-          acknowledge the history prefix sent during reconfiguration, and
-          therefore it does not count towards these 3 required servers and the
-          reconfiguration will be aborted. In case this happens, a client can
-          achieve the same task by two reconfig commands: first invoke a
-          reconfig to remove D from the configuration and then invoke a second
-          command to add it back as a participant (follower). During the
-          intermediate state D is a non-voting follower and can ACK the state
-          transfer performed during the second reconfig comand.</para>
-      </section>
-    </section>
-  </section>
-  <section id="ch_reconfig_rebalancing">
-    <title>Rebalancing Client Connections</title>
-    <para>When a ZooKeeper cluster is started, if each client is given the same
-      connection string (list of servers), the client will randomly choose a
-      server in the list to connect to, which makes the expected number of
-      client connections per server the same for each of the servers. We
-      implemented a method that preserves this property when the set of servers
-      changes through reconfiguration. See Sections 4 and 5.1 in the <ulink
-      url="https://www.usenix.org/conference/usenixfederatedconferencesweek/dynamic-recon%EF%AC%81guration-primarybackup-clusters"
-      >paper</ulink>.</para>
-    <para>In order for the method to work, all clients must subscribe to
-      configuration changes (by setting a watch on /zookeeper/config either
-      directly or through the <command>getConfig</command> API command). When
-      the watch is triggered, the client should read the new configuration by
-      invoking <command>sync</command> and <command>getConfig</command> and if
-      the configuration is indeed new invoke the
-      <command>updateServerList</command> API command. To avoid mass client
-      migration at the same time, it is better to have each client sleep a
-      random short period of time before invoking
-      <command>updateServerList</command>.</para>
-    <para>A few examples can be found in:
-      <filename>StaticHostProviderTest.java</filename> and
-      <filename>TestReconfig.cc</filename></para>
-    <para>Example (this is not a recipe, but a simplified example just to
-      explain the general idea):</para>
-    <programlisting><![CDATA[
-public void process(WatchedEvent event) {
-    synchronized (this) {
-        if (event.getType() == EventType.None) {
-            connected = (event.getState() == KeeperState.SyncConnected);
-            notifyAll();
-        } else if (event.getPath()!=null &&  event.getPath().equals(ZooDefs.CONFIG_NODE)) {
-            // in prod code never block the event thread!
-            zk.sync(ZooDefs.CONFIG_NODE, this, null);
-            zk.getConfig(this, this, null);
-        }
-    }
-}
-public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
-    if (path!=null &&  path.equals(ZooDefs.CONFIG_NODE)) {
-        String config[] = ConfigUtils.getClientConfigStr(new String(data)).split(" ");   // similar to config -c
-        long version = Long.parseLong(config[0], 16);
-        if (this.configVersion == null){
-             this.configVersion = version;
-        } else if (version > this.configVersion) {
-            hostList = config[1];
-            try {
-                // the following command is not blocking but may cause the client to close the socket and
-                // migrate to a different server. In practice its better to wait a short period of time, chosen
-                // randomly, so that different clients migrate at different times
-                zk.updateServerList(hostList);
-            } catch (IOException e) {
-                System.err.println("Error updating server list");
-                e.printStackTrace();
-            }
-            this.configVersion = version;
-} } }]]></programlisting>
-  </section>
-</article>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperStarted.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperStarted.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperStarted.xml
deleted file mode 100644
index e5cd777..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperStarted.xml
+++ /dev/null
@@ -1,419 +0,0 @@
-<?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>ZooKeeper 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 creating
-      distributed applications that use ZooKeeper. It discusses the basic
-      operations ZooKeeper supports, and how these can be used to build
-      higher-level abstractions. It contains solutions to common tasks, a
-      troubleshooting guide, and links to other information.</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_GettingStarted">
-    <title>Getting Started: Coordinating Distributed Applications with
-      ZooKeeper</title>
-
-    <para>This document contains information to get you started quickly with
-    ZooKeeper. It is aimed primarily at developers hoping to try it out, and
-    contains simple installation instructions for a single ZooKeeper server, a
-    few commands to verify that it is running, and a simple programming
-    example. Finally, as a convenience, there are a few sections regarding
-    more complicated installations, for example running replicated
-    deployments, and optimizing the transaction log. However for the complete
-    instructions for commercial deployments, please refer to the <ulink
-    url="zookeeperAdmin.html">ZooKeeper
-    Administrator's Guide</ulink>.</para>
-
-    <section id="sc_Prerequisites">
-      <title>Pre-requisites</title>
-
-      <para>See <ulink url="zookeeperAdmin.html#sc_systemReq">
-          System Requirements</ulink> in the Admin guide.</para>
-    </section>
-
-    <section id="sc_Download">
-      <title>Download</title>
-
-      <para>To get a ZooKeeper distribution, download a recent
-        <ulink url="http://zookeeper.apache.org/releases.html">
-          stable</ulink> release from one of the Apache Download
-        Mirrors.</para>
-    </section>
-	
-    <section id="sc_InstallingSingleMode">
-      <title>Standalone Operation</title>
-
-      <para>Setting up a ZooKeeper server in standalone mode is
-      straightforward. The server is contained in a single JAR file,
-      so installation consists of creating a configuration.</para>
-
-      <para>Once you've downloaded a stable ZooKeeper release unpack
-      it and cd to the root</para>
-
-      <para>To start ZooKeeper you need a configuration file. Here is a sample,
-      create it in <emphasis role="bold">conf/zoo.cfg</emphasis>:</para>
-
-<programlisting>
-tickTime=2000
-dataDir=/var/lib/zookeeper
-clientPort=2181
-</programlisting>
-
-      <para>This file can be called anything, but for the sake of this
-      discussion call
-      it <emphasis role="bold">conf/zoo.cfg</emphasis>. Change the
-      value of <emphasis role="bold">dataDir</emphasis> to specify an
-      existing (empty to start with) directory.  Here are the meanings
-      for each of the fields:</para>
-
-      <variablelist>
-        <varlistentry>
-          <term><emphasis role="bold">tickTime</emphasis></term>
-
-          <listitem>
-            <para>the basic time unit in milliseconds used by ZooKeeper. It is
-            used to do heartbeats and the minimum session timeout will be
-            twice the tickTime.</para>
-          </listitem>
-        </varlistentry>
-      </variablelist>
-
-      <variablelist>
-        <varlistentry>
-          <term><emphasis role="bold">dataDir</emphasis></term>
-
-          <listitem>
-            <para>the location to store the in-memory database snapshots and,
-            unless specified otherwise, the transaction log of updates to the
-            database.</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-          <term><emphasis role="bold">clientPort</emphasis></term>
-
-          <listitem>
-            <para>the port to listen for client connections</para>
-          </listitem>
-        </varlistentry>
-      </variablelist>
-
-      <para>Now that you created the configuration file, you can start
-      ZooKeeper:</para>
-
-      <programlisting>bin/zkServer.sh start</programlisting>
-
-      <para>ZooKeeper logs messages using log4j -- more detail
-      available in the
-      <ulink url="zookeeperProgrammers.html#Logging">Logging</ulink>
-      section of the Programmer's Guide. You will see log messages
-      coming to the console (default) and/or a log file depending on
-      the log4j configuration.</para>
-
-      <para>The steps outlined here run ZooKeeper in standalone mode. There is
-      no replication, so if ZooKeeper process fails, the service will go down.
-      This is fine for most development situations, but to run ZooKeeper in
-      replicated mode, please see <ulink
-      url="#sc_RunningReplicatedZooKeeper">Running Replicated
-      ZooKeeper</ulink>.</para>
-    </section>
-	
-    <section id="sc_FileManagement">
-      <title>Managing ZooKeeper Storage</title>
-      <para>For long running production systems ZooKeeper storage must
-      be managed externally (dataDir and logs). See the section on
-      <ulink
-      url="zookeeperAdmin.html#sc_maintenance">maintenance</ulink> for
-      more details.</para>
-    </section>
-
-    <section id="sc_ConnectingToZooKeeper">
-      <title>Connecting to ZooKeeper</title>
-
-      <programlisting>$ bin/zkCli.sh -server 127.0.0.1:2181</programlisting>
-
-      <para>This lets you perform simple, file-like operations.</para>
-
-      <para>Once you have connected, you should see something like:
-        </para>
-      <programlisting>
-<![CDATA[
-Connecting to localhost:2181
-log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
-log4j:WARN Please initialize the log4j system properly.
-Welcome to ZooKeeper!
-JLine support is enabled
-[zkshell: 0]
-]]>        </programlisting>
-      <para>
-        From the shell, type <command>help</command> to get a listing of commands that can be executed from the client, as in:
-      </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 0] help
-ZooKeeper host:port cmd args
-        get path [watch]
-        ls path [watch]
-        set path data [version]
-        delquota [-n|-b] path
-        quit
-        printwatches on|off
-        create path data acl
-        stat path [watch]
-        listquota path
-        history
-        setAcl path acl
-        getAcl path
-        sync path
-        redo cmdno
-        addauth scheme auth
-        delete path [version]
-        deleteall path
-        setquota -n|-b val path
-
-]]>        </programlisting>
-      <para>From here, you can try a few simple commands to get a feel for this simple command line interface.  First, start by issuing the list command, as
-      in <command>ls</command>, yielding:
-      </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 8] ls /
-[zookeeper]
-]]>        </programlisting>
-      <para>Next, create a new znode by running <command>create /zk_test my_data</command>. This creates a new znode and associates the string "my_data" with the node.
-      You should see:</para>
-      <programlisting>
-<![CDATA[
-[zkshell: 9] create /zk_test my_data
-Created /zk_test
-]]>      </programlisting>
-      <para>  Issue another <command>ls /</command> command to see what the directory looks like:
-        </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 11] ls /
-[zookeeper, zk_test]
-
-]]>        </programlisting><para>
-      Notice that the zk_test directory has now been created.
-      </para>
-      <para>Next, verify that the data was associated with the znode by running the <command>get</command> command, as in:
-      </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 12] get /zk_test
-my_data
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 5
-mtime = Fri Jun 05 13:57:06 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 0
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 7
-numChildren = 0
-]]>        </programlisting>
-      <para>We can change the data associated with zk_test by issuing the <command>set</command> command, as in:
-        </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 14] set /zk_test junk
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 6
-mtime = Fri Jun 05 14:01:52 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 1
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 4
-numChildren = 0
-[zkshell: 15] get /zk_test
-junk
-cZxid = 5
-ctime = Fri Jun 05 13:57:06 PDT 2009
-mZxid = 6
-mtime = Fri Jun 05 14:01:52 PDT 2009
-pZxid = 5
-cversion = 0
-dataVersion = 1
-aclVersion = 0
-ephemeralOwner = 0
-dataLength = 4
-numChildren = 0
-]]>      </programlisting>
-      <para>
-       (Notice we did a <command>get</command> after setting the data and it did, indeed, change.</para>
-      <para>Finally, let's <command>delete</command> the node by issuing:
-      </para>
-      <programlisting>
-<![CDATA[
-[zkshell: 16] delete /zk_test
-[zkshell: 17] ls /
-[zookeeper]
-[zkshell: 18]
-]]></programlisting>
-      <para>That's it for now.  To explore more, continue with the rest of this document and see the <ulink url="zookeeperProgrammers.html">Programmer's Guide</ulink>. </para>
-    </section>
-
-    <section id="sc_ProgrammingToZooKeeper">
-      <title>Programming to ZooKeeper</title>
-
-      <para>ZooKeeper has a Java bindings and C bindings. They are
-      functionally equivalent. The C bindings exist in two variants: single
-      threaded and multi-threaded. These differ only in how the messaging loop
-      is done. For more information, see the <ulink
-      url="zookeeperProgrammers.html#ch_programStructureWithExample">Programming
-      Examples in the ZooKeeper Programmer's Guide</ulink> for
-      sample code using of the different APIs.</para>
-    </section>
-
-    <section id="sc_RunningReplicatedZooKeeper">
-      <title>Running Replicated ZooKeeper</title>
-
-      <para>Running ZooKeeper in standalone mode is convenient for evaluation,
-      some development, and testing. But in production, you should run
-      ZooKeeper in replicated mode. A replicated group of servers in the same
-      application is called a <emphasis>quorum</emphasis>, and in replicated
-      mode, all servers in the quorum have copies of the same configuration
-      file.</para>
-   <note>
-      <para>
-         For replicated mode, a minimum of three servers are required,
-         and it is strongly recommended that you have an odd number of
-         servers. If you only have two servers, then you are in a
-         situation where if one of them fails, there are not enough
-         machines to form a majority quorum. Two servers is inherently
-         <emphasis role="bold">less</emphasis>
-         stable than a single server, because there are two single
-         points of failure.
-      </para>
-   </note>
-   <para>
-      The required
-      <emphasis role="bold">conf/zoo.cfg</emphasis>
-      file for replicated mode is similar to the one used in standalone
-      mode, but with a few differences. Here is an example:
-   </para>
-
-<programlisting>
-tickTime=2000
-dataDir=/var/lib/zookeeper
-clientPort=2181
-initLimit=5
-syncLimit=2
-server.1=zoo1:2888:3888
-server.2=zoo2:2888:3888
-server.3=zoo3:2888:3888
-</programlisting>
-
-      <para>The new entry, <emphasis role="bold">initLimit</emphasis> is
-      timeouts ZooKeeper uses to limit the length of time the ZooKeeper
-      servers in quorum have to connect to a leader. The entry <emphasis
-      role="bold">syncLimit</emphasis> limits how far out of date a server can
-      be from a leader.</para>
-
-      <para>With both of these timeouts, you specify the unit of time using
-      <emphasis role="bold">tickTime</emphasis>. In this example, the timeout
-      for initLimit is 5 ticks at 2000 milleseconds a tick, or 10
-      seconds.</para>
-
-      <para>The entries of the form <emphasis>server.X</emphasis> list the
-      servers that make up the ZooKeeper service. When the server starts up,
-      it knows which server it is by looking for the file
-      <emphasis>myid</emphasis> in the data directory. That file has the 
-      contains the server number, in ASCII.</para>
-
-       <para>Finally, note the two port numbers after each server
-       name: " 2888" and "3888". Peers use the former port to connect
-       to other peers. Such a connection is necessary so that peers
-       can communicate, for example, to agree upon the order of
-       updates. More specifically, a ZooKeeper server uses this port
-       to connect followers to the leader. When a new leader arises, a
-       follower opens a TCP connection to the leader using this
-       port. Because the default leader election also uses TCP, we
-       currently require another port for leader election. This is the
-       second port in the server entry.
-       </para>
-
-      <note>
-        <para>If you want to test multiple servers on a single
-        machine, specify the servername
-        as <emphasis>localhost</emphasis> with unique quorum &amp;
-        leader election ports (i.e. 2888:3888, 2889:3889, 2890:3890 in
-        the example above) for each server.X in that server's config
-        file. Of course separate <emphasis>dataDir</emphasis>s and
-        distinct <emphasis>clientPort</emphasis>s are also necessary
-        (in the above replicated example, running on a
-        single <emphasis>localhost</emphasis>, you would still have
-        three config files).</para>
-        <para>Please be aware that setting up multiple servers on a single
-            machine will not create any redundancy. If something were to
-            happen which caused the machine to die, all of the zookeeper
-            servers would be offline. Full redundancy requires that each
-            server have its own machine. It must be a completely separate
-            physical server. Multiple virtual machines on the same physical
-            host are still vulnerable to the complete failure of that host.</para>
-      </note>
-    </section>
-
-    <section>
-      <title>Other Optimizations</title>
-
-      <para>There are a couple of other configuration parameters that can
-      greatly increase performance:</para>
-
-      <itemizedlist>
-        <listitem>
-          <para>To get low latencies on updates it is important to
-          have a dedicated transaction log directory. By default
-          transaction logs are put in the same directory as the data
-          snapshots and <emphasis>myid</emphasis> file. The dataLogDir
-          parameters indicates a different directory to use for the
-          transaction logs.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>[tbd: what is the other config param?]</emphasis></para>
-        </listitem>
-      </itemizedlist>
-    </section>
-  </section>
-</article>


[18/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

…project (branch 3.5)

In this commit I've removed the forrest XML files and their result from the repository.
I've also removed the process to generate HTML and PDF files from the forrest files, since it's not needed anymore.

It also effects the test-github-pr.sh and test-patch.sh, since we do have less parameters for them (FORREST_HOME).

Change-Id: I30ecdb181f19eed05d86838b12c75e0c03e33710

Author: Tamas Penzes <ta...@cloudera.com>

Reviewers: andor@apache.org

Closes #697 from tamaashu/ZOOKEEPER-3155-3.5


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

Branch: refs/heads/branch-3.5
Commit: ab59048a61022f2062818f2574cf99958677cd0b
Parents: 14364eb
Author: Tamas Penzes <ta...@cloudera.com>
Authored: Fri Nov 9 08:41:33 2018 -0800
Committer: Andor Molnar <an...@apache.org>
Committed: Fri Nov 9 08:41:33 2018 -0800

----------------------------------------------------------------------
 build.xml                                       |   29 +-
 docs/bookkeeperConfig.html                      |  384 ---
 docs/bookkeeperConfig.pdf                       |  Bin 13807 -> 0 bytes
 docs/bookkeeperOverview.html                    |  694 -----
 docs/bookkeeperOverview.pdf                     |  Bin 147574 -> 0 bytes
 docs/bookkeeperProgrammer.html                  | 1083 -------
 docs/bookkeeperProgrammer.pdf                   |  Bin 24965 -> 0 bytes
 docs/bookkeeperStarted.html                     |  448 ---
 docs/bookkeeperStarted.pdf                      |  Bin 17115 -> 0 bytes
 docs/bookkeeperStream.html                      |  612 ----
 docs/bookkeeperStream.pdf                       |  Bin 13200 -> 0 bytes
 docs/broken-links.xml                           |    2 -
 docs/images/2pc.jpg                             |  Bin 15174 -> 0 bytes
 docs/images/bk-overview.jpg                     |  Bin 124211 -> 0 bytes
 docs/images/built-with-forrest-button.png       |  Bin 1936 -> 0 bytes
 docs/images/favicon.ico                         |  Bin 766 -> 0 bytes
 docs/images/hadoop-logo.jpg                     |  Bin 9443 -> 0 bytes
 docs/images/instruction_arrow.png               |  Bin 285 -> 0 bytes
 docs/images/state_dia.jpg                       |  Bin 51364 -> 0 bytes
 docs/images/zkcomponents.jpg                    |  Bin 30831 -> 0 bytes
 docs/images/zknamespace.jpg                     |  Bin 35414 -> 0 bytes
 docs/images/zkperfRW-3.2.jpg                    |  Bin 41948 -> 0 bytes
 docs/images/zkperfRW.jpg                        |  Bin 161542 -> 0 bytes
 docs/images/zkperfreliability.jpg               |  Bin 69825 -> 0 bytes
 docs/images/zkservice.jpg                       |  Bin 86790 -> 0 bytes
 docs/images/zookeeper_small.gif                 |  Bin 4847 -> 0 bytes
 docs/index.html                                 |  352 ---
 docs/index.pdf                                  |  Bin 12657 -> 0 bytes
 docs/javaExample.html                           |  900 ------
 docs/javaExample.pdf                            |  Bin 33818 -> 0 bytes
 docs/linkmap.html                               |  394 ---
 docs/linkmap.pdf                                |  Bin 10826 -> 0 bytes
 docs/recipes.html                               | 1024 -------
 docs/recipes.pdf                                |  Bin 33856 -> 0 bytes
 docs/releasenotes.html                          | 2251 ---------------
 docs/skin/CommonMessages_de.xml                 |   23 -
 docs/skin/CommonMessages_en_US.xml              |   23 -
 docs/skin/CommonMessages_es.xml                 |   23 -
 docs/skin/CommonMessages_fr.xml                 |   23 -
 docs/skin/basic.css                             |  167 --
 docs/skin/breadcrumbs-optimized.js              |   90 -
 docs/skin/breadcrumbs.js                        |  237 --
 docs/skin/fontsize.js                           |  166 --
 docs/skin/getBlank.js                           |   40 -
 docs/skin/getMenu.js                            |   45 -
 docs/skin/images/README.txt                     |    1 -
 docs/skin/images/add.jpg                        |  Bin 1142 -> 0 bytes
 docs/skin/images/apache-thanks.png              |  Bin 4840 -> 0 bytes
 docs/skin/images/built-with-cocoon.gif          |  Bin 2252 -> 0 bytes
 docs/skin/images/built-with-forrest-button.png  |  Bin 1936 -> 0 bytes
 docs/skin/images/chapter.gif                    |  Bin 49 -> 0 bytes
 docs/skin/images/chapter_open.gif               |  Bin 49 -> 0 bytes
 docs/skin/images/current.gif                    |  Bin 54 -> 0 bytes
 docs/skin/images/error.png                      |  Bin 1709 -> 0 bytes
 docs/skin/images/external-link.gif              |  Bin 71 -> 0 bytes
 docs/skin/images/fix.jpg                        |  Bin 932 -> 0 bytes
 docs/skin/images/forrest-credit-logo.png        |  Bin 4633 -> 0 bytes
 docs/skin/images/hack.jpg                       |  Bin 743 -> 0 bytes
 docs/skin/images/header_white_line.gif          |  Bin 37 -> 0 bytes
 docs/skin/images/info.png                       |  Bin 1320 -> 0 bytes
 docs/skin/images/instruction_arrow.png          |  Bin 285 -> 0 bytes
 docs/skin/images/label.gif                      |  Bin 54 -> 0 bytes
 docs/skin/images/page.gif                       |  Bin 79 -> 0 bytes
 docs/skin/images/pdfdoc.gif                     |  Bin 1008 -> 0 bytes
 docs/skin/images/poddoc.png                     |  Bin 856 -> 0 bytes
 docs/skin/images/printer.gif                    |  Bin 603 -> 0 bytes
 .../skin/images/rc-b-l-15-1body-2menu-3menu.png |  Bin 348 -> 0 bytes
 .../skin/images/rc-b-r-15-1body-2menu-3menu.png |  Bin 319 -> 0 bytes
 ...-r-5-1header-2tab-selected-3tab-selected.png |  Bin 200 -> 0 bytes
 .../rc-t-l-5-1header-2searchbox-3searchbox.png  |  Bin 199 -> 0 bytes
 ...-l-5-1header-2tab-selected-3tab-selected.png |  Bin 209 -> 0 bytes
 ...-1header-2tab-unselected-3tab-unselected.png |  Bin 199 -> 0 bytes
 .../skin/images/rc-t-r-15-1body-2menu-3menu.png |  Bin 390 -> 0 bytes
 .../rc-t-r-5-1header-2searchbox-3searchbox.png  |  Bin 214 -> 0 bytes
 ...-r-5-1header-2tab-selected-3tab-selected.png |  Bin 215 -> 0 bytes
 ...-1header-2tab-unselected-3tab-unselected.png |  Bin 214 -> 0 bytes
 docs/skin/images/remove.jpg                     |  Bin 1251 -> 0 bytes
 docs/skin/images/rss.png                        |  Bin 360 -> 0 bytes
 docs/skin/images/spacer.gif                     |  Bin 43 -> 0 bytes
 docs/skin/images/success.png                    |  Bin 1291 -> 0 bytes
 docs/skin/images/txtdoc.png                     |  Bin 784 -> 0 bytes
 docs/skin/images/update.jpg                     |  Bin 990 -> 0 bytes
 docs/skin/images/valid-html401.png              |  Bin 2948 -> 0 bytes
 docs/skin/images/vcss.png                       |  Bin 1134 -> 0 bytes
 docs/skin/images/warning.png                    |  Bin 1215 -> 0 bytes
 docs/skin/images/xmldoc.gif                     |  Bin 992 -> 0 bytes
 docs/skin/menu.js                               |   48 -
 docs/skin/note.txt                              |   50 -
 docs/skin/print.css                             |   54 -
 docs/skin/profile.css                           |  168 --
 docs/skin/prototype.js                          | 1257 ---------
 docs/skin/screen.css                            |  587 ----
 docs/zookeeperAdmin.html                        | 2669 ------------------
 docs/zookeeperAdmin.pdf                         |  Bin 102168 -> 0 bytes
 docs/zookeeperHierarchicalQuorums.html          |  264 --
 docs/zookeeperHierarchicalQuorums.pdf           |  Bin 6654 -> 0 bytes
 docs/zookeeperInternals.html                    |  793 ------
 docs/zookeeperInternals.pdf                     |  Bin 48811 -> 0 bytes
 docs/zookeeperJMX.html                          |  467 ---
 docs/zookeeperJMX.pdf                           |  Bin 16475 -> 0 bytes
 docs/zookeeperObservers.html                    |  354 ---
 docs/zookeeperObservers.pdf                     |  Bin 12868 -> 0 bytes
 docs/zookeeperOtherInfo.html                    |  230 --
 docs/zookeeperOtherInfo.pdf                     |  151 -
 docs/zookeeperOver.html                         |  692 -----
 docs/zookeeperOver.pdf                          |  Bin 302467 -> 0 bytes
 docs/zookeeperProgrammers.html                  | 2517 -----------------
 docs/zookeeperProgrammers.pdf                   |  Bin 144324 -> 0 bytes
 docs/zookeeperQuotas.html                       |  278 --
 docs/zookeeperQuotas.pdf                        |  Bin 11184 -> 0 bytes
 docs/zookeeperReconfig.html                     | 1250 --------
 docs/zookeeperReconfig.pdf                      |  Bin 62416 -> 0 bytes
 docs/zookeeperStarted.html                      |  618 ----
 docs/zookeeperStarted.pdf                       |  Bin 28078 -> 0 bytes
 docs/zookeeperTutorial.html                     |  925 ------
 docs/zookeeperTutorial.pdf                      |  Bin 34212 -> 0 bytes
 zookeeper-docs/forrest.properties               |  109 -
 zookeeper-docs/src/documentation/README.txt     |    7 -
 zookeeper-docs/src/documentation/TODO.txt       |  227 --
 .../classes/CatalogManager.properties           |   37 -
 zookeeper-docs/src/documentation/conf/cli.xconf |  328 ---
 .../src/documentation/content/xdocs/index.xml   |   87 -
 .../documentation/content/xdocs/javaExample.xml |  664 -----
 .../src/documentation/content/xdocs/recipes.xml |  688 -----
 .../src/documentation/content/xdocs/site.xml    |   97 -
 .../src/documentation/content/xdocs/tabs.xml    |   36 -
 .../content/xdocs/zookeeperAdmin.xml            | 2315 ---------------
 .../xdocs/zookeeperHierarchicalQuorums.xml      |   75 -
 .../content/xdocs/zookeeperInternals.xml        |  487 ----
 .../content/xdocs/zookeeperJMX.xml              |  236 --
 .../content/xdocs/zookeeperObservers.xml        |  145 -
 .../content/xdocs/zookeeperOtherInfo.xml        |   46 -
 .../content/xdocs/zookeeperOver.xml             |  464 ---
 .../content/xdocs/zookeeperProgrammers.xml      | 1872 ------------
 .../content/xdocs/zookeeperQuotas.xml           |   71 -
 .../content/xdocs/zookeeperReconfig.xml         |  883 ------
 .../content/xdocs/zookeeperStarted.xml          |  419 ---
 .../content/xdocs/zookeeperTutorial.xml         |  712 -----
 .../src/documentation/resources/images/2pc.jpg  |  Bin 15174 -> 0 bytes
 .../resources/images/bk-overview.jpg            |  Bin 124211 -> 0 bytes
 .../documentation/resources/images/favicon.ico  |  Bin 766 -> 0 bytes
 .../resources/images/hadoop-logo.jpg            |  Bin 9443 -> 0 bytes
 .../resources/images/state_dia.dia              |  Bin 2597 -> 0 bytes
 .../resources/images/state_dia.jpg              |  Bin 51364 -> 0 bytes
 .../documentation/resources/images/zkarch.jpg   |  Bin 24535 -> 0 bytes
 .../resources/images/zkcomponents.jpg           |  Bin 30831 -> 0 bytes
 .../resources/images/zknamespace.jpg            |  Bin 35414 -> 0 bytes
 .../resources/images/zkperfRW-3.2.jpg           |  Bin 41948 -> 0 bytes
 .../documentation/resources/images/zkperfRW.jpg |  Bin 161542 -> 0 bytes
 .../resources/images/zkperfreliability.jpg      |  Bin 69825 -> 0 bytes
 .../resources/images/zkservice.jpg              |  Bin 86790 -> 0 bytes
 .../resources/images/zookeeper_small.gif        |  Bin 4847 -> 0 bytes
 zookeeper-docs/src/documentation/skinconf.xml   |  360 ---
 zookeeper-docs/status.xml                       |   74 -
 .../src/test/resources/test-github-pr.sh        |   42 +-
 .../src/test/resources/test-patch.sh            |   44 +-
 156 files changed, 45 insertions(+), 32863 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 9854b48..0216a11 100644
--- a/build.xml
+++ b/build.xml
@@ -549,24 +549,6 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
     <!-- ====================================================== -->
     <!-- Documentation                                          -->
     <!-- ====================================================== -->
-    <target name="docs" depends="forrest.check" description="Generate forrest-based documentation. To use, specify -Dforrest.home=&lt;base of Apache Forrest installation&gt; on the command line." if="forrest.home">
-      <condition property="forrest.exec" value="forrest.bat" else="forrest">
-      	<os family="windows"/>
-      </condition>
-      <exec dir="${docs.src}" executable="${forrest.home}/bin/${forrest.exec}"
-            failonerror="true">
-      </exec>
-      <copy todir="${docs.dir}">
-        <fileset dir="${docs.src}/build/site/" />
-      </copy>
-      <style basedir="${conf.dir}" destdir="${docs.dir}"
-             includes="zookeeper-default.xml" style="conf/configuration.xsl"/>
-    </target>
-
-    <target name="forrest.check" unless="forrest.home">
-      <fail message="'forrest.home' is not defined. Please pass -Dforrest.home=&lt;base of Apache Forrest installation&gt; to Ant on the command-line." />
-    </target>
-
     <!-- Javadoc -->
     <target name="javadoc-dev" depends="jar"
             description="Generate javadoc for zookeeper developers">
@@ -1811,7 +1793,7 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
 		to Ant on the command-line." />
     </target>
 
-    <target name="test-patch" depends="patch.check,findbugs.check,forrest.check">
+    <target name="test-patch" depends="patch.check,findbugs.check">
   	<exec executable="bash" failonerror="true">
     		<arg value="${test_patch_sh}"/>
     		<arg value="DEVELOPER"/>
@@ -1821,13 +1803,12 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
     		<arg value="${grep.cmd}"/>
     		<arg value="${patch.cmd}"/>
     		<arg value="${findbugs.home}"/>
-    		<arg value="${forrest.home}"/>
     		<arg value="${basedir}"/>
     		<arg value="${java5.home}"/>
   	</exec>
     </target>
 
-    <target name="hudson-test-patch" depends="findbugs.check,forrest.check">
+    <target name="hudson-test-patch" depends="findbugs.check">
   	<exec executable="bash" failonerror="true">
     		<arg value="${test_patch_sh}"/>
     		<arg value="HUDSON"/>
@@ -1839,7 +1820,6 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
     		<arg value="${grep.cmd}"/>
     		<arg value="${patch.cmd}"/>
     		<arg value="${findbugs.home}"/>
-    		<arg value="${forrest.home}"/>
     		<arg value="${basedir}"/>
     		<arg value="${jira.passwd}"/>
     		<arg value="${java5.home}"/>
@@ -1848,7 +1828,7 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
     	</exec>
      </target>
 
-   <target name="qa-test-pullrequest" depends="findbugs.check,forrest.check">
+     <target name="qa-test-pullrequest" depends="findbugs.check">
         <exec executable="bash" failonerror="true">
                 <arg value="${test_pullrequest_sh}"/>
                 <arg value="QABUILD"/>
@@ -1860,7 +1840,6 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
                 <arg value="${grep.cmd}"/>
                 <arg value="${patch.cmd}"/>
                 <arg value="${findbugs.home}"/>
-                <arg value="${forrest.home}"/>
                 <arg value="${basedir}"/>
                 <arg value="${jira.passwd}"/>
                 <arg value="${java5.home}"/>
@@ -1870,7 +1849,7 @@ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle.ant">
 
 
      <!-- this target runs the hudson trunk build -->
-     <target name="hudson-test-trunk" depends="docs,tar,findbugs"/>
+     <target name="hudson-test-trunk" depends="tar,findbugs"/>
 
      <target name="api-xml" depends="ivy-retrieve-jdiff, javadoc, write-null">
        <javadoc>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperConfig.html
----------------------------------------------------------------------
diff --git a/docs/bookkeeperConfig.html b/docs/bookkeeperConfig.html
deleted file mode 100644
index fd925d3..0000000
--- a/docs/bookkeeperConfig.html
+++ /dev/null
@@ -1,384 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
-<meta name="Forrest-skin-name" content="pelt">
-<title>BookKeeper 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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
-</li>
-</ul>
-<!--+
-    |end Tabs
-    +-->
-</div>
-</div>
-<div id="main">
-<div id="publishedStrip">
-<!--+
-    |start Subtabs
-    +-->
-<div id="level2tabs"></div>
-<!--+
-    |end Endtabs
-    +-->
-<script type="text/javascript"><!--
-document.write("Last Published: " + document.lastModified);
-//  --></script>
-</div>
-<!--+
-    |breadtrail
-    +-->
-<div class="breadtrail">
-
-             &nbsp;
-           </div>
-<!--+
-    |start Menu, mainarea
-    +-->
-<!--+
-    |start Menu
-    +-->
-<div id="menu">
-<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
-<div id="menu_1.1" class="menuitemgroup">
-<div class="menuitem">
-<a href="index.html">Welcome</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperOver.html">Overview</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperStarted.html">Getting Started</a>
-</div>
-<div class="menuitem">
-<a href="releasenotes.html">Release Notes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
-<div id="menu_1.2" class="menuitemgroup">
-<div class="menuitem">
-<a href="api/index.html">API Docs</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperProgrammers.html">Programmer's Guide</a>
-</div>
-<div class="menuitem">
-<a href="javaExample.html">Java Example</a>
-</div>
-<div class="menuitem">
-<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
-</div>
-<div class="menuitem">
-<a href="recipes.html">Recipes</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_selected_1.3', 'skin/')" id="menu_selected_1.3Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">BookKeeper</div>
-<div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
-<div class="menuitem">
-<a href="bookkeeperStarted.html">Getting started</a>
-</div>
-<div class="menuitem">
-<a href="bookkeeperOverview.html">Overview</a>
-</div>
-<div class="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 class="menuitem">
-<a href="zookeeperObservers.html">Observers Guide</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
-<div id="menu_1.5" class="menuitemgroup">
-<div class="menuitem">
-<a href="zookeeperInternals.html">ZooKeeper Internals</a>
-</div>
-</div>
-<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
-<div id="menu_1.6" class="menuitemgroup">
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="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="front-matter">
-<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>
-</div>
-  
-
-  
-
-  
-
-  
-<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="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="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-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar\
-		:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar -Dlog4j.configuration=log4j.properties\ 
-		org.apache.bookkeeper.proto.BookieServer 3181 127.0.0.1:2181 /path_to_log_device/\
-		/path_to_ledger_device/
-	   </span>
-</p>
-<p>
- 	   The parameters are:
- 	   </p>
-<ul>
- 	   	
-<li>
- 	   	
-<p>
- 	   		Port number that the bookie listens on;
- 	   	</p>
- 	   	
-</li>
- 	   	
- 	   	
-<li>
- 	   	
-<p>
- 	   		Comma separated list of ZooKeeper servers with a hostname:port format;
- 	   	</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="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>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperConfig.pdf
----------------------------------------------------------------------
diff --git a/docs/bookkeeperConfig.pdf b/docs/bookkeeperConfig.pdf
deleted file mode 100644
index 4950b07..0000000
Binary files a/docs/bookkeeperConfig.pdf and /dev/null differ

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

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperOverview.pdf
----------------------------------------------------------------------
diff --git a/docs/bookkeeperOverview.pdf b/docs/bookkeeperOverview.pdf
deleted file mode 100644
index 80aff7f..0000000
Binary files a/docs/bookkeeperOverview.pdf and /dev/null differ

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

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/bookkeeperProgrammer.pdf
----------------------------------------------------------------------
diff --git a/docs/bookkeeperProgrammer.pdf b/docs/bookkeeperProgrammer.pdf
deleted file mode 100644
index 8756828..0000000
Binary files a/docs/bookkeeperProgrammer.pdf and /dev/null differ


[05/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml
----------------------------------------------------------------------
diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml
deleted file mode 100644
index d82e234..0000000
--- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml
+++ /dev/null
@@ -1,2315 +0,0 @@
-<?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>ZooKeeper Administrator's Guide</title>
-
-  <subtitle>A Guide to Deployment and Administration</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 ZooKeeper. It also discusses best practices and common
-      problems.</para>
-    </abstract>
-  </articleinfo>
-
-  <section id="ch_deployment">
-    <title>Deployment</title>
-
-    <para>This section contains information about deploying Zookeeper and
-    covers these topics:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para><xref linkend="sc_systemReq" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="sc_zkMulitServerSetup" /></para>
-      </listitem>
-
-      <listitem>
-        <para><xref linkend="sc_singleAndDevSetup" /></para>
-      </listitem>
-    </itemizedlist>
-
-    <para>The first two sections assume you are interested in installing
-    ZooKeeper in a production environment such as a datacenter. The final
-    section covers situations in which you are setting up ZooKeeper on a
-    limited basis - for evaluation, testing, or development - but not in a
-    production environment.</para>
-
-    <section id="sc_systemReq">
-      <title>System Requirements</title>
-
-      <section id="sc_supportedPlatforms">
-        <title>Supported Platforms</title>
-
-        <para>ZooKeeper consists of multiple components.  Some components are
-        supported broadly, and other components are supported only on a smaller
-        set of platforms.</para>
-
-        <itemizedlist>
-          <listitem>
-            <para><emphasis role="bold">Client</emphasis> is the Java client
-            library, used by applications to connect to a ZooKeeper ensemble.
-            </para>
-          </listitem>
-          <listitem>
-            <para><emphasis role="bold">Server</emphasis> is the Java server
-            that runs on the ZooKeeper ensemble nodes.</para>
-          </listitem>
-          <listitem>
-            <para><emphasis role="bold">Native Client</emphasis> is a client
-            implemented in C, similar to the Java client, used by applications
-            to connect to a ZooKeeper ensemble.</para>
-          </listitem>
-          <listitem>
-            <para><emphasis role="bold">Contrib</emphasis> refers to multiple
-            optional add-on components.</para>
-          </listitem>
-        </itemizedlist>
-
-        <para>The following matrix describes the level of support committed for
-        running each component on different operating system platforms.</para>
-
-        <table>
-          <title>Support Matrix</title>
-          <tgroup cols="5" align="left" colsep="1" rowsep="1">
-            <thead>
-              <row>
-                <entry>Operating System</entry>
-                <entry>Client</entry>
-                <entry>Server</entry>
-                <entry>Native Client</entry>
-                <entry>Contrib</entry>
-              </row>
-            </thead>
-            <tbody>
-              <row>
-                <entry>GNU/Linux</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-              </row>
-              <row>
-                <entry>Solaris</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-                <entry>Not Supported</entry>
-                <entry>Not Supported</entry>
-              </row>
-              <row>
-                <entry>FreeBSD</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-                <entry>Not Supported</entry>
-                <entry>Not Supported</entry>
-              </row>
-              <row>
-                <entry>Windows</entry>
-                <entry>Development and Production</entry>
-                <entry>Development and Production</entry>
-                <entry>Not Supported</entry>
-                <entry>Not Supported</entry>
-              </row>
-              <row>
-                <entry>Mac OS X</entry>
-                <entry>Development Only</entry>
-                <entry>Development Only</entry>
-                <entry>Not Supported</entry>
-                <entry>Not Supported</entry>
-              </row>
-            </tbody>
-          </tgroup>
-        </table>
-
-        <para>For any operating system not explicitly mentioned as supported in
-        the matrix, components may or may not work.  The ZooKeeper community
-        will fix obvious bugs that are reported for other platforms, but there
-        is no full support.</para>
-      </section>
-
-      <section id="sc_requiredSoftware">
-        <title>Required Software </title>
-
-        <para>ZooKeeper runs in Java, release 1.8 or greater (JDK 8 or
-        greater, FreeBSD support requires openjdk8).  It runs as an
-        <emphasis>ensemble</emphasis> of ZooKeeper servers. Three
-        ZooKeeper servers is the minimum recommended size for an
-        ensemble, and we also recommend that they run on separate
-        machines. At Yahoo!, ZooKeeper is usually deployed on
-        dedicated RHEL boxes, with dual-core processors, 2GB of RAM,
-        and 80GB IDE hard drives.</para>
-      </section>
-
-    </section>
-
-    <section id="sc_zkMulitServerSetup">
-      <title>Clustered (Multi-Server) Setup</title>
-
-      <para>For reliable ZooKeeper service, you should deploy ZooKeeper in a
-      cluster known as an <emphasis>ensemble</emphasis>. As long as a majority
-      of the ensemble are up, the service will be available. Because Zookeeper
-      requires a majority, it is best to use an
-      odd number of machines. For example, with four machines ZooKeeper can
-      only handle the failure of a single machine; if two machines fail, the
-      remaining two machines do not constitute a majority. However, with five
-      machines ZooKeeper can handle the failure of two machines. </para>
-      <note>
-         <para>
-            As mentioned in the
-            <ulink url="zookeeperStarted.html">ZooKeeper Getting Started Guide</ulink>
-            , a minimum of three servers are required for a fault tolerant
-            clustered setup, and it is strongly recommended that you have an
-            odd number of servers.
-         </para>
-         <para>Usually three servers is more than enough for a production
-            install, but for maximum reliability during maintenance, you may
-            wish to install five servers. With three servers, if you perform
-            maintenance on one of them, you are vulnerable to a failure on one
-            of the other two servers during that maintenance. If you have five
-            of them running, you can take one down for maintenance, and know
-            that you're still OK if one of the other four suddenly fails.
-         </para>
-         <para>Your redundancy considerations should include all aspects of
-            your environment. If you have three ZooKeeper servers, but their
-            network cables are all plugged into the same network switch, then
-            the failure of that switch will take down your entire ensemble.
-         </para>
-      </note>
-      <para>Here are the steps to setting a server that will be part of an
-      ensemble. These steps should be performed on every host in the
-      ensemble:</para>
-
-      <orderedlist>
-        <listitem>
-          <para>Install the Java JDK. You can use the native packaging system
-          for your system, or download the JDK from:</para>
-
-          <para><ulink
-          url="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</ulink></para>
-        </listitem>
-
-        <listitem>
-          <para>Set the Java heap size. This is very important to avoid
-          swapping, which will seriously degrade ZooKeeper performance. To
-          determine the correct value, use load tests, and make sure you are
-          well below the usage limit that would cause you to swap. Be
-          conservative - use a maximum heap size of 3GB for a 4GB
-          machine.</para>
-        </listitem>
-
-        <listitem>
-          <para>Install the ZooKeeper Server Package. It can be downloaded
-            from:
-          </para>
-          <para>
-            <ulink url="http://zookeeper.apache.org/releases.html">
-              http://zookeeper.apache.org/releases.html
-            </ulink>
-          </para>
-        </listitem>
-
-        <listitem>
-          <para>Create a configuration file. This file can be called anything.
-          Use the following settings as a starting point:</para>
-
-          <programlisting>
-tickTime=2000
-dataDir=/var/lib/zookeeper/
-clientPort=2181
-initLimit=5
-syncLimit=2
-server.1=zoo1:2888:3888
-server.2=zoo2:2888:3888
-server.3=zoo3:2888:3888</programlisting>
-
-          <para>You can find the meanings of these and other configuration
-          settings in the section <xref linkend="sc_configuration" />. A word
-          though about a few here:</para>
-
-          <para>Every machine that is part of the ZooKeeper ensemble should know
-          about every other machine in the ensemble. You accomplish this with
-          the series of lines of the form <emphasis
-          role="bold">server.id=host:port:port</emphasis>. The parameters <emphasis
-          role="bold">host</emphasis> and <emphasis
-          role="bold">port</emphasis> are straightforward. You attribute the
-          server id to each machine by creating a file named
-          <filename>myid</filename>, one for each server, which resides in
-          that server's data directory, as specified by the configuration file
-          parameter <emphasis role="bold">dataDir</emphasis>.</para></listitem>
-
-          <listitem><para>The myid file
-          consists of a single line containing only the text of that machine's
-          id. So <filename>myid</filename> of server 1 would contain the text
-          "1" and nothing else. The id must be unique within the
-          ensemble and should have a value between 1 and 255. <emphasis role="bold">IMPORTANT:</emphasis> if you
-          enable extended features such as TTL Nodes (see below) the id must be
-          between 1 and 254 due to internal limitations.</para>
-        </listitem>
-
-        <listitem>
-          <para>If your configuration file is set up, you can start a
-          ZooKeeper server:</para>
-
-          <para><computeroutput>$ java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf \
-              org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg
-          </computeroutput></para>
-          
-          <para>QuorumPeerMain starts a ZooKeeper server,
-            <ulink url="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">JMX</ulink>
-            management beans are also registered which allows
-            management through a JMX management console. 
-            The <ulink url="zookeeperJMX.html">ZooKeeper JMX
-            document</ulink> contains details on managing ZooKeeper with JMX.
-          </para>
-
-          <para>See the script <emphasis>bin/zkServer.sh</emphasis>,
-            which is included in the release, for an example
-            of starting server instances.</para>
-
-        </listitem>
-
-        <listitem>
-          <para>Test your deployment by connecting to the hosts:</para>
-
-          <para>In Java, you can run the following command to execute
-          simple operations:</para>
-
-          <para><computeroutput>$ bin/zkCli.sh -server 127.0.0.1:2181</computeroutput></para>
-        </listitem>
-      </orderedlist>
-    </section>
-
-    <section id="sc_singleAndDevSetup">
-      <title>Single Server and Developer Setup</title>
-
-      <para>If you want to setup ZooKeeper for development purposes, you will
-      probably want to setup a single server instance of ZooKeeper, and then
-      install either the Java or C client-side libraries and bindings on your
-      development machine.</para>
-
-      <para>The steps to setting up a single server instance are the similar
-      to the above, except the configuration file is simpler. You can find the
-      complete instructions in the <ulink
-      url="zookeeperStarted.html#sc_InstallingSingleMode">Installing and
-      Running ZooKeeper in Single Server Mode</ulink> section of the <ulink
-      url="zookeeperStarted.html">ZooKeeper Getting Started
-      Guide</ulink>.</para>
-
-      <para>For information on installing the client side libraries, refer to
-      the <ulink url="zookeeperProgrammers.html#Bindings">Bindings</ulink>
-      section of the <ulink url="zookeeperProgrammers.html">ZooKeeper
-      Programmer's Guide</ulink>.</para>
-    </section>
-  </section>
-
-  <section id="ch_administration">
-    <title>Administration</title>
-
-    <para>This section contains information about running and maintaining
-    ZooKeeper and covers these topics: </para>
-    <itemizedlist>
-        <listitem>
-          <para><xref linkend="sc_designing" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_provisioning" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_strengthsAndLimitations" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_administering" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_maintenance" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_supervision" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_monitoring" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_logging" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_troubleshooting" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_configuration" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_zkCommands" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_dataFileManagement" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_commonProblems" /></para>
-        </listitem>
-
-        <listitem>
-          <para><xref linkend="sc_bestPractices" /></para>
-        </listitem>
-      </itemizedlist>
-
-    <section id="sc_designing">
-      <title>Designing a ZooKeeper Deployment</title>
-
-      <para>The reliablity of ZooKeeper rests on two basic assumptions.</para>
-      <orderedlist>
-        <listitem><para> Only a minority of servers in a deployment
-            will fail. <emphasis>Failure</emphasis> in this context
-            means a machine crash, or some error in the network that
-            partitions a server off from the majority.</para>
-        </listitem>
-        <listitem><para> Deployed machines operate correctly. To
-            operate correctly means to execute code correctly, to have
-            clocks that work properly, and to have storage and network
-            components that perform consistently.</para>
-        </listitem>
-      </orderedlist>
-    
-    <para>The sections below contain considerations for ZooKeeper
-      administrators to maximize the probability for these assumptions
-      to hold true. Some of these are cross-machines considerations,
-      and others are things you should consider for each and every
-      machine in your deployment.</para>
-
-    <section id="sc_CrossMachineRequirements">
-      <title>Cross Machine Requirements</title>
-    
-      <para>For the ZooKeeper service to be active, there must be a
-        majority of non-failing machines that can communicate with
-        each other. To create a deployment that can tolerate the
-        failure of F machines, you should count on deploying 2xF+1
-        machines.  Thus, a deployment that consists of three machines
-        can handle one failure, and a deployment of five machines can
-        handle two failures. Note that a deployment of six machines
-        can only handle two failures since three machines is not a
-        majority.  For this reason, ZooKeeper deployments are usually
-        made up of an odd number of machines.</para>
-
-      <para>To achieve the highest probability of tolerating a failure
-        you should try to make machine failures independent. For
-        example, if most of the machines share the same switch,
-        failure of that switch could cause a correlated failure and
-        bring down the service. The same holds true of shared power
-        circuits, cooling systems, etc.</para>
-    </section>
-
-    <section>
-      <title>Single Machine Requirements</title>
-
-      <para>If ZooKeeper has to contend with other applications for
-        access to resources like storage media, CPU, network, or
-        memory, its performance will suffer markedly.  ZooKeeper has
-        strong durability guarantees, which means it uses storage
-        media to log changes before the operation responsible for the
-        change is allowed to complete. You should be aware of this
-        dependency then, and take great care if you want to ensure
-        that ZooKeeper operations aren’t held up by your media. Here
-        are some things you can do to minimize that sort of
-        degradation:
-      </para>
-
-      <itemizedlist>
-        <listitem>
-          <para>ZooKeeper's transaction log must be on a dedicated
-            device. (A dedicated partition is not enough.) ZooKeeper
-            writes the log sequentially, without seeking Sharing your
-            log device with other processes can cause seeks and
-            contention, which in turn can cause multi-second
-            delays.</para>
-        </listitem>
-
-        <listitem>
-          <para>Do not put ZooKeeper in a situation that can cause a
-            swap. In order for ZooKeeper to function with any sort of
-            timeliness, it simply cannot be allowed to swap.
-            Therefore, make certain that the maximum heap size given
-            to ZooKeeper is not bigger than the amount of real memory
-            available to ZooKeeper.  For more on this, see
-            <xref linkend="sc_commonProblems"/>
-            below. </para>
-        </listitem>
-      </itemizedlist>
-    </section>
-    </section>
-
-    <section id="sc_provisioning">
-      <title>Provisioning</title>
-
-      <para></para>
-    </section>
-
-    <section id="sc_strengthsAndLimitations">
-      <title>Things to Consider: ZooKeeper Strengths and Limitations</title>
-
-      <para></para>
-    </section>
-
-    <section id="sc_administering">
-      <title>Administering</title>
-
-      <para></para>
-    </section>
-
-    <section id="sc_maintenance">
-      <title>Maintenance</title>
-
-      <para>Little long term maintenance is required for a ZooKeeper
-        cluster however you must be aware of the following:</para>
-
-      <section>
-        <title>Ongoing Data Directory Cleanup</title>
-
-        <para>The ZooKeeper <ulink url="#var_datadir">Data
-          Directory</ulink> contains files which are a persistent copy
-          of the znodes stored by a particular serving ensemble. These
-          are the snapshot and transactional log files. As changes are
-          made to the znodes these changes are appended to a
-          transaction log. Occasionally, when a log grows large, a
-          snapshot of the current state of all znodes will be written
-          to the filesystem and a new transaction log file is created
-          for future transactions. During snapshotting, ZooKeeper may
-          continue appending incoming transactions to the old log file.
-          Therefore, some transactions which are newer than a snapshot
-          may be found in the last transaction log preceding the
-          snapshot.
-        </para>
-
-        <para>A ZooKeeper server <emphasis role="bold">will not remove
-        old snapshots and log files</emphasis> when using the default
-        configuration (see autopurge below), this is the
-        responsibility of the operator. Every serving environment is
-        different and therefore the requirements of managing these
-        files may differ from install to install (backup for example).
-        </para>
-
-        <para>The PurgeTxnLog utility implements a simple retention
-        policy that administrators can use. The <ulink
-        url="ext:api/index">API docs</ulink> contains details on
-        calling conventions (arguments, etc...).
-        </para>
-
-        <para>In the following example the last count snapshots and
-        their corresponding logs are retained and the others are
-        deleted.  The value of &lt;count&gt; should typically be
-        greater than 3 (although not required, this provides 3 backups
-        in the unlikely event a recent log has become corrupted). This
-        can be run as a cron job on the ZooKeeper server machines to
-        clean up the logs daily.</para>
-
-        <programlisting> java -cp zookeeper.jar:lib/slf4j-api-1.7.5.jar:lib/slf4j-log4j12-1.7.5.jar:lib/log4j-1.2.17.jar:conf org.apache.zookeeper.server.PurgeTxnLog &lt;dataDir&gt; &lt;snapDir&gt; -n &lt;count&gt;</programlisting>
-
-        <para>Automatic purging of the snapshots and corresponding
-        transaction logs was introduced in version 3.4.0 and can be
-        enabled via the following configuration parameters <emphasis
-        role="bold">autopurge.snapRetainCount</emphasis> and <emphasis
-        role="bold">autopurge.purgeInterval</emphasis>. For more on
-        this, see <xref linkend="sc_advancedConfiguration"/>
-        below.</para>
-      </section>
-
-      <section>
-        <title>Debug Log Cleanup (log4j)</title>
-
-        <para>See the section on <ulink
-        url="#sc_logging">logging</ulink> in this document. It is
-        expected that you will setup a rolling file appender using the
-        in-built log4j feature. The sample configuration file in the
-        release tar's conf/log4j.properties provides an example of
-        this.
-        </para>
-      </section>
-
-    </section>
-
-    <section id="sc_supervision">
-      <title>Supervision</title>
-
-      <para>You will want to have a supervisory process that manages
-      each of your ZooKeeper server processes (JVM). The ZK server is
-      designed to be "fail fast" meaning that it will shutdown
-      (process exit) if an error occurs that it cannot recover
-      from. As a ZooKeeper serving cluster is highly reliable, this
-      means that while the server may go down the cluster as a whole
-      is still active and serving requests. Additionally, as the
-      cluster is "self healing" the failed server once restarted will
-      automatically rejoin the ensemble w/o any manual
-      interaction.</para>
-
-      <para>Having a supervisory process such as <ulink
-      url="http://cr.yp.to/daemontools.html">daemontools</ulink> or
-      <ulink
-      url="http://en.wikipedia.org/wiki/Service_Management_Facility">SMF</ulink>
-      (other options for supervisory process are also available, it's
-      up to you which one you would like to use, these are just two
-      examples) managing your ZooKeeper server ensures that if the
-      process does exit abnormally it will automatically be restarted
-      and will quickly rejoin the cluster.</para>
-
-      <para>It is also recommended to configure the ZooKeeper server process to
-      terminate and dump its heap if an
-      <computeroutput>OutOfMemoryError</computeroutput> occurs.  This is achieved
-      by launching the JVM with the following arguments on Linux and Windows
-      respectively.  The <filename>zkServer.sh</filename> and
-      <filename>zkServer.cmd</filename> scripts that ship with ZooKeeper set
-      these options.
-      </para>
-
-      <programlisting>-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'</programlisting>
-      <programlisting>"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"</programlisting>
-    </section>
-
-    <section id="sc_monitoring">
-      <title>Monitoring</title>
-
-      <para>The ZooKeeper service can be monitored in one of two
-      primary ways; 1) the command port through the use of <ulink
-      url="#sc_zkCommands">4 letter words</ulink> and 2) <ulink
-      url="zookeeperJMX.html">JMX</ulink>. See the appropriate section for
-      your environment/requirements.</para>
-    </section>
-
-    <section id="sc_logging">
-      <title>Logging</title>
-
-    <para>
-        ZooKeeper uses <emphasis role="bold"><ulink url="http://www.slf4j.org">SLF4J</ulink></emphasis>
-        version 1.7.5 as its logging infrastructure. For backward compatibility it is bound to
-        <emphasis role="bold">LOG4J</emphasis> but you can use
-        <emphasis role="bold"><ulink url="http://logback.qos.ch/">LOGBack</ulink></emphasis>
-        or any other supported logging framework of your choice.
-    </para>
-    <para>
-        The ZooKeeper default <filename>log4j.properties</filename>
-        file resides in the <filename>conf</filename> directory. Log4j requires that
-        <filename>log4j.properties</filename> either be in the working directory
-        (the directory from which ZooKeeper is run) or be accessible from the classpath.
-    </para>
-
-    <para>For more information about SLF4J, see
-      <ulink url="http://www.slf4j.org/manual.html">its manual</ulink>.</para>
-
-    <para>For more information about LOG4J, see
-      <ulink url="http://logging.apache.org/log4j/1.2/manual.html#defaultInit">Log4j Default Initialization Procedure</ulink> 
-      of the log4j manual.</para>
-      
-    </section>
-
-    <section id="sc_troubleshooting">
-      <title>Troubleshooting</title>
-	<variablelist>
-		<varlistentry>
-		<term> Server not coming up because of file corruption</term>
-		<listitem>
-		<para>A server might not be able to read its database and fail to come up because of 
-		some file corruption in the transaction logs of the ZooKeeper server. You will
-		see some IOException on loading ZooKeeper database. In such a case,
-		make sure all the other servers in your ensemble are up and  working. Use "stat" 
-		command on the command port to see if they are in good health. After you have verified that
-		all the other servers of the ensemble are up, you can go ahead and clean the database
-		of the corrupt server. Delete all the files in datadir/version-2 and datalogdir/version-2/.
-		Restart the server.
-		</para>
-		</listitem>
-		</varlistentry>
-		</variablelist>
-    </section>
-
-    <section id="sc_configuration">
-      <title>Configuration Parameters</title>
-
-      <para>ZooKeeper's behavior is governed by the ZooKeeper configuration
-      file. This file is designed so that the exact same file can be used by
-      all the servers that make up a ZooKeeper server assuming the disk
-      layouts are the same. If servers use different configuration files, care
-      must be taken to ensure that the list of servers in all of the different
-      configuration files match.</para>
-
-      <note>
-        <para>In 3.5.0 and later, some of these parameters should be placed in
-         a dynamic configuration file. If they are placed in the static
-         configuration file, ZooKeeper will automatically move them over to the
-         dynamic configuration file. See <ulink url="zookeeperReconfig.html">
-         Dynamic Reconfiguration</ulink> for more information.</para>
-      </note>
-
-      <section id="sc_minimumConfiguration">
-        <title>Minimum Configuration</title>
-
-        <para>Here are the minimum configuration keywords that must be defined
-        in the configuration file:</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>clientPort</term>
-
-            <listitem>
-              <para>the port to listen for client connections; that is, the
-              port that clients attempt to connect to.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>secureClientPort</term>
-
-            <listitem>
-              <para>the port to listen on for secure client connections using SSL.
-
-              <emphasis role="bold">clientPort</emphasis> specifies
-                the port for plaintext connections while <emphasis role="bold">
-                  secureClientPort</emphasis> specifies the port for SSL
-                connections. Specifying both enables mixed-mode while omitting
-                either will disable that mode.</para>
-              <para>Note that SSL feature will be enabled when user plugs-in
-                zookeeper.serverCnxnFactory, zookeeper.clientCnxnSocket as Netty.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry id="var_datadir">
-            <term>dataDir</term>
-
-            <listitem>
-              <para>the location where ZooKeeper will store the in-memory
-              database snapshots and, unless specified otherwise, the
-              transaction log of updates to the database.</para>
-
-              <note>
-                <para>Be careful where you put the transaction log. A
-                dedicated transaction log device is key to consistent good
-                performance. Putting the log on a busy device will adversely
-                effect performance.</para>
-              </note>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry id="id_tickTime">
-            <term>tickTime</term>
-
-            <listitem>
-              <para>the length of a single tick, which is the basic time unit
-              used by ZooKeeper, as measured in milliseconds. It is used to
-              regulate heartbeats, and timeouts. For example, the minimum
-              session timeout will be two ticks.</para>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-      </section>
-
-      <section id="sc_advancedConfiguration">
-        <title>Advanced Configuration</title>
-
-        <para>The configuration settings in the section are optional. You can
-        use them to further fine tune the behaviour of your ZooKeeper servers.
-        Some can also be set using Java system properties, generally of the
-        form <emphasis>zookeeper.keyword</emphasis>. The exact system
-        property, when available, is noted below.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>dataLogDir</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>This option will direct the machine to write the
-              transaction log to the <emphasis
-              role="bold">dataLogDir</emphasis> rather than the <emphasis
-              role="bold">dataDir</emphasis>. This allows a dedicated log
-              device to be used, and helps avoid competition between logging
-              and snaphots.</para>
-
-              <note>
-                <para>Having a dedicated log device has a large impact on
-                throughput and stable latencies. It is highly recommened to
-                dedicate a log device and set <emphasis
-                role="bold">dataLogDir</emphasis> to point to a directory on
-                that device, and then make sure to point <emphasis
-                role="bold">dataDir</emphasis> to a directory
-                <emphasis>not</emphasis> residing on that device.</para>
-              </note>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>globalOutstandingLimit</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.globalOutstandingLimit.</emphasis>)</para>
-
-              <para>Clients can submit requests faster than ZooKeeper can
-              process them, especially if there are a lot of clients. To
-              prevent ZooKeeper from running out of memory due to queued
-              requests, ZooKeeper will throttle clients so that there is no
-              more than globalOutstandingLimit outstanding requests in the
-              system. The default limit is 1,000.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>preAllocSize</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.preAllocSize</emphasis>)</para>
-
-              <para>To avoid seeks ZooKeeper allocates space in the
-              transaction log file in blocks of preAllocSize kilobytes. The
-              default block size is 64M. One reason for changing the size of
-              the blocks is to reduce the block size if snapshots are taken
-              more often. (Also, see <emphasis
-              role="bold">snapCount</emphasis>).</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>snapCount</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.snapCount</emphasis>)</para>
-
-              <para>ZooKeeper records its transactions using snapshots and
-              a transaction log (think write-ahead log).The number of
-              transactions recorded in the transaction log before a snapshot
-              can be taken (and the transaction log rolled) is determined
-              by snapCount. In order to prevent all of the machines in the quorum
-              from taking a snapshot at the same time, each ZooKeeper server
-              will take a snapshot when the number of transactions in the transaction log
-              reaches a runtime generated random value in the [snapCount/2+1, snapCount] 
-              range.The default snapCount is 100,000.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>maxClientCnxns</term>
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Limits the number of concurrent connections (at the socket 
-              level) that a single client, identified by IP address, may make
-              to a single member of the ZooKeeper ensemble. This is used to 
-              prevent certain classes of DoS attacks, including file 
-              descriptor exhaustion. The default is 60. Setting this to 0
-              entirely removes the limit on concurrent connections.</para>
-            </listitem>
-           </varlistentry>
-
-           <varlistentry>
-             <term>clientPortAddress</term>
-
-             <listitem>
-               <para><emphasis role="bold">New in 3.3.0:</emphasis> the
-               address (ipv4, ipv6 or hostname) to listen for client
-               connections; that is, the address that clients attempt
-               to connect to. This is optional, by default we bind in
-               such a way that any connection to the <emphasis
-               role="bold">clientPort</emphasis> for any
-               address/interface/nic on the server will be
-               accepted.</para>
-             </listitem>
-           </varlistentry>
-
-          <varlistentry>
-            <term>minSessionTimeout</term>
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> the
-              minimum session timeout in milliseconds that the server
-              will allow the client to negotiate. Defaults to 2 times
-              the <emphasis role="bold">tickTime</emphasis>.</para>
-            </listitem>
-           </varlistentry>
-
-          <varlistentry>
-            <term>maxSessionTimeout</term>
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> the
-              maximum session timeout in milliseconds that the server
-              will allow the client to negotiate. Defaults to 20 times
-              the <emphasis role="bold">tickTime</emphasis>.</para>
-            </listitem>
-           </varlistentry>
-           
-           <varlistentry>
-             <term>fsync.warningthresholdms</term>
-             <listitem>
-               <para>(Java system property: <emphasis
-               role="bold">zookeeper.fsync.warningthresholdms</emphasis>)</para>
-
-               <para><emphasis role="bold">New in 3.3.4:</emphasis> A
-               warning message will be output to the log whenever an
-               fsync in the Transactional Log (WAL) takes longer than
-               this value. The values is specified in milliseconds and
-               defaults to 1000. This value can only be set as a
-               system property.</para>
-             </listitem>
-           </varlistentry>
-
-          <varlistentry>
-            <term>autopurge.snapRetainCount</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.4.0:</emphasis> 
-              When enabled, ZooKeeper auto purge feature retains
-              the <emphasis role="bold">autopurge.snapRetainCount</emphasis> most
-              recent snapshots and the corresponding transaction logs in the 
-              <emphasis role="bold">dataDir</emphasis> and <emphasis 
-              role="bold">dataLogDir</emphasis> respectively and deletes the rest.
-              Defaults to 3. Minimum value is 3.</para>
-            </listitem>
-          </varlistentry>
-          
-          <varlistentry>
-            <term>autopurge.purgeInterval</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.4.0:</emphasis> The
-              time interval in hours for which the purge task has to
-              be triggered. Set to a positive integer (1 and above)
-              to enable the auto purging. Defaults to 0.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>syncEnabled</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.observer.syncEnabled</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.4.6, 3.5.0:</emphasis>
-              The observers now log transaction and write snapshot to disk
-              by default like the participants. This reduces the recovery time
-              of the observers on restart. Set to "false" to disable this
-              feature. Default is "true"</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>zookeeper.extendedTypesEnabled</term>
-
-            <listitem>
-                <para>(Java system property only: <emphasis
-                    role="bold">zookeeper.extendedTypesEnabled</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.5.4, 3.6.0:</emphasis> Define to "true" to enable
-              extended features such as the creation of <ulink url="zookeeperProgrammers.html#TTL+Nodes">TTL Nodes</ulink>.
-              They are disabled by default. IMPORTANT: when enabled server IDs must
-              be less than 255 due to internal limitations.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>zookeeper.emulate353TTLNodes</term>
-
-            <listitem>
-                <para>(Java system property only: <emphasis
-                    role="bold">zookeeper.emulate353TTLNodes</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.5.4, 3.6.0:</emphasis> Due to
-                <ulink url="https://issues.apache.org/jira/browse/ZOOKEEPER-2901">ZOOKEEPER-2901</ulink> TTL nodes
-                created in version 3.5.3 are not supported in 3.5.4/3.6.0. However, a workaround is provided via the
-                zookeeper.emulate353TTLNodes system property. If you used TTL nodes in ZooKeeper 3.5.3 and need to maintain
-                compatibility set <emphasis role="bold">zookeeper.emulate353TTLNodes</emphasis> to "true" in addition to
-                <emphasis role="bold">zookeeper.extendedTypesEnabled</emphasis>. NOTE: due to the bug, server IDs
-                must be 127 or less. Additionally, the maximum support TTL value is 1099511627775 which is smaller
-                than what was allowed in 3.5.3 (1152921504606846975)</para>
-            </listitem>
-          </varlistentry>
-
-        </variablelist>
-      </section>
-
-      <section id="sc_clusterOptions">
-        <title>Cluster Options</title>
-
-        <para>The options in this section are designed for use with an ensemble
-        of servers -- that is, when deploying clusters of servers.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>electionAlg</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Election implementation to use. A value of "0" corresponds
-              to the original UDP-based version, "1" corresponds to the
-              non-authenticated UDP-based version of fast leader election, "2"
-              corresponds to the authenticated UDP-based version of fast
-              leader election, and "3" corresponds to TCP-based version of
-              fast leader election. Currently, algorithm 3 is the default</para>
-              
-              <note>
-              <para> The implementations of leader election 0, 1, and 2 are now 
-              <emphasis role="bold"> deprecated </emphasis>. We have the intention
-              of removing them in the next release, at which point only the 
-              FastLeaderElection will be available. 
-              </para>
-              </note>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>initLimit</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Amount of time, in ticks (see <ulink
-              url="#id_tickTime">tickTime</ulink>), to allow followers to
-              connect and sync to a leader. Increased this value as needed, if
-              the amount of data managed by ZooKeeper is large.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>leaderServes</term>
-
-            <listitem>
-              <para>(Java system property: zookeeper.<emphasis
-              role="bold">leaderServes</emphasis>)</para>
-
-              <para>Leader accepts client connections. Default value is "yes".
-              The leader machine coordinates updates. For higher update
-              throughput at thes slight expense of read throughput the leader
-              can be configured to not accept clients and focus on
-              coordination. The default to this option is yes, which means
-              that a leader will accept client connections.</para>
-
-              <note>
-                <para>Turning on leader selection is highly recommended when
-                you have more than three ZooKeeper servers in an ensemble.</para>
-              </note>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>server.x=[hostname]:nnnnn[:nnnnn], etc</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>servers making up the ZooKeeper ensemble. When the server
-              starts up, it determines which server it is by looking for the
-              file <filename>myid</filename> in the data directory. That file
-              contains the server number, in ASCII, and it should match
-              <emphasis role="bold">x</emphasis> in <emphasis
-              role="bold">server.x</emphasis> in the left hand side of this
-              setting.</para>
-
-              <para>The list of servers that make up ZooKeeper servers that is
-              used by the clients must match the list of ZooKeeper servers
-              that each ZooKeeper server has.</para>
-
-              <para>There are two port numbers <emphasis role="bold">nnnnn</emphasis>. 
-              The first followers use to connect to the leader, and the second is for 
-              leader election. The leader election port is only necessary if electionAlg 
-              is 1, 2, or 3 (default). If electionAlg is 0, then the second port is not 
-              necessary. If you want to test multiple servers on a single machine, then 
-              different ports can be used for each server.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>syncLimit</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Amount of time, in ticks (see <ulink
-              url="#id_tickTime">tickTime</ulink>), to allow followers to sync
-              with ZooKeeper. If followers fall too far behind a leader, they
-              will be dropped.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>group.x=nnnnn[:nnnnn]</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Enables a hierarchical quorum construction."x" is a group identifier
-              and the numbers following the "=" sign correspond to server identifiers. 
-              The left-hand side of the assignment is a colon-separated list of server
-              identifiers. Note that groups must be disjoint and the union of all groups
-              must be the ZooKeeper ensemble. </para>
-              
-              <para> You will find an example <ulink url="zookeeperHierarchicalQuorums.html">here</ulink>
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>weight.x=nnnnn</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para>Used along with "group", it assigns a weight to a server when
-              forming quorums. Such a value corresponds to the weight of a server
-              when voting. There are a few parts of ZooKeeper that require voting
-              such as leader election and the atomic broadcast protocol. By default
-              the weight of server is 1. If the configuration defines groups, but not
-              weights, then a value of 1 will be assigned to all servers.  
-              </para>
-              
-              <para> You will find an example <ulink url="zookeeperHierarchicalQuorums.html">here</ulink>
-              </para>
-            </listitem>
-          </varlistentry>
-          
-          <varlistentry>
-            <term>cnxTimeout</term>
-
-            <listitem>
-              <para>(Java system property: zookeeper.<emphasis
-              role="bold">cnxTimeout</emphasis>)</para>
-
-              <para>Sets the timeout value for opening connections for leader election notifications. 
-              Only applicable if you are using electionAlg 3. 
-              </para>
-
-              <note>
-                <para>Default value is 5 seconds.</para>
-              </note>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>standaloneEnabled</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.5.0:</emphasis>
-              When set to false, a single server can be started in replicated
-              mode, a lone participant can run with observers, and a cluster
-              can reconfigure down to one node, and up from one node. The
-              default is true for backwards compatibility. It can be set
-              using QuorumPeerConfig's setStandaloneEnabled method or by
-              adding "standaloneEnabled=false" or "standaloneEnabled=true"
-              to a server's config file.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>reconfigEnabled</term>
-
-            <listitem>
-              <para>(No Java system property)</para>
-
-              <para><emphasis role="bold">New in 3.5.3:</emphasis>
-                This controls the enabling or disabling of
-                <ulink url="zookeeperReconfig.html">
-                  Dynamic Reconfiguration</ulink> feature. When the feature
-                is enabled, users can perform reconfigure operations through
-                the ZooKeeper client API or through ZooKeeper command line tools
-                assuming users are authorized to perform such operations.
-                When the feature is disabled, no user, including the super user,
-                can perform a reconfiguration. Any attempt to reconfigure will return an error.
-                <emphasis role="bold">"reconfigEnabled"</emphasis> option can be set as
-                <emphasis role="bold">"reconfigEnabled=false"</emphasis> or
-                <emphasis role="bold">"reconfigEnabled=true"</emphasis>
-                to a server's config file, or using QuorumPeerConfig's
-                setReconfigEnabled method. The default value is false.
-
-                If present, the value should be consistent across every server in
-                the entire ensemble. Setting the value as true on some servers and false
-                on other servers will cause inconsistent behavior depending on which server
-                is elected as leader. If the leader has a setting of
-                <emphasis role="bold">"reconfigEnabled=true"</emphasis>, then the ensemble
-                will have reconfig feature enabled. If the leader has a setting of
-                <emphasis role="bold">"reconfigEnabled=false"</emphasis>, then the ensemble
-                will have reconfig feature disabled. It is thus recommended to have a consistent
-                value for <emphasis role="bold">"reconfigEnabled"</emphasis> across servers
-                in the ensemble.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>4lw.commands.whitelist</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-                      role="bold">zookeeper.4lw.commands.whitelist</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.5.3:</emphasis>
-                A list of comma separated <ulink url="#sc_4lw">Four Letter Words</ulink>
-                commands that user wants to use. A valid Four Letter Words
-                command must be put in this list else ZooKeeper server will
-                not enable the command.
-                By default the whitelist only contains "srvr" command
-                which zkServer.sh uses. The rest of four letter word commands are disabled
-                by default.
-              </para>
-
-              <para>Here's an example of the configuration that enables stat, ruok, conf, and isro
-              command while disabling the rest of Four Letter Words command:</para>
-              <programlisting>
-                4lw.commands.whitelist=stat, ruok, conf, isro
-              </programlisting>
-
-              <para>If you really need enable all four letter word commands by default, you can use
-                the asterisk option so you don't have to include every command one by one in the list.
-                As an example, this will enable all four letter word commands:
-              </para>
-              <programlisting>
-                4lw.commands.whitelist=*
-              </programlisting>
-
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>tcpKeepAlive</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-                      role="bold">zookeeper.tcpKeepAlive</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.5.4:</emphasis>
-                Setting this to true sets the TCP keepAlive flag on the
-                sockets used by quorum members to perform elections.
-                This will allow for connections between quorum members to
-                remain up when there is network infrastructure that may
-                otherwise break them. Some NATs and firewalls may terminate
-                or lose state for long running or idle connections.</para>
-
-              <para> Enabling this option relies on OS level settings to work
-                properly, check your operating system's options regarding TCP
-                keepalive for more information.  Defaults to
-                <emphasis role="bold">false</emphasis>.
-              </para>
-            </listitem>
-          </varlistentry>
-
-        </variablelist>
-        <para></para>
-      </section>
-
-      <section id="sc_authOptions">
-        <title>Encryption, Authentication, Authorization Options</title>
-
-        <para>The options in this section allow control over
-        encryption/authentication/authorization performed by the service.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>DigestAuthenticationProvider.superDigest</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.DigestAuthenticationProvider.superDigest</emphasis>)</para>
-
-              <para>By default this feature is <emphasis
-              role="bold">disabled</emphasis></para>
-
-              <para><emphasis role="bold">New in 3.2:</emphasis>
-              Enables a ZooKeeper ensemble administrator to access the
-              znode hierarchy as a "super" user. In particular no ACL
-              checking occurs for a user authenticated as
-              super.</para>
-
-              <para>org.apache.zookeeper.server.auth.DigestAuthenticationProvider
-              can be used to generate the superDigest, call it with
-              one parameter of "super:&lt;password>". Provide the
-              generated "super:&lt;data>" as the system property value
-              when starting each server of the ensemble.</para>
-
-              <para>When authenticating to a ZooKeeper server (from a
-              ZooKeeper client) pass a scheme of "digest" and authdata
-              of "super:&lt;password>". Note that digest auth passes
-              the authdata in plaintext to the server, it would be
-              prudent to use this authentication method only on
-              localhost (not over the network) or over an encrypted
-              connection.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>X509AuthenticationProvider.superUser</term>
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.X509AuthenticationProvider.superUser</emphasis>)</para>
-
-              <para>The SSL-backed way to enable a ZooKeeper ensemble
-              administrator to access the znode hierarchy as a "super" user.
-              When this parameter is set to an X500 principal name, only an
-              authenticated client with that principal will be able to bypass
-              ACL checking and have full privileges to all znodes.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>zookeeper.superUser</term>
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.superUser</emphasis>)</para>
-
-              <para>Similar to <emphasis role="bold">zookeeper.X509AuthenticationProvider.superUser</emphasis>
-              but is generic for SASL based logins. It stores the name of 
-              a user that can access the znode hierarchy as a "super" user.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>ssl.keyStore.location and ssl.keyStore.password</term>
-            <listitem>
-              <para>(Java system properties: <emphasis role="bold">
-                zookeeper.ssl.keyStore.location</emphasis> and <emphasis
-                      role="bold">zookeeper.ssl.keyStore.password</emphasis>)</para>
-
-              <para>Specifies the file path to a JKS containing the local
-                credentials to be used for SSL connections, and the
-                password to unlock the file.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>ssl.trustStore.location and ssl.trustStore.password</term>
-            <listitem>
-              <para>(Java system properties: <emphasis role="bold">
-                zookeeper.ssl.trustStore.location</emphasis> and <emphasis
-                      role="bold">zookeeper.ssl.trustStore.password</emphasis>)</para>
-
-              <para>Specifies the file path to a JKS containing the remote
-                credentials to be used for SSL connections, and the
-                password to unlock the file.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>ssl.authProvider</term>
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.ssl.authProvider</emphasis>)</para>
-
-              <para>Specifies a subclass of <emphasis role="bold">
-              org.apache.zookeeper.auth.X509AuthenticationProvider</emphasis>
-              to use for secure client authentication. This is useful in
-              certificate key infrastructures that do not use JKS. It may be
-              necessary to extend <emphasis role="bold">javax.net.ssl.X509KeyManager
-              </emphasis> and <emphasis role="bold">javax.net.ssl.X509TrustManager</emphasis>
-              to get the desired behavior from the SSL stack. To configure the
-              ZooKeeper server to use the custom provider for authentication,
-              choose a scheme name for the custom AuthenticationProvider and
-              set the property <emphasis role="bold">zookeeper.authProvider.[scheme]
-              </emphasis> to the fully-qualified class name of the custom
-              implementation. This will load the provider into the ProviderRegistry.
-              Then set this property <emphasis role="bold">
-              zookeeper.ssl.authProvider=[scheme]</emphasis> and that provider
-              will be used for secure authentication.</para>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-      </section>
-
-      <section>
-        <title>Experimental Options/Features</title>
-
-        <para>New features that are currently considered experimental.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>Read Only Mode Server</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">readonlymode.enabled</emphasis>)</para>
-
-              <para><emphasis role="bold">New in 3.4.0:</emphasis>
-              Setting this value to true enables Read Only Mode server
-              support (disabled by default). ROM allows clients
-              sessions which requested ROM support to connect to the
-              server even when the server might be partitioned from
-              the quorum. In this mode ROM clients can still read
-              values from the ZK service, but will be unable to write
-              values and see changes from other clients. See
-              ZOOKEEPER-784 for more details.
-              </para>
-            </listitem>
-          </varlistentry>
-
-        </variablelist>
-      </section>
-
-      <section>
-        <title>Unsafe Options</title>
-
-        <para>The following options can be useful, but be careful when you use
-        them. The risk of each is explained along with the explanation of what
-        the variable does.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>forceSync</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.forceSync</emphasis>)</para>
-
-              <para>Requires updates to be synced to media of the transaction
-              log before finishing processing the update. If this option is
-              set to no, ZooKeeper will not require updates to be synced to
-              the media.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>jute.maxbuffer:</term>
-
-            <listitem>
-              <para>(Java system property:<emphasis role="bold">
-              jute.maxbuffer</emphasis>)</para>
-
-              <para>This option can only be set as a Java system property.
-              There is no zookeeper prefix on it. It specifies the maximum
-              size of the data that can be stored in a znode. The default is
-              0xfffff, or just under 1M. If this option is changed, the system
-              property must be set on all servers and clients otherwise
-              problems will arise. This is really a sanity check. ZooKeeper is
-              designed to store data on the order of kilobytes in size.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>skipACL</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.skipACL</emphasis>)</para>
-
-              <para>Skips ACL checks. This results in a boost in throughput,
-              but opens up full access to the data tree to everyone.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>quorumListenOnAllIPs</term>
-
-            <listitem>
-              <para>When set to true the ZooKeeper server will listen  
-              for connections from its peers on all available IP addresses,
-              and not only the address configured in the server list of the
-              configuration file. It affects the connections handling the 
-              ZAB protocol and the Fast Leader Election protocol. Default
-              value is <emphasis role="bold">false</emphasis>.</para>
-            </listitem>
-          </varlistentry>
-
-        </variablelist>
-      </section>
-
-      <section>
-        <title>Disabling data directory autocreation</title>
-
-        <para><emphasis role="bold">New in 3.5:</emphasis> The default
-        behavior of a ZooKeeper server is to automatically create the
-        data directory (specified in the configuration file) when
-        started if that directory does not already exist. This can be
-        inconvenient and even dangerous in some cases. Take the case
-        where a configuration change is made to a running server,
-        wherein the <emphasis role="bold">dataDir</emphasis> parameter
-        is accidentally changed. When the ZooKeeper server is
-        restarted it will create this non-existent directory and begin
-        serving - with an empty znode namespace. This scenario can
-        result in an effective "split brain" situation (i.e. data in
-        both the new invalid directory and the original valid data
-        store). As such is would be good to have an option to turn off
-        this autocreate behavior. In general for production
-        environments this should be done, unfortunately however the
-        default legacy behavior cannot be changed at this point and
-        therefore this must be done on a case by case basis. This is
-        left to users and to packagers of ZooKeeper distributions.
-        </para>
-
-        <para>When running <emphasis
-        role="bold">zkServer.sh</emphasis> autocreate can be disabled
-        by setting the environment variable <emphasis
-        role="bold">ZOO_DATADIR_AUTOCREATE_DISABLE</emphasis> to 1.
-        When running ZooKeeper servers directly from class files this
-        can be accomplished by setting <emphasis
-        role="bold">zookeeper.datadir.autocreate=false</emphasis> on
-        the java command line, i.e. <emphasis
-        role="bold">-Dzookeeper.datadir.autocreate=false</emphasis>
-        </para>
-
-        <para>When this feature is disabled, and the ZooKeeper server
-        determines that the required directories do not exist it will
-        generate an error and refuse to start.
-        </para>
-
-        <para>A new script <emphasis
-        role="bold">zkServer-initialize.sh</emphasis> is provided to
-        support this new feature. If autocreate is disabled it is
-        necessary for the user to first install ZooKeeper, then create
-        the data directory (and potentially txnlog directory), and
-        then start the server. Otherwise as mentioned in the previous
-        paragraph the server will not start. Running <emphasis
-        role="bold">zkServer-initialize.sh</emphasis> will create the
-        required directories, and optionally setup the myid file
-        (optional command line parameter). This script can be used
-        even if the autocreate feature itself is not used, and will
-        likely be of use to users as this (setup, including creation
-        of the myid file) has been an issue for users in the past.
-        Note that this script ensures the data directories exist only,
-        it does not create a config file, but rather requires a config
-        file to be available in order to execute.
-        </para>
-      </section>
-
-      <section id="sc_performance_options">
-        <title>Performance Tuning Options</title>
-
-        <para><emphasis role="bold">New in 3.5.0:</emphasis> Several subsystems have been reworked
-        to improve read throughput. This includes multi-threading of the NIO communication subsystem and
-        request processing pipeline (Commit Processor). NIO is the default client/server communication
-        subsystem. Its threading model comprises 1 acceptor thread, 1-N selector threads and 0-M
-        socket I/O worker threads. In the request processing pipeline the system can be configured
-        to process multiple read request at once while maintaining the same consistency guarantee
-        (same-session read-after-write). The Commit Processor threading model comprises 1 main
-        thread and 0-N worker threads.
-        </para>
-
-        <para>
-        The default values are aimed at maximizing read throughput on a dedicated ZooKeeper machine.
-        Both subsystems need to have sufficient amount of threads to achieve peak read throughput.
-        </para>
-
-        <variablelist>
-
-          <varlistentry>
-            <term>zookeeper.nio.numSelectorThreads</term>
-            <listitem>
-              <para>(Java system property only: <emphasis
-              role="bold">zookeeper.nio.numSelectorThreads</emphasis>)
-              </para>
-              <para><emphasis role="bold">New in 3.5.0:</emphasis>
-              Number of NIO selector threads. At least 1 selector thread required.
-              It is recommended to use more than one selector for large numbers
-              of client connections. The default value is sqrt( number of cpu cores / 2 ).
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>zookeeper.nio.numWorkerThreads</term>
-            <listitem>
-              <para>(Java system property only: <emphasis
-              role="bold">zookeeper.nio.numWorkerThreads</emphasis>)
-              </para>
-              <para><emphasis role="bold">New in 3.5.0:</emphasis>
-              Number of NIO worker threads. If configured with 0 worker threads, the selector threads
-              do the socket I/O directly. The default value is 2 times the number of cpu cores.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>zookeeper.commitProcessor.numWorkerThreads</term>
-            <listitem>
-              <para>(Java system property only: <emphasis
-              role="bold">zookeeper.commitProcessor.numWorkerThreads</emphasis>)
-              </para>
-              <para><emphasis role="bold">New in 3.5.0:</emphasis>
-              Number of Commit Processor worker threads. If configured with 0 worker threads, the main thread
-              will process the request directly. The default value is the number of cpu cores.
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>znode.container.checkIntervalMs</term>
-
-            <listitem>
-              <para>(Java system property only)</para>
-
-              <para><emphasis role="bold">New in 3.5.1:</emphasis> The
-                time interval in milliseconds for each check of candidate container
-                and ttl nodes. Default is "60000".</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>znode.container.maxPerMinute</term>
-
-            <listitem>
-              <para>(Java system property only)</para>
-
-              <para><emphasis role="bold">New in 3.5.1:</emphasis> The
-                maximum number of container nodes that can be deleted per
-                minute. This prevents herding during container deletion.
-                Default is "10000".</para>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-      </section>
-
-      <section>
-        <title>Communication using the Netty framework</title>
-
-        <para><ulink url="http://netty.io">Netty</ulink>
-            is an NIO based client/server communication framework, it
-            simplifies (over NIO being used directly) many of the
-            complexities of network level communication for java
-            applications. Additionally the Netty framework has built
-            in support for encryption (SSL) and authentication
-            (certificates). These are optional features and can be
-            turned on or off individually.
-        </para>
-        <para>In versions 3.5+, a ZooKeeper server can use Netty
-            instead of NIO (default option) by setting the environment
-            variable <emphasis role="bold">zookeeper.serverCnxnFactory</emphasis>
-            to <emphasis role="bold">org.apache.zookeeper.server.NettyServerCnxnFactory</emphasis>;
-            for the client, set <emphasis role="bold">zookeeper.clientCnxnSocket</emphasis>
-            to <emphasis role="bold">org.apache.zookeeper.ClientCnxnSocketNetty</emphasis>.
-        </para>
-
-        <para>
-          TBD - tuning options for netty - currently there are none that are netty specific but we should add some. Esp around max bound on the number of reader worker threads netty creates.
-        </para>
-        <para>
-          TBD - how to manage encryption
-        </para>
-        <para>
-          TBD - how to manage certificates
-        </para>
-
-      </section>
-
-      <section id="sc_adminserver_config">
-        <title>AdminServer configuration</title>
-        <para><emphasis role="bold">New in 3.5.0:</emphasis> The following
-        options are used to configure the <ulink
-        url="#sc_adminserver">AdminServer</ulink>.</para>
-
-        <variablelist>
-          <varlistentry>
-            <term>admin.enableServer</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.admin.enableServer</emphasis>)</para>
-
-              <para>Set to "false" to disable the AdminServer.  By default the
-              AdminServer is enabled.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>admin.serverAddress</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.admin.serverAddress</emphasis>)</para>
-
-              <para>The address the embedded Jetty server listens on. Defaults to 0.0.0.0.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>admin.serverPort</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.admin.serverPort</emphasis>)</para>
-
-              <para>The port the embedded Jetty server listens on.  Defaults to 8080.</para>
-            </listitem>
-          </varlistentry>
-
-            <varlistentry>
-                <term>admin.idleTimeout</term>
-
-                <listitem>
-                    <para>(Java system property: <emphasis
-                            role="bold">zookeeper.admin.idleTimeout</emphasis>)</para>
-
-                    <para>Set the maximum idle time in milliseconds that a connection can wait 
-                          before sending or receiving data. Defaults to 30000 ms.</para>
-                </listitem>
-            </varlistentry>
-
-
-          <varlistentry>
-            <term>admin.commandURL</term>
-
-            <listitem>
-              <para>(Java system property: <emphasis
-              role="bold">zookeeper.admin.commandURL</emphasis>)</para>
-
-              <para>The URL for listing and issuing commands relative to the
-              root URL.  Defaults to "/commands".</para>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-      </section>
-
-    </section>
-
-    <section id="sc_zkCommands">
-      <title>ZooKeeper Commands</title>
-
-      <section id="sc_4lw">
-        <title>The Four Letter Words</title>
-        <para>ZooKeeper responds to a small set of commands. Each command is
-        composed of four letters. You issue the commands to ZooKeeper via telnet
-        or nc, at the client port.</para>
-
-        <para>Three of the more interesting commands: "stat" gives some
-        general information about the server and connected clients,
-        while "srvr" and "cons" give extended details on server and
-        connections respectively.</para>
-
-        <para><emphasis role="bold">New in 3.5.3:</emphasis>
-          Four Letter Words need to be explicitly white listed before using.
-          Please refer <emphasis role="bold">4lw.commands.whitelist</emphasis>
-           described in <ulink url="#sc_clusterOptions">
-            cluster configuration section</ulink> for details.
-          Moving forward, Four Letter Words will be deprecated, please use
-          <ulink url="#sc_adminserver">AdminServer</ulink> instead.
-        </para>
-
-      <variablelist>
-          <varlistentry>
-            <term>conf</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Print
-              details about serving configuration.</para>
-            </listitem>
-
-          </varlistentry>
-
-          <varlistentry>
-            <term>cons</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> List
-              full connection/session details for all clients connected
-              to this server. Includes information on numbers of packets
-              received/sent, session id, operation latencies, last
-              operation performed, etc...</para>
-            </listitem>
-
-          </varlistentry>
-
-          <varlistentry>
-            <term>crst</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Reset
-              connection/session statistics for all connections.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>dump</term>
-
-            <listitem>
-              <para>Lists the outstanding sessions and ephemeral nodes. This
-              only works on the leader.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>envi</term>
-
-            <listitem>
-              <para>Print details about serving environment</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>ruok</term>
-
-            <listitem>
-              <para>Tests if server is running in a non-error state. The server
-              will respond with imok if it is running. Otherwise it will not
-              respond at all.</para>
-
-              <para>A response of "imok" does not necessarily indicate that the
-              server has joined the quorum, just that the server process is active
-              and bound to the specified client port. Use "stat" for details on
-              state wrt quorum and client connection information.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>srst</term>
-
-            <listitem>
-              <para>Reset server statistics.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>srvr</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
-              full details for the server.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>stat</term>
-
-            <listitem>
-              <para>Lists brief details for the server and connected
-              clients.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>wchs</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
-              brief information on watches for the server.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>wchc</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
-              detailed information on watches for the server, by
-              session.  This outputs a list of sessions(connections)
-              with associated watches (paths). Note, depending on the
-              number of watches this operation may be expensive (ie
-              impact server performance), use it carefully.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>dirs</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.5.1:</emphasis>
-                Shows the total size of snapshot and log files in bytes
-              </para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>wchp</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
-              detailed information on watches for the server, by path.
-              This outputs a list of paths (znodes) with associated
-              sessions. Note, depending on the number of watches this
-              operation may be expensive (ie impact server performance),
-              use it carefully.</para>
-            </listitem>
-          </varlistentry>
-
-
-          <varlistentry>
-            <term>mntr</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.4.0:</emphasis> Outputs a list 
-              of variables that could be used for monitoring the health of the cluster.</para>
-
-              <programlisting>$ echo mntr | nc localhost 2185
-
-              zk_version  3.4.0
-              zk_avg_latency  0
-              zk_max_latency  0
-              zk_min_latency  0
-              zk_packets_received 70
-              zk_packets_sent 69
-              zk_num_alive_connections	1
-              zk_outstanding_requests 0
-              zk_server_state leader
-              zk_znode_count   4
-              zk_watch_count  0
-              zk_ephemerals_count 0
-              zk_approximate_data_size    27
-              zk_followers    4                   - only exposed by the Leader
-              zk_synced_followers 4               - only exposed by the Leader
-              zk_pending_syncs    0               - only exposed by the Leader
-              zk_open_file_descriptor_count 23    - only available on Unix platforms
-              zk_max_file_descriptor_count 1024   - only available on Unix platforms
-              zk_last_proposal_size 23
-              zk_min_proposal_size 23
-              zk_max_proposal_size 64
-              </programlisting>
-
-              <para>The output is compatible with java properties format and the content 
-              may change over time (new keys added). Your scripts should expect changes.</para>
-
-              <para>ATTENTION: Some of the keys are platform specific and some of the keys are only exported by the Leader. </para>
-
-              <para>The output contains multiple lines with the following format:</para>
-              <programlisting>key \t value</programlisting>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>isro</term>
-
-            <listitem>
-              <para><emphasis role="bold">New in 3.4.0:</emphasis> Tests if
-              server is running in read-only mode.  The server will respond with
-              "ro" if in read-only mode or "rw" if not in read-only mode.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>gtmk</term>
-
-            <listitem>
-              <para>Gets the current trace mask as a 64-bit signed long value in
-              decimal format.  See <command>stmk</command> for an explanation of
-              the possible values.</para>
-            </listitem>
-          </varlistentry>
-
-          <varlistentry>
-            <term>stmk</term>
-
-            <listitem>
-              <para>Sets the current trace mask.  The trace mask is 64 bits,
-              where each bit enables or disables a specific category of trace
-              logging on the server.  Log4J must be configured to enable
-              <command>TRACE</command> level first in order to see trace logging
-              messages.  The bits of the trace mask correspond to the following
-              trace logging categories.</para>
-
-              <table>
-                <title>Trace Mask Bit Values</title>
-                <tgroup cols="2" align="left" colsep="1" rowsep="1">
-                  <tbody>
-                    <row>
-                      <entry>0b0000000000</entry>
-                      <entry>Unused, reserved for future use.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0000000010</entry>
-                      <entry>Logs client requests, excluding ping
-                      requests.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0000000100</entry>
-                      <entry>Unused, reserved for future use.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0000001000</entry>
-                      <entry>Logs client ping requests.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0000010000</entry>
-                      <entry>Logs packets received from the quorum peer that is
-                      the current leader, excluding ping requests.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0000100000</entry>
-                      <entry>Logs addition, removal and validation of client
-                      sessions.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0001000000</entry>
-                      <entry>Logs delivery of watch events to client
-                      sessions.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0010000000</entry>
-                      <entry>Logs ping packets received from the quorum peer
-                      that is the current leader.</entry>
-                    </row>
-                    <row>
-                      <entry>0b0100000000</entry>
-                      <entry>Unused, reserved for future use.</entry>
-                    </row>
-                    <row>
-                      <entry>0b1000000000</entry>
-                      <entry>Unused, reserved for future use.</entry>
-                    </row>
-                  </tbody>
-                </tgroup>
-              </table>
-
-              <para>All remaining bits in the 64-bit value are unused and
-              reserved for future use.  Multiple trace logging categories are
-              specified by calculating the bitwise OR of the documented values.
-              The default trace mask is 0b0100110010.  Thus, by default, trace
-              logging includes client requests, packets received from the
-              leader and sessions.</para>
-
-              <para>To set a different trace mask, send a request containing the
-              <command>stmk</command> four-letter word followed by the trace
-              mask represented as a 64-bit signed long value.  This example uses
-              the Perl <command>pack</command> function to construct a trace
-              mask that enables all trace logging categories described above and
-              convert it to a 64-bit signed long value with big-endian byte
-              order.  The result is appended to <command>stmk</command> and sent
-              to the server using netcat.  The server responds with the new
-              trace mask in decimal format.</para>
-
-              <programlisting>$ perl -e "print 'stmk', pack('q>', 0b0011111010)" | nc localhost 2181
-250
-              </programlisting>
-            </listitem>
-          </varlistentry>
-        </variablelist>
-
-        <para>Here's an example of the <emphasis role="bold">ruok</emphasis>
-        command:</para>
-
-        <programlisting>$ echo ruok | nc 127.0.0.1 5111
-        imok
-        </programlisting>
-
-      </section>
-      <section id="sc_adminserver">
-        <title>The AdminServer</title>
-        <para><emphasis role="bold">New in

<TRUNCATED>

[16/18] zookeeper git commit: ZOOKEEPER-3155: Remove Forrest XMLs and their build process from the …

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/recipes.html
----------------------------------------------------------------------
diff --git a/docs/recipes.html b/docs/recipes.html
deleted file mode 100644
index 163041e..0000000
--- a/docs/recipes.html
+++ /dev/null
@@ -1,1024 +0,0 @@
-<!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://zookeeper.apache.org/">ZooKeeper</a> &gt; <a href="http://zookeeper.apache.org/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
-</div>
-<!--+
-    |header
-    +-->
-<div class="header">
-<!--+
-    |start group logo
-    +-->
-<div class="grouplogo">
-<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
-</div>
-<!--+
-    |end group logo
-    +-->
-<!--+
-    |start Project Logo
-    +-->
-<div class="projectlogo">
-<a href="http://zookeeper.apache.org/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
-</div>
-<!--+
-    |end Project Logo
-    +-->
-<!--+
-    |start Search
-    +-->
-<div class="searchbox">
-<form action="http://www.google.com/search" method="get" class="roundtopsmall">
-<input value="zookeeper.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
-                    <input name="Search" value="Search" type="submit">
-</form>
-</div>
-<!--+
-    |end search
-    +-->
-<!--+
-    |start Tabs
-    +-->
-<ul id="tabs">
-<li>
-<a class="unselected" href="http://zookeeper.apache.org/">Project</a>
-</li>
-<li>
-<a class="unselected" href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/">Wiki</a>
-</li>
-<li class="current">
-<a class="selected" href="index.html">ZooKeeper 3.5 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">Admin &amp; Ops</div>
-<div id="menu_1.3" 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 class="menuitem">
-<a href="zookeeperReconfig.html">Dynamic Reconfiguration</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 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 class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER">Wiki</a>
-</div>
-<div class="menuitem">
-<a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>
-</div>
-<div class="menuitem">
-<a href="http://zookeeper.apache.org/mailing_lists.html">Mailing Lists</a>
-</div>
-</div>
-<div id="credit"></div>
-<div id="roundbottom">
-<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
-<!--+
-  |alternative credits
-  +-->
-<div id="credit2"></div>
-</div>
-<!--+
-    |end Menu
-    +-->
-<!--+
-    |start content
-    +-->
-<div id="content">
-<div title="Portable Document Format" class="pdflink">
-<a class="dida" href="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_recipes_errorHandlingNote">Important Note About Error Handling</a>
-</li>
-<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="#sc_recipes_GuidNote">Recoverable Errors and the GUID</a>
-</li>
-<li>
-<a href="#Shared+Locks">Shared Locks</a>
-</li>
-<li>
-<a href="#sc_revocableSharedLocks">Revocable 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_recipes_errorHandlingNote"></a>
-<h3 class="h4">Important Note About Error Handling</h3>
-<p>When implementing the recipes you must handle recoverable exceptions 
-        (see the <a href="https://cwiki.apache.org/confluence/display/ZOOKEEPER/FAQ">FAQ</a>). In 
-	particular, several of the recipes employ sequential ephemeral 
-	nodes. When creating a sequential ephemeral node there is an error case in 
-	which the create() succeeds on the server but the server crashes before 
-	returning the name of the node to the client. When the client reconnects its 
-	session is still valid and, thus, the node is not removed. The implication is 
-	that it is difficult for the client to know if its node was created or not. The 
-	recipes below include measures to handle this.</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 L</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_/guid-lock-" and the <em>sequence</em> and
-        <em>ephemeral</em> flags set. The <em>guid</em> 
-		is needed in case the create() result is missed. See the note below.</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="sc_recipes_GuidNote"></a>
-<h4>Recoverable Errors and the GUID</h4>
-<ul>
-      
-<li>
-        
-<p>If a recoverable error occurs calling <strong>create()</strong> the 
-		client should call <strong>getChildren()</strong> and check for a node 
-		containing the <em>guid</em> used in the path name. 
-		This handles the case (noted <a href="#sc_recipes_errorHandlingNote">above</a>) of 
-		the create() succeeding on the server but the server crashing before returning the name 
-		of the new node.</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">guid-/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">guid-/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>
-<p>Notes:</p>
-<ul>
-      
-<li>
-        
-<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>
-      
-</li>
-    
-</ul>
-<ul>
-      
-<li>
-        
-<p>See the <a href="#sc_recipes_GuidNote">note for Locks</a> on how to use the guid in the node.</p>
-      
-</li>
-    
-</ul>
-<a name="sc_revocableSharedLocks"></a>
-<h4>Revocable 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/guid-n_"
-    with both flags SEQUENCE|EPHEMERAL. With the sequence flag, ZooKeeper
-    automatically appends a sequence number that is greater than 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 a 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/guid-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/guid-n_j", where j is the largest
-        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/guid-n_j", where j is the
-        largest sequence number such that j &lt; i and n_j is a znode in C;
-        </p>
-      
-</li>
-    
-</ol>
-<p>Notes:</p>
-<ul>
-      
-<li>
-	    
-<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 znode
-	    to acknowledge that the leader has executed the leader procedure. </p>
-      
-</li>
-    
-</ul>
-<ul>
-      
-<li>
-        
-<p>See the <a href="#sc_recipes_GuidNote">note for Locks</a> on how to use the guid in the node.</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;
-          <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
-</div>
-<!--+
-    |end bottomstrip
-    +-->
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/ab59048a/docs/recipes.pdf
----------------------------------------------------------------------
diff --git a/docs/recipes.pdf b/docs/recipes.pdf
deleted file mode 100644
index a6e54bd..0000000
Binary files a/docs/recipes.pdf and /dev/null differ