zookeeper 0.4.4 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +10 -0
- data/CHANGELOG +95 -0
- data/Gemfile +17 -0
- data/Manifest +8 -2
- data/README.markdown +59 -0
- data/Rakefile +137 -7
- data/ext/.gitignore +6 -0
- data/ext/Rakefile +51 -0
- data/ext/c_zookeeper.rb +212 -0
- data/ext/dbg.h +53 -0
- data/ext/depend +5 -0
- data/ext/extconf.rb +44 -15
- data/ext/generate_gvl_code.rb +316 -0
- data/ext/zkc-3.3.5.tar.gz +0 -0
- data/ext/zkrb_wrapper.c +731 -0
- data/ext/zkrb_wrapper.h +330 -0
- data/ext/zkrb_wrapper_compat.c +15 -0
- data/ext/zkrb_wrapper_compat.h +11 -0
- data/ext/zookeeper_base.rb +211 -0
- data/ext/zookeeper_c.c +268 -97
- data/ext/zookeeper_lib.c +157 -92
- data/ext/zookeeper_lib.h +12 -6
- data/java/zookeeper_base.rb +477 -0
- data/lib/zookeeper/acls.rb +10 -1
- data/lib/zookeeper/callbacks.rb +5 -3
- data/lib/zookeeper/common/queue_with_pipe.rb +78 -0
- data/lib/zookeeper/common.rb +174 -0
- data/lib/zookeeper/constants.rb +31 -28
- data/lib/zookeeper/em_client.rb +55 -0
- data/lib/zookeeper/exceptions.rb +10 -2
- data/lib/zookeeper/stat.rb +11 -2
- data/lib/zookeeper/version.rb +6 -0
- data/lib/zookeeper.rb +155 -122
- data/notes.txt +14 -0
- data/spec/c_zookeeper_spec.rb +50 -0
- data/spec/chrooted_connection_spec.rb +81 -0
- data/spec/default_watcher_spec.rb +41 -0
- data/spec/em_spec.rb +51 -0
- data/spec/log4j.properties +17 -0
- data/spec/shared/all_success_return_values.rb +10 -0
- data/spec/shared/connection_examples.rb +1018 -0
- data/spec/spec_helper.rb +119 -0
- data/spec/support/progress_formatter.rb +15 -0
- data/spec/zookeeper_spec.rb +24 -0
- data/zookeeper.gemspec +37 -25
- metadata +78 -34
- data/README +0 -42
- data/ext/zkc-3.3.2.tar.gz +0 -0
data/ext/zookeeper_lib.c
CHANGED
@@ -6,6 +6,17 @@ This file contains three sets of helpers:
|
|
6
6
|
- functions for translating between Ruby and C versions of ZK datatypes
|
7
7
|
|
8
8
|
wickman@twitter.com
|
9
|
+
|
10
|
+
*********************************************************************************
|
11
|
+
*
|
12
|
+
* NOTE: be *very careful* in these functions, calling *ANY* ruby interpreter
|
13
|
+
* function when you're not in an interpreter thread can hork ruby, trigger a
|
14
|
+
* [BUG], corrupt the stack, kill your dog, knock up your daughter, etc. etc.
|
15
|
+
*
|
16
|
+
*********************************************************************************
|
17
|
+
|
18
|
+
slyphon@gmail.com
|
19
|
+
|
9
20
|
*/
|
10
21
|
|
11
22
|
#include "ruby.h"
|
@@ -16,90 +27,136 @@ wickman@twitter.com
|
|
16
27
|
#include <stdlib.h>
|
17
28
|
#include <pthread.h>
|
18
29
|
#include <unistd.h>
|
30
|
+
#include <inttypes.h>
|
31
|
+
#include "dbg.h"
|
19
32
|
|
20
33
|
#define GET_SYM(str) ID2SYM(rb_intern(str))
|
21
34
|
|
22
35
|
int ZKRBDebugging;
|
23
36
|
|
37
|
+
// XXX(slyphon): need to check these for error, but what to do if they fail?
|
24
38
|
pthread_mutex_t zkrb_q_mutex = PTHREAD_MUTEX_INITIALIZER;
|
25
39
|
|
26
|
-
|
40
|
+
#define LOG_PTHREAD_ERR(A, M, ...) if (A) { log_err(M, ##__VA_ARGS__); errno=0; }
|
41
|
+
|
42
|
+
#define GLOBAL_MUTEX_LOCK(F) LOG_PTHREAD_ERR(pthread_mutex_lock(&zkrb_q_mutex), F)
|
43
|
+
#define GLOBAL_MUTEX_UNLOCK(F) LOG_PTHREAD_ERR(pthread_mutex_unlock(&zkrb_q_mutex), F)
|
44
|
+
|
45
|
+
|
27
46
|
void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
}
|
47
|
+
GLOBAL_MUTEX_LOCK("zkrb_enqueue");
|
48
|
+
|
49
|
+
check_debug(q != NULL && q->tail != NULL, "zkrb_enqueue: queue ptr or tail was NULL\n");
|
50
|
+
|
33
51
|
q->tail->event = elt;
|
34
|
-
q->tail->next = (
|
52
|
+
q->tail->next = (zkrb_event_ll_t *) malloc(sizeof(zkrb_event_ll_t));
|
35
53
|
q->tail = q->tail->next;
|
36
54
|
q->tail->event = NULL;
|
37
55
|
q->tail->next = NULL;
|
38
56
|
ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
|
39
|
-
|
40
|
-
|
41
|
-
|
57
|
+
|
58
|
+
// XXX(slyphon): can't raise a ruby exception here as we may not be calling
|
59
|
+
// this from a ruby thread. Calling into the interpreter from a non-ruby
|
60
|
+
// thread is bad, mm'kay?
|
61
|
+
|
62
|
+
check(ret != -1, "write to queue (%p) pipe failed!\n", q);
|
63
|
+
|
64
|
+
error:
|
65
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_enqueue");
|
42
66
|
}
|
43
67
|
|
68
|
+
// NOTE: the zkrb_event_t* returned *is* the same pointer that's part of the
|
69
|
+
// queue, the only place this is used is in method_has_events, and it is simply
|
70
|
+
// tested for null-ness. it's probably better to make the null-test here and
|
71
|
+
// not return the pointer
|
72
|
+
//
|
44
73
|
zkrb_event_t * zkrb_peek(zkrb_queue_t *q) {
|
45
|
-
pthread_mutex_lock(&zkrb_q_mutex);
|
46
74
|
zkrb_event_t *event = NULL;
|
75
|
+
|
76
|
+
GLOBAL_MUTEX_LOCK("zkrb_peek");
|
77
|
+
|
47
78
|
if (q != NULL && q->head != NULL && q->head->event != NULL) {
|
48
79
|
event = q->head->event;
|
49
80
|
}
|
50
|
-
|
81
|
+
|
82
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_peek");
|
51
83
|
return event;
|
52
84
|
}
|
53
85
|
|
86
|
+
#define ZKRB_QUEUE_EMPTY(q) (q == NULL || q->head == NULL || q->head->event == NULL)
|
87
|
+
|
54
88
|
zkrb_event_t* zkrb_dequeue(zkrb_queue_t *q, int need_lock) {
|
89
|
+
zkrb_event_t *rv = NULL;
|
90
|
+
zkrb_event_ll_t *old_root = NULL;
|
91
|
+
|
55
92
|
if (need_lock)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
return NULL;
|
61
|
-
} else {
|
62
|
-
struct zkrb_event_ll_t *old_root = q->head;
|
93
|
+
GLOBAL_MUTEX_LOCK("zkrb_dequeue");
|
94
|
+
|
95
|
+
if (!ZKRB_QUEUE_EMPTY(q)) {
|
96
|
+
old_root = q->head;
|
63
97
|
q->head = q->head->next;
|
64
|
-
|
65
|
-
free(old_root);
|
66
|
-
if (need_lock)
|
67
|
-
pthread_mutex_unlock(&zkrb_q_mutex);
|
68
|
-
return rv;
|
98
|
+
rv = old_root->event;
|
69
99
|
}
|
100
|
+
|
101
|
+
if (need_lock)
|
102
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_dequeue");
|
103
|
+
|
104
|
+
free(old_root);
|
105
|
+
return rv;
|
70
106
|
}
|
71
107
|
|
72
108
|
void zkrb_signal(zkrb_queue_t *q) {
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
109
|
+
GLOBAL_MUTEX_LOCK("zkrb_signal");
|
110
|
+
|
111
|
+
if (!write(q->pipe_write, "0", 1)) /* Wake up Ruby listener */
|
112
|
+
log_err("zkrb_signal: write to pipe failed, could not wake");
|
113
|
+
|
114
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_signal");
|
115
|
+
}
|
116
|
+
|
117
|
+
zkrb_event_ll_t *zkrb_event_ll_t_alloc(void) {
|
118
|
+
zkrb_event_ll_t *rv = malloc(sizeof(zkrb_event_ll_t));
|
119
|
+
|
120
|
+
if (!rv) return NULL;
|
121
|
+
|
122
|
+
rv->event = NULL;
|
123
|
+
rv->next = NULL;
|
124
|
+
|
125
|
+
return rv;
|
78
126
|
}
|
79
127
|
|
80
128
|
zkrb_queue_t *zkrb_queue_alloc(void) {
|
129
|
+
// some of the locking is a little coarse, but it
|
130
|
+
// eases the logic of releasing in case of error.
|
131
|
+
GLOBAL_MUTEX_LOCK("zkrb_queue_alloc");
|
132
|
+
|
81
133
|
int pfd[2];
|
82
|
-
|
83
|
-
|
134
|
+
zkrb_queue_t *rq = NULL;
|
135
|
+
|
136
|
+
check(pipe(pfd) == 0, "creating the signal pipe failed");
|
137
|
+
|
138
|
+
rq = malloc(sizeof(zkrb_queue_t));
|
139
|
+
check_mem(rq);
|
140
|
+
|
141
|
+
rq->head = zkrb_event_ll_t_alloc();
|
142
|
+
check_mem(rq->head);
|
84
143
|
|
85
|
-
pthread_mutex_lock(&zkrb_q_mutex);
|
86
|
-
zkrb_queue_t *rq = malloc(sizeof(zkrb_queue_t));
|
87
|
-
rq->head = malloc(sizeof(struct zkrb_event_ll_t));
|
88
|
-
rq->head->event = NULL; rq->head->next = NULL;
|
89
144
|
rq->tail = rq->head;
|
90
145
|
rq->pipe_read = pfd[0];
|
91
146
|
rq->pipe_write = pfd[1];
|
92
|
-
pthread_mutex_unlock(&zkrb_q_mutex);
|
93
147
|
|
148
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
|
94
149
|
return rq;
|
150
|
+
|
151
|
+
error:
|
152
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
|
153
|
+
free(rq);
|
154
|
+
return NULL;
|
95
155
|
}
|
96
156
|
|
97
157
|
void zkrb_queue_free(zkrb_queue_t *queue) {
|
98
|
-
|
99
|
-
|
100
|
-
pthread_mutex_unlock(&zkrb_q_mutex);
|
101
|
-
return;
|
102
|
-
}
|
158
|
+
GLOBAL_MUTEX_LOCK("zkrb_queue_free");
|
159
|
+
check_debug(queue != NULL, "zkrb_queue_free: queue was NULL");
|
103
160
|
|
104
161
|
zkrb_event_t *elt;
|
105
162
|
while ((elt = zkrb_dequeue(queue, 0)) != NULL) {
|
@@ -109,11 +166,13 @@ void zkrb_queue_free(zkrb_queue_t *queue) {
|
|
109
166
|
close(queue->pipe_read);
|
110
167
|
close(queue->pipe_write);
|
111
168
|
free(queue);
|
112
|
-
|
169
|
+
|
170
|
+
error:
|
171
|
+
GLOBAL_MUTEX_UNLOCK("zkrb_queue_free");
|
113
172
|
}
|
114
173
|
|
115
174
|
zkrb_event_t *zkrb_event_alloc(void) {
|
116
|
-
zkrb_event_t *rv =
|
175
|
+
zkrb_event_t *rv = malloc(sizeof(zkrb_event_t));
|
117
176
|
return rv;
|
118
177
|
}
|
119
178
|
|
@@ -141,7 +200,8 @@ void zkrb_event_free(zkrb_event_t *event) {
|
|
141
200
|
case ZKRB_STRINGS: {
|
142
201
|
struct zkrb_strings_completion *strings_ctx = event->completion.strings_completion;
|
143
202
|
int k;
|
144
|
-
|
203
|
+
if (strings_ctx->values)
|
204
|
+
for (k = 0; k < strings_ctx->values->count; ++k) free(strings_ctx->values->data[k]);
|
145
205
|
free(strings_ctx->values);
|
146
206
|
free(strings_ctx);
|
147
207
|
break;
|
@@ -149,9 +209,12 @@ void zkrb_event_free(zkrb_event_t *event) {
|
|
149
209
|
case ZKRB_STRINGS_STAT: {
|
150
210
|
struct zkrb_strings_stat_completion *strings_stat_ctx = event->completion.strings_stat_completion;
|
151
211
|
int k;
|
152
|
-
|
212
|
+
if (strings_stat_ctx->values)
|
213
|
+
for (k = 0; k < strings_stat_ctx->values->count; ++k) free(strings_stat_ctx->values->data[k]);
|
153
214
|
free(strings_stat_ctx->values);
|
154
|
-
|
215
|
+
|
216
|
+
if (strings_stat_ctx->stat)
|
217
|
+
free(strings_stat_ctx->stat);
|
155
218
|
free(strings_stat_ctx);
|
156
219
|
break;
|
157
220
|
}
|
@@ -174,11 +237,10 @@ void zkrb_event_free(zkrb_event_t *event) {
|
|
174
237
|
case ZKRB_VOID: {
|
175
238
|
break;
|
176
239
|
}
|
177
|
-
|
178
240
|
default:
|
179
|
-
|
180
|
-
fprintf(stderr, "ERROR?\n");
|
241
|
+
log_err("unrecognized event in event_free!");
|
181
242
|
}
|
243
|
+
|
182
244
|
free(event);
|
183
245
|
}
|
184
246
|
|
@@ -187,6 +249,11 @@ void zkrb_event_free(zkrb_event_t *event) {
|
|
187
249
|
VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
|
188
250
|
VALUE hash = rb_hash_new();
|
189
251
|
|
252
|
+
if (!event) {
|
253
|
+
log_err("event was NULL in zkrb_event_to_ruby");
|
254
|
+
return hash;
|
255
|
+
}
|
256
|
+
|
190
257
|
rb_hash_aset(hash, GET_SYM("req_id"), LL2NUM(event->req_id));
|
191
258
|
if (event->type != ZKRB_WATCHER)
|
192
259
|
rb_hash_aset(hash, GET_SYM("rc"), INT2FIX(event->rc));
|
@@ -200,33 +267,40 @@ VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
|
|
200
267
|
break;
|
201
268
|
}
|
202
269
|
case ZKRB_STAT: {
|
270
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_STAT\n");
|
203
271
|
struct zkrb_stat_completion *stat_ctx = event->completion.stat_completion;
|
204
272
|
rb_hash_aset(hash, GET_SYM("stat"), stat_ctx->stat ? zkrb_stat_to_rarray(stat_ctx->stat) : Qnil);
|
205
273
|
break;
|
206
274
|
}
|
207
275
|
case ZKRB_STRING: {
|
276
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_STRING\n");
|
208
277
|
struct zkrb_string_completion *string_ctx = event->completion.string_completion;
|
209
278
|
rb_hash_aset(hash, GET_SYM("string"), string_ctx->value ? rb_str_new2(string_ctx->value) : Qnil);
|
210
279
|
break;
|
211
280
|
}
|
212
281
|
case ZKRB_STRINGS: {
|
282
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_STRINGS\n");
|
213
283
|
struct zkrb_strings_completion *strings_ctx = event->completion.strings_completion;
|
214
284
|
rb_hash_aset(hash, GET_SYM("strings"), strings_ctx->values ? zkrb_string_vector_to_ruby(strings_ctx->values) : Qnil);
|
215
285
|
break;
|
216
286
|
}
|
217
287
|
case ZKRB_STRINGS_STAT: {
|
288
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_STRINGS_STAT\n");
|
218
289
|
struct zkrb_strings_stat_completion *strings_stat_ctx = event->completion.strings_stat_completion;
|
219
290
|
rb_hash_aset(hash, GET_SYM("strings"), strings_stat_ctx->values ? zkrb_string_vector_to_ruby(strings_stat_ctx->values) : Qnil);
|
220
291
|
rb_hash_aset(hash, GET_SYM("stat"), strings_stat_ctx->stat ? zkrb_stat_to_rarray(strings_stat_ctx->stat) : Qnil);
|
221
292
|
break;
|
222
293
|
}
|
223
294
|
case ZKRB_ACL: {
|
295
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_ACL\n");
|
224
296
|
struct zkrb_acl_completion *acl_ctx = event->completion.acl_completion;
|
225
297
|
rb_hash_aset(hash, GET_SYM("acl"), acl_ctx->acl ? zkrb_acl_vector_to_ruby(acl_ctx->acl) : Qnil);
|
226
298
|
rb_hash_aset(hash, GET_SYM("stat"), acl_ctx->stat ? zkrb_stat_to_rarray(acl_ctx->stat) : Qnil);
|
227
299
|
break;
|
228
300
|
}
|
229
301
|
case ZKRB_WATCHER: {
|
302
|
+
zkrb_debug("zkrb_event_to_ruby ZKRB_WATCHER\n");
|
303
|
+
struct zkrb_acl_completion *acl_ctx = event->completion.acl_completion;
|
230
304
|
struct zkrb_watcher_completion *watcher_ctx = event->completion.watcher_completion;
|
231
305
|
rb_hash_aset(hash, GET_SYM("type"), INT2FIX(watcher_ctx->type));
|
232
306
|
rb_hash_aset(hash, GET_SYM("state"), INT2FIX(watcher_ctx->state));
|
@@ -244,17 +318,17 @@ VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
|
|
244
318
|
void zkrb_print_stat(const struct Stat *s) {
|
245
319
|
fprintf(stderr, "stat {\n");
|
246
320
|
if (s != NULL) {
|
247
|
-
fprintf(stderr, "\t czxid: %
|
248
|
-
fprintf(stderr, "\t mzxid: %
|
249
|
-
fprintf(stderr, "\t ctime: %
|
250
|
-
fprintf(stderr, "\t mtime: %
|
251
|
-
fprintf(stderr, "\t version: %d\n"
|
252
|
-
fprintf(stderr, "\t cversion: %d\n"
|
253
|
-
fprintf(stderr, "\t aversion: %d\n"
|
254
|
-
fprintf(stderr, "\t ephemeralOwner: %
|
255
|
-
fprintf(stderr, "\t dataLength: %d\n"
|
256
|
-
fprintf(stderr, "\t numChildren: %d\n"
|
257
|
-
fprintf(stderr, "\t pzxid: %
|
321
|
+
fprintf(stderr, "\t czxid: %"PRId64"\n", s->czxid); // PRId64 defined in inttypes.h
|
322
|
+
fprintf(stderr, "\t mzxid: %"PRId64"\n", s->mzxid);
|
323
|
+
fprintf(stderr, "\t ctime: %"PRId64"\n", s->ctime);
|
324
|
+
fprintf(stderr, "\t mtime: %"PRId64"\n", s->mtime);
|
325
|
+
fprintf(stderr, "\t version: %d\n", s->version);
|
326
|
+
fprintf(stderr, "\t cversion: %d\n", s->cversion);
|
327
|
+
fprintf(stderr, "\t aversion: %d\n", s->aversion);
|
328
|
+
fprintf(stderr, "\t ephemeralOwner: %"PRId64"\n", s->ephemeralOwner);
|
329
|
+
fprintf(stderr, "\t dataLength: %d\n", s->dataLength);
|
330
|
+
fprintf(stderr, "\t numChildren: %d\n", s->numChildren);
|
331
|
+
fprintf(stderr, "\t pzxid: %"PRId64"\n", s->pzxid);
|
258
332
|
} else {
|
259
333
|
fprintf(stderr, "\tNULL\n");
|
260
334
|
}
|
@@ -263,14 +337,17 @@ void zkrb_print_stat(const struct Stat *s) {
|
|
263
337
|
|
264
338
|
zkrb_calling_context *zkrb_calling_context_alloc(int64_t req_id, zkrb_queue_t *queue) {
|
265
339
|
zkrb_calling_context *ctx = malloc(sizeof(zkrb_calling_context));
|
340
|
+
if (!ctx) return NULL;
|
341
|
+
|
266
342
|
ctx->req_id = req_id;
|
267
343
|
ctx->queue = queue;
|
344
|
+
|
268
345
|
return ctx;
|
269
346
|
}
|
270
347
|
|
271
348
|
void zkrb_print_calling_context(zkrb_calling_context *ctx) {
|
272
349
|
fprintf(stderr, "calling context (%p){\n", ctx);
|
273
|
-
fprintf(stderr, "\treq_id = %
|
350
|
+
fprintf(stderr, "\treq_id = %"PRId64"\n", ctx->req_id);
|
274
351
|
fprintf(stderr, "\tqueue = %p\n", ctx->queue);
|
275
352
|
fprintf(stderr, "}\n");
|
276
353
|
}
|
@@ -292,12 +369,10 @@ void zkrb_print_calling_context(zkrb_calling_context *ctx) {
|
|
292
369
|
|
293
370
|
void zkrb_state_callback(
|
294
371
|
zhandle_t *zh, int type, int state, const char *path, void *calling_ctx) {
|
295
|
-
|
296
|
-
|
297
|
-
fprintf(stderr, "ZOOKEEPER_C_STATE WATCHER "
|
372
|
+
|
373
|
+
zkrb_debug("ZOOKEEPER_C_STATE WATCHER "
|
298
374
|
"type = %d, state = %d, path = %p, value = %s\n",
|
299
375
|
type, state, (void *) path, path ? path : "NULL");
|
300
|
-
}
|
301
376
|
|
302
377
|
/* save callback context */
|
303
378
|
struct zkrb_watcher_completion *wc = malloc(sizeof(struct zkrb_watcher_completion));
|
@@ -326,11 +401,10 @@ void zkrb_state_callback(
|
|
326
401
|
|
327
402
|
void zkrb_data_callback(
|
328
403
|
int rc, const char *value, int value_len, const struct Stat *stat, const void *calling_ctx) {
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
}
|
404
|
+
|
405
|
+
zkrb_debug("ZOOKEEPER_C_DATA WATCHER "
|
406
|
+
"rc = %d (%s), value = %s, len = %d\n",
|
407
|
+
rc, zerror(rc), value ? value : "NULL", value_len);
|
334
408
|
|
335
409
|
/* copy data completion */
|
336
410
|
struct zkrb_data_completion *dc = malloc(sizeof(struct zkrb_data_completion));
|
@@ -356,10 +430,8 @@ void zkrb_data_callback(
|
|
356
430
|
|
357
431
|
void zkrb_stat_callback(
|
358
432
|
int rc, const struct Stat *stat, const void *calling_ctx) {
|
359
|
-
|
360
|
-
fprintf(stderr, "ZOOKEEPER_C_STAT WATCHER "
|
433
|
+
zkrb_debug("ZOOKEEPER_C_STAT WATCHER "
|
361
434
|
"rc = %d (%s)\n", rc, zerror(rc));
|
362
|
-
}
|
363
435
|
|
364
436
|
struct zkrb_stat_completion *sc = malloc(sizeof(struct zkrb_stat_completion));
|
365
437
|
sc->stat = NULL;
|
@@ -375,10 +447,9 @@ void zkrb_stat_callback(
|
|
375
447
|
|
376
448
|
void zkrb_string_callback(
|
377
449
|
int rc, const char *string, const void *calling_ctx) {
|
378
|
-
|
379
|
-
|
450
|
+
|
451
|
+
zkrb_debug("ZOOKEEPER_C_STRING WATCHER "
|
380
452
|
"rc = %d (%s)\n", rc, zerror(rc));
|
381
|
-
}
|
382
453
|
|
383
454
|
struct zkrb_string_completion *sc = malloc(sizeof(struct zkrb_string_completion));
|
384
455
|
sc->value = NULL;
|
@@ -395,10 +466,8 @@ void zkrb_string_callback(
|
|
395
466
|
|
396
467
|
void zkrb_strings_callback(
|
397
468
|
int rc, const struct String_vector *strings, const void *calling_ctx) {
|
398
|
-
|
399
|
-
fprintf(stderr, "ZOOKEEPER_C_STRINGS WATCHER "
|
469
|
+
zkrb_debug("ZOOKEEPER_C_STRINGS WATCHER "
|
400
470
|
"rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
|
401
|
-
}
|
402
471
|
|
403
472
|
/* copy string vector */
|
404
473
|
struct zkrb_strings_completion *sc = malloc(sizeof(struct zkrb_strings_completion));
|
@@ -414,14 +483,13 @@ void zkrb_strings_callback(
|
|
414
483
|
|
415
484
|
void zkrb_strings_stat_callback(
|
416
485
|
int rc, const struct String_vector *strings, const struct Stat *stat, const void *calling_ctx) {
|
417
|
-
|
418
|
-
fprintf(stderr, "ZOOKEEPER_C_STRINGS_STAT WATCHER "
|
486
|
+
zkrb_debug("ZOOKEEPER_C_STRINGS_STAT WATCHER "
|
419
487
|
"rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
|
420
|
-
}
|
421
488
|
|
422
489
|
struct zkrb_strings_stat_completion *sc = malloc(sizeof(struct zkrb_strings_stat_completion));
|
423
490
|
sc->stat = NULL;
|
424
491
|
if (stat != NULL) { sc->stat = malloc(sizeof(struct Stat)); memcpy(sc->stat, stat, sizeof(struct Stat)); }
|
492
|
+
|
425
493
|
sc->values = (strings != NULL) ? zkrb_clone_string_vector(strings) : NULL;
|
426
494
|
|
427
495
|
ZKH_SETUP_EVENT(queue, event);
|
@@ -432,12 +500,9 @@ void zkrb_strings_stat_callback(
|
|
432
500
|
zkrb_enqueue(queue, event);
|
433
501
|
}
|
434
502
|
|
435
|
-
void zkrb_void_callback(
|
436
|
-
|
437
|
-
if (ZKRBDebugging) {
|
438
|
-
fprintf(stderr, "ZOOKEEPER_C_VOID WATCHER "
|
503
|
+
void zkrb_void_callback(int rc, const void *calling_ctx) {
|
504
|
+
zkrb_debug("ZOOKEEPER_C_VOID WATCHER "
|
439
505
|
"rc = %d (%s)\n", rc, zerror(rc));
|
440
|
-
}
|
441
506
|
|
442
507
|
ZKH_SETUP_EVENT(queue, event);
|
443
508
|
event->rc = rc;
|
@@ -449,10 +514,7 @@ void zkrb_void_callback(
|
|
449
514
|
|
450
515
|
void zkrb_acl_callback(
|
451
516
|
int rc, struct ACL_vector *acls, struct Stat *stat, const void *calling_ctx) {
|
452
|
-
|
453
|
-
fprintf(stderr, "ZOOKEEPER_C_ACL WATCHER "
|
454
|
-
"rc = %d (%s)\n", rc, zerror(rc));
|
455
|
-
}
|
517
|
+
zkrb_debug("ZOOKEEPER_C_ACL WATCHER rc = %d (%s)\n", rc, zerror(rc));
|
456
518
|
|
457
519
|
struct zkrb_acl_completion *ac = malloc(sizeof(struct zkrb_acl_completion));
|
458
520
|
ac->acl = NULL;
|
@@ -484,11 +546,12 @@ VALUE zkrb_acl_to_ruby(struct ACL *acl) {
|
|
484
546
|
}
|
485
547
|
|
486
548
|
#warning [wickman] TODO test zkrb_ruby_to_aclvector
|
549
|
+
#warning [slyphon] TODO size checking on acl_ary (cast to int)
|
487
550
|
struct ACL_vector * zkrb_ruby_to_aclvector(VALUE acl_ary) {
|
488
551
|
Check_Type(acl_ary, T_ARRAY);
|
489
552
|
|
490
553
|
struct ACL_vector *v = malloc(sizeof(struct ACL_vector));
|
491
|
-
allocate_ACL_vector(v, RARRAY_LEN(acl_ary));
|
554
|
+
allocate_ACL_vector(v, (int)RARRAY_LEN(acl_ary));
|
492
555
|
|
493
556
|
int k;
|
494
557
|
for (k = 0; k < v->count; ++k) {
|
@@ -610,3 +673,5 @@ struct String_vector * zkrb_clone_string_vector(const struct String_vector * src
|
|
610
673
|
}
|
611
674
|
return dst;
|
612
675
|
}
|
676
|
+
|
677
|
+
// vim:sts=2:sw=2:et
|
data/ext/zookeeper_lib.h
CHANGED
@@ -11,6 +11,11 @@
|
|
11
11
|
#define ZK_FALSE 0
|
12
12
|
#define ZKRB_GLOBAL_REQ -1
|
13
13
|
|
14
|
+
// (slyphon): this RC value does not conflict with any of the ZOO_ERRORS
|
15
|
+
// but need to find a better way of formalizing and defining this stuff
|
16
|
+
#define ZKRB_ERR_REQ -2
|
17
|
+
#define ZKRB_ERR_RC -15
|
18
|
+
|
14
19
|
#ifndef RSTRING_LEN
|
15
20
|
# define RSTRING_LEN(x) RSTRING(x)->len
|
16
21
|
#endif
|
@@ -88,14 +93,16 @@ typedef struct {
|
|
88
93
|
} completion;
|
89
94
|
} zkrb_event_t;
|
90
95
|
|
91
|
-
struct
|
92
|
-
zkrb_event_t
|
93
|
-
struct
|
96
|
+
struct zkrb_event_ll {
|
97
|
+
zkrb_event_t *event;
|
98
|
+
struct zkrb_event_ll *next;
|
94
99
|
};
|
95
100
|
|
101
|
+
typedef struct zkrb_event_ll zkrb_event_ll_t;
|
102
|
+
|
96
103
|
typedef struct {
|
97
|
-
|
98
|
-
|
104
|
+
zkrb_event_ll_t *head;
|
105
|
+
zkrb_event_ll_t *tail;
|
99
106
|
int pipe_read;
|
100
107
|
int pipe_write;
|
101
108
|
} zkrb_queue_t;
|
@@ -105,7 +112,6 @@ void zkrb_queue_free(zkrb_queue_t *queue);
|
|
105
112
|
zkrb_event_t * zkrb_event_alloc(void);
|
106
113
|
void zkrb_event_free(zkrb_event_t *ptr);
|
107
114
|
|
108
|
-
/* push/pop is a misnomer, this is a queue */
|
109
115
|
void zkrb_enqueue(zkrb_queue_t *queue, zkrb_event_t *elt);
|
110
116
|
zkrb_event_t * zkrb_peek(zkrb_queue_t *queue);
|
111
117
|
zkrb_event_t * zkrb_dequeue(zkrb_queue_t *queue, int need_lock);
|