slyphon-zookeeper 0.8.0.rc.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,36 @@
1
+ v0.8.0 Refactor C implementaion, EventMachine client
2
+
3
+ * separated CZookeeper and ZookeeperBase implementation
4
+
5
+ This solves issues with reopen not working properly, makes for a much
6
+ cleaner event delivery implementation. ZookeeperBase controls the lifecycle
7
+ of the event dispatch thread now, rather than it being tied to CZookeeper.
8
+
9
+ * added support for the 'sync' API call
10
+
11
+ * Refactored zookeeper_c.c and zookeeper_lib.c
12
+
13
+ More error checking in zookeeper_lib.c and restructure some things to make
14
+ logic easier to follow
15
+
16
+ Fix bug in method_get_next_event that made the shutdown case so complicated
17
+
18
+ * Massively simplified EMClient implementation
19
+
20
+ Rather than trying to hook the IO used by zookeeper_lib to notify zookeeper_c
21
+ about event availabiltiy directly into EventMachine, use the same event delivery
22
+ thread, but wrap the dispatch call in EM.schedule.
23
+
24
+ * Improve implementation of spin-lock-esque code that waits for the connection to be
25
+ established before returning.
26
+
27
+ This cut the test runtime down from 1m 20s to 2s.
28
+
29
+ * Java client refactoring, similar correctness changes
30
+
31
+ * Change ZookeeperException base class to StandardError instead of Exception
32
+
33
+
1
34
  v0.4.5 Upgrade to ZooKeeper 3.3.3
2
35
 
3
36
  v0.4.4 Fix race condition on close, possible data corruption on async get.
@@ -24,3 +57,4 @@ v0.2. Bundle C dependencies, like memcached.gem.
24
57
 
25
58
  v0.1. First release.
26
59
 
60
+ # vim:ft=text:ts=2:sw=2:et
@@ -56,7 +56,10 @@ class ZookeeperBase
56
56
  @watcher_reqs.clear
57
57
  set_default_global_watcher
58
58
 
59
- @czk = CZookeeper.new(@host, @event_queue)
59
+ orig_czk, @czk = @czk, CZookeeper.new(@host, @event_queue)
60
+
61
+ orig_czk.close if orig_czk
62
+
60
63
  @czk.wait_until_connected(timeout)
61
64
  end
62
65
 
@@ -176,7 +176,7 @@ class ZookeeperBase
176
176
 
177
177
  @mutex.synchronize do
178
178
  # flushes all outstanding watcher reqs.
179
- @watcher_reqs = {}
179
+ @watcher_reqs.clear
180
180
  set_default_global_watcher
181
181
 
182
182
  replace_jzk!
data/lib/zookeeper.rb CHANGED
@@ -183,6 +183,16 @@ class Zookeeper < ZookeeperBase
183
183
  def associating?
184
184
  super
185
185
  end
186
+
187
+ # There are some operations that are dangerous in the context of the event
188
+ # dispatch thread (because they would block further event delivery). This
189
+ # method allows clients to know if they're currently executing in the context of an
190
+ # event.
191
+ #
192
+ # @returns [true,false] true if the current thread is the event dispatch thread
193
+ def event_dispatch_thread?
194
+ super
195
+ end
186
196
 
187
197
  # for expert use only. set the underlying debug level for the C layer, has no
188
198
  # effect in java
@@ -4,6 +4,10 @@ module ZookeeperCommon
4
4
  # sigh, i guess define this here?
5
5
  ZKRB_GLOBAL_CB_REQ = -1
6
6
 
7
+ def event_dispatch_thread?
8
+ @dispatcher && (@dispatcher == Thread.current)
9
+ end
10
+
7
11
  protected
8
12
  def get_next_event(blocking=true)
9
13
  @event_queue.pop(!blocking).tap do |event|
@@ -31,16 +31,24 @@ module ZookeeperEM
31
31
  end
32
32
 
33
33
  def dispatch_next_callback(hash)
34
- EM.schedule { super(hash) }
34
+ EM.schedule do
35
+ if running? and not closed?
36
+ logger.debug { "#{self.class}##{__method__} dispatch_next_callback: #{hash.inspect}: reactor_thread? #{EM.reactor_thread?}, running? #{running?}, closed? #{closed?}" }
37
+ super(hash)
38
+ end
39
+ end
35
40
  end
36
41
 
37
- # this is synchronous, but since the API still allows attaching to on_close,
38
- # we just fake it here
39
42
  def close(&block)
40
- on_close(&block).tap do |d|
41
- super()
42
- d.succeed
43
- end
43
+ on_close(&block)
44
+ super()
45
+ on_close.succeed
46
+ end
47
+
48
+ # Because eventmachine is single-threaded, and events are dispatched on the
49
+ # reactor thread we just delegate this to EM.reactor_thread?
50
+ def event_dispatch_thread?
51
+ EM.reactor_thread?
44
52
  end
45
53
  end # Client
46
54
  end # ZookeeperEM
@@ -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.8.0.rc.1'
6
+ s.version = '0.8.0'
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"]
@@ -985,6 +985,23 @@ shared_examples_for "connection" do
985
985
  end
986
986
  end
987
987
  end
988
- end
989
988
 
989
+ describe :event_dispatch_thread? do
990
+ it %[should return true when called on the event dispatching thread] do
991
+ @result = nil
992
+
993
+ cb = lambda do |hash|
994
+ @result = zk.event_dispatch_thread?
995
+ end
996
+
997
+ @rv = zk.sync(:path => path, :callback => cb)
998
+
999
+ wait_until(2) { @result == true }.should be_true
1000
+ end
1001
+
1002
+ it %[should return false when not on the event dispatching thread] do
1003
+ zk.event_dispatch_thread?.should_not be_true
1004
+ end
1005
+ end
1006
+ end
990
1007
 
metadata CHANGED
@@ -1,15 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slyphon-zookeeper
3
3
  version: !ruby/object:Gem::Version
4
- hash: -3630593450
5
- prerelease: 6
4
+ hash: 63
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
9
  - 0
10
- - rc
11
- - 1
12
- version: 0.8.0.rc.1
10
+ version: 0.8.0
13
11
  platform: ruby
14
12
  authors:
15
13
  - Phillip Pearson
@@ -22,7 +20,7 @@ autorequire:
22
20
  bindir: bin
23
21
  cert_chain: []
24
22
 
25
- date: 2012-04-21 00:00:00 Z
23
+ date: 2012-04-23 00:00:00 Z
26
24
  dependencies:
27
25
  - !ruby/object:Gem::Dependency
28
26
  name: rspec
@@ -64,7 +62,7 @@ dependencies:
64
62
  requirements:
65
63
  - - "="
66
64
  - !ruby/object:Gem::Version
67
- hash: -1432400188
65
+ hash: -909636374
68
66
  segments:
69
67
  - 1
70
68
  - 0
@@ -198,14 +196,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
198
196
  required_rubygems_version: !ruby/object:Gem::Requirement
199
197
  none: false
200
198
  requirements:
201
- - - ">"
199
+ - - ">="
202
200
  - !ruby/object:Gem::Version
203
- hash: 25
201
+ hash: 3
204
202
  segments:
205
- - 1
206
- - 3
207
- - 1
208
- version: 1.3.1
203
+ - 0
204
+ version: "0"
209
205
  requirements: []
210
206
 
211
207
  rubyforge_project: