zookeeper 0.9.4-java → 1.0.0.beta.1-java
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/.dotfiles/rvmrc +1 -0
- data/.gitignore +3 -0
- data/.gitmodules +3 -0
- data/.travis.yml +22 -0
- data/CHANGELOG +38 -5
- data/Gemfile +18 -1
- data/README.markdown +2 -0
- data/Rakefile +47 -109
- data/ext/c_zookeeper.rb +10 -6
- data/ext/zookeeper_base.rb +23 -11
- data/ext/zookeeper_c.c +14 -10
- data/java/{zookeeper_base.rb → java_base.rb} +13 -12
- data/lib/zookeeper/acls.rb +17 -13
- data/lib/zookeeper/callbacks.rb +28 -11
- data/lib/zookeeper/client.rb +30 -0
- data/lib/zookeeper/client_methods.rb +241 -0
- data/lib/zookeeper/common/queue_with_pipe.rb +3 -7
- data/lib/zookeeper/common.rb +13 -12
- data/lib/zookeeper/compatibility.rb +135 -0
- data/lib/zookeeper/constants.rb +35 -1
- data/lib/zookeeper/em_client.rb +1 -1
- data/lib/zookeeper/exceptions.rb +117 -93
- data/lib/zookeeper/rake_tasks.rb +165 -0
- data/lib/zookeeper/stat.rb +16 -16
- data/lib/zookeeper/version.rb +2 -4
- data/lib/zookeeper.rb +32 -244
- data/scripts/upgrade-1.0-sed-alike.rb +46 -0
- data/spec/c_zookeeper_spec.rb +10 -9
- data/spec/chrooted_connection_spec.rb +2 -2
- data/spec/default_watcher_spec.rb +4 -4
- data/spec/em_spec.rb +1 -1
- data/spec/shared/connection_examples.rb +52 -37
- data/spec/spec_helper.rb +22 -84
- data/spec/support/00_spawn_zookeeper.rb +20 -0
- data/spec/support/zookeeper_spec_helpers.rb +84 -0
- data/spec/zookeeper_spec.rb +1 -1
- data/zookeeper.gemspec +9 -12
- metadata +50 -36
- data/examples/cloud_config.rb +0 -125
- data/test/test_basic.rb +0 -37
- data/test/test_callback1.rb +0 -36
- data/test/test_close.rb +0 -16
- data/test/test_esoteric.rb +0 -7
- data/test/test_watcher1.rb +0 -56
- data/test/test_watcher2.rb +0 -52
@@ -34,7 +34,7 @@ shared_examples_for "connection" do
|
|
34
34
|
|
35
35
|
it %[should return a stat] do
|
36
36
|
@rv[:stat].should_not be_nil
|
37
|
-
@rv[:stat].should be_kind_of(
|
37
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -43,7 +43,7 @@ shared_examples_for "connection" do
|
|
43
43
|
|
44
44
|
before do
|
45
45
|
@event = nil
|
46
|
-
@watcher = Zookeeper::WatcherCallback.new
|
46
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
47
47
|
|
48
48
|
@rv = zk.get(:path => path, :watcher => @watcher, :watcher_context => path)
|
49
49
|
end
|
@@ -67,7 +67,7 @@ shared_examples_for "connection" do
|
|
67
67
|
|
68
68
|
describe :async do
|
69
69
|
before do
|
70
|
-
@cb = Zookeeper::DataCallback.new
|
70
|
+
@cb = Zookeeper::Callbacks::DataCallback.new
|
71
71
|
|
72
72
|
@rv = zk.get(:path => path, :callback => @cb, :callback_context => path)
|
73
73
|
wait_until(1.0) { @cb.completed? }
|
@@ -82,7 +82,7 @@ shared_examples_for "connection" do
|
|
82
82
|
|
83
83
|
it %[should have the stat object in the callback] do
|
84
84
|
@cb.stat.should_not be_nil
|
85
|
-
@cb.stat.should be_kind_of(
|
85
|
+
@cb.stat.should be_kind_of(Zookeeper::Stat)
|
86
86
|
end
|
87
87
|
|
88
88
|
it %[should have the data] do
|
@@ -94,8 +94,8 @@ shared_examples_for "connection" do
|
|
94
94
|
it_should_behave_like "all success return values"
|
95
95
|
|
96
96
|
before do
|
97
|
-
@cb = Zookeeper::DataCallback.new
|
98
|
-
@watcher = Zookeeper::WatcherCallback.new
|
97
|
+
@cb = Zookeeper::Callbacks::DataCallback.new
|
98
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
99
99
|
|
100
100
|
@rv = zk.get(:path => path, :callback => @cb, :callback_context => path, :watcher => @watcher, :watcher_context => path)
|
101
101
|
wait_until(1.0) { @cb.completed? }
|
@@ -104,7 +104,7 @@ shared_examples_for "connection" do
|
|
104
104
|
|
105
105
|
it %[should have the stat object in the callback] do
|
106
106
|
@cb.stat.should_not be_nil
|
107
|
-
@cb.stat.should be_kind_of(
|
107
|
+
@cb.stat.should be_kind_of(Zookeeper::Stat)
|
108
108
|
end
|
109
109
|
|
110
110
|
it %[should have the data] do
|
@@ -129,7 +129,7 @@ shared_examples_for "connection" do
|
|
129
129
|
|
130
130
|
describe 'bad arguments' do
|
131
131
|
it %[should barf with a BadArguments error] do
|
132
|
-
lambda { zk.get(:bad_arg => 'what!?') }.should raise_error(
|
132
|
+
lambda { zk.get(:bad_arg => 'what!?') }.should raise_error(Zookeeper::Exceptions::BadArguments)
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end # get
|
@@ -150,7 +150,7 @@ shared_examples_for "connection" do
|
|
150
150
|
|
151
151
|
it %[should return the new stat] do
|
152
152
|
@rv[:stat].should_not be_nil
|
153
|
-
@rv[:stat].should be_kind_of(
|
153
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
154
154
|
@rv[:stat].version.should > @stat.version
|
155
155
|
end
|
156
156
|
end
|
@@ -164,7 +164,7 @@ shared_examples_for "connection" do
|
|
164
164
|
|
165
165
|
it %[should return the new stat] do
|
166
166
|
@rv[:stat].should_not be_nil
|
167
|
-
@rv[:stat].should be_kind_of(
|
167
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
168
168
|
@rv[:stat].version.should > @stat.version
|
169
169
|
end
|
170
170
|
end
|
@@ -190,14 +190,14 @@ shared_examples_for "connection" do
|
|
190
190
|
it %[should barf if the data size is too large], :input_size => true do
|
191
191
|
large_data = '0' * (1024 ** 2)
|
192
192
|
|
193
|
-
lambda { zk.set(:path => path, :data => large_data) }.should raise_error(
|
193
|
+
lambda { zk.set(:path => path, :data => large_data) }.should raise_error(Zookeeper::Exceptions::DataTooLargeException)
|
194
194
|
end
|
195
195
|
end
|
196
196
|
end # sync
|
197
197
|
|
198
198
|
describe :async do
|
199
199
|
before do
|
200
|
-
@cb = Zookeeper::StatCallback.new
|
200
|
+
@cb = Zookeeper::Callbacks::StatCallback.new
|
201
201
|
end
|
202
202
|
|
203
203
|
describe 'without version' do
|
@@ -264,7 +264,7 @@ shared_examples_for "connection" do
|
|
264
264
|
it %[should barf if the data size is too large], :input_size => true do
|
265
265
|
large_data = '0' * (1024 ** 2)
|
266
266
|
|
267
|
-
lambda { zk.set(:path => path, :data => large_data, :callback => @cb, :callback_context => path) }.should raise_error(
|
267
|
+
lambda { zk.set(:path => path, :data => large_data, :callback => @cb, :callback_context => path) }.should raise_error(Zookeeper::Exceptions::DataTooLargeException)
|
268
268
|
end
|
269
269
|
end
|
270
270
|
|
@@ -303,7 +303,7 @@ shared_examples_for "connection" do
|
|
303
303
|
|
304
304
|
it %[should have a stat object whose num_children is 3] do
|
305
305
|
@rv[:stat].should_not be_nil
|
306
|
-
@rv[:stat].should be_kind_of(
|
306
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
307
307
|
@rv[:stat].num_children.should == 3
|
308
308
|
end
|
309
309
|
end
|
@@ -314,7 +314,7 @@ shared_examples_for "connection" do
|
|
314
314
|
before do
|
315
315
|
@addtl_child = 'child3'
|
316
316
|
|
317
|
-
@watcher = Zookeeper::WatcherCallback.new
|
317
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
318
318
|
|
319
319
|
@rv = zk.get_children(:path => path, :watcher => @watcher, :watcher_context => path)
|
320
320
|
end
|
@@ -331,7 +331,7 @@ shared_examples_for "connection" do
|
|
331
331
|
|
332
332
|
it %[should have a stat object whose num_children is 3] do
|
333
333
|
@rv[:stat].should_not be_nil
|
334
|
-
@rv[:stat].should be_kind_of(
|
334
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
335
335
|
@rv[:stat].num_children.should == 3
|
336
336
|
end
|
337
337
|
|
@@ -353,7 +353,7 @@ shared_examples_for "connection" do
|
|
353
353
|
it_should_behave_like "all success return values"
|
354
354
|
|
355
355
|
before do
|
356
|
-
@cb =
|
356
|
+
@cb = Zookeeper::Callbacks::StringsCallback.new
|
357
357
|
@rv = zk.get_children(:path => path, :callback => @cb, :callback_context => path)
|
358
358
|
|
359
359
|
wait_until { @cb.completed? }
|
@@ -372,7 +372,7 @@ shared_examples_for "connection" do
|
|
372
372
|
|
373
373
|
it %[should have a stat object whose num_children is 3] do
|
374
374
|
@cb.stat.should_not be_nil
|
375
|
-
@cb.stat.should be_kind_of(
|
375
|
+
@cb.stat.should be_kind_of(Zookeeper::Stat)
|
376
376
|
@cb.stat.num_children.should == 3
|
377
377
|
end
|
378
378
|
end
|
@@ -383,8 +383,8 @@ shared_examples_for "connection" do
|
|
383
383
|
before do
|
384
384
|
@addtl_child = 'child3'
|
385
385
|
|
386
|
-
@watcher = Zookeeper::WatcherCallback.new
|
387
|
-
@cb =
|
386
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
387
|
+
@cb = Zookeeper::Callbacks::StringsCallback.new
|
388
388
|
|
389
389
|
@rv = zk.get_children(:path => path, :watcher => @watcher, :watcher_context => path, :callback => @cb, :callback_context => path)
|
390
390
|
wait_until { @cb.completed? }
|
@@ -407,7 +407,7 @@ shared_examples_for "connection" do
|
|
407
407
|
|
408
408
|
it %[should have a stat object whose num_children is 3] do
|
409
409
|
@cb.stat.should_not be_nil
|
410
|
-
@cb.stat.should be_kind_of(
|
410
|
+
@cb.stat.should be_kind_of(Zookeeper::Stat)
|
411
411
|
@cb.stat.num_children.should == 3
|
412
412
|
end
|
413
413
|
|
@@ -445,7 +445,7 @@ shared_examples_for "connection" do
|
|
445
445
|
it_should_behave_like "all success return values"
|
446
446
|
|
447
447
|
before do
|
448
|
-
@watcher = Zookeeper::WatcherCallback.new
|
448
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
449
449
|
|
450
450
|
@rv = zk.stat(:path => path, :watcher => @watcher, :watcher_context => path)
|
451
451
|
end
|
@@ -472,7 +472,7 @@ shared_examples_for "connection" do
|
|
472
472
|
it_should_behave_like "all success return values"
|
473
473
|
|
474
474
|
before do
|
475
|
-
@cb =
|
475
|
+
@cb = Zookeeper::Callbacks::StatCallback.new
|
476
476
|
@rv = zk.stat(:path => path, :callback => @cb, :callback_context => path)
|
477
477
|
|
478
478
|
wait_until { @cb.completed? }
|
@@ -494,9 +494,9 @@ shared_examples_for "connection" do
|
|
494
494
|
before do
|
495
495
|
@addtl_child = 'child3'
|
496
496
|
|
497
|
-
@watcher = Zookeeper::WatcherCallback.new
|
497
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
498
498
|
|
499
|
-
@cb =
|
499
|
+
@cb = Zookeeper::Callbacks::StatCallback.new
|
500
500
|
@rv = zk.stat(:path => path, :callback => @cb, :callback_context => path, :watcher => @watcher, :watcher_context => path)
|
501
501
|
|
502
502
|
wait_until { @cb.completed? }
|
@@ -541,7 +541,7 @@ shared_examples_for "connection" do
|
|
541
541
|
it %[should barf if the data size is too large], :input_size => true do
|
542
542
|
large_data = '0' * (1024 ** 2)
|
543
543
|
|
544
|
-
lambda { zk.create(:path => path, :data => large_data) }.should raise_error(
|
544
|
+
lambda { zk.create(:path => path, :data => large_data) }.should raise_error(Zookeeper::Exceptions::DataTooLargeException)
|
545
545
|
end
|
546
546
|
end
|
547
547
|
|
@@ -642,7 +642,7 @@ shared_examples_for "connection" do
|
|
642
642
|
|
643
643
|
describe :async do
|
644
644
|
before do
|
645
|
-
@cb =
|
645
|
+
@cb = Zookeeper::Callbacks::StringCallback.new
|
646
646
|
end
|
647
647
|
|
648
648
|
describe :default_flags do
|
@@ -676,7 +676,7 @@ shared_examples_for "connection" do
|
|
676
676
|
|
677
677
|
lambda do
|
678
678
|
zk.create(:path => path, :data => large_data, :callback => @cb, :callback_context => path)
|
679
|
-
end.should raise_error(
|
679
|
+
end.should raise_error(Zookeeper::Exceptions::DataTooLargeException)
|
680
680
|
end
|
681
681
|
end
|
682
682
|
|
@@ -821,7 +821,7 @@ shared_examples_for "connection" do
|
|
821
821
|
|
822
822
|
describe :async do
|
823
823
|
before do
|
824
|
-
@cb =
|
824
|
+
@cb = Zookeeper::Callbacks::VoidCallback.new
|
825
825
|
end
|
826
826
|
|
827
827
|
describe 'without version' do
|
@@ -886,7 +886,7 @@ shared_examples_for "connection" do
|
|
886
886
|
end
|
887
887
|
|
888
888
|
it %[should return a stat for the path] do
|
889
|
-
@rv[:stat].should be_kind_of(
|
889
|
+
@rv[:stat].should be_kind_of(Zookeeper::Stat)
|
890
890
|
end
|
891
891
|
|
892
892
|
it %[should return the acls] do
|
@@ -906,7 +906,7 @@ shared_examples_for "connection" do
|
|
906
906
|
it_should_behave_like "all success return values"
|
907
907
|
|
908
908
|
before do
|
909
|
-
@cb = Zookeeper::ACLCallback.new
|
909
|
+
@cb = Zookeeper::Callbacks::ACLCallback.new
|
910
910
|
@rv = zk.get_acl(:path => path, :callback => @cb, :callback_context => path)
|
911
911
|
|
912
912
|
wait_until(2) { @cb.completed? }
|
@@ -914,7 +914,7 @@ shared_examples_for "connection" do
|
|
914
914
|
end
|
915
915
|
|
916
916
|
it %[should return a stat for the path] do
|
917
|
-
@cb.stat.should be_kind_of(
|
917
|
+
@cb.stat.should be_kind_of(Zookeeper::Stat)
|
918
918
|
end
|
919
919
|
|
920
920
|
it %[should return the acls] do
|
@@ -922,7 +922,7 @@ shared_examples_for "connection" do
|
|
922
922
|
acls.should be_kind_of(Array)
|
923
923
|
|
924
924
|
acl = acls.first
|
925
|
-
acl.should be_kind_of(
|
925
|
+
acl.should be_kind_of(Zookeeper::ACLs::ACL)
|
926
926
|
|
927
927
|
acl.perms.should == Zookeeper::ZOO_PERM_ALL
|
928
928
|
|
@@ -935,7 +935,7 @@ shared_examples_for "connection" do
|
|
935
935
|
describe :set_acl do
|
936
936
|
before do
|
937
937
|
@perms = 5
|
938
|
-
@new_acl = [
|
938
|
+
@new_acl = [Zookeeper::ACLs::ACL.new(:perms => @perms, :id => Zookeeper::Constants::ZOO_ANYONE_ID_UNSAFE)]
|
939
939
|
pending("No idea how to set ACLs")
|
940
940
|
end
|
941
941
|
|
@@ -950,7 +950,7 @@ shared_examples_for "connection" do
|
|
950
950
|
|
951
951
|
describe :session_id do
|
952
952
|
it %[should return the session_id as a Fixnum] do
|
953
|
-
zk.session_id.should be_kind_of(
|
953
|
+
zk.session_id.should be_kind_of(Integer)
|
954
954
|
end
|
955
955
|
end
|
956
956
|
|
@@ -965,7 +965,7 @@ shared_examples_for "connection" do
|
|
965
965
|
it_should_behave_like "all success return values"
|
966
966
|
|
967
967
|
before do
|
968
|
-
@cb = Zookeeper::StringCallback.new
|
968
|
+
@cb = Zookeeper::Callbacks::StringCallback.new
|
969
969
|
@rv = zk.sync(:path => path, :callback => @cb)
|
970
970
|
|
971
971
|
wait_until(2) { @cb.completed }
|
@@ -975,7 +975,7 @@ shared_examples_for "connection" do
|
|
975
975
|
|
976
976
|
describe :errors do
|
977
977
|
it %[should barf with BadArguments if :callback is not given] do
|
978
|
-
lambda { zk.sync(:path => path) }.should raise_error(
|
978
|
+
lambda { zk.sync(:path => path) }.should raise_error(Zookeeper::Exceptions::BadArguments)
|
979
979
|
end
|
980
980
|
end
|
981
981
|
end
|
@@ -1014,5 +1014,20 @@ shared_examples_for "connection" do
|
|
1014
1014
|
end
|
1015
1015
|
end
|
1016
1016
|
end
|
1017
|
+
|
1018
|
+
unless defined?(::JRUBY_VERSION)
|
1019
|
+
describe 'fork protection' do
|
1020
|
+
it %[should raise an InheritedConnectionError if the current Process.pid is different from the one that created the client] do
|
1021
|
+
pid = Process.pid
|
1022
|
+
begin
|
1023
|
+
Process.stub(:pid => -1)
|
1024
|
+
lambda { zk.stat(:path => path) }.should raise_error(Zookeeper::Exceptions::InheritedConnectionError)
|
1025
|
+
ensure
|
1026
|
+
# ensure we reset this, only want it to fail during the test
|
1027
|
+
Process.stub(:pid => pid)
|
1028
|
+
end
|
1029
|
+
end
|
1030
|
+
end
|
1031
|
+
end
|
1017
1032
|
end
|
1018
1033
|
|
data/spec/spec_helper.rb
CHANGED
@@ -4,9 +4,13 @@ $LOAD_PATH.uniq!
|
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
6
|
|
7
|
-
|
7
|
+
release_ops_path = File.expand_path('../../releaseops/lib', __FILE__)
|
8
|
+
|
9
|
+
if File.exists?(release_ops_path)
|
10
|
+
require File.join(release_ops_path, 'releaseops')
|
11
|
+
ReleaseOps::SimpleCov.maybe_start
|
12
|
+
end
|
8
13
|
|
9
|
-
require 'flexmock'
|
10
14
|
require 'zookeeper'
|
11
15
|
|
12
16
|
Dir[File.expand_path('../support/**/*.rb', __FILE__)].sort.each { |f| require(f) }
|
@@ -26,94 +30,28 @@ if ENV['ZKRB_NOLOG']
|
|
26
30
|
end
|
27
31
|
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
Zookeeper.logger
|
34
|
-
end
|
35
|
-
|
36
|
-
def ensure_node(zk, path, data)
|
37
|
-
return if zk.closed?
|
38
|
-
if zk.stat(:path => path)[:stat].exists?
|
39
|
-
zk.set(:path => path, :data => data)
|
40
|
-
else
|
41
|
-
zk.create(:path => path, :data => data)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def with_open_zk(host='localhost:2181')
|
46
|
-
z = Zookeeper.new(host)
|
47
|
-
yield z
|
48
|
-
ensure
|
49
|
-
if z
|
50
|
-
unless z.closed?
|
51
|
-
z.close
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.mock_with :rspec
|
35
|
+
config.include ZookeeperSpecHeleprs
|
36
|
+
config.extend ZookeeperSpecHeleprs
|
52
37
|
|
53
|
-
|
54
|
-
|
55
|
-
!z.connected?
|
56
|
-
rescue RuntimeError
|
57
|
-
true
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
38
|
+
if Zookeeper.spawn_zookeeper?
|
39
|
+
require 'zk-server'
|
63
40
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
elsif h[:rc] == ZookeeperExceptions::ZNONODE
|
73
|
-
# no-op
|
74
|
-
else
|
75
|
-
raise "Oh noes! unexpected return value! #{h.inspect}"
|
41
|
+
config.before(:suite) do
|
42
|
+
Zookeeper.logger.debug { "Starting zookeeper service" }
|
43
|
+
ZK::Server.run do |c|
|
44
|
+
c.base_dir = File.expand_path('../../.zkserver', __FILE__)
|
45
|
+
c.client_port = Zookeeper.test_port
|
46
|
+
c.force_sync = false
|
47
|
+
c.snap_count = 1_000_000
|
76
48
|
end
|
77
49
|
end
|
78
50
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
raise "oh noes! failed to delete #{path}"
|
83
|
-
end
|
84
|
-
|
85
|
-
path
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
# method to wait until block passed returns true or timeout (default is 10 seconds) is reached
|
90
|
-
# raises TiemoutError on timeout
|
91
|
-
def wait_until(timeout=10)
|
92
|
-
time_to_stop = Time.now + timeout
|
93
|
-
while true
|
94
|
-
rval = yield
|
95
|
-
return rval if rval
|
96
|
-
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
97
|
-
Thread.pass
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
# inverse of wait_until
|
102
|
-
def wait_while(timeout=10)
|
103
|
-
time_to_stop = Time.now + timeout
|
104
|
-
while true
|
105
|
-
rval = yield
|
106
|
-
return rval unless rval
|
107
|
-
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
108
|
-
Thread.pass
|
51
|
+
config.after(:suite) do
|
52
|
+
Zookeeper.logger.debug { "stopping zookeeper service" }
|
53
|
+
ZK::Server.shutdown
|
109
54
|
end
|
110
55
|
end
|
111
56
|
end
|
112
57
|
|
113
|
-
RSpec.configure do |config|
|
114
|
-
config.mock_with :flexmock
|
115
|
-
config.include ZookeeperSpecHeleprs
|
116
|
-
config.extend ZookeeperSpecHeleprs
|
117
|
-
end
|
118
|
-
|
119
|
-
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Zookeeper
|
2
|
+
def self.spawn_zookeeper?
|
3
|
+
!!ENV['SPAWN_ZOOKEEPER']
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.travis?
|
7
|
+
!!ENV['TRAVIS']
|
8
|
+
end
|
9
|
+
|
10
|
+
@test_port ||= spawn_zookeeper? ? 21811 : 2181
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :test_port
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.default_cnx_str
|
17
|
+
"localhost:#{test_port}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module ZookeeperSpecHeleprs
|
2
|
+
class TimeoutError < StandardError; end
|
3
|
+
|
4
|
+
def logger
|
5
|
+
Zookeeper.logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def ensure_node(zk, path, data)
|
9
|
+
return if zk.closed?
|
10
|
+
if zk.stat(:path => path)[:stat].exists?
|
11
|
+
zk.set(:path => path, :data => data)
|
12
|
+
else
|
13
|
+
zk.create(:path => path, :data => data)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_open_zk(host=nil)
|
18
|
+
z = Zookeeper.new(Zookeeper.default_cnx_str)
|
19
|
+
yield z
|
20
|
+
ensure
|
21
|
+
if z
|
22
|
+
unless z.closed?
|
23
|
+
z.close
|
24
|
+
|
25
|
+
wait_until do
|
26
|
+
begin
|
27
|
+
!z.connected?
|
28
|
+
rescue RuntimeError
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# this is not as safe as the one in ZK, just to be used to clean up
|
37
|
+
# when we're the only one adjusting a particular path
|
38
|
+
def rm_rf(z, path)
|
39
|
+
z.get_children(:path => path).tap do |h|
|
40
|
+
if h[:rc].zero?
|
41
|
+
h[:children].each do |child|
|
42
|
+
rm_rf(z, File.join(path, child))
|
43
|
+
end
|
44
|
+
elsif h[:rc] == Zookeeper::Exceptions::ZNONODE
|
45
|
+
# no-op
|
46
|
+
else
|
47
|
+
raise "Oh noes! unexpected return value! #{h.inspect}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
rv = z.delete(:path => path)
|
52
|
+
|
53
|
+
unless (rv[:rc].zero? or rv[:rc] == Zookeeper::Exceptions::ZNONODE)
|
54
|
+
raise "oh noes! failed to delete #{path}"
|
55
|
+
end
|
56
|
+
|
57
|
+
path
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# method to wait until block passed returns true or timeout (default is 10 seconds) is reached
|
62
|
+
# raises TiemoutError on timeout
|
63
|
+
def wait_until(timeout=10)
|
64
|
+
time_to_stop = Time.now + timeout
|
65
|
+
while true
|
66
|
+
rval = yield
|
67
|
+
return rval if rval
|
68
|
+
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
69
|
+
Thread.pass
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# inverse of wait_until
|
74
|
+
def wait_while(timeout=10)
|
75
|
+
time_to_stop = Time.now + timeout
|
76
|
+
while true
|
77
|
+
rval = yield
|
78
|
+
return rval unless rval
|
79
|
+
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
80
|
+
Thread.pass
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
data/spec/zookeeper_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require 'shared/connection_examples'
|
|
5
5
|
describe 'Zookeeper' do
|
6
6
|
let(:path) { "/_zktest_" }
|
7
7
|
let(:data) { "underpants" }
|
8
|
-
let(:connection_string) {
|
8
|
+
let(:connection_string) { Zookeeper.default_cnx_str }
|
9
9
|
|
10
10
|
before do
|
11
11
|
@zk = Zookeeper.new(connection_string)
|
data/zookeeper.gemspec
CHANGED
@@ -3,28 +3,25 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
require 'zookeeper/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
7
|
-
s.version =
|
6
|
+
s.name = 'zookeeper'
|
7
|
+
s.version = Zookeeper::VERSION
|
8
8
|
|
9
9
|
s.authors = ["Phillip Pearson", "Eric Maland", "Evan Weaver", "Brian Wickman", "Neil Conway", "Jonathan D. Simms"]
|
10
10
|
s.email = ["slyphon@gmail.com"]
|
11
|
-
s.summary = %q{
|
11
|
+
s.summary = %q{Apache ZooKeeper driver for Rubies}
|
12
12
|
s.description = <<-EOS
|
13
|
-
A low-level multi-Ruby wrapper around the ZooKeeper API bindings.
|
14
|
-
|
13
|
+
A low-level multi-Ruby wrapper around the ZooKeeper API bindings. For a
|
14
|
+
friendlier interface, see http://github.com/slyphon/zk. Currently supported:
|
15
|
+
MRI: {1.8.7, 1.9.2, 1.9.3}, JRuby: ~> 1.6.7, Rubinius: 2.0.testing, REE 1.8.7.
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
MRI: 1.8.7, 1.9.2, 1.9.3
|
19
|
-
JRuby: ~> 1.6.7
|
20
|
-
Rubinius: 2.0.testing
|
21
|
-
|
22
|
-
This library uses version #{ZookeeperVersion::DRIVER_VERSION} of zookeeper bindings.
|
17
|
+
This library uses version #{Zookeeper::DRIVER_VERSION} of zookeeper bindings.
|
23
18
|
|
24
19
|
EOS
|
25
20
|
|
26
21
|
s.homepage = 'https://github.com/slyphon/zookeeper'
|
27
22
|
|
23
|
+
s.add_runtime_dependency 'backports', '~> 2.5.1'
|
24
|
+
|
28
25
|
s.files = `git ls-files`.split("\n")
|
29
26
|
s.require_paths = ["lib"]
|
30
27
|
|