zookeeper 1.4.4 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.dotfiles/ruby-gemset +1 -0
- data/.dotfiles/ruby-version +1 -0
- data/.gitignore +2 -0
- data/.travis.yml +1 -0
- data/CHANGELOG +23 -0
- data/Gemfile +2 -2
- data/README.markdown +2 -2
- data/Rakefile +13 -2
- data/ext/Rakefile +9 -33
- data/ext/c_zookeeper.rb +20 -9
- data/ext/event_lib.c +19 -19
- data/ext/event_lib.h +1 -1
- data/ext/extconf.rb +8 -5
- data/ext/generate_gvl_code.rb +4 -6
- data/ext/{patch-zookeeper → patches/zkc-3.3.5-network.patch} +0 -0
- data/ext/patches/zkc-3.4.5-logging.patch +41 -0
- data/ext/zkc-3.4.5.tar.gz +0 -0
- data/ext/zkrb.c +74 -21
- data/ext/zkrb_wrapper.c +44 -0
- data/ext/zkrb_wrapper.h +21 -1
- data/ext/zookeeper_base.rb +8 -6
- data/java/java_base.rb +14 -9
- data/lib/zookeeper/acls.rb +5 -5
- data/lib/zookeeper/client_methods.rb +2 -2
- data/lib/zookeeper/version.rb +2 -2
- data/spec/shared/connection_examples.rb +29 -0
- data/spec/support/progress_formatter.rb +1 -1
- data/zoomonkey/duplicates +3 -0
- data/zoomonkey/zoomonkey.rb +194 -0
- metadata +37 -44
- data/ext/zkc-3.3.5.tar.gz +0 -0
data/lib/zookeeper/acls.rb
CHANGED
@@ -26,11 +26,11 @@ module ACLs
|
|
26
26
|
end
|
27
27
|
|
28
28
|
module Constants
|
29
|
-
ZOO_PERM_READ = 0
|
30
|
-
ZOO_PERM_WRITE = 1
|
31
|
-
ZOO_PERM_CREATE = 2
|
32
|
-
ZOO_PERM_DELETE =
|
33
|
-
ZOO_PERM_ADMIN =
|
29
|
+
ZOO_PERM_READ = 1 << 0
|
30
|
+
ZOO_PERM_WRITE = 1 << 1
|
31
|
+
ZOO_PERM_CREATE = 1 << 2
|
32
|
+
ZOO_PERM_DELETE = 1 << 3
|
33
|
+
ZOO_PERM_ADMIN = 1 << 4
|
34
34
|
ZOO_PERM_ALL = ZOO_PERM_READ | ZOO_PERM_WRITE | ZOO_PERM_CREATE | ZOO_PERM_DELETE | ZOO_PERM_ADMIN
|
35
35
|
|
36
36
|
ZOO_ANYONE_ID_UNSAFE = Id.new(:scheme => "world", :id => "anyone")
|
@@ -9,12 +9,12 @@ module ClientMethods
|
|
9
9
|
def_delegators :@req_registry, :setup_call
|
10
10
|
private :setup_call
|
11
11
|
|
12
|
-
def reopen(timeout=10, watcher=nil)
|
12
|
+
def reopen(timeout=10, watcher=nil, opts = {})
|
13
13
|
warn "WARN: ZookeeperBase#reopen watcher argument is now ignored" if watcher
|
14
14
|
super
|
15
15
|
end
|
16
16
|
|
17
|
-
def initialize(host, timeout=10, watcher=nil)
|
17
|
+
def initialize(host, timeout=10, watcher=nil, opts = {})
|
18
18
|
super
|
19
19
|
end
|
20
20
|
|
data/lib/zookeeper/version.rb
CHANGED
@@ -441,6 +441,35 @@ shared_examples_for "connection" do
|
|
441
441
|
end
|
442
442
|
end
|
443
443
|
|
444
|
+
describe :child_watcher_behavior do
|
445
|
+
describe :async_watch, :async => true do
|
446
|
+
it_should_behave_like "all success return values"
|
447
|
+
|
448
|
+
before do
|
449
|
+
@watcher = Zookeeper::Callbacks::WatcherCallback.new
|
450
|
+
@cb = Zookeeper::Callbacks::StringsCallback.new
|
451
|
+
|
452
|
+
@rv = zk.get_children(:path => path, :watcher => @watcher, :watcher_context => path, :callback => @cb, :callback_context => path)
|
453
|
+
wait_until { @cb.completed? }
|
454
|
+
@cb.should be_completed
|
455
|
+
end
|
456
|
+
|
457
|
+
it %[should fire the watcher when the node has been deleted] do
|
458
|
+
@watcher.should_not be_completed
|
459
|
+
|
460
|
+
zk.delete(:path => path)[:rc].should == Zookeeper::ZOK
|
461
|
+
|
462
|
+
wait_until { @watcher.completed? }
|
463
|
+
@watcher.should be_completed
|
464
|
+
|
465
|
+
@watcher.path.should == path
|
466
|
+
@watcher.context.should == path
|
467
|
+
@watcher.type.should == Zookeeper::ZOO_DELETED_EVENT
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
|
444
473
|
# NOTE: the jruby version of stat on non-existent node will have a
|
445
474
|
# return_code of 0, but the C version will have a return_code of -101
|
446
475
|
describe :stat do
|
@@ -5,7 +5,7 @@ module RSpec
|
|
5
5
|
module Formatters
|
6
6
|
class ProgressFormatter
|
7
7
|
def example_started(example)
|
8
|
-
SpecGlobalLogger.logger <<
|
8
|
+
SpecGlobalLogger.logger << pending_color("\n=====<([ #{example.full_description} ])>=====\n")
|
9
9
|
super(example)
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'zookeeper'
|
2
|
+
require 'zk-server'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
SLEEP_TIME = 30
|
7
|
+
STDOUT.sync = true
|
8
|
+
|
9
|
+
if ENV['DEBUG']
|
10
|
+
def zookeeper_logger(from)
|
11
|
+
l = Logger.new(STDOUT)
|
12
|
+
l.formatter = proc do |sev, time, c, msg|
|
13
|
+
"t=#{time.to_i} from=#{from} level=#{sev.downcase} message=#{msg.inspect}\n"
|
14
|
+
end
|
15
|
+
l
|
16
|
+
end
|
17
|
+
|
18
|
+
Zookeeper.logger = zookeeper_logger('zookeeper')
|
19
|
+
Zookeeper.set_debug_level(Zookeeper::ZOO_LOG_LEVEL_DEBUG)
|
20
|
+
end
|
21
|
+
|
22
|
+
class Worker
|
23
|
+
def initialize(body = nil, &block)
|
24
|
+
raise ArgumentError, "Cannot include both body and block" if body && block
|
25
|
+
@body = body || block
|
26
|
+
end
|
27
|
+
|
28
|
+
def body
|
29
|
+
@body || method(:call)
|
30
|
+
end
|
31
|
+
|
32
|
+
def start
|
33
|
+
@thread = Thread.new do
|
34
|
+
Thread.current.abort_on_exception = true
|
35
|
+
body.call
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def stop
|
40
|
+
if @thread
|
41
|
+
@thread.kill
|
42
|
+
@thread = nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def join
|
47
|
+
if @thread
|
48
|
+
@thread.join
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
base_dir = Dir.mktmpdir('zk-server-cluster')
|
56
|
+
num_cluster = 3
|
57
|
+
cluster = ZK::Server::Cluster.new(num_cluster, :base_dir => base_dir)
|
58
|
+
|
59
|
+
class Reader < Worker
|
60
|
+
attr_reader :client
|
61
|
+
|
62
|
+
def initialize(zookeeper_hosts)
|
63
|
+
@zookeeper_hosts = zookeeper_hosts
|
64
|
+
@log_from = :reader
|
65
|
+
end
|
66
|
+
|
67
|
+
def call
|
68
|
+
@client = Zookeeper.new(@zookeeper_hosts, 10, method(:watcher))
|
69
|
+
client.wait_until_connected
|
70
|
+
|
71
|
+
client.create(:path => "/test", :data => '') rescue client.set(:path => "/test", :data => '')
|
72
|
+
|
73
|
+
while true
|
74
|
+
error = nil
|
75
|
+
t = Benchmark.realtime do
|
76
|
+
begin
|
77
|
+
client.get(:path => "/test")
|
78
|
+
rescue => e
|
79
|
+
error = e
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
msg = "host=#{client.connected_host || 'nil'} session_id=#{client.session_id} state=#{client.state_by_value(client.state)} time=#{"%0.4f" % t}"
|
84
|
+
if error
|
85
|
+
msg << " error=#{error.class} error_message=#{error.to_s.inspect}"
|
86
|
+
msg << " closed=#{client.closed?} running=#{client.running?} shutting_down=#{client.shutting_down?}"
|
87
|
+
end
|
88
|
+
|
89
|
+
log msg
|
90
|
+
|
91
|
+
sleep 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def log(message)
|
96
|
+
puts "t=#{Time.now.to_i} from=#{@log_from} #{message}\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
def watcher(event)
|
100
|
+
if event[:state] == Zookeeper::ZOO_EXPIRED_SESSION_STATE
|
101
|
+
if client
|
102
|
+
log "action=reconnecting state=#{client.state_by_value(event[:state])} session_id=#{client.session_id}"
|
103
|
+
client.reopen
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Writer < Worker
|
111
|
+
def initialize(zookeeper_hosts)
|
112
|
+
@zookeeper_hosts = zookeeper_hosts
|
113
|
+
@log_from = :writer
|
114
|
+
end
|
115
|
+
|
116
|
+
def call
|
117
|
+
client = Zookeeper.new(@zookeeper_hosts)
|
118
|
+
client.wait_until_connected
|
119
|
+
|
120
|
+
while true
|
121
|
+
error = nil
|
122
|
+
t = Benchmark.realtime do
|
123
|
+
begin
|
124
|
+
client.create(:path => "/test", :data => '') rescue client.set(:path => "/test", :data => '')
|
125
|
+
rescue => e
|
126
|
+
error = e
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
msg = "host=#{client.connected_host || 'nil'} session_id=#{client.session_id} state=#{client.state_by_value(client.state)} time=#{"%0.4f" % t}"
|
131
|
+
msg << " error=#{error.class} error_message=#{error.to_s.inspect}" if error
|
132
|
+
log msg
|
133
|
+
|
134
|
+
sleep 1
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def log(message)
|
139
|
+
puts "t=#{Time.now.to_i} from=#{@log_from} #{message}\n"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class ZooMonkey < Worker
|
144
|
+
attr_reader :cluster
|
145
|
+
|
146
|
+
def initialize(cluster)
|
147
|
+
@cluster = cluster
|
148
|
+
@log_from = :server
|
149
|
+
end
|
150
|
+
|
151
|
+
def call
|
152
|
+
while true
|
153
|
+
sleep SLEEP_TIME
|
154
|
+
|
155
|
+
cluster.processes.each do |server|
|
156
|
+
host = "127.0.0.1:#{server.client_port}"
|
157
|
+
log "host=#{host} pid=#{server.pid} action=pausing"
|
158
|
+
server.kill "STOP"
|
159
|
+
sleep SLEEP_TIME
|
160
|
+
|
161
|
+
log "host=#{host} pid=#{server.pid} action=resuming"
|
162
|
+
server.kill "CONT"
|
163
|
+
sleep SLEEP_TIME
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def log(message)
|
169
|
+
puts "t=#{Time.now.to_i} from=#{@log_from} #{message}\n"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
begin
|
174
|
+
cluster.run
|
175
|
+
|
176
|
+
zookeeper_hosts = cluster.processes.map { |p| "127.0.0.1:#{p.client_port}" }
|
177
|
+
zookeeper_spec = (zookeeper_hosts * 2).join(',')
|
178
|
+
|
179
|
+
reader = Reader.new(zookeeper_spec)
|
180
|
+
reader.start
|
181
|
+
|
182
|
+
# writer = Writer.new(zookeeper_spec)
|
183
|
+
# writer.start
|
184
|
+
|
185
|
+
monkey = ZooMonkey.new(cluster)
|
186
|
+
monkey.start
|
187
|
+
|
188
|
+
reader.join
|
189
|
+
writer.join
|
190
|
+
monkey.join
|
191
|
+
ensure
|
192
|
+
cluster.clobber!
|
193
|
+
FileUtils.remove_entry(base_dir)
|
194
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,10 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: zookeeper
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.6
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 4
|
9
|
-
- 4
|
10
|
-
version: 1.4.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Phillip Pearson
|
14
9
|
- Eric Maland
|
15
10
|
- Evan Weaver
|
@@ -19,27 +14,30 @@ authors:
|
|
19
14
|
autorequire:
|
20
15
|
bindir: bin
|
21
16
|
cert_chain: []
|
22
|
-
|
23
|
-
date: 2013-04-27 00:00:00 Z
|
17
|
+
date: 2013-09-09 00:00:00.000000000 Z
|
24
18
|
dependencies: []
|
19
|
+
description: ! 'A low-level multi-Ruby wrapper around the ZooKeeper API bindings.
|
20
|
+
For a
|
25
21
|
|
26
|
-
description: |+
|
27
|
-
A low-level multi-Ruby wrapper around the ZooKeeper API bindings. For a
|
28
22
|
friendlier interface, see http://github.com/slyphon/zk. Currently supported:
|
23
|
+
|
29
24
|
MRI: {1.8.7, 1.9.2, 1.9.3}, JRuby: ~> 1.6.7, Rubinius: 2.0.testing, REE 1.8.7.
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
|
26
|
+
|
27
|
+
This library uses version 3.4.5 of zookeeper bindings.
|
28
|
+
|
29
|
+
|
30
|
+
'
|
31
|
+
email:
|
34
32
|
- slyphon@gmail.com
|
35
33
|
executables: []
|
36
|
-
|
37
|
-
extensions:
|
34
|
+
extensions:
|
38
35
|
- ext/extconf.rb
|
39
36
|
extra_rdoc_files: []
|
40
|
-
|
41
|
-
files:
|
37
|
+
files:
|
42
38
|
- .ctags_paths
|
39
|
+
- .dotfiles/ruby-gemset
|
40
|
+
- .dotfiles/ruby-version
|
43
41
|
- .dotfiles/rvmrc
|
44
42
|
- .gitignore
|
45
43
|
- .gitmodules
|
@@ -62,8 +60,9 @@ files:
|
|
62
60
|
- ext/event_lib.h
|
63
61
|
- ext/extconf.rb
|
64
62
|
- ext/generate_gvl_code.rb
|
65
|
-
- ext/patch
|
66
|
-
- ext/zkc-3.
|
63
|
+
- ext/patches/zkc-3.3.5-network.patch
|
64
|
+
- ext/patches/zkc-3.4.5-logging.patch
|
65
|
+
- ext/zkc-3.4.5.tar.gz
|
67
66
|
- ext/zkrb.c
|
68
67
|
- ext/zkrb_wrapper.c
|
69
68
|
- ext/zkrb_wrapper.h
|
@@ -113,41 +112,34 @@ files:
|
|
113
112
|
- spec/support/zookeeper_spec_helpers.rb
|
114
113
|
- spec/zookeeper_spec.rb
|
115
114
|
- zookeeper.gemspec
|
115
|
+
- zoomonkey/duplicates
|
116
|
+
- zoomonkey/zoomonkey.rb
|
116
117
|
homepage: https://github.com/slyphon/zookeeper
|
117
118
|
licenses: []
|
118
|
-
|
119
119
|
post_install_message:
|
120
120
|
rdoc_options: []
|
121
|
-
|
122
|
-
require_paths:
|
121
|
+
require_paths:
|
123
122
|
- lib
|
124
123
|
- ext
|
125
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
125
|
none: false
|
127
|
-
requirements:
|
128
|
-
- -
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
|
131
|
-
|
132
|
-
- 0
|
133
|
-
version: "0"
|
134
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ! '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
131
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
140
|
-
segments:
|
141
|
-
- 0
|
142
|
-
version: "0"
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
143
136
|
requirements: []
|
144
|
-
|
145
137
|
rubyforge_project:
|
146
138
|
rubygems_version: 1.8.25
|
147
139
|
signing_key:
|
148
140
|
specification_version: 3
|
149
141
|
summary: Apache ZooKeeper driver for Rubies
|
150
|
-
test_files:
|
142
|
+
test_files:
|
151
143
|
- spec/c_zookeeper_spec.rb
|
152
144
|
- spec/chrooted_connection_spec.rb
|
153
145
|
- spec/compatibilty_spec.rb
|
@@ -165,3 +157,4 @@ test_files:
|
|
165
157
|
- spec/support/progress_formatter.rb
|
166
158
|
- spec/support/zookeeper_spec_helpers.rb
|
167
159
|
- spec/zookeeper_spec.rb
|
160
|
+
has_rdoc:
|
data/ext/zkc-3.3.5.tar.gz
DELETED
Binary file
|