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/07/13 12:58:16 UTC
[06/10] zookeeper git commit: ZOOKEEPER-3033: MAVEN MIGRATION - Step
1.2 - create zk-recipes maven structure
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/include/zoo_queue.h
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/include/zoo_queue.h b/src/recipes/queue/src/c/include/zoo_queue.h
deleted file mode 100644
index dccc763..0000000
--- a/src/recipes/queue/src/c/include/zoo_queue.h
+++ /dev/null
@@ -1,118 +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.
- */
-
-#ifndef ZOOKEEPER_QUEUE_H_
-#define ZOOKEEPER_QUEUE_H_
-
-#include <zookeeper.h>
-#include <pthread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/**
- * \file zoo_queue.h
- * \brief zookeeper recipe for queues.
- */
-
-
-struct zkr_queue {
- zhandle_t *zh;
- char *path;
- struct ACL_vector *acl;
- pthread_mutex_t pmutex;
- char *node_name;
- int node_name_length;
- char *cached_create_path;
-};
-
-typedef struct zkr_queue zkr_queue_t;
-
-
-/**
- * \brief initializes a zookeeper queue
- *
- * this method instantiates a zookeeper queue
- * \param queue the zookeeper queue to initialize
- * \param zh the zookeeper handle to use
- * \param path the path in zookeeper to use for the queue
- * \param acl the acl to use in zookeeper.
- * \return return 0 if successful.
- */
-ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl);
-
-/**
- * \brief adds an element to a zookeeper queue
- *
- * this method adds an element to the back of a zookeeper queue.
- * \param queue the zookeeper queue to add the element to
- * \param data a pointer to a data buffer
- * \param buffer_len the length of the buffer
- * \return returns 0 (ZOK) if successful, otherwise returns a zookeeper error code.
- */
-ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len);
-
-/**
- * \brief returns the head of a zookeeper queue
- *
- * this method returns the head of a zookeeper queue without removing it.
- * \param queue the zookeeper queue to add the element to
- * \param buffer a pointer to a data buffer
- * \param buffer_len a pointer to the length of the buffer
- * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code.
- */
-ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len);
-
-/**
- * \brief returns the head of a zookeeper queue
- *
- * this method returns the head of a zookeeper queue without removing it.
- * \param queue the zookeeper queue to get the head of
- * \param buffer a pointer to a data buffer
- * \param buffer_len a pointer to the length of the buffer
- * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful (-1 if the queue is empty). Otherwise it will set *buffer_len to -1 and return a zookeeper error code.
- */
-ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len);
-
-/**
- * \brief removes and returns the head of a zookeeper queue, blocks if necessary
- *
- * this method returns the head of a zookeeper queue without removing it.
- * \param queue the zookeeper queue to remove and return the head of
- * \param buffer a pointer to a data buffer
- * \param buffer_len a pointer to the length of the buffer
- * \return returns 0 (ZOK) and sets *buffer_len to the length of data written if successful. Otherwise it will set *buffer_len to -1 and return a zookeeper error code.
- */
-ZOOAPI int zkr_queue_take(zhandle_t *zh, zkr_queue_t *queue, char *buffer, int *buffer_len);
-
-/**
- * \brief destroys a zookeeper queue structure
- *
- * this destroys a zookeeper queue structure, this is only a local operation and will not affect
- * the state of the queue on the zookeeper server.
- * \param queue the zookeeper queue to destroy
- */
-void zkr_queue_destroy(zkr_queue_t *queue);
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif //ZOOKEEPER_QUEUE_H_
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/src/zoo_queue.c
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/src/zoo_queue.c b/src/recipes/queue/src/c/src/zoo_queue.c
deleted file mode 100644
index d7cc570..0000000
--- a/src/recipes/queue/src/c/src/zoo_queue.c
+++ /dev/null
@@ -1,442 +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.
- */
-
-#ifdef DLL_EXPORT
-#define USE_STATIC_LIB
-#endif
-
-#if defined(__CYGWIN__)
-#define USE_IPV6
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <zookeeper_log.h>
-#include <time.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <limits.h>
-#include <zoo_queue.h>
-#include <stdbool.h>
-#ifdef HAVE_SYS_UTSNAME_H
-#include <sys/utsname.h>
-#endif
-
-#ifdef HAVE_GETPWUID_R
-#include <pwd.h>
-#endif
-
-#define IF_DEBUG(x) if (logLevel==ZOO_LOG_LEVEL_DEBUG) {x;}
-
-
-static void free_String_vector(struct String_vector *v) {
- if (v->data) {
- int32_t i;
- for (i=0; i<v->count; i++) {
- free(v->data[i]);
- }
- free(v->data);
- v->data = 0;
- }
-}
-
-
-static int vstrcmp(const void* str1, const void* str2) {
- const char **a = (const char**)str1;
- const char **b = (const char**) str2;
- return strcmp(*a, *b);
-}
-
-static void sort_children(struct String_vector *vector) {
- qsort( vector->data, vector->count, sizeof(char*), &vstrcmp);
-}
-
-
-static void concat_path_nodename_n(char *buffer, int len, const char *path, const char *node_name){
- snprintf(buffer, len, "%s/%s", path, node_name);
-}
-
-static char *concat_path_nodename(const char *path, const char *node_name){
- int node_path_length = strlen(path) + 1+ strlen(node_name) +1;
- char *node_path = (char *) malloc(node_path_length * sizeof(char));
- concat_path_nodename_n(node_path, node_path_length, path, node_name);
- return node_path;
-}
-
-
-static void zkr_queue_cache_create_path(zkr_queue_t *queue){
- if(queue->cached_create_path != NULL){
- free(queue->cached_create_path);
- }
- queue->cached_create_path = concat_path_nodename(queue->path, queue->node_name);
-}
-
-ZOOAPI int zkr_queue_init(zkr_queue_t *queue, zhandle_t* zh, char* path, struct ACL_vector *acl){
- queue->zh = zh;
- queue->path = path;
- queue->node_name = "qn-";
- queue->node_name_length = strlen(queue->node_name);
- queue->cached_create_path = NULL;
- queue->acl = acl;
- pthread_mutex_init(&(queue->pmutex), NULL);
- zkr_queue_cache_create_path(queue);
- return 0;
-}
-
-static ZOOAPI int create_queue_root(zkr_queue_t *queue){
- return zoo_create(queue->zh, queue->path, NULL, 0, queue->acl, 0, NULL, 0 );
-}
-
-static int valid_child_name(zkr_queue_t *queue, const char *child_name){
- return strncmp(queue->node_name, child_name, queue->node_name_length);
-}
-
-ZOOAPI int zkr_queue_offer(zkr_queue_t *queue, const char *data, int buffer_len){
- for(;;){
- int rc = zoo_create(queue->zh, queue->cached_create_path, data, buffer_len, queue->acl, ZOO_SEQUENCE, NULL, 0 );
- switch(rc){
- int create_root_rc;
- case ZNONODE:
- create_root_rc = create_queue_root(queue);
- switch(create_root_rc){
- case ZNODEEXISTS:
- case ZOK:
- break;
- default:
- return create_root_rc;
- }
- break;
- default:
- return rc;
- }
- }
-}
-
-
-ZOOAPI int zkr_queue_element(zkr_queue_t *queue, char *buffer, int *buffer_len){
- int path_length = strlen(queue->path);
- for(;;){
- struct String_vector stvector;
- struct String_vector *vector = &stvector;
- /*Get sorted children*/
- int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, vector);
- switch(get_children_rc){
- case ZOK:
- break;
- case ZNONODE:
- *buffer_len = -1;
- return ZOK;
- default:
- return get_children_rc;
- }
- if(stvector.count == 0){
- *buffer_len = -1;
- return ZOK;
- }
-
- sort_children(vector);
- /*try all*/
- int i;
- for(i=0; i < stvector.count; i++){
- char *child_name = stvector.data[i];
- int child_path_length = path_length + 1 + strlen(child_name) +1;
- char child_path[child_path_length];
- concat_path_nodename_n(child_path, child_path_length, queue->path, child_name);
- int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL);
- switch(get_rc){
- case ZOK:
- free_String_vector(vector);
- return ZOK;
- case ZNONODE:
- break;
- default:
- free_String_vector(vector);
- return get_rc;
- }
- }
-
- free_String_vector(vector);
- }
-}
-
-ZOOAPI int zkr_queue_remove(zkr_queue_t *queue, char *buffer, int *buffer_len){
- int path_length = strlen(queue->path);
- for(;;){
- struct String_vector stvector;
- struct String_vector *vector = &stvector;
- /*Get sorted children*/
- int get_children_rc = zoo_get_children(queue->zh, queue->path, 0, &stvector);
- switch(get_children_rc){
- case ZOK:
- break;
- case ZNONODE:
- *buffer_len = -1;
- return ZOK;
-
- default:
- *buffer_len = -1;
- return get_children_rc;
- }
- if(stvector.count == 0){
- *buffer_len = -1;
- return ZOK;
- }
-
- sort_children(vector);
- /*try all*/
- int i;
- for( i=0; i < stvector.count; i++){
- char *child_name = stvector.data[i];
- int child_path_length = path_length + 1 + strlen(child_name) +1;
- char child_path[child_path_length];
- concat_path_nodename_n(child_path, child_path_length, queue->path, child_name);
- int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL);
- switch(get_rc){
- int delete_rc;
- case ZOK:
- delete_rc = zoo_delete(queue->zh, child_path, -1);
- switch(delete_rc){
- case ZOK:
- free_String_vector(vector);
- return delete_rc;
- case ZNONODE:
- break;
- default:
- free_String_vector(vector);
- *buffer_len = -1;
- return delete_rc;
- }
- break;
- case ZNONODE:
- break;
- default:
- free_String_vector(vector);
- *buffer_len = -1;
- return get_rc;
- }
- }
- free_String_vector(vector);
- }
-}
-
-/**
- * The take_latch structure roughly emulates a Java CountdownLatch with 1 as the initial value.
- * It is meant to be used by a setter thread and a waiter thread.
- *
- * This latch is specialized to be used with the queue, all latches created for the same queue structure will use the same mutex.
- *
- * The setter thread at some point will call take_latch_setter_trigger_latch() on the thread.
- *
- * The waiter thread creates the latch and at some point either calls take_latch_waiter_await()s or take_latch_waiter_mark_unneeded()s it.
- * The await function will return after the setter thread has triggered the latch.
- * The mark unneeded function will return immediately and avoid some unneeded initialization.
- *
- * Whichever thread is last to call their required function disposes of the latch.
- *
- * The latch may disposed if no threads will call the waiting, marking, or triggering functions using take_latch_destroy_syncrhonized().
- */
-
-struct take_latch {
- enum take_state {take_init, take_waiting, take_triggered, take_not_needed} state;
- pthread_cond_t latch_condition;
- zkr_queue_t *queue;
-};
-
-
-typedef struct take_latch take_latch_t;
-
-
-static void take_latch_init( take_latch_t *latch, zkr_queue_t *queue){
- pthread_mutex_t *mutex = &(queue->pmutex);
- pthread_mutex_lock(mutex);
- latch->state = take_init;
- latch->queue = queue;
- pthread_mutex_unlock(mutex);
-}
-
-static take_latch_t *create_take_latch(zkr_queue_t *queue){
- take_latch_t *new_take_latch = (take_latch_t *) malloc(sizeof(take_latch_t));
- take_latch_init(new_take_latch, queue);
- return new_take_latch;
-}
-
-
-//Only call this when you own the mutex
-static void take_latch_destroy_unsafe(take_latch_t *latch){
- if(latch->state == take_waiting){
- pthread_cond_destroy(&(latch->latch_condition));
- }
- free(latch);
-}
-
-static void take_latch_destroy_synchronized(take_latch_t *latch){
- pthread_mutex_t *mutex = &(latch->queue->pmutex);
- pthread_mutex_lock(mutex);
- take_latch_destroy_unsafe(latch);
- pthread_mutex_unlock(mutex);
-}
-
-static void take_latch_setter_trigger_latch(zhandle_t *zh, take_latch_t *latch){
- pthread_mutex_t *mutex = &(latch->queue->pmutex);
- pthread_mutex_lock(mutex);
- switch(latch->state){
- case take_init:
- latch->state = take_triggered;
- break;
- case take_not_needed:
- take_latch_destroy_unsafe(latch);
- break;
- case take_triggered:
- LOG_DEBUG(LOGCALLBACK(zh), ("Error! Latch was triggered twice."));
- break;
- case take_waiting:
- pthread_cond_signal(&(latch->latch_condition));
- break;
- }
- pthread_mutex_unlock(mutex);
-}
-
-static void take_latch_waiter_await(zhandle_t *zh, take_latch_t *latch){
- pthread_mutex_t *mutex = &(latch->queue->pmutex);
- pthread_mutex_lock(mutex);
- switch(latch->state){
- case take_init:
- pthread_cond_init(&(latch->latch_condition),NULL);
- latch->state = take_waiting;
- pthread_cond_wait(&(latch->latch_condition),mutex);
- take_latch_destroy_unsafe(latch);
- break;
- case take_waiting:
- LOG_DEBUG(LOGCALLBACK(zh), ("Error! Called await twice."));
- break;
- case take_not_needed:
- LOG_DEBUG(LOGCALLBACK(zh), ("Error! Waiting after marking not needed."));
- break;
- case take_triggered:
- take_latch_destroy_unsafe(latch);
- break;
- }
- pthread_mutex_unlock(mutex);
-}
-
-static void take_latch_waiter_mark_unneeded(zhandle_t *zh, take_latch_t *latch){
- pthread_mutex_t *mutex = &(latch->queue->pmutex);
- pthread_mutex_lock(mutex);
- switch(latch->state){
- case take_init:
- latch->state = take_not_needed;
- break;
- case take_waiting:
- LOG_DEBUG(LOGCALLBACK(zh), ("Error! Can't mark unneeded after waiting."));
- break;
- case take_not_needed:
- LOG_DEBUG(LOGCALLBACK(zh), ("Marked unneeded twice."));
- break;
- case take_triggered:
- take_latch_destroy_unsafe(latch);
- break;
- }
- pthread_mutex_unlock(mutex);
-}
-
-static void take_watcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx){
- take_latch_t *latch = (take_latch_t *) watcherCtx;
- take_latch_setter_trigger_latch(zh, latch);
-}
-
-
-
-ZOOAPI int zkr_queue_take(zhandle_t *zh, zkr_queue_t *queue, char *buffer, int *buffer_len){
- int path_length = strlen(queue->path);
-take_attempt:
- for(;;){
- struct String_vector stvector;
- struct String_vector *vector = &stvector;
- /*Get sorted children*/
- take_latch_t *take_latch = create_take_latch(queue);
- int get_children_rc = zoo_wget_children(queue->zh, queue->path, take_watcher, take_latch, &stvector);
- switch(get_children_rc){
- case ZOK:
- break;
- int create_queue_rc;
- case ZNONODE:
- take_latch_destroy_synchronized(take_latch);
- create_queue_rc = create_queue_root(queue);
- switch(create_queue_rc){
- case ZNODEEXISTS:
- case ZOK:
- goto take_attempt;
- default:
- *buffer_len = -1;
- return create_queue_rc;
- }
- default:
- take_latch_destroy_synchronized(take_latch);
- *buffer_len = -1;
- return get_children_rc;
- }
- if(stvector.count == 0){
- take_latch_waiter_await(zh, take_latch);
- }else{
- take_latch_waiter_mark_unneeded(zh, take_latch);
- }
-
- sort_children(vector);
- /*try all*/
- int i;
- for( i=0; i < stvector.count; i++){
- char *child_name = stvector.data[i];
- int child_path_length = path_length + 1 + strlen(child_name) +1;
- char child_path[child_path_length];
- concat_path_nodename_n(child_path, child_path_length, queue->path, child_name);
- int get_rc = zoo_get(queue->zh, child_path, 0, buffer, buffer_len, NULL);
- switch(get_rc){
- int delete_rc;
- case ZOK:
- delete_rc = zoo_delete(queue->zh, child_path, -1);
- switch(delete_rc){
- case ZOK:
- free_String_vector(vector);
- return delete_rc;
- case ZNONODE:
- break;
- default:
- free_String_vector(vector);
- *buffer_len = -1;
- return delete_rc;
- }
- break;
- case ZNONODE:
- break;
- default:
- free_String_vector(vector);
- *buffer_len = -1;
- return get_rc;
- }
- }
- free_String_vector(vector);
- }
-}
-
-ZOOAPI void zkr_queue_destroy(zkr_queue_t *queue){
- pthread_mutex_destroy(&(queue->pmutex));
- if(queue->cached_create_path != NULL){
- free(queue->cached_create_path);
- }
-}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/tests/TestClient.cc
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/tests/TestClient.cc b/src/recipes/queue/src/c/tests/TestClient.cc
deleted file mode 100644
index 5446d9b..0000000
--- a/src/recipes/queue/src/c/tests/TestClient.cc
+++ /dev/null
@@ -1,452 +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.
- */
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/select.h>
-#include <cppunit/TestAssert.h>
-
-
-using namespace std;
-
-#include <cstring>
-#include <list>
-
-#include <zookeeper.h>
-#include <zoo_queue.h>
-
-static void yield(zhandle_t *zh, int i)
-{
- sleep(i);
-}
-
-typedef struct evt {
- string path;
- int type;
-} evt_t;
-
-typedef struct watchCtx {
-private:
- list<evt_t> events;
-public:
- bool connected;
- zhandle_t *zh;
-
- watchCtx() {
- connected = false;
- zh = 0;
- }
- ~watchCtx() {
- if (zh) {
- zookeeper_close(zh);
- zh = 0;
- }
- }
-
- evt_t getEvent() {
- evt_t evt;
- evt = events.front();
- events.pop_front();
- return evt;
- }
-
- int countEvents() {
- int count;
- count = events.size();
- return count;
- }
-
- void putEvent(evt_t evt) {
- events.push_back(evt);
- }
-
- bool waitForConnected(zhandle_t *zh) {
- time_t expires = time(0) + 10;
- while(!connected && time(0) < expires) {
- yield(zh, 1);
- }
- return connected;
- }
- bool waitForDisconnected(zhandle_t *zh) {
- time_t expires = time(0) + 15;
- while(connected && time(0) < expires) {
- yield(zh, 1);
- }
- return !connected;
- }
-} watchctx_t;
-
-extern "C" {
-
- const char *thread_test_string="Hello World!";
-
- void *offer_thread_shared_queue(void *queue_handle){
- zkr_queue_t *queue = (zkr_queue_t *) queue_handle;
-
- int test_string_buffer_length = strlen(thread_test_string) + 1;
- int offer_rc = zkr_queue_offer(queue, thread_test_string, test_string_buffer_length);
- pthread_exit(NULL);
- }
-
- void *take_thread_shared_queue(void *queue_handle){
- zkr_queue_t *queue = (zkr_queue_t *) queue_handle;
-
- int test_string_buffer_length = strlen(thread_test_string) + 1;
- int receive_buffer_capacity = test_string_buffer_length;
- int receive_buffer_length = receive_buffer_capacity;
- char *receive_buffer = (char *) malloc(sizeof(char) * receive_buffer_capacity);
-
- int remove_rc = zkr_queue_take(queue, receive_buffer, &receive_buffer_length);
- switch(remove_rc){
- case ZOK:
- pthread_exit(receive_buffer);
- default:
- free(receive_buffer);
- pthread_exit(NULL);
- }
- }
-
- int valid_test_string(void *result){
- char *result_string = (char *) result;
- return !strncmp(result_string, thread_test_string, strlen(thread_test_string));
- }
-}
-
-class Zookeeper_queuetest : public CPPUNIT_NS::TestFixture
-{
- CPPUNIT_TEST_SUITE(Zookeeper_queuetest);
- CPPUNIT_TEST(testInitDestroy);
- CPPUNIT_TEST(testOffer1);
- CPPUNIT_TEST(testOfferRemove1);
- CPPUNIT_TEST(testOfferRemove2);
- CPPUNIT_TEST(testOfferRemove3);
- CPPUNIT_TEST(testOfferRemove4);
- CPPUNIT_TEST(testOfferRemove5);
- CPPUNIT_TEST(testOfferRemove6);
- CPPUNIT_TEST(testOfferTake1);
- CPPUNIT_TEST(testOfferTake2);
- CPPUNIT_TEST(testOfferTake3);
- CPPUNIT_TEST(testOfferTake4);
- CPPUNIT_TEST(testOfferTake5);
- CPPUNIT_TEST(testOfferTake6);
- CPPUNIT_TEST_SUITE_END();
-
- static void watcher(zhandle_t *, int type, int state, const char *path,void*v){
- watchctx_t *ctx = (watchctx_t*)v;
-
- if (state == ZOO_CONNECTED_STATE) {
- ctx->connected = true;
- } else {
- ctx->connected = false;
- }
- if (type != ZOO_SESSION_EVENT) {
- evt_t evt;
- evt.path = path;
- evt.type = type;
- ctx->putEvent(evt);
- }
- }
-
- static const char hostPorts[];
-
- const char *getHostPorts() {
- return hostPorts;
- }
-
- zhandle_t *createClient(watchctx_t *ctx) {
- zhandle_t *zk = zookeeper_init(hostPorts, watcher, 10000, 0,
- ctx, 0);
- ctx->zh = zk;
- sleep(1);
- return zk;
- }
-
-public:
-
-#define ZKSERVER_CMD "./tests/zkServer.sh"
-
- void setUp()
- {
- char cmd[1024];
- sprintf(cmd, "%s startClean %s", ZKSERVER_CMD, getHostPorts());
- CPPUNIT_ASSERT(system(cmd) == 0);
- }
-
-
- void startServer() {
- char cmd[1024];
- sprintf(cmd, "%s start %s", ZKSERVER_CMD, getHostPorts());
- CPPUNIT_ASSERT(system(cmd) == 0);
- }
-
- void stopServer() {
- tearDown();
- }
-
- void tearDown()
- {
- char cmd[1024];
- sprintf(cmd, "%s stop %s", ZKSERVER_CMD, getHostPorts());
- CPPUNIT_ASSERT(system(cmd) == 0);
- }
-
- void initializeQueuesAndHandles(int num_clients, zhandle_t *zoohandles[],
- watchctx_t ctxs[], zkr_queue_t queues[], char *path){
- int i;
- for(i=0; i< num_clients; i++){
- zoohandles[i] = createClient(&ctxs[i]);
- zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE);
- }
- }
-
- void cleanUpQueues(int num_clients, zkr_queue_t queues[]){
- int i;
- for(i=0; i < num_clients; i++){
- zkr_queue_destroy(&queues[i]);
- }
- }
-
- void testInitDestroy(){
- int num_clients = 1;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
- char *path= (char *)"/testInitDestroy";
-
- int i;
- for(i=0; i< num_clients; i++){
- zoohandles[i] = createClient(&ctxs[i]);
- zkr_queue_init(&queues[i], zoohandles[i], path, &ZOO_OPEN_ACL_UNSAFE);
- }
-
- for(i=0; i< num_clients; i++){
- zkr_queue_destroy(&queues[i]);
- }
-
- }
-
- void testOffer1(){
- int num_clients = 1;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
- char *path= (char *)"/testOffer1";
-
- initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path);
-
- const char *test_string="Hello World!";
- int test_string_length = strlen(test_string);
- int test_string_buffer_length = test_string_length + 1;
- char buffer[test_string_buffer_length];
-
- int offer_rc = zkr_queue_offer(&queues[0], test_string, test_string_buffer_length);
- CPPUNIT_ASSERT(offer_rc == ZOK);
-
- int removed_element_buffer_length = test_string_buffer_length;
- int remove_rc = zkr_queue_remove(&queues[0], buffer, &removed_element_buffer_length);
- CPPUNIT_ASSERT(remove_rc == ZOK);
- CPPUNIT_ASSERT(removed_element_buffer_length == test_string_buffer_length);
- CPPUNIT_ASSERT(strncmp(test_string,buffer,test_string_length)==0);
-
- cleanUpQueues(num_clients,queues);
- }
-
- void create_n_remove_m(char *path, int n, int m){
- int num_clients = 2;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
-
- initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path);
-
- int i;
- int max_digits = sizeof(int)*3;
- const char *test_string = "Hello World!";
- int buffer_length = strlen(test_string) + max_digits + 1;
- char correct_buffer[buffer_length];
- char receive_buffer[buffer_length];
-
- for(i = 0; i < n; i++){
- snprintf(correct_buffer, buffer_length, "%s%d", test_string,i);
- int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length);
- CPPUNIT_ASSERT(offer_rc == ZOK);
- }
- printf("Offers\n");
- for(i=0; i<m ;i++){
- snprintf(correct_buffer, buffer_length, "%s%d", test_string,i);
- int receive_buffer_length=buffer_length;
- int remove_rc = zkr_queue_remove(&queues[1], receive_buffer, &receive_buffer_length);
- CPPUNIT_ASSERT(remove_rc == ZOK);
- if(i >=n){
- CPPUNIT_ASSERT(receive_buffer_length == -1);
- }else{
- CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0);
- }
- }
-
- cleanUpQueues(num_clients,queues);
- }
-
- void testOfferRemove1(){
- create_n_remove_m((char *)"/testOfferRemove1", 0,1);
- }
-
- void testOfferRemove2(){
- create_n_remove_m((char *)"/testOfferRemove2", 1,1);
- }
-
- void testOfferRemove3(){
- create_n_remove_m((char *)"/testOfferRemove3", 10,1);
- }
-
- void testOfferRemove4(){
- create_n_remove_m((char *)"/testOfferRemove4", 10,10);
- }
-
- void testOfferRemove5(){
- create_n_remove_m((char *)"/testOfferRemove5", 10,5);
- }
-
- void testOfferRemove6(){
- create_n_remove_m((char *)"/testOfferRemove6", 10,11);
- }
-
- void create_n_take_m(char *path, int n, int m){
- CPPUNIT_ASSERT(m<=n);
- int num_clients = 2;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
-
- initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path);
-
- int i;
- int max_digits = sizeof(int)*3;
- const char *test_string = "Hello World!";
- int buffer_length = strlen(test_string) + max_digits + 1;
- char correct_buffer[buffer_length];
- char receive_buffer[buffer_length];
-
- for(i = 0; i < n; i++){
- snprintf(correct_buffer, buffer_length, "%s%d", test_string,i);
- int offer_rc = zkr_queue_offer(&queues[0], correct_buffer, buffer_length);
- CPPUNIT_ASSERT(offer_rc == ZOK);
- }
- printf("Offers\n");
- for(i=0; i<m ;i++){
- snprintf(correct_buffer, buffer_length, "%s%d", test_string,i);
- int receive_buffer_length=buffer_length;
- int remove_rc = zkr_queue_take(&queues[1], receive_buffer, &receive_buffer_length);
- CPPUNIT_ASSERT(remove_rc == ZOK);
- if(i >=n){
- CPPUNIT_ASSERT(receive_buffer_length == -1);
- }else{
- CPPUNIT_ASSERT(strncmp(correct_buffer,receive_buffer, buffer_length)==0);
- }
- }
-
- cleanUpQueues(num_clients,queues);
- }
-
- void testOfferTake1(){
- create_n_take_m((char *)"/testOfferTake1", 2,1);
- }
-
- void testOfferTake2(){
- create_n_take_m((char *)"/testOfferTake2", 1,1);
- }
-
- void testOfferTake3(){
- create_n_take_m((char *)"/testOfferTake3", 10,1);
- }
-
- void testOfferTake4(){
- create_n_take_m((char *)"/testOfferTake4", 10,10);
- }
-
- void testOfferTake5(){
- create_n_take_m((char *)"/testOfferTake5", 10,5);
- }
-
- void testOfferTake6(){
- create_n_take_m((char *)"/testOfferTake6", 12,11);
- }
-
- void testTakeThreaded(){
- int num_clients = 1;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
- char *path=(char *)"/testTakeThreaded";
-
- initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path);
- pthread_t take_thread;
-
- pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]);
-
- usleep(1000);
-
- pthread_t offer_thread;
- pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]);
- pthread_join(offer_thread, NULL);
-
- void *take_thread_result;
- pthread_join(take_thread, &take_thread_result);
- CPPUNIT_ASSERT(take_thread_result != NULL);
- CPPUNIT_ASSERT(valid_test_string(take_thread_result));
-
- cleanUpQueues(num_clients,queues);
- }
-
- void testTakeThreaded2(){
- int num_clients = 1;
- watchctx_t ctxs[num_clients];
- zhandle_t *zoohandles[num_clients];
- zkr_queue_t queues[num_clients];
- char *path=(char *)"/testTakeThreaded2";
-
- initializeQueuesAndHandles(num_clients, zoohandles, ctxs, queues, path);
-
- int take_attempts;
- int num_take_attempts = 2;
- for(take_attempts=0; take_attempts < num_take_attempts; take_attempts++){
- pthread_t take_thread;
-
- pthread_create(&take_thread, NULL, take_thread_shared_queue, (void *) &queues[0]);
-
- usleep(1000);
-
- pthread_t offer_thread;
- pthread_create(&offer_thread, NULL, offer_thread_shared_queue, (void *) &queues[0]);
- pthread_join(offer_thread, NULL);
-
- void *take_thread_result;
- pthread_join(take_thread, &take_thread_result);
- CPPUNIT_ASSERT(take_thread_result != NULL);
- CPPUNIT_ASSERT(valid_test_string(take_thread_result));
-
- }
- cleanUpQueues(num_clients,queues);
- }
-};
-
-const char Zookeeper_queuetest::hostPorts[] = "127.0.0.1:22181";
-CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_queuetest);
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/tests/TestDriver.cc
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/tests/TestDriver.cc b/src/recipes/queue/src/c/tests/TestDriver.cc
deleted file mode 100644
index 2b818f4..0000000
--- a/src/recipes/queue/src/c/tests/TestDriver.cc
+++ /dev/null
@@ -1,114 +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.
- */
-
-#include <string>
-#include <cppunit/TestRunner.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextTestProgressListener.h>
-#include <cppunit/BriefTestProgressListener.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <stdexcept>
-#include <cppunit/Exception.h>
-#include <cppunit/TestFailure.h>
-#include <cppunit/XmlOutputter.h>
-#include <fstream>
-
-#include "Util.h"
-
-using namespace std;
-
-CPPUNIT_NS_BEGIN
-
-class EclipseOutputter: public CompilerOutputter
-{
-public:
- EclipseOutputter(TestResultCollector *result,ostream &stream):
- CompilerOutputter(result,stream,"%p:%l: "),stream_(stream)
- {
- }
- virtual void printFailedTestName( TestFailure *failure ){}
- virtual void printFailureMessage( TestFailure *failure )
- {
- stream_<<": ";
- Message msg = failure->thrownException()->message();
- stream_<< msg.shortDescription();
-
- string text;
- for(int i=0; i<msg.detailCount();i++){
- text+=msg.detailAt(i);
- if(i+1!=msg.detailCount())
- text+=", ";
- }
- if(text.length()!=0)
- stream_ <<" ["<<text<<"]";
- stream_<<"\n";
- }
- ostream& stream_;
-};
-
-CPPUNIT_NS_END
-
-int main( int argc, char* argv[] ) {
- // if command line contains "-ide" then this is the post build check
- // => the output must be in the compiler error format.
- //bool selfTest = (argc > 1) && (std::string("-ide") == argv[1]);
- globalTestConfig.addConfigFromCmdLine(argc,argv);
-
- // Create the event manager and test controller
- CPPUNIT_NS::TestResult controller;
- // Add a listener that colllects test result
- CPPUNIT_NS::TestResultCollector result;
- controller.addListener( &result );
-
- // Add a listener that print dots as tests run.
- // CPPUNIT_NS::TextTestProgressListener progress;
- CPPUNIT_NS::BriefTestProgressListener progress;
- controller.addListener( &progress );
-
- CPPUNIT_NS::TestRunner runner;
- runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
-
- try
- {
- cout << "Running " << globalTestConfig.getTestName();
- runner.run( controller, globalTestConfig.getTestName());
- cout<<endl;
-
- // Print test in a compiler compatible format.
- CPPUNIT_NS::EclipseOutputter outputter( &result,cout);
- outputter.write();
-
- // Uncomment this for XML output
-#ifdef ENABLE_XML_OUTPUT
- std::ofstream file( "tests.xml" );
- CPPUNIT_NS::XmlOutputter xml( &result, file );
- xml.setStyleSheet( "report.xsl" );
- xml.write();
- file.close();
-#endif
- }
- catch ( std::invalid_argument &e ) // Test path not resolved
- {
- cout<<"\nERROR: "<<e.what()<<endl;
- return 0;
- }
-
- return result.wasSuccessful() ? 0 : 1;
- }
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/tests/Util.cc
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/tests/Util.cc b/src/recipes/queue/src/c/tests/Util.cc
deleted file mode 100644
index 26a9a09..0000000
--- a/src/recipes/queue/src/c/tests/Util.cc
+++ /dev/null
@@ -1,30 +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.
- */
-
-#include "Util.h"
-
-const std::string EMPTY_STRING;
-
-TestConfig globalTestConfig;
-
-void millisleep(int ms){
- timespec ts;
- ts.tv_sec=ms/1000;
- ts.tv_nsec=(ms%1000)*1000000; // to nanoseconds
- nanosleep(&ts,0);
-}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/tests/Util.h
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/tests/Util.h b/src/recipes/queue/src/c/tests/Util.h
deleted file mode 100644
index 95f5420..0000000
--- a/src/recipes/queue/src/c/tests/Util.h
+++ /dev/null
@@ -1,134 +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.
- */
-
-#ifndef UTIL_H_
-#define UTIL_H_
-
-#include <map>
-#include <vector>
-#include <string>
-
-// number of elements in array
-#define COUNTOF(array) sizeof(array)/sizeof(array[0])
-
-#define DECLARE_WRAPPER(ret,sym,sig) \
- extern "C" ret __real_##sym sig; \
- extern "C" ret __wrap_##sym sig
-
-#define CALL_REAL(sym,params) \
- __real_##sym params
-
-// must include "src/zookeeper_log.h" to be able to use this macro
-#define TEST_TRACE(x) \
- log_message(3,__LINE__,__func__,format_log_message x)
-
-extern const std::string EMPTY_STRING;
-
-// *****************************************************************************
-// A bit of wizardry to get to the bare type from a reference or a pointer
-// to the type
-template <class T>
-struct TypeOp {
- typedef T BareT;
- typedef T ArgT;
-};
-
-// partial specialization for reference types
-template <class T>
-struct TypeOp<T&>{
- typedef T& ArgT;
- typedef typename TypeOp<T>::BareT BareT;
-};
-
-// partial specialization for pointers
-template <class T>
-struct TypeOp<T*>{
- typedef T* ArgT;
- typedef typename TypeOp<T>::BareT BareT;
-};
-
-// *****************************************************************************
-// Container utilities
-
-template <class K, class V>
-void putValue(std::map<K,V>& map,const K& k, const V& v){
- typedef std::map<K,V> Map;
- typename Map::const_iterator it=map.find(k);
- if(it==map.end())
- map.insert(typename Map::value_type(k,v));
- else
- map[k]=v;
-}
-
-template <class K, class V>
-bool getValue(const std::map<K,V>& map,const K& k,V& v){
- typedef std::map<K,V> Map;
- typename Map::const_iterator it=map.find(k);
- if(it==map.end())
- return false;
- v=it->second;
- return true;
-}
-
-// *****************************************************************************
-// misc utils
-
-// millisecond sleep
-void millisleep(int ms);
-// evaluate given predicate until it returns true or the timeout
-// (in millis) has expired
-template<class Predicate>
-int ensureCondition(const Predicate& p,int timeout){
- int elapsed=0;
- while(!p() && elapsed<timeout){
- millisleep(2);
- elapsed+=2;
- }
- return elapsed;
-};
-
-// *****************************************************************************
-// test global configuration data
-class TestConfig{
- typedef std::vector<std::string> CmdLineOptList;
-public:
- typedef CmdLineOptList::const_iterator const_iterator;
- TestConfig(){}
- ~TestConfig(){}
- void addConfigFromCmdLine(int argc, char* argv[]){
- if(argc>=2)
- testName_=argv[1];
- for(int i=2; i<argc;++i)
- cmdOpts_.push_back(argv[i]);
- }
- const_iterator getExtraOptBegin() const {return cmdOpts_.begin();}
- const_iterator getExtraOptEnd() const {return cmdOpts_.end();}
- size_t getExtraOptCount() const {
- return cmdOpts_.size();
- }
- const std::string& getTestName() const {
- return testName_=="all"?EMPTY_STRING:testName_;
- }
-private:
- CmdLineOptList cmdOpts_;
- std::string testName_;
-};
-
-extern TestConfig globalTestConfig;
-
-#endif /*UTIL_H_*/
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/c/tests/zkServer.sh
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/c/tests/zkServer.sh b/src/recipes/queue/src/c/tests/zkServer.sh
deleted file mode 100755
index a22fd30..0000000
--- a/src/recipes/queue/src/c/tests/zkServer.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/bash
-#
-# 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.
-
-
-if [ "x$1" == "x" ]
-then
- echo "USAGE: $0 startClean|start|stop hostPorts"
- exit 2
-fi
-
-if [ "x$1" == "xstartClean" ]
-then
- rm -rf /tmp/zkdata
-fi
-
-# Make sure nothing is left over from before
-if [ -r "/tmp/zk.pid" ]
-then
-pid=`cat /tmp/zk.pid`
-kill -9 $pid
-rm -f /tmp/zk.pid
-fi
-
-base_dir="../../../../.."
-
-CLASSPATH="$CLASSPATH:${base_dir}/build/classes"
-CLASSPATH="$CLASSPATH:${base_dir}/conf"
-
-for f in "${base_dir}"/zookeeper-*.jar
-do
- CLASSPATH="$CLASSPATH:$f"
-done
-
-for i in "${base_dir}"/build/lib/*.jar
-do
- CLASSPATH="$CLASSPATH:$i"
-done
-
-for i in "${base_dir}"/src/java/lib/*.jar
-do
- CLASSPATH="$CLASSPATH:$i"
-done
-
-CLASSPATH="$CLASSPATH:${CLOVER_HOME}/lib/clover.jar"
-
-case $1 in
-start|startClean)
- mkdir -p /tmp/zkdata
- java -cp $CLASSPATH org.apache.zookeeper.server.ZooKeeperServerMain 22181 /tmp/zkdata &> /tmp/zk.log &
- echo $! > /tmp/zk.pid
- sleep 5
- ;;
-stop)
- # Already killed above
- ;;
-*)
- echo "Unknown command " + $1
- exit 2
-esac
-
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
----------------------------------------------------------------------
diff --git a/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java b/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
deleted file mode 100644
index c35c332..0000000
--- a/src/recipes/queue/src/java/org/apache/zookeeper/recipes/queue/DistributedQueue.java
+++ /dev/null
@@ -1,314 +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.
- */
-
-package org.apache.zookeeper.recipes.queue;
-
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.TreeMap;
-import java.util.concurrent.CountDownLatch;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooDefs;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.data.ACL;
-import org.apache.zookeeper.data.Stat;
-
-/**
- *
- * A <a href="package.html">protocol to implement a distributed queue</a>.
- *
- */
-
-public class DistributedQueue {
- private static final Logger LOG = LoggerFactory.getLogger(DistributedQueue.class);
-
- private final String dir;
-
- private ZooKeeper zookeeper;
- private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;
-
- private final String prefix = "qn-";
-
-
- public DistributedQueue(ZooKeeper zookeeper, String dir, List<ACL> acl){
- this.dir = dir;
-
- if(acl != null){
- this.acl = acl;
- }
- this.zookeeper = zookeeper;
-
- }
-
-
-
- /**
- * Returns a Map of the children, ordered by id.
- * @param watcher optional watcher on getChildren() operation.
- * @return map from id to child name for all children
- */
- private Map<Long,String> orderedChildren(Watcher watcher) throws KeeperException, InterruptedException {
- Map<Long,String> orderedChildren = new TreeMap<Long,String>();
-
- List<String> childNames = null;
- try{
- childNames = zookeeper.getChildren(dir, watcher);
- }catch (KeeperException.NoNodeException e){
- throw e;
- }
-
- for(String childName : childNames){
- try{
- //Check format
- if(!childName.regionMatches(0, prefix, 0, prefix.length())){
- LOG.warn("Found child node with improper name: " + childName);
- continue;
- }
- String suffix = childName.substring(prefix.length());
- Long childId = new Long(suffix);
- orderedChildren.put(childId,childName);
- }catch(NumberFormatException e){
- LOG.warn("Found child node with improper format : " + childName + " " + e,e);
- }
- }
-
- return orderedChildren;
- }
-
- /**
- * Find the smallest child node.
- * @return The name of the smallest child node.
- */
- private String smallestChildName() throws KeeperException, InterruptedException {
- long minId = Long.MAX_VALUE;
- String minName = "";
-
- List<String> childNames = null;
-
- try{
- childNames = zookeeper.getChildren(dir, false);
- }catch(KeeperException.NoNodeException e){
- LOG.warn("Caught: " +e,e);
- return null;
- }
-
- for(String childName : childNames){
- try{
- //Check format
- if(!childName.regionMatches(0, prefix, 0, prefix.length())){
- LOG.warn("Found child node with improper name: " + childName);
- continue;
- }
- String suffix = childName.substring(prefix.length());
- long childId = Long.parseLong(suffix);
- if(childId < minId){
- minId = childId;
- minName = childName;
- }
- }catch(NumberFormatException e){
- LOG.warn("Found child node with improper format : " + childName + " " + e,e);
- }
- }
-
-
- if(minId < Long.MAX_VALUE){
- return minName;
- }else{
- return null;
- }
- }
-
- /**
- * Return the head of the queue without modifying the queue.
- * @return the data at the head of the queue.
- * @throws NoSuchElementException
- * @throws KeeperException
- * @throws InterruptedException
- */
- public byte[] element() throws NoSuchElementException, KeeperException, InterruptedException {
- Map<Long,String> orderedChildren;
-
- // element, take, and remove follow the same pattern.
- // We want to return the child node with the smallest sequence number.
- // Since other clients are remove()ing and take()ing nodes concurrently,
- // the child with the smallest sequence number in orderedChildren might be gone by the time we check.
- // We don't call getChildren again until we have tried the rest of the nodes in sequence order.
- while(true){
- try{
- orderedChildren = orderedChildren(null);
- }catch(KeeperException.NoNodeException e){
- throw new NoSuchElementException();
- }
- if(orderedChildren.size() == 0 ) throw new NoSuchElementException();
-
- for(String headNode : orderedChildren.values()){
- if(headNode != null){
- try{
- return zookeeper.getData(dir+"/"+headNode, false, null);
- }catch(KeeperException.NoNodeException e){
- //Another client removed the node first, try next
- }
- }
- }
-
- }
- }
-
-
- /**
- * Attempts to remove the head of the queue and return it.
- * @return The former head of the queue
- * @throws NoSuchElementException
- * @throws KeeperException
- * @throws InterruptedException
- */
- public byte[] remove() throws NoSuchElementException, KeeperException, InterruptedException {
- Map<Long,String> orderedChildren;
- // Same as for element. Should refactor this.
- while(true){
- try{
- orderedChildren = orderedChildren(null);
- }catch(KeeperException.NoNodeException e){
- throw new NoSuchElementException();
- }
- if(orderedChildren.size() == 0) throw new NoSuchElementException();
-
- for(String headNode : orderedChildren.values()){
- String path = dir +"/"+headNode;
- try{
- byte[] data = zookeeper.getData(path, false, null);
- zookeeper.delete(path, -1);
- return data;
- }catch(KeeperException.NoNodeException e){
- // Another client deleted the node first.
- }
- }
-
- }
- }
-
- private class LatchChildWatcher implements Watcher {
-
- CountDownLatch latch;
-
- public LatchChildWatcher(){
- latch = new CountDownLatch(1);
- }
-
- public void process(WatchedEvent event){
- LOG.debug("Watcher fired on path: " + event.getPath() + " state: " +
- event.getState() + " type " + event.getType());
- latch.countDown();
- }
- public void await() throws InterruptedException {
- latch.await();
- }
- }
-
- /**
- * Removes the head of the queue and returns it, blocks until it succeeds.
- * @return The former head of the queue
- * @throws NoSuchElementException
- * @throws KeeperException
- * @throws InterruptedException
- */
- public byte[] take() throws KeeperException, InterruptedException {
- Map<Long,String> orderedChildren;
- // Same as for element. Should refactor this.
- while(true){
- LatchChildWatcher childWatcher = new LatchChildWatcher();
- try{
- orderedChildren = orderedChildren(childWatcher);
- }catch(KeeperException.NoNodeException e){
- zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);
- continue;
- }
- if(orderedChildren.size() == 0){
- childWatcher.await();
- continue;
- }
-
- for(String headNode : orderedChildren.values()){
- String path = dir +"/"+headNode;
- try{
- byte[] data = zookeeper.getData(path, false, null);
- zookeeper.delete(path, -1);
- return data;
- }catch(KeeperException.NoNodeException e){
- // Another client deleted the node first.
- }
- }
- }
- }
-
- /**
- * Inserts data into queue.
- * @param data
- * @return true if data was successfully added
- */
- public boolean offer(byte[] data) throws KeeperException, InterruptedException{
- for(;;){
- try{
- zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL);
- return true;
- }catch(KeeperException.NoNodeException e){
- zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);
- }
- }
-
- }
-
- /**
- * Returns the data at the first element of the queue, or null if the queue is empty.
- * @return data at the first element of the queue, or null.
- * @throws KeeperException
- * @throws InterruptedException
- */
- public byte[] peek() throws KeeperException, InterruptedException{
- try{
- return element();
- }catch(NoSuchElementException e){
- return null;
- }
- }
-
-
- /**
- * Attempts to remove the head of the queue and return it. Returns null if the queue is empty.
- * @return Head of the queue or null.
- * @throws KeeperException
- * @throws InterruptedException
- */
- public byte[] poll() throws KeeperException, InterruptedException {
- try{
- return remove();
- }catch(NoSuchElementException e){
- return null;
- }
- }
-
-
-
-}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/src/recipes/queue/test/org/apache/zookeeper/recipes/queue/DistributedQueueTest.java
----------------------------------------------------------------------
diff --git a/src/recipes/queue/test/org/apache/zookeeper/recipes/queue/DistributedQueueTest.java b/src/recipes/queue/test/org/apache/zookeeper/recipes/queue/DistributedQueueTest.java
deleted file mode 100644
index c6cfae2..0000000
--- a/src/recipes/queue/test/org/apache/zookeeper/recipes/queue/DistributedQueueTest.java
+++ /dev/null
@@ -1,286 +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.
- */
-package org.apache.zookeeper.recipes.queue;
-
-import java.util.NoSuchElementException;
-
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.test.ClientBase;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Test;
-
-
-
-public class DistributedQueueTest extends ClientBase {
-
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- LOG.info("FINISHED " + getTestName());
- }
-
-
- @Test
- public void testOffer1() throws Exception {
- String dir = "/testOffer1";
- String testString = "Hello World";
- final int num_clients = 1;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- queueHandles[0].offer(testString.getBytes());
-
- byte dequeuedBytes[] = queueHandles[0].remove();
- Assert.assertEquals(new String(dequeuedBytes), testString);
- }
-
- @Test
- public void testOffer2() throws Exception {
- String dir = "/testOffer2";
- String testString = "Hello World";
- final int num_clients = 2;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- queueHandles[0].offer(testString.getBytes());
-
- byte dequeuedBytes[] = queueHandles[1].remove();
- Assert.assertEquals(new String(dequeuedBytes), testString);
- }
-
- @Test
- public void testTake1() throws Exception {
- String dir = "/testTake1";
- String testString = "Hello World";
- final int num_clients = 1;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- queueHandles[0].offer(testString.getBytes());
-
- byte dequeuedBytes[] = queueHandles[0].take();
- Assert.assertEquals(new String(dequeuedBytes), testString);
- }
-
-
-
- @Test
- public void testRemove1() throws Exception{
- String dir = "/testRemove1";
- String testString = "Hello World";
- final int num_clients = 1;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- try{
- queueHandles[0].remove();
- }catch(NoSuchElementException e){
- return;
- }
- Assert.assertTrue(false);
- }
-
- public void createNremoveMtest(String dir,int n,int m) throws Exception{
- String testString = "Hello World";
- final int num_clients = 2;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- for(int i=0; i< n; i++){
- String offerString = testString + i;
- queueHandles[0].offer(offerString.getBytes());
- }
-
- byte data[] = null;
- for(int i=0; i<m; i++){
- data=queueHandles[1].remove();
- }
- Assert.assertEquals(new String(data), testString+(m-1));
- }
-
- @Test
- public void testRemove2() throws Exception{
- createNremoveMtest("/testRemove2",10,2);
- }
- @Test
- public void testRemove3() throws Exception{
- createNremoveMtest("/testRemove3",1000,1000);
- }
-
- public void createNremoveMelementTest(String dir,int n,int m) throws Exception{
- String testString = "Hello World";
- final int num_clients = 2;
- ZooKeeper clients[] = new ZooKeeper[num_clients];
- DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- for(int i=0; i< n; i++){
- String offerString = testString + i;
- queueHandles[0].offer(offerString.getBytes());
- }
-
- byte data[] = null;
- for(int i=0; i<m; i++){
- data=queueHandles[1].remove();
- }
- Assert.assertEquals(new String(queueHandles[1].element()), testString+m);
- }
-
- @Test
- public void testElement1() throws Exception {
- createNremoveMelementTest("/testElement1",1,0);
- }
-
- @Test
- public void testElement2() throws Exception {
- createNremoveMelementTest("/testElement2",10,2);
- }
-
- @Test
- public void testElement3() throws Exception {
- createNremoveMelementTest("/testElement3",1000,500);
- }
-
- @Test
- public void testElement4() throws Exception {
- createNremoveMelementTest("/testElement4",1000,1000-1);
- }
-
- @Test
- public void testTakeWait1() throws Exception{
- String dir = "/testTakeWait1";
- final String testString = "Hello World";
- final int num_clients = 1;
- final ZooKeeper clients[] = new ZooKeeper[num_clients];
- final DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
-
- final byte[] takeResult[] = new byte[1][];
- Thread takeThread = new Thread(){
- public void run(){
- try{
- takeResult[0] = queueHandles[0].take();
- }catch(KeeperException e){
-
- }catch(InterruptedException e){
-
- }
- }
- };
- takeThread.start();
-
- Thread.sleep(1000);
- Thread offerThread= new Thread() {
- public void run(){
- try {
- queueHandles[0].offer(testString.getBytes());
- } catch (KeeperException e) {
-
- } catch (InterruptedException e) {
-
- }
- }
- };
- offerThread.start();
- offerThread.join();
-
- takeThread.join();
-
- Assert.assertTrue(takeResult[0] != null);
- Assert.assertEquals(new String(takeResult[0]), testString);
- }
-
- @Test
- public void testTakeWait2() throws Exception{
- String dir = "/testTakeWait2";
- final String testString = "Hello World";
- final int num_clients = 1;
- final ZooKeeper clients[] = new ZooKeeper[num_clients];
- final DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
- for(int i=0; i < clients.length; i++){
- clients[i] = createClient();
- queueHandles[i] = new DistributedQueue(clients[i], dir, null);
- }
- int num_attempts =2;
- for(int i=0; i< num_attempts; i++){
- final byte[] takeResult[] = new byte[1][];
- final String threadTestString = testString + i;
- Thread takeThread = new Thread(){
- public void run(){
- try{
- takeResult[0] = queueHandles[0].take();
- }catch(KeeperException e){
-
- }catch(InterruptedException e){
-
- }
- }
- };
- takeThread.start();
-
- Thread.sleep(1000);
- Thread offerThread= new Thread() {
- public void run(){
- try {
- queueHandles[0].offer(threadTestString.getBytes());
- } catch (KeeperException e) {
-
- } catch (InterruptedException e) {
-
- }
- }
- };
- offerThread.start();
- offerThread.join();
-
- takeThread.join();
-
- Assert.assertTrue(takeResult[0] != null);
- Assert.assertEquals(new String(takeResult[0]), threadTestString);
- }
- }
-}
-
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/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
index f53536f..40a31ad 100644
--- a/zookeeper-docs/src/documentation/content/xdocs/recipes.xml
+++ b/zookeeper-docs/src/documentation/content/xdocs/recipes.xml
@@ -283,7 +283,7 @@
<note>
<para>There now exists a Queue implementation in ZooKeeper
recipes directory. This is distributed with the release --
- src/recipes/queue directory of the release artifact.
+ zookeeper-recipes/zookeeper-recipes-queue directory of the release artifact.
</para>
</note>
@@ -312,7 +312,7 @@
<note>
<para>There now exists a Lock implementation in ZooKeeper
recipes directory. This is distributed with the release --
- src/recipes/lock directory of the release artifact.
+ zookeeper-recipes/zookeeper-recipes-lock directory of the release artifact.
</para>
</note>
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/zookeeper-recipes/README.txt
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/README.txt b/zookeeper-recipes/README.txt
new file mode 100644
index 0000000..856dae0
--- /dev/null
+++ b/zookeeper-recipes/README.txt
@@ -0,0 +1,26 @@
+1) This source directory contains various Zookeeper recipe implementations.
+
+2) The recipe directory name should specify the name of the recipe you are implementing - eg. zookeeper-recipes-lock/.
+
+3) It would be great if you can provide both the java and c recipes for the zookeeper recipes.
+ C recipes go in to zookeeper-recipes/zookeeper-recipes-[recipe-name]/src/c
+ Java implementation goes into zookeeper-recipes/zookeeper-recipes-[recipe-name]/src/java.
+
+4) The recipes hold high standards like our zookeeper c/java libraries, so make sure that you include
+some unit testing with both the c and java recipe code.
+
+5) Also, please name your c client public methods as
+zkr_recipe-name_methodname
+(eg. zkr_lock_lock in zookeeper-recipes-lock/src/c)
+
+6) The various recipes are in ../docs/recipes.html or
+../../docs/reciped.pdf. Also, this is not an exhaustive list by any chance.
+Zookeeper is used (and can be used) for more than what we have listed in the docs.
+
+7) To run the c tests in all the recipes,
+- make sure the main zookeeper c libraries in
+{top}/src/c/ are compiled. Run autoreconf -if;./configure; make. The libaries
+will be installed in {top}/src/c/.libs.
+- run autoreconf if;./configure;make run-check
+ in zookeeper-recipes/$recipename/src/c
+
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/zookeeper-recipes/build-recipes.xml
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/build-recipes.xml b/zookeeper-recipes/build-recipes.xml
new file mode 100644
index 0000000..b8457eb
--- /dev/null
+++ b/zookeeper-recipes/build-recipes.xml
@@ -0,0 +1,161 @@
+<?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.
+-->
+
+<!-- Imported by recipesb/*/build.xml files to share generic targets. -->
+
+<project name="zookeeperbuildrecipes">
+
+ <property name="name" value="${ant.project.name}"/>
+ <property name="root" value="${basedir}"/>
+
+ <property name="zk.root" location="${root}/../../"/>
+
+ <property name="src.dir" location="${root}/src/java"/>
+ <property name="src.test" location="${root}/src/test"/>
+
+ <property name="build.dir" location="${zk.root}/build/recipes/${name}"/>
+ <property name="build.classes" location="${build.dir}/classes"/>
+ <property name="build.test" location="${build.dir}/test"/>
+
+ <property name="javac.deprecation" value="on"/>
+ <property name="javac.debug" value="on"/>
+
+ <property name="build.encoding" value="utf8"/>
+
+ <!-- to be overridden by sub-projects -->
+ <target name="check-recipes"/>
+ <target name="init-recipes"/>
+
+ <property name="lib.jars.includes" value="lib/*.jar" />
+ <property name="lib.jars.excludes" value="" />
+
+ <!-- prior to ant 1.7.1 fileset always fails if dir doesn't exist
+ so just point to bin directory and provide settings that exclude
+ everything - user can change as appropriate -->
+ <property name="additional.lib.dir" value="${zk.root}/bin" />
+ <property name="additional.lib.dir.includes" value="**/*.jar" />
+ <property name="additional.lib.dir.excludes" value="**/*.jar" />
+
+ <fileset id="lib.jars" dir="${root}">
+ <include name="${lib.jars.includes}" />
+ <exclude name="${lib.jars.excludes}" />
+ </fileset>
+
+ <path id="classpath">
+ <pathelement location="${build.classes}"/>
+ <!-- allow the user to override (e.g. if there are local versions) -->
+ <fileset dir="${additional.lib.dir}">
+ <include name="${additional.lib.dir.includes}" />
+ <exclude name="${additional.lib.dir.excludes}" />
+ </fileset>
+ <fileset refid="lib.jars"/>
+ <pathelement location="${zk.root}/build/classes"/>
+ <fileset dir="${zk.root}/build/lib">
+ <include name="**/*.jar" />
+ </fileset>
+ <fileset dir="${zk.root}/build/test/lib">
+ <include name="**/*.jar"/>
+ </fileset>
+ <fileset dir="${zk.root}/src/java/lib">
+ <include name="**/*.jar" />
+ </fileset>
+ </path>
+
+ <!-- ====================================================== -->
+ <!-- Stuff needed by all targets -->
+ <!-- ====================================================== -->
+ <target name="init" depends="check-recipes" unless="skip.recipes">
+ <echo message="recipes: ${name}"/>
+ <mkdir dir="${build.dir}"/>
+ <mkdir dir="${build.classes}"/>
+ <mkdir dir="${build.test}"/>
+ <antcall target="init-recipes"/>
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Compile a recipes files -->
+ <!-- ====================================================== -->
+ <target name="compile" depends="init" unless="skip.contrib">
+ <echo message="contrib: ${name}"/>
+
+ <javac
+ encoding="${build.encoding}"
+ srcdir="${src.dir}"
+ includes="**/*.java"
+ destdir="${build.classes}"
+ debug="${javac.debug}"
+ deprecation="${javac.deprecation}">
+ <classpath refid="classpath"/>
+ </javac>
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Make a recipes jar -->
+ <!-- ====================================================== -->
+ <target name="jar" depends="compile" unless="skip.recipes">
+ <echo message="recipes: ${name}"/>
+ <jar
+ jarfile="${build.dir}/zookeeper-${version}-recipes-${name}.jar"
+ basedir="${build.classes}"
+ />
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Package a recipes files -->
+ <!-- ====================================================== -->
+ <target name="package" depends="jar" unless="skip.recipes">
+ <echo message="recipes: ${name}"/>
+
+ <mkdir dir="${dist.dir}${package.share}/recipes/${name}"/>
+ <copy todir="${dist.dir}${package.share}/recipes/${name}" includeEmptyDirs="false"
+ flatten="true">
+ <fileset dir="${build.dir}">
+ <include name="zookeeper-${version}-recipes-${name}.jar" />
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- ================================================================== -->
+ <!-- Clean. Delete the build files, and their directories -->
+ <!-- ================================================================== -->
+ <target name="clean">
+ <echo message="recipes: ${name}"/>
+ <delete dir="${build.dir}"/>
+ </target>
+
+ <!-- ================================================================== -->
+ <!-- Utility features -->
+ <!-- ================================================================== -->
+
+ <target name="checkMainIsAvailable">
+ <available classname="org.apache.zookeeper.ZooKeeperMain"
+ property="mainIsCompiled">
+ <!-- we can't use id=classpath, because available fails if fileset directory
+ doesn't exist -->
+ <classpath>
+ <pathelement location="${zk.root}/build/classes"/>
+ </classpath>
+ </available>
+ </target>
+
+ <target name="checkMainCompiled" unless="mainIsCompiled" depends="checkMainIsAvailable">
+ <fail message="ZooKeeper main must first be compiled (toplevel build.xml)"/>
+ </target>
+
+</project>
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/zookeeper-recipes/build.xml
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/build.xml b/zookeeper-recipes/build.xml
new file mode 100644
index 0000000..559d5a5
--- /dev/null
+++ b/zookeeper-recipes/build.xml
@@ -0,0 +1,61 @@
+<?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.
+-->
+
+<project name="zookeeperrecipes" default="compile" basedir=".">
+
+ <!-- In case one of the contrib subdirectories -->
+ <!-- fails the build or test targets and you cannot fix it: -->
+ <!-- Then add to fileset: excludes="badcontrib/build.xml" -->
+
+ <!-- ====================================================== -->
+ <!-- Compile contribs. -->
+ <!-- ====================================================== -->
+ <target name="compile">
+ <subant target="jar">
+ <fileset dir="." includes="*/build.xml"/>
+ </subant>
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Package contrib jars. -->
+ <!-- ====================================================== -->
+ <target name="package">
+ <subant target="package">
+ <fileset dir="." includes="*/build.xml"/>
+ </subant>
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Test all the contribs. -->
+ <!-- ====================================================== -->
+ <target name="test">
+ <subant target="test">
+ <fileset dir="." includes="*/build.xml"/>
+ </subant>
+ </target>
+
+ <!-- ====================================================== -->
+ <!-- Clean all the contribs. -->
+ <!-- ====================================================== -->
+ <target name="clean">
+ <subant target="clean">
+ <fileset dir="." includes="*/build.xml"/>
+ </subant>
+ </target>
+</project>
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/zookeeper-recipes/zookeeper-recipes-election/README.txt
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-election/README.txt b/zookeeper-recipes/zookeeper-recipes-election/README.txt
new file mode 100644
index 0000000..10447ed
--- /dev/null
+++ b/zookeeper-recipes/zookeeper-recipes-election/README.txt
@@ -0,0 +1,27 @@
+<!--
+ 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.
+-->
+
+1) This election interface recipe implements the leader election recipe
+mentioned in ../../../docs/recipes.[html,pdf].
+
+2) To compile the leader election java recipe you can just run ant jar from
+this directory.
+Please report any bugs on the jira
+
+http://issues.apache.org/jira/browse/ZOOKEEPER
+
+
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/28de451a/zookeeper-recipes/zookeeper-recipes-election/build.xml
----------------------------------------------------------------------
diff --git a/zookeeper-recipes/zookeeper-recipes-election/build.xml b/zookeeper-recipes/zookeeper-recipes-election/build.xml
new file mode 100644
index 0000000..8e1d00a
--- /dev/null
+++ b/zookeeper-recipes/zookeeper-recipes-election/build.xml
@@ -0,0 +1,128 @@
+<!--
+ 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.
+-->
+
+<project name="election" default="jar">
+ <import file="../build-recipes.xml"/>
+ <property name="test.main.classes" value="${zk.root}/build/test/classes"/>
+ <property name="test.build.dir" value="${build.test}" />
+ <property name="test.src.dir" value="test"/>
+ <property name="test.log.dir" value="${test.build.dir}/logs" />
+ <property name="test.data.dir" value="${test.build.dir}/data" />
+ <property name="test.data.upgrade.dir" value="${test.data.dir}/upgrade" />
+ <property name="test.tmp.dir" value="${test.build.dir}/tmp" />
+ <property name="test.output" value="no" />
+ <property name="test.timeout" value="900000" />
+ <property name="test.junit.output.format" value="plain" />
+ <property name="test.junit.fork.mode" value="perTest" />
+ <property name="test.junit.printsummary" value="yes" />
+ <property name="test.junit.haltonfailure" value="no" />
+ <property name="test.junit.maxmem" value="512m" />
+
+ <target name="setjarname">
+ <property name="jarname"
+ value="${build.dir}/zookeeper-${version}-recipes-${name}.jar"/>
+ </target>
+
+ <!-- Override jar target to specify main class -->
+ <target name="jar" depends="checkMainCompiled, setjarname, compile">
+ <echo message="recipes: ${name}"/>
+
+ <jar jarfile="${jarname}">
+ <fileset file="${zk.root}/LICENSE.txt" />
+ <fileset dir="${build.classes}"/>
+ <fileset dir="${build.test}"/>
+ </jar>
+ </target>
+
+ <target name="test" depends="compile-test,test-init,test-category,junit.run" />
+
+ <target name="compile-test" depends="compile">
+ <property name="target.jdk" value="${ant.java.version}" />
+ <property name="src.test.local" location="${basedir}/test" />
+ <mkdir dir="${build.test}"/>
+ <javac srcdir="${src.test.local}"
+ destdir="${build.test}"
+ target="${target.jdk}"
+ debug="on" encoding="${build.encoding}">
+ <classpath refid="classpath" />
+ <classpath>
+ <pathelement path="${test.main.classes}"/>
+ </classpath>
+ </javac>
+ </target>
+
+ <target name="test-init" depends="jar,compile-test">
+ <delete dir="${test.log.dir}" />
+ <delete dir="${test.tmp.dir}" />
+ <delete dir="${test.data.dir}" />
+ <mkdir dir="${test.log.dir}" />
+ <mkdir dir="${test.tmp.dir}" />
+ <mkdir dir="${test.data.dir}" />
+ </target>
+
+ <target name="test-category">
+ <property name="test.category" value=""/>
+ </target>
+
+ <target name="junit.run">
+ <echo message="${test.src.dir}" />
+ <junit showoutput="${test.output}"
+ printsummary="${test.junit.printsummary}"
+ haltonfailure="${test.junit.haltonfailure}"
+ fork="yes"
+ forkmode="${test.junit.fork.mode}"
+ maxmemory="${test.junit.maxmem}"
+ dir="${basedir}" timeout="${test.timeout}"
+ errorProperty="tests.failed" failureProperty="tests.failed">
+ <sysproperty key="build.test.dir" value="${test.tmp.dir}" />
+ <sysproperty key="test.data.dir" value="${test.data.dir}" />
+ <sysproperty key="log4j.configuration"
+ value="file:${basedir}/conf/log4j.properties" />
+ <classpath refid="classpath"/>
+ <classpath>
+ <pathelement path="${build.test}" />
+ <pathelement path="${test.main.classes}"/>
+ </classpath>
+ <formatter type="${test.junit.output.format}" />
+ <batchtest todir="${test.log.dir}" unless="testcase">
+ <fileset dir="${test.src.dir}"
+ includes="**/*${test.category}Test.java"/>
+ </batchtest>
+ <batchtest todir="${test.log.dir}" if="testcase">
+ <fileset dir="${test.src.dir}" includes="**/${testcase}.java"/>
+ </batchtest>
+ </junit>
+ <fail if="tests.failed">Tests failed!</fail>
+ </target>
+
+ <target name="package" depends="jar, zookeeperbuildrecipes.package"
+ unless="skip.recipes">
+
+ <copy file="${basedir}/build.xml" todir="${dist.dir}/recipes/${name}"/>
+
+ <mkdir dir="${dist.dir}/recipes/${name}/test"/>
+ <copy todir="${dist.dir}/recipes/${name}/test">
+ <fileset dir="${basedir}/test"/>
+ </copy>
+ <mkdir dir="${dist.dir}/recipes/${name}/src"/>
+ <copy todir="${dist.dir}/recipes/${name}/src">
+ <fileset dir="${basedir}/src"/>
+ </copy>
+ </target>
+
+</project>
+