slyphon-zookeeper 0.2.3 → 0.2.4

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/ext/zookeeper_c.c CHANGED
@@ -19,6 +19,7 @@
19
19
  #include <unistd.h>
20
20
  #include <sys/fcntl.h>
21
21
  #include <pthread.h>
22
+ #include <inttypes.h>
22
23
 
23
24
  #include "zookeeper_lib.h"
24
25
 
@@ -49,7 +50,9 @@ static int destroy_zkrb_instance(struct zkrb_instance_data* ptr) {
49
50
  if (ptr->zh) {
50
51
  const void *ctx = zoo_get_context(ptr->zh);
51
52
  /* Note that after zookeeper_close() returns, ZK handle is invalid */
53
+ if (ZKRBDebugging) fprintf(stderr, "calling zookeeper_close\n");
52
54
  rv = zookeeper_close(ptr->zh);
55
+ if (ZKRBDebugging) fprintf(stderr, "zookeeper_close returned %d\n", rv);
53
56
  free((void *) ctx);
54
57
  }
55
58
 
@@ -69,7 +72,7 @@ static void print_zkrb_instance_data(struct zkrb_instance_data* ptr) {
69
72
  fprintf(stderr, "zkrb_instance_data (%p) {\n", ptr);
70
73
  fprintf(stderr, " zh = %p\n", ptr->zh);
71
74
  fprintf(stderr, " { state = %d }\n", zoo_state(ptr->zh));
72
- fprintf(stderr, " id = %llx\n", ptr->myid.client_id);
75
+ fprintf(stderr, " id = %"PRId64"\n", ptr->myid.client_id); // PRId64 defined in inttypes.h
73
76
  fprintf(stderr, " q = %p\n", ptr->queue);
74
77
  fprintf(stderr, "}\n");
75
78
  }
@@ -521,7 +524,7 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
521
524
  rb_raise(rb_eRuntimeError, "read failed: %d", errno);
522
525
  }
523
526
  else if (ZKRBDebugging) {
524
- fprintf(stderr, "read %d bytes from the queue (%p)'s pipe\n", bytes_read, zk->queue);
527
+ fprintf(stderr, "read %zd bytes from the queue (%p)'s pipe\n", bytes_read, zk->queue);
525
528
  }
526
529
 
527
530
  continue;
@@ -579,10 +582,13 @@ static VALUE method_close_handle(VALUE self) {
579
582
  // has been called
580
583
  rb_iv_set(self, "@_closed", Qtrue);
581
584
 
585
+ if (ZKRBDebugging) fprintf(stderr, "calling destroy_zkrb_instance\n");
582
586
 
583
587
  /* Note that after zookeeper_close() returns, ZK handle is invalid */
584
588
  int rc = destroy_zkrb_instance(zk);
585
589
 
590
+ if (ZKRBDebugging) fprintf(stderr, "destroy_zkrb_instance returned: %d\n", rc);
591
+
586
592
  return INT2FIX(rc);
587
593
  }
588
594
 
data/ext/zookeeper_lib.c CHANGED
@@ -16,6 +16,7 @@ wickman@twitter.com
16
16
  #include <stdlib.h>
17
17
  #include <pthread.h>
18
18
  #include <unistd.h>
19
+ #include <inttypes.h>
19
20
 
20
21
  #define GET_SYM(str) ID2SYM(rb_intern(str))
21
22
 
@@ -56,9 +57,6 @@ void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
56
57
  if ((ret == -1)) {
57
58
  fprintf(stderr, "WARNING: write to queue (%p) pipe failed!\n", q);
58
59
  }
59
- /* else {*/
60
- /* fprintf(stderr, "successfully enqueued event on queue (%p)\n", q);*/
61
- /* }*/
62
60
  }
63
61
  }
64
62
 
@@ -283,17 +281,17 @@ VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
283
281
  void zkrb_print_stat(const struct Stat *s) {
284
282
  fprintf(stderr, "stat {\n");
285
283
  if (s != NULL) {
286
- fprintf(stderr, "\t czxid: %lld\n", s->czxid);
287
- fprintf(stderr, "\t mzxid: %lld\n", s->mzxid);
288
- fprintf(stderr, "\t ctime: %lld\n", s->ctime);
289
- fprintf(stderr, "\t mtime: %lld\n", s->mtime);
290
- fprintf(stderr, "\t version: %d\n" , s->version);
291
- fprintf(stderr, "\t cversion: %d\n" , s->cversion);
292
- fprintf(stderr, "\t aversion: %d\n" , s->aversion);
293
- fprintf(stderr, "\t ephemeralOwner: %lld\n", s->ephemeralOwner);
294
- fprintf(stderr, "\t dataLength: %d\n" , s->dataLength);
295
- fprintf(stderr, "\t numChildren: %d\n" , s->numChildren);
296
- fprintf(stderr, "\t pzxid: %lld\n", s->pzxid);
284
+ fprintf(stderr, "\t czxid: %"PRId64"\n", s->czxid); // PRId64 defined in inttypes.h
285
+ fprintf(stderr, "\t mzxid: %"PRId64"\n", s->mzxid);
286
+ fprintf(stderr, "\t ctime: %"PRId64"\n", s->ctime);
287
+ fprintf(stderr, "\t mtime: %"PRId64"\n", s->mtime);
288
+ fprintf(stderr, "\t version: %d\n", s->version);
289
+ fprintf(stderr, "\t cversion: %d\n", s->cversion);
290
+ fprintf(stderr, "\t aversion: %d\n", s->aversion);
291
+ fprintf(stderr, "\t ephemeralOwner: %"PRId64"\n", s->ephemeralOwner);
292
+ fprintf(stderr, "\t dataLength: %d\n", s->dataLength);
293
+ fprintf(stderr, "\t numChildren: %d\n", s->numChildren);
294
+ fprintf(stderr, "\t pzxid: %"PRId64"\n", s->pzxid);
297
295
  } else {
298
296
  fprintf(stderr, "\tNULL\n");
299
297
  }
@@ -309,7 +307,7 @@ zkrb_calling_context *zkrb_calling_context_alloc(int64_t req_id, zkrb_queue_t *q
309
307
 
310
308
  void zkrb_print_calling_context(zkrb_calling_context *ctx) {
311
309
  fprintf(stderr, "calling context (%p){\n", ctx);
312
- fprintf(stderr, "\treq_id = %lld\n", ctx->req_id);
310
+ fprintf(stderr, "\treq_id = %"PRId64"\n", ctx->req_id);
313
311
  fprintf(stderr, "\tqueue = %p\n", ctx->queue);
314
312
  fprintf(stderr, "}\n");
315
313
  }
@@ -37,29 +37,28 @@ module ZookeeperEM
37
37
  def close(&block)
38
38
  on_close(&block)
39
39
 
40
- logger.debug { "close called, closed? #{closed?} running? #{running?}" }
40
+ logger.debug { "#{self.class.name}: close called, closed? #{closed?} running? #{running?}" }
41
41
 
42
42
  if @_running
43
43
  @start_stop_mutex.synchronize do
44
44
  @_running = false
45
45
  end
46
46
 
47
- @em_connection.detach if @em_connection
48
- @em_connection = nil
49
-
50
- unless @_closed
51
- @start_stop_mutex.synchronize do
52
- logger.debug { "closing handle" }
53
- close_handle
47
+ if @em_connection
48
+ EM.next_tick do
49
+ @em_connection.detach do
50
+ logger.debug { "#{self.class.name}: connection unbound, continuing with shutdown" }
51
+ finish_closing
52
+ end
54
53
  end
55
-
56
- selectable_io.close unless selectable_io.closed?
54
+ else
55
+ logger.debug { "#{self.class.name}: em_connection was never set up, finish closing" }
56
+ finish_closing
57
57
  end
58
58
  else
59
- logger.debug { "we are not running, so returning on_close deferred" }
59
+ logger.debug { "#{self.class.name}: we are not running, so returning on_close deferred" }
60
60
  end
61
61
 
62
- on_close.succeed
63
62
  on_close
64
63
  end
65
64
 
@@ -73,14 +72,30 @@ module ZookeeperEM
73
72
  EM.schedule do
74
73
  if running? and not closed?
75
74
  begin
75
+ logger.debug { "adding EM.watch(#{selectable_io.inspect})" }
76
76
  @em_connection = EM.watch(selectable_io, ZKConnection, self) { |cnx| cnx.notify_readable = true }
77
77
  rescue Exception => e
78
78
  $stderr.puts "caught exception from EM.watch(): #{e.inspect}"
79
79
  end
80
- on_attached.succeed
81
80
  end
82
81
  end
83
82
  end
83
+
84
+ def finish_closing
85
+ unless @_closed
86
+ @start_stop_mutex.synchronize do
87
+ logger.debug { "closing handle" }
88
+ close_handle
89
+ end
90
+
91
+ unless selectable_io.closed?
92
+ logger.debug { "calling close on selectable_io: #{selectable_io.inspect}" }
93
+ selectable_io.close
94
+ end
95
+ end
96
+
97
+ on_close.succeed
98
+ end
84
99
  end
85
100
 
86
101
  # this class is handed to EventMachine.watch to handle event dispatching
@@ -94,24 +109,53 @@ module ZookeeperEM
94
109
 
95
110
  def initialize(zk_client)
96
111
  @zk_client = zk_client
112
+ end
113
+
114
+ def post_init
115
+ logger.debug { "post_init called" }
97
116
  @attached = true
117
+
118
+ @on_unbind = EM::DefaultDeferrable.new.tap do |d|
119
+ d.callback do
120
+ logger.debug { "on_unbind deferred fired" }
121
+ end
122
+ end
123
+
124
+ # probably because of the way post_init works, unless we fire this
125
+ # callback in next_tick @em_connection in the client may not be set
126
+ # (which on_attached callbacks may be relying on)
127
+ EM.next_tick do
128
+ logger.debug { "firing on_attached callback" }
129
+ @zk_client.on_attached.succeed
130
+ end
131
+ end
132
+
133
+ # EM::DefaultDeferrable that will be called back when our em_connection has been detached
134
+ # and we've completed the close operation
135
+ def on_unbind(&block)
136
+ @on_unbind.callback(&block) if block
137
+ @on_unbind
98
138
  end
99
139
 
100
140
  def attached?
101
141
  @attached
102
142
  end
103
143
 
104
- def detach
144
+ def unbind
145
+ on_unbind.succeed
146
+ end
147
+
148
+ def detach(&blk)
149
+ on_unbind(&blk)
105
150
  return unless @attached
106
151
  @attached = false
107
- super
108
- logger.debug { "#{self.class.name}: detached" }
152
+ rval = super()
153
+ logger.debug { "#{self.class.name}: detached, rval: #{rval.inspect}" }
109
154
  end
110
155
 
111
156
  # we have an event waiting
112
157
  def notify_readable
113
158
  if @zk_client.running?
114
- # logger.debug { "#{self.class.name}: dispatching events while #{@zk_client.running?}" }
115
159
 
116
160
  read_io_nb if @zk_client.dispatch_next_callback(false)
117
161
 
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "slyphon-zookeeper"
6
- s.version = '0.2.3'
6
+ s.version = '0.2.4'
7
7
 
8
8
  s.authors = ["Phillip Pearson", "Eric Maland", "Evan Weaver", "Brian Wickman", "Neil Conway", "Jonathan D. Simms"]
9
9
  s.email = ["slyphon@gmail.com"]
data/spec/em_spec.rb CHANGED
@@ -20,7 +20,12 @@ describe 'ZookeeperEM' do
20
20
  end
21
21
 
22
22
  def teardown_and_done
23
- @zk.close { done }
23
+ @zk.close do
24
+ logger.debug { "TEST: about to call done" }
25
+ EM.next_tick do
26
+ done
27
+ end
28
+ end
24
29
  end
25
30
 
26
31
  describe 'selectable_io' do
@@ -55,37 +60,6 @@ describe 'ZookeeperEM' do
55
60
  teardown_and_done
56
61
  end
57
62
  end
58
-
59
- it %[should not be read-ready if there's no event] do
60
- pending "get this to work in jruby" if defined?(::JRUBY_VERSION)
61
- # there's always an initial event after connect
62
-
63
- # except in jruby
64
- # if defined?(::JRUBY_VERSION)
65
- # @zk.get(:path => '/', :callback => @data_cb)
66
- # end
67
-
68
- setup_zk do
69
- events = 0
70
-
71
- while true
72
- r, *_ = IO.select([@zk.selectable_io], [], [], 0.2)
73
-
74
- break unless r
75
-
76
- h = @zk.get_next_event(false)
77
- @zk.selectable_io.read(1)
78
-
79
- events += 1
80
-
81
- h.should be_kind_of(Hash)
82
- end
83
-
84
- events.should == 1
85
-
86
- teardown_and_done
87
- end
88
- end
89
63
  end
90
64
 
91
65
  describe 'em_connection' do
data/spec/spec_helper.rb CHANGED
@@ -13,6 +13,14 @@ Zookeeper.logger = Logger.new(File.expand_path('../../test.log', __FILE__)).tap
13
13
  log.level = Logger::DEBUG
14
14
  end
15
15
 
16
+
17
+ # NOTE: this is a useful debugging setup. have our logs and the low-level C
18
+ # logging statements both go to stderr. to use, comment the above and uncomment
19
+ # below
20
+
21
+ # Zookeeper.logger = Logger.new($stderr).tap { |l| l.level = Logger::DEBUG }
22
+ # Zookeeper.set_debug_level(4)
23
+
16
24
  def logger
17
25
  Zookeeper.logger
18
26
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slyphon-zookeeper
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
9
+ - 4
10
+ version: 0.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Phillip Pearson
@@ -20,7 +20,7 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2011-06-27 00:00:00 +00:00
23
+ date: 2011-06-29 00:00:00 +00:00
24
24
  default_executable:
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency