http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h b/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h deleted file mode 100644 index 5c06bbf..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/include/zoo_lock.h +++ /dev/null @@ -1,168 +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_LOCK_H_ -#define ZOOKEEPER_LOCK_H_ - -#include <zookeeper.h> -#include <pthread.h> - -#ifdef __cplusplus -extern "C" { -#endif -/** - * \brief the call back function called on status change of lock - * - * the call back funtion is called with a rc of 0 if lock is acquired and - * with an rc of 1 if the lock is released - * \param rc the value to let us know if its locked or unlocked - * \param cbdata the callback data that we passed when initializing - * the zookeeper lock. - */ - -typedef void (* zkr_lock_completion) (int rc, void* cbdata); - -/** - * \file zoo_lock.h - * \brief zookeeper recipe for locking and leader election. - * this api implements a writelock on a given path in zookeeper. - * this api can also be used for leader election. - */ - -struct zkr_lock_mutex { - zhandle_t *zh; - char *path; - struct ACL_vector *acl; - char *id; - void *cbdata; - zkr_lock_completion completion; - pthread_mutex_t pmutex; - int isOwner; - char* ownerid; -}; - -typedef struct zkr_lock_mutex zkr_lock_mutex_t; - - -/** - * \brief initializing a zookeeper lock. - * - * this method instantiates the zookeeper mutex lock. - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl); - -/** - * \brief initializing a zookeeper lock. - * - * - * this method instantiates the zookeeper mutex lock with - * a completion function. - * - * \param mutex the mutex to initialize - * \param zh the zookeeper handle to use - * \param path the path in zookeeper to use for locking - * \param acl the acls to use in zookeeper. - * \param completion the callback thats called when lock - * is acquired and released. - * \param cbdata the callback method is called with data - * \return return 0 if successful. - */ -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata); - -/** - * \brief lock the zookeeper mutex - * - * this method tries locking the mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is no error. check - * with zkr_lock_isowner() if you have the lock - */ -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex); - -/** - * \brief unlock the zookeeper mutex - * - * this method unlocks the zookeeper mutex - * \param mutex the zookeeper mutex - * \return return 0 if there is not error in executing unlock. - * else returns non zero - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex); - -/** - * \brief set the callback function for zookeeper mutex - * - * this method sets the callback for zookeeper mutex - * \param mutex the zookeeper mutex - * \param callback the call back completion function - */ -ZOOAPI void zkr_lock_setcallback(zkr_lock_mutex_t *mutex, - zkr_lock_completion completion); - -/** - * \brief get the callback function for zookeeper mutex - * - * this method gets the callback funtion for zookeeper mutex - * \param mutex the zookeeper mutex - * \return the lock completion function - */ -ZOOAPI zkr_lock_completion zkr_lock_getcallback(zkr_lock_mutex_t *mutex); - -/** - * \brief destroy the mutex - * this method free the mutex - * \param mutex destroy the zookepeer lock. - * \return return 0 if destroyed. - */ -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex); - -/** - * \brief return the parent path this mutex is using - * this method returns the parent path - * \param mutex the mutex - * \return return the parent path - */ -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex); - -/** - * \brief return if this mutex is owner of the lock - * this method returns if its owner or not - * \param mutex the mutex - * \return return true if is owner and false if not - */ -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex); - -/** - * \brief return the id for this mutex - * this mutex retunrns the id string - * \param mutex the mutex - * \return the id for this mutex - */ -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex); - -#ifdef __cplusplus -} -#endif -#endif //ZOOKEEPER_LOCK_H_
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c b/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c deleted file mode 100644 index 74a115f..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/src/zoo_lock.c +++ /dev/null @@ -1,396 +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_lock.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;} - - -ZOOAPI int zkr_lock_init(zkr_lock_mutex_t* mutex, zhandle_t* zh, - char* path, struct ACL_vector *acl) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = NULL; - mutex->cbdata = NULL; - mutex->id = NULL; - mutex->ownerid = NULL; - mutex->isOwner = 0; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -ZOOAPI int zkr_lock_init_cb(zkr_lock_mutex_t *mutex, zhandle_t* zh, - char *path, struct ACL_vector *acl, - zkr_lock_completion completion, void* cbdata) { - mutex->zh = zh; - mutex->path = path; - mutex->acl = acl; - mutex->completion = completion; - mutex->cbdata = cbdata; - mutex->isOwner = 0; - mutex->ownerid = NULL; - mutex->id = NULL; - pthread_mutex_init(&(mutex->pmutex), NULL); - return 0; -} - -/** - * unlock the mutex - */ -ZOOAPI int zkr_lock_unlock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - if (mutex->id != NULL) { - int len = strlen(mutex->path) + strlen(mutex->id) + 2; - char buf[len]; - sprintf(buf, "%s/%s", mutex->path, mutex->id); - int ret = 0; - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - ret = ZCONNECTIONLOSS; - while (ret == ZCONNECTIONLOSS && (count < 3)) { - ret = zoo_delete(zh, buf, -1); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(LOGCALLBACK(zh), ("connectionloss while deleting the node")); - nanosleep(&ts, 0); - count++; - } - } - if (ret == ZOK || ret == ZNONODE) { - zkr_lock_completion completion = mutex->completion; - if (completion != NULL) { - completion(1, mutex->cbdata); - } - - free(mutex->id); - mutex->id = NULL; - pthread_mutex_unlock(&(mutex->pmutex)); - return 0; - } - LOG_WARN(LOGCALLBACK(zh), ("not able to connect to server - giving up")); - pthread_mutex_unlock(&(mutex->pmutex)); - return ZCONNECTIONLOSS; - } - pthread_mutex_unlock(&(mutex->pmutex)); - return ZSYSTEMERROR; -} - -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(strrchr(*a, '-')+1, strrchr(*b, '-')+1); -} - -static void sort_children(struct String_vector *vector) { - qsort( vector->data, vector->count, sizeof(char*), &vstrcmp); -} - -static char* child_floor(char **sorted_data, int len, char *element) { - char* ret = NULL; - int i =0; - for (i=0; i < len; i++) { - if (strcmp(sorted_data[i], element) < 0) { - ret = sorted_data[i]; - } - } - return ret; -} - -static void lock_watcher_fn(zhandle_t* zh, int type, int state, - const char* path, void *watcherCtx) { - //callback that we registered - //should be called - zkr_lock_lock((zkr_lock_mutex_t*) watcherCtx); -} - -/** - * get the last name of the path - */ -static char* getName(char* str) { - char* name = strrchr(str, '/'); - if (name == NULL) - return NULL; - return strdup(name + 1); -} - -/** - * just a method to retry get children - */ -static int retry_getchildren(zhandle_t *zh, char* path, struct String_vector *vector, - struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_get_children(zh, path, 0, vector); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(LOGCALLBACK(zh), ("connection loss to the server")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** see if our node already exists - * if it does then we dup the name and - * return it - */ -static char* lookupnode(struct String_vector *vector, char *prefix) { - char *ret = NULL; - if (vector->data) { - int i = 0; - for (i = 0; i < vector->count; i++) { - char* child = vector->data[i]; - if (strncmp(prefix, child, strlen(prefix)) == 0) { - ret = strdup(child); - break; - } - } - } - return ret; -} - -/** retry zoo_wexists - */ -static int retry_zoowexists(zhandle_t *zh, char* path, watcher_fn watcher, void* ctx, - struct Stat *stat, struct timespec *ts, int retry) { - int ret = ZCONNECTIONLOSS; - int count = 0; - while (ret == ZCONNECTIONLOSS && count < retry) { - ret = zoo_wexists(zh, path, watcher, ctx, stat); - if (ret == ZCONNECTIONLOSS) { - LOG_DEBUG(LOGCALLBACK(zh), ("connectionloss while setting watch on my predecessor")); - nanosleep(ts, 0); - count++; - } - } - return ret; -} - -/** - * the main code that does the zookeeper leader - * election. this code creates its own ephemeral - * node on the given path and sees if its the first - * one on the list and claims to be a leader if and only - * if its the first one of children in the paretn path - */ -static int zkr_lock_operation(zkr_lock_mutex_t *mutex, struct timespec *ts) { - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - char *id = mutex->id; - struct Stat stat; - char* owner_id = NULL; - int retry = 3; - do { - const clientid_t *cid = zoo_client_id(zh); - // get the session id - int64_t session = cid->client_id; - char prefix[30]; - int ret = 0; -#if defined(__x86_64__) - snprintf(prefix, 30, "x-%016lx-", session); -#else - snprintf(prefix, 30, "x-%016llx-", session); -#endif - struct String_vector vectorst; - vectorst.data = NULL; - vectorst.count = 0; - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, &vectorst, ts, retry); - if (ret != ZOK) - return ret; - struct String_vector *vector = &vectorst; - mutex->id = lookupnode(vector, prefix); - free_String_vector(vector); - if (mutex->id == NULL) { - int len = strlen(path) + strlen(prefix) + 2; - char buf[len]; - char retbuf[len+20]; - snprintf(buf, len, "%s/%s", path, prefix); - ret = ZCONNECTIONLOSS; - ret = zoo_create(zh, buf, NULL, 0, mutex->acl, - ZOO_EPHEMERAL|ZOO_SEQUENCE, retbuf, (len+20)); - - // do not want to retry the create since - // we would end up creating more than one child - if (ret != ZOK) { - LOG_WARN(LOGCALLBACK(zh), ("could not create zoo node %s", buf)); - return ret; - } - mutex->id = getName(retbuf); - } - - if (mutex->id != NULL) { - ret = ZCONNECTIONLOSS; - ret = retry_getchildren(zh, path, vector, ts, retry); - if (ret != ZOK) { - LOG_WARN(LOGCALLBACK(zh), ("could not connect to server")); - return ret; - } - //sort this list - sort_children(vector); - owner_id = vector->data[0]; - mutex->ownerid = strdup(owner_id); - id = mutex->id; - char* lessthanme = child_floor(vector->data, vector->count, id); - if (lessthanme != NULL) { - int flen = strlen(mutex->path) + strlen(lessthanme) + 2; - char last_child[flen]; - sprintf(last_child, "%s/%s",mutex->path, lessthanme); - ret = ZCONNECTIONLOSS; - ret = retry_zoowexists(zh, last_child, &lock_watcher_fn, mutex, - &stat, ts, retry); - // cannot watch my predecessor i am giving up - // we need to be able to watch the predecessor - // since if we do not become a leader the others - // will keep waiting - if (ret != ZOK) { - free_String_vector(vector); - LOG_WARN(LOGCALLBACK(zh), ("unable to watch my predecessor")); - ret = zkr_lock_unlock(mutex); - while (ret == 0) { - //we have to give up our leadership - // since we cannot watch out predecessor - ret = zkr_lock_unlock(mutex); - } - return ret; - } - // we are not the owner of the lock - mutex->isOwner = 0; - } - else { - // this is the case when we are the owner - // of the lock - if (strcmp(mutex->id, owner_id) == 0) { - LOG_DEBUG(LOGCALLBACK(zh), ("got the zoo lock owner - %s", mutex->id)); - mutex->isOwner = 1; - if (mutex->completion != NULL) { - mutex->completion(0, mutex->cbdata); - } - return ZOK; - } - } - free_String_vector(vector); - return ZOK; - } - } while (mutex->id == NULL); - return ZOK; -} - -ZOOAPI int zkr_lock_lock(zkr_lock_mutex_t *mutex) { - pthread_mutex_lock(&(mutex->pmutex)); - zhandle_t *zh = mutex->zh; - char *path = mutex->path; - struct Stat stat; - int exists = zoo_exists(zh, path, 0, &stat); - int count = 0; - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = (.5)*1000000; - // retry to see if the path exists and - // and create if the path does not exist - while ((exists == ZCONNECTIONLOSS || exists == ZNONODE) && (count <4)) { - count++; - // retry the operation - if (exists == ZCONNECTIONLOSS) - exists = zoo_exists(zh, path, 0, &stat); - else if (exists == ZNONODE) - exists = zoo_create(zh, path, NULL, 0, mutex->acl, 0, NULL, 0); - nanosleep(&ts, 0); - - } - - // need to check if we cannot still access the server - int check_retry = ZCONNECTIONLOSS; - count = 0; - while (check_retry != ZOK && count <4) { - check_retry = zkr_lock_operation(mutex, &ts); - if (check_retry != ZOK) { - nanosleep(&ts, 0); - count++; - } - } - pthread_mutex_unlock(&(mutex->pmutex)); - return zkr_lock_isowner(mutex); -} - - -ZOOAPI char* zkr_lock_getpath(zkr_lock_mutex_t *mutex) { - return mutex->path; -} - -ZOOAPI int zkr_lock_isowner(zkr_lock_mutex_t *mutex) { - return (mutex->id != NULL && mutex->ownerid != NULL - && (strcmp(mutex->id, mutex->ownerid) == 0)); -} - -ZOOAPI char* zkr_lock_getid(zkr_lock_mutex_t *mutex) { - return mutex->ownerid; -} - -ZOOAPI int zkr_lock_destroy(zkr_lock_mutex_t* mutex) { - if (mutex->id) - free(mutex->id); - mutex->path = NULL; - mutex->acl = NULL; - mutex->completion = NULL; - pthread_mutex_destroy(&(mutex->pmutex)); - mutex->isOwner = 0; - if (mutex->ownerid) - free(mutex->ownerid); - return 0; -} - http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc deleted file mode 100644 index 2cc56cf..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestClient.cc +++ /dev/null @@ -1,201 +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 <stdlib.h> -#include <sys/select.h> -#include <cppunit/TestAssert.h> - - -using namespace std; - -#include <cstring> -#include <list> - -#include <zookeeper.h> -#include <zoo_lock.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; - -class Zookeeper_locktest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(Zookeeper_locktest); - CPPUNIT_TEST(testlock); - 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 testlock() - { - watchctx_t ctx; - int rc; - struct Stat stat; - char buf[1024]; - int blen; - struct String_vector strings; - const char *testName; - zkr_lock_mutex_t mutexes[3]; - int count = 3; - int i = 0; - char* path = "/test-lock"; - for (i=0; i< 3; i++) { - zhandle_t *zh = createClient(&ctx); - zkr_lock_init(&mutexes[i], zh, path, &ZOO_OPEN_ACL_UNSAFE); - zkr_lock_lock(&mutexes[i]); - } - sleep(30); - zkr_lock_mutex leader = mutexes[0]; - zkr_lock_mutex mutex; - int ret = strcmp(leader.id, leader.ownerid); - CPPUNIT_ASSERT(ret == 0); - for(i=1; i < count; i++) { - mutex = mutexes[i]; - CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); - } - zkr_lock_unlock(&leader); - sleep(30); - zkr_lock_mutex secondleader = mutexes[1]; - CPPUNIT_ASSERT(strcmp(secondleader.id , secondleader.ownerid) == 0); - for (i=2; i<count; i++) { - mutex = mutexes[i]; - CPPUNIT_ASSERT(strcmp(mutex.id, mutex.ownerid) != 0); - } - } - -}; - -const char Zookeeper_locktest::hostPorts[] = "127.0.0.1:22181"; -CPPUNIT_TEST_SUITE_REGISTRATION(Zookeeper_locktest); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/TestDriver.cc deleted file mode 100644 index 2b818f4..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/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/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.cc deleted file mode 100644 index 26a9a09..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/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/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/Util.h deleted file mode 100644 index 95f5420..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/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/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh b/zookeeper-recipes/zookeeper-recipes-lock/src/c/tests/zkServer.sh deleted file mode 100755 index a22fd30..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/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/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java deleted file mode 100644 index 1c21ad6..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/LockListener.java +++ /dev/null @@ -1,38 +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.lock; - -/** - * This class has two methods which are call - * back methods when a lock is acquired and - * when the lock is released. - * - */ -public interface LockListener { - /** - * call back called when the lock - * is acquired - */ - public void lockAcquired(); - - /** - * call back called when the lock is - * released. - */ - public void lockReleased(); -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java deleted file mode 100644 index 4efdb85..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ProtocolSupport.java +++ /dev/null @@ -1,193 +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.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; -import org.apache.zookeeper.recipes.lock.ZooKeeperOperation; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * A base class for protocol implementations which provides a number of higher - * level helper methods for working with ZooKeeper along with retrying synchronous - * operations if the connection to ZooKeeper closes such as - * {@link #retryOperation(ZooKeeperOperation)} - * - */ -class ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(ProtocolSupport.class); - - protected final ZooKeeper zookeeper; - private AtomicBoolean closed = new AtomicBoolean(false); - private long retryDelay = 500L; - private int retryCount = 10; - private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE; - - public ProtocolSupport(ZooKeeper zookeeper) { - this.zookeeper = zookeeper; - } - - /** - * Closes this strategy and releases any ZooKeeper resources; but keeps the - * ZooKeeper instance open - */ - public void close() { - if (closed.compareAndSet(false, true)) { - doClose(); - } - } - - /** - * return zookeeper client instance - * @return zookeeper client instance - */ - public ZooKeeper getZookeeper() { - return zookeeper; - } - - /** - * return the acl its using - * @return the acl. - */ - public List<ACL> getAcl() { - return acl; - } - - /** - * set the acl - * @param acl the acl to set to - */ - public void setAcl(List<ACL> acl) { - this.acl = acl; - } - - /** - * get the retry delay in milliseconds - * @return the retry delay - */ - public long getRetryDelay() { - return retryDelay; - } - - /** - * Sets the time waited between retry delays - * @param retryDelay the retry delay - */ - public void setRetryDelay(long retryDelay) { - this.retryDelay = retryDelay; - } - - /** - * Allow derived classes to perform - * some custom closing operations to release resources - */ - protected void doClose() { - } - - - /** - * Perform the given operation, retrying if the connection fails - * @return object. it needs to be cast to the callee's expected - * return type. - */ - protected Object retryOperation(ZooKeeperOperation operation) - throws KeeperException, InterruptedException { - KeeperException exception = null; - for (int i = 0; i < retryCount; i++) { - try { - return operation.execute(); - } catch (KeeperException.SessionExpiredException e) { - LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e); - throw e; - } catch (KeeperException.ConnectionLossException e) { - if (exception == null) { - exception = e; - } - LOG.debug("Attempt " + i + " failed with connection loss so " + - "attempting to reconnect: " + e, e); - retryDelay(i); - } - } - throw exception; - } - - /** - * Ensures that the given path exists with no data, the current - * ACL and no flags - * @param path - */ - protected void ensurePathExists(String path) { - ensureExists(path, null, acl, CreateMode.PERSISTENT); - } - - /** - * Ensures that the given path exists with the given data, ACL and flags - * @param path - * @param acl - * @param flags - */ - protected void ensureExists(final String path, final byte[] data, - final List<ACL> acl, final CreateMode flags) { - try { - retryOperation(new ZooKeeperOperation() { - public boolean execute() throws KeeperException, InterruptedException { - Stat stat = zookeeper.exists(path, false); - if (stat != null) { - return true; - } - zookeeper.create(path, data, acl, flags); - return true; - } - }); - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - } - } - - /** - * Returns true if this protocol has been closed - * @return true if this protocol is closed - */ - protected boolean isClosed() { - return closed.get(); - } - - /** - * Performs a retry delay if this is not the first attempt - * @param attemptCount the number of the attempts performed so far - */ - protected void retryDelay(int attemptCount) { - if (attemptCount > 0) { - try { - Thread.sleep(attemptCount * retryDelay); - } catch (InterruptedException e) { - LOG.debug("Failed to sleep: " + e, e); - } - } - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java deleted file mode 100644 index 5caebee..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java +++ /dev/null @@ -1,296 +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.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Stat; - -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; - -/** - * A <a href="package.html">protocol to implement an exclusive - * write lock or to elect a leader</a>. <p/> You invoke {@link #lock()} to - * start the process of grabbing the lock; you may get the lock then or it may be - * some time later. <p/> You can register a listener so that you are invoked - * when you get the lock; otherwise you can ask if you have the lock - * by calling {@link #isOwner()} - * - */ -public class WriteLock extends ProtocolSupport { - private static final Logger LOG = LoggerFactory.getLogger(WriteLock.class); - - private final String dir; - private String id; - private ZNodeName idName; - private String ownerId; - private String lastChildId; - private byte[] data = {0x12, 0x34}; - private LockListener callback; - private LockZooKeeperOperation zop; - - /** - * zookeeper contructor for writelock - * @param zookeeper zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acls the acls that you want to use for all the paths, - * if null world read/write is used. - */ - public WriteLock(ZooKeeper zookeeper, String dir, List<ACL> acl) { - super(zookeeper); - this.dir = dir; - if (acl != null) { - setAcl(acl); - } - this.zop = new LockZooKeeperOperation(); - } - - /** - * zookeeper contructor for writelock with callback - * @param zookeeper the zookeeper client instance - * @param dir the parent path you want to use for locking - * @param acl the acls that you want to use for all the paths - * @param callback the call back instance - */ - public WriteLock(ZooKeeper zookeeper, String dir, List<ACL> acl, - LockListener callback) { - this(zookeeper, dir, acl); - this.callback = callback; - } - - /** - * return the current locklistener - * @return the locklistener - */ - public LockListener getLockListener() { - return this.callback; - } - - /** - * register a different call back listener - * @param callback the call back instance - */ - public void setLockListener(LockListener callback) { - this.callback = callback; - } - - /** - * Removes the lock or associated znode if - * you no longer require the lock. this also - * removes your request in the queue for locking - * in case you do not already hold the lock. - * @throws RuntimeException throws a runtime exception - * if it cannot connect to zookeeper. - */ - public synchronized void unlock() throws RuntimeException { - - if (!isClosed() && id != null) { - // we don't need to retry this operation in the case of failure - // as ZK will remove ephemeral files and we don't wanna hang - // this process when closing if we cannot reconnect to ZK - try { - - ZooKeeperOperation zopdel = new ZooKeeperOperation() { - public boolean execute() throws KeeperException, - InterruptedException { - zookeeper.delete(id, -1); - return Boolean.TRUE; - } - }; - zopdel.execute(); - } catch (InterruptedException e) { - LOG.warn("Caught: " + e, e); - //set that we have been interrupted. - Thread.currentThread().interrupt(); - } catch (KeeperException.NoNodeException e) { - // do nothing - } catch (KeeperException e) { - LOG.warn("Caught: " + e, e); - throw (RuntimeException) new RuntimeException(e.getMessage()). - initCause(e); - } - finally { - if (callback != null) { - callback.lockReleased(); - } - id = null; - } - } - } - - /** - * the watcher called on - * getting watch while watching - * my predecessor - */ - private class LockWatcher implements Watcher { - public void process(WatchedEvent event) { - // lets either become the leader or watch the new/updated node - LOG.debug("Watcher fired on path: " + event.getPath() + " state: " + - event.getState() + " type " + event.getType()); - try { - lock(); - } catch (Exception e) { - LOG.warn("Failed to acquire lock: " + e, e); - } - } - } - - /** - * a zoookeeper operation that is mainly responsible - * for all the magic required for locking. - */ - private class LockZooKeeperOperation implements ZooKeeperOperation { - - /** find if we have been created earler if not create our node - * - * @param prefix the prefix node - * @param zookeeper teh zookeeper client - * @param dir the dir paretn - * @throws KeeperException - * @throws InterruptedException - */ - private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) - throws KeeperException, InterruptedException { - List<String> names = zookeeper.getChildren(dir, false); - for (String name : names) { - if (name.startsWith(prefix)) { - id = name; - if (LOG.isDebugEnabled()) { - LOG.debug("Found id created last time: " + id); - } - break; - } - } - if (id == null) { - id = zookeeper.create(dir + "/" + prefix, data, - getAcl(), EPHEMERAL_SEQUENTIAL); - - if (LOG.isDebugEnabled()) { - LOG.debug("Created id: " + id); - } - } - - } - - /** - * the command that is run and retried for actually - * obtaining the lock - * @return if the command was successful or not - */ - public boolean execute() throws KeeperException, InterruptedException { - do { - if (id == null) { - long sessionId = zookeeper.getSessionId(); - String prefix = "x-" + sessionId + "-"; - // lets try look up the current ID if we failed - // in the middle of creating the znode - findPrefixInChildren(prefix, zookeeper, dir); - idName = new ZNodeName(id); - } - if (id != null) { - List<String> names = zookeeper.getChildren(dir, false); - if (names.isEmpty()) { - LOG.warn("No children in: " + dir + " when we've just " + - "created one! Lets recreate it..."); - // lets force the recreation of the id - id = null; - } else { - // lets sort them explicitly (though they do seem to come back in order ususally :) - SortedSet<ZNodeName> sortedNames = new TreeSet<ZNodeName>(); - for (String name : names) { - sortedNames.add(new ZNodeName(dir + "/" + name)); - } - ownerId = sortedNames.first().getName(); - SortedSet<ZNodeName> lessThanMe = sortedNames.headSet(idName); - if (!lessThanMe.isEmpty()) { - ZNodeName lastChildName = lessThanMe.last(); - lastChildId = lastChildName.getName(); - if (LOG.isDebugEnabled()) { - LOG.debug("watching less than me node: " + lastChildId); - } - Stat stat = zookeeper.exists(lastChildId, new LockWatcher()); - if (stat != null) { - return Boolean.FALSE; - } else { - LOG.warn("Could not find the" + - " stats for less than me: " + lastChildName.getName()); - } - } else { - if (isOwner()) { - if (callback != null) { - callback.lockAcquired(); - } - return Boolean.TRUE; - } - } - } - } - } - while (id == null); - return Boolean.FALSE; - } - }; - - /** - * Attempts to acquire the exclusive write lock returning whether or not it was - * acquired. Note that the exclusive lock may be acquired some time later after - * this method has been invoked due to the current lock owner going away. - */ - public synchronized boolean lock() throws KeeperException, InterruptedException { - if (isClosed()) { - return false; - } - ensurePathExists(dir); - - return (Boolean) retryOperation(zop); - } - - /** - * return the parent dir for lock - * @return the parent dir used for locks. - */ - public String getDir() { - return dir; - } - - /** - * Returns true if this node is the owner of the - * lock (or the leader) - */ - public boolean isOwner() { - return id != null && ownerId != null && id.equals(ownerId); - } - - /** - * return the id for this lock - * @return the id for this lock - */ - public String getId() { - return this.id; - } -} - http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java deleted file mode 100644 index 2e32e59..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZNodeName.java +++ /dev/null @@ -1,112 +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.lock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Represents an ephemeral znode name which has an ordered sequence number - * and can be sorted in order - * - */ -class ZNodeName implements Comparable<ZNodeName> { - private final String name; - private String prefix; - private int sequence = -1; - private static final Logger LOG = LoggerFactory.getLogger(ZNodeName.class); - - public ZNodeName(String name) { - if (name == null) { - throw new NullPointerException("id cannot be null"); - } - this.name = name; - this.prefix = name; - int idx = name.lastIndexOf('-'); - if (idx >= 0) { - this.prefix = name.substring(0, idx); - try { - this.sequence = Integer.parseInt(name.substring(idx + 1)); - // If an exception occurred we misdetected a sequence suffix, - // so return -1. - } catch (NumberFormatException e) { - LOG.info("Number format exception for " + idx, e); - } catch (ArrayIndexOutOfBoundsException e) { - LOG.info("Array out of bounds for " + idx, e); - } - } - } - - @Override - public String toString() { - return name.toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ZNodeName sequence = (ZNodeName) o; - - if (!name.equals(sequence.name)) return false; - - return true; - } - - @Override - public int hashCode() { - return name.hashCode() + 37; - } - - /** - * Compare znodes based on their sequence number - * @param that other znode to compare to - * @return the difference between their sequence numbers: a positive value if this - * znode has a larger sequence number, 0 if they have the same sequence number - * or a negative number if this znode has a lower sequence number - */ - public int compareTo(ZNodeName that) { - int answer = this.sequence - that.sequence; - if (answer == 0) { - return this.prefix.compareTo(that.prefix); - } - return answer; - } - - /** - * Returns the name of the znode - */ - public String getName() { - return name; - } - - /** - * Returns the sequence number - */ - public int getZNodeName() { - return sequence; - } - - /** - * Returns the text prefix before the sequence number - */ - public String getPrefix() { - return prefix; - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java b/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java deleted file mode 100644 index 54317ed..0000000 --- a/zookeeper-recipes/zookeeper-recipes-lock/src/java/org/apache/zookeeper/recipes/lock/ZooKeeperOperation.java +++ /dev/null @@ -1,38 +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.lock; - -import org.apache.zookeeper.KeeperException; - -/** - * A callback object which can be used for implementing retry-able operations in the - * {@link org.apache.zookeeper.recipes.lock.ProtocolSupport} class - * - */ -public interface ZooKeeperOperation { - - /** - * Performs the operation - which may be involved multiple times if the connection - * to ZooKeeper closes during this operation - * - * @return the result of the operation or null - * @throws KeeperException - * @throws InterruptedException - */ - public boolean execute() throws KeeperException, InterruptedException; -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL new file mode 100644 index 0000000..5458714 --- /dev/null +++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d8bd3191/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am ---------------------------------------------------------------------- diff --git a/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am new file mode 100644 index 0000000..9b36b43 --- /dev/null +++ b/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/Makefile.am @@ -0,0 +1,46 @@ +# 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 $(top_srcdir)/aminclude.am + +AM_CFLAGS = -Wall -fPIC -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated \ + -I$(top_srcdir)/include -I/usr/include +AM_CPPFLAGS = -Wall -I${ZOOKEEPER_PATH}/include -I${ZOOKEEPER_PATH}/generated\ + -I${top_srcdir}/include -I/usr/include +EXTRA_DIST = LICENSE +lib_LTLIBRARIES = libzoolock.la +libzoolock_la_SOURCES = src/zoo_lock.c include/zoo_lock.h +libzoolock_la_CPPFLAGS = -DDLOPEN_MODULE +libzoolock_la_LDFLAGS = -version-info 0:1:0 + +#run the tests now + +TEST_SOURCES = tests/TestDriver.cc tests/TestClient.cc tests/Util.cc + + +check_PROGRAMS = zklocktest +nodist_zklocktest_SOURCES = ${TEST_SOURCES} +zklocktest_LDADD = ${ZOOKEEPER_LD} libzoolock.la -lpthread ${CPPUNIT_LIBS} +zklocktest_CXXFLAGS = -DUSE_STATIC_LIB ${CPPUNIT_CFLAGS} + +run-check: check + ./zklocktest ${TEST_OPTIONS} + +clean-local: clean-check + ${RM} ${DX_CLEANFILES} + +clean-check: + ${RM} ${nodist_zklocktest_OBJECTS}
