zookeeper 0.9.4-java → 1.0.0.beta.1-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|