zookeeper-ng 1.5
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.
- checksums.yaml +7 -0
- data/.ctags_paths +1 -0
- data/.dotfiles/ruby-gemset +1 -0
- data/.dotfiles/ruby-version +1 -0
- data/.dotfiles/rvmrc +2 -0
- data/.gitignore +19 -0
- data/.gitmodules +3 -0
- data/.travis.yml +25 -0
- data/CHANGELOG +395 -0
- data/Gemfile +30 -0
- data/Guardfile +8 -0
- data/LICENSE +23 -0
- data/Manifest +29 -0
- data/README.markdown +85 -0
- data/Rakefile +121 -0
- data/cause-abort.rb +117 -0
- data/ext/.gitignore +6 -0
- data/ext/Rakefile +41 -0
- data/ext/c_zookeeper.rb +398 -0
- data/ext/common.h +17 -0
- data/ext/dbg.h +53 -0
- data/ext/depend +5 -0
- data/ext/event_lib.c +740 -0
- data/ext/event_lib.h +175 -0
- data/ext/extconf.rb +103 -0
- data/ext/generate_gvl_code.rb +321 -0
- data/ext/patches/zkc-3.3.5-network.patch +24 -0
- data/ext/patches/zkc-3.4.5-fetch-and-add.patch +16 -0
- data/ext/patches/zkc-3.4.5-logging.patch +41 -0
- data/ext/patches/zkc-3.4.5-out-of-order-ping.patch +163 -0
- data/ext/patches/zkc-3.4.5-overflow.patch +11 -0
- data/ext/patches/zkc-3.4.5-yosemite-htonl-fix.patch +102 -0
- data/ext/zkc-3.4.5.tar.gz +0 -0
- data/ext/zkrb.c +1075 -0
- data/ext/zkrb_wrapper.c +775 -0
- data/ext/zkrb_wrapper.h +350 -0
- data/ext/zkrb_wrapper_compat.c +15 -0
- data/ext/zkrb_wrapper_compat.h +11 -0
- data/ext/zookeeper_base.rb +256 -0
- data/java/java_base.rb +503 -0
- data/lib/zookeeper.rb +115 -0
- data/lib/zookeeper/acls.rb +44 -0
- data/lib/zookeeper/callbacks.rb +108 -0
- data/lib/zookeeper/client.rb +30 -0
- data/lib/zookeeper/client_methods.rb +282 -0
- data/lib/zookeeper/common.rb +122 -0
- data/lib/zookeeper/common/queue_with_pipe.rb +110 -0
- data/lib/zookeeper/compatibility.rb +138 -0
- data/lib/zookeeper/constants.rb +97 -0
- data/lib/zookeeper/continuation.rb +223 -0
- data/lib/zookeeper/core_ext.rb +58 -0
- data/lib/zookeeper/em_client.rb +55 -0
- data/lib/zookeeper/exceptions.rb +135 -0
- data/lib/zookeeper/forked.rb +19 -0
- data/lib/zookeeper/latch.rb +34 -0
- data/lib/zookeeper/logger.rb +39 -0
- data/lib/zookeeper/logger/forwarding_logger.rb +84 -0
- data/lib/zookeeper/monitor.rb +19 -0
- data/lib/zookeeper/rake_tasks.rb +165 -0
- data/lib/zookeeper/request_registry.rb +153 -0
- data/lib/zookeeper/stat.rb +21 -0
- data/lib/zookeeper/version.rb +4 -0
- data/notes.txt +14 -0
- data/scripts/upgrade-1.0-sed-alike.rb +46 -0
- data/spec/c_zookeeper_spec.rb +51 -0
- data/spec/chrooted_connection_spec.rb +83 -0
- data/spec/compatibilty_spec.rb +8 -0
- data/spec/default_watcher_spec.rb +41 -0
- data/spec/em_spec.rb +51 -0
- data/spec/ext/zookeeper_base_spec.rb +19 -0
- data/spec/forked_connection_spec.rb +124 -0
- data/spec/latch_spec.rb +24 -0
- data/spec/log4j.properties +17 -0
- data/spec/shared/all_success_return_values.rb +10 -0
- data/spec/shared/connection_examples.rb +1077 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/00_logging.rb +38 -0
- data/spec/support/10_spawn_zookeeper.rb +24 -0
- data/spec/support/progress_formatter.rb +15 -0
- data/spec/support/zookeeper_spec_helpers.rb +96 -0
- data/spec/zookeeper_spec.rb +24 -0
- data/zookeeper.gemspec +38 -0
- data/zoomonkey/duplicates +3 -0
- data/zoomonkey/zoomonkey.rb +194 -0
- metadata +157 -0
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('../../ext', __FILE__))
|
3
|
+
$LOAD_PATH.uniq!
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
|
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
|
13
|
+
|
14
|
+
require 'zookeeper'
|
15
|
+
|
16
|
+
Dir[File.expand_path('../support/**/*.rb', __FILE__)].sort.each { |f| require(f) }
|
17
|
+
|
18
|
+
if ENV['ZKRB_DEBUG']
|
19
|
+
Zookeeper.set_debug_level(4)
|
20
|
+
end
|
21
|
+
|
22
|
+
if ENV['ZKRB_NOLOG']
|
23
|
+
SpecGlobalLogger.logger.level = ::Logger::FATAL
|
24
|
+
Zookeeper.set_debug_level(0)
|
25
|
+
end
|
26
|
+
|
27
|
+
RSpec.configure do |config|
|
28
|
+
config.mock_with :rspec
|
29
|
+
[Zookeeper::SpecHelpers, SpecGlobalLogger].each do |mod|
|
30
|
+
config.include(mod)
|
31
|
+
config.extend(mod)
|
32
|
+
end
|
33
|
+
|
34
|
+
if Zookeeper.spawn_zookeeper?
|
35
|
+
require 'zk-server'
|
36
|
+
|
37
|
+
config.before(:suite) do
|
38
|
+
SpecGlobalLogger.logger.debug { "Starting zookeeper service" }
|
39
|
+
ZK::Server.run do |c|
|
40
|
+
c.base_dir = File.expand_path('../../.zkserver', __FILE__)
|
41
|
+
c.client_port = Zookeeper.test_port
|
42
|
+
c.force_sync = false
|
43
|
+
c.snap_count = 1_000_000
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
config.after(:suite) do
|
48
|
+
SpecGlobalLogger.logger.debug { "stopping zookeeper service" }
|
49
|
+
ZK::Server.shutdown
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
require 'pp'
|
55
|
+
|
56
|
+
if RUBY_VERSION == '1.9.3'
|
57
|
+
trap('USR1') do
|
58
|
+
threads = Thread.list.map { |th| th.backtrace }
|
59
|
+
pp threads
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Zookeeper
|
2
|
+
TEST_LOG_PATH = File.expand_path('../../../test.log', __FILE__)
|
3
|
+
|
4
|
+
def self.setup_test_logger
|
5
|
+
log =
|
6
|
+
if (ENV['ZOOKEEPER_DEBUG'] || ENV['ZKRB_DEBUG'])
|
7
|
+
::Logger.new(STDERR)
|
8
|
+
else
|
9
|
+
::Logger.new(TEST_LOG_PATH)
|
10
|
+
end
|
11
|
+
|
12
|
+
log.level = ::Logger::DEBUG
|
13
|
+
|
14
|
+
Zookeeper::Logger.wrapped_logger = log
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Zookeeper.setup_test_logger
|
19
|
+
|
20
|
+
module SpecGlobalLogger
|
21
|
+
extend self
|
22
|
+
|
23
|
+
def logger
|
24
|
+
@spec_global_logger ||= Zookeeper::Logger::ForwardingLogger.for(Zookeeper::Logger.wrapped_logger, 'spec')
|
25
|
+
end
|
26
|
+
|
27
|
+
# sets the log level to FATAL for the duration of the block
|
28
|
+
def mute_logger
|
29
|
+
zk_log = Zookeeper::Logger.wrapped_logger
|
30
|
+
|
31
|
+
orig_level, zk_log.level = zk_log.level, ::Logger::FATAL
|
32
|
+
orig_zk_level, Zookeeper.debug_level = Zookeeper.debug_level, Zookeeper::Constants::ZOO_LOG_LEVEL_ERROR
|
33
|
+
yield
|
34
|
+
ensure
|
35
|
+
zk_log.level = orig_zk_level
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,24 @@
|
|
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
|
+
def self.default_cnx_host
|
11
|
+
ENV['ZK_DEFAULT_HOST'] || 'localhost'
|
12
|
+
end
|
13
|
+
|
14
|
+
@test_port ||= spawn_zookeeper? ? 21811 : 2181
|
15
|
+
|
16
|
+
class << self
|
17
|
+
attr_accessor :test_port
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.default_cnx_str
|
21
|
+
"#{default_cnx_host}:#{test_port}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rspec/core/formatters/progress_formatter'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Core
|
5
|
+
module Formatters
|
6
|
+
class ProgressFormatter
|
7
|
+
def example_started(example)
|
8
|
+
SpecGlobalLogger.logger << pending_color("\n=====<([ #{example.full_description} ])>=====\n")
|
9
|
+
super(example)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Zookeeper
|
2
|
+
module SpecHelpers
|
3
|
+
class TimeoutError < StandardError; end
|
4
|
+
include Zookeeper::Constants
|
5
|
+
include Zookeeper::Logger
|
6
|
+
|
7
|
+
def ensure_node(zk, path, data)
|
8
|
+
return if zk.closed?
|
9
|
+
if zk.stat(:path => path)[:stat].exists?
|
10
|
+
zk.set(:path => path, :data => data)
|
11
|
+
else
|
12
|
+
zk.create(:path => path, :data => data)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def with_open_zk(host=nil)
|
17
|
+
z = Zookeeper.new(Zookeeper.default_cnx_str)
|
18
|
+
yield z
|
19
|
+
ensure
|
20
|
+
if z
|
21
|
+
unless z.closed?
|
22
|
+
z.close
|
23
|
+
|
24
|
+
wait_until do
|
25
|
+
begin
|
26
|
+
!z.connected?
|
27
|
+
rescue RuntimeError
|
28
|
+
true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# this is not as safe as the one in ZK, just to be used to clean up
|
36
|
+
# when we're the only one adjusting a particular path
|
37
|
+
def rm_rf(z, path)
|
38
|
+
z.get_children(:path => path).tap do |h|
|
39
|
+
if h[:rc].zero?
|
40
|
+
h[:children].each do |child|
|
41
|
+
rm_rf(z, File.join(path, child))
|
42
|
+
end
|
43
|
+
elsif h[:rc] == ZNONODE
|
44
|
+
# no-op
|
45
|
+
else
|
46
|
+
raise "Oh noes! unexpected return value! #{h.inspect}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
rv = z.delete(:path => path)
|
51
|
+
|
52
|
+
unless (rv[:rc].zero? or rv[:rc] == ZNONODE)
|
53
|
+
raise "oh noes! failed to delete #{path}"
|
54
|
+
end
|
55
|
+
|
56
|
+
path
|
57
|
+
end
|
58
|
+
|
59
|
+
def mkdir_p(zk, path)
|
60
|
+
while true # loop because we can't retry
|
61
|
+
h = zk.create(:path => path, :data => '')
|
62
|
+
case h[:rc]
|
63
|
+
when ZOK, ZNODEEXISTS
|
64
|
+
return
|
65
|
+
when ZNONODE
|
66
|
+
parent = File.dirname(path)
|
67
|
+
raise "WTF? we wound up trying to create '/', something is screwed!" if parent == '/'
|
68
|
+
mkdir_p(zk, parent)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# method to wait until block passed returns true or timeout (default is 10 seconds) is reached
|
74
|
+
# raises TiemoutError on timeout
|
75
|
+
def wait_until(timeout=10)
|
76
|
+
time_to_stop = Time.now + timeout
|
77
|
+
while true
|
78
|
+
rval = yield
|
79
|
+
return rval if rval
|
80
|
+
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
81
|
+
Thread.pass
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# inverse of wait_until
|
86
|
+
def wait_while(timeout=10)
|
87
|
+
time_to_stop = Time.now + timeout
|
88
|
+
while true
|
89
|
+
rval = yield
|
90
|
+
return rval unless rval
|
91
|
+
raise TimeoutError, "timeout of #{timeout}s exceeded" if Time.now > time_to_stop
|
92
|
+
Thread.pass
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shared/connection_examples'
|
3
|
+
|
4
|
+
|
5
|
+
describe 'Zookeeper' do
|
6
|
+
let(:path) { "/_zktest_" }
|
7
|
+
let(:data) { "underpants" }
|
8
|
+
let(:connection_string) { Zookeeper.default_cnx_str }
|
9
|
+
|
10
|
+
before do
|
11
|
+
@zk = Zookeeper.new(connection_string)
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
@zk and @zk.close
|
16
|
+
end
|
17
|
+
|
18
|
+
def zk
|
19
|
+
@zk
|
20
|
+
end
|
21
|
+
|
22
|
+
it_should_behave_like "connection"
|
23
|
+
end
|
24
|
+
|
data/zookeeper.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'zookeeper/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'zookeeper-ng'
|
7
|
+
s.version = Zookeeper::VERSION
|
8
|
+
|
9
|
+
s.authors = ["Ben Fritsch", "Phillip Pearson", "Eric Maland", "Evan Weaver", "Brian Wickman", "Neil Conway", "Jonathan D. Simms"]
|
10
|
+
s.email = ["ich@abwesend.com"]
|
11
|
+
s.summary = %q{Apache ZooKeeper driver for Rubies}
|
12
|
+
s.description = <<-EOS
|
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.
|
16
|
+
|
17
|
+
This library uses version #{Zookeeper::DRIVER_VERSION} of zookeeper bindings.
|
18
|
+
|
19
|
+
EOS
|
20
|
+
|
21
|
+
s.homepage = 'https://github.com/slyphon/zookeeper'
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
if ENV['JAVA_GEM'] or defined?(::JRUBY_VERSION)
|
27
|
+
s.platform = 'java'
|
28
|
+
s.add_runtime_dependency('slyphon-log4j', '= 1.2.15')
|
29
|
+
s.add_runtime_dependency('slyphon-zookeeper_jar', '= 3.3.5')
|
30
|
+
s.require_paths += %w[java]
|
31
|
+
else
|
32
|
+
s.require_paths += %w[ext]
|
33
|
+
s.extensions = 'ext/extconf.rb'
|
34
|
+
end
|
35
|
+
|
36
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
37
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
38
|
+
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
|