Randgalt edited this page Jul 10, 2012 · 20 revisions

Test Server

In the curator-test sub-model the TestingServer class is provided. This class creates a local, in-process ZooKeeper server that can be used for testing.

Test Cluster

In the curator-test sub-model the TestingCluster class is provided. This class creates an internally running ensemble of ZooKeeper servers.


Various static methods to help with using ZooKeeper ZNode paths:

  • getNodeFromPath: Given a full path, return the node name. i.e. "/one/two/three" will return "three"
  • mkdirs: Make sure all the nodes in the path are created.
  • getSortedChildren: Return the children of the given path sorted by sequence number
  • makePath: Given a parent path and a child node, create a combined full path


Utility to ensure that a particular path is created. The first time it is used, a synchronized call to ZKPaths.mkdirs(ZooKeeper, String) is made to ensure that the entire path has been created (with an empty byte array if needed). Subsequent calls with the instance are un-synchronized NOPs.


EnsurePath       ensurePath = new EnsurePath(aFullPathToEnsure);
String           nodePath = aFullPathToEnsure + "/foo";
ensurePath.ensure(zk);   // first time syncs and creates if needed
zk.create(nodePath, ...);
ensurePath.ensure(zk);   // subsequent times are NOPs
zk.create(nodePath, ...);

NOTE: There's a method in the CuratorFramework class that returns an EnsurePath instance that is namespace aware.


See: DistributedQueue and DistributedPriorityQueue

A queue consumer that provides behavior similar to a the JDK's BlockingQueue.


Due to limitations in ZooKeeper's transport layer, a single queue will break if it has more than 10K-ish items in it. This class provides a facade over multiple distributed queues. It monitors the queues and if any one of them goes over a threshold, a new queue is added. Puts are distributed amongst the queues.

Reaper and ChildReaper


A Utility to delete parent paths of locks, etc. Periodically checks paths added to the reaper. If at check time, there are no children, the path is deleted. Clients should create one Reaper instance per application. Add lock paths to the reaper as needed and the reaper will periodically delete them. Curator's lock recipes will correctly handle parents getting deleted.


Utility to reap the empty child nodes in a parent node. Periodically calls getChildren() on the node and adds empty nodes to an internally managed Reaper.

NOTE: You should consider using LeaderSelector to run the Reapers as they don't need to run in every client.