Repository: zookeeper Updated Branches: refs/heads/branch-3.5 4694b8ada -> b024a3e29
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..e320ed6 --- /dev/null +++ b/zookeeper-docs/src/documentation/content/xdocs/zookeeperTutorial.xml @@ -0,0 +1,712 @@ +<?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<String> list = zk.getChildren(root, true); + + if (list.size() < 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<String> list = zk.getChildren(root, true); + if (list.size() > 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<String> 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 < 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<String> list = zk.getChildren(root, true); + + if (list.size() < 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<String> list = zk.getChildren(root, true); + if (list.size() > 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<String> 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 < 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 < max; i++) + try{ + q.produce(10 + i); + } catch (KeeperException e){ + + } catch (InterruptedException e){ + + } + } else { + System.out.println("Consumer"); + + for (i = 0; i < 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 < 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/b024a3e2/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 new file mode 100755 index 0000000..fe4488f Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/2pc.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..6e12fb4 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/bk-overview.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..161bcf7 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/favicon.ico differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..809525d Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/hadoop-logo.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100755 index 0000000..4a58a00 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/state_dia.dia differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100755 index 0000000..b6f4a8b Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/state_dia.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..a0e5fcc Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkarch.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..7690578 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkcomponents.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..05534bc Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zknamespace.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..594b50b Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkperfRW-3.2.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..ad3019f Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkperfRW.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..232bba8 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkperfreliability.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..1ec9154 Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zkservice.jpg differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/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 new file mode 100644 index 0000000..4e8014f Binary files /dev/null and b/zookeeper-docs/src/documentation/resources/images/zookeeper_small.gif differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b024a3e2/zookeeper-docs/src/documentation/skinconf.xml ---------------------------------------------------------------------- diff --git a/zookeeper-docs/src/documentation/skinconf.xml b/zookeeper-docs/src/documentation/skinconf.xml new file mode 100644 index 0000000..9edf69e --- /dev/null +++ b/zookeeper-docs/src/documentation/skinconf.xml @@ -0,0 +1,360 @@ +<?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="[email protected]" + href="mailto:[email protected]?subject=Feedback " > + 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/b024a3e2/zookeeper-docs/status.xml ---------------------------------------------------------------------- diff --git a/zookeeper-docs/status.xml b/zookeeper-docs/status.xml new file mode 100644 index 0000000..3ac3fda --- /dev/null +++ b/zookeeper-docs/status.xml @@ -0,0 +1,74 @@ +<?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="[email protected]" 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="[email protected]" 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:[email protected]">[email protected]</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/b024a3e2/zookeeper-it/.empty ---------------------------------------------------------------------- diff --git a/zookeeper-it/.empty b/zookeeper-it/.empty new file mode 100644 index 0000000..e69de29
