flare-tools 0.4.5.1 → 0.5.0
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/.gitignore +24 -0
- data/.travis.yml +15 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +28 -0
- data/History.txt +5 -0
- data/Makefile +25 -0
- data/README.txt +2 -2
- data/Rakefile +36 -34
- data/flare-tools.gemspec +26 -0
- data/lib/flare/entity/server.rb +4 -0
- data/lib/flare/tools.rb +3 -3
- data/lib/flare/tools/cli.rb +1 -0
- data/lib/flare/tools/cli/activate.rb +19 -13
- data/lib/flare/tools/cli/balance.rb +15 -8
- data/lib/flare/tools/cli/deploy.rb +53 -49
- data/lib/flare/tools/cli/dispatch.rb +101 -0
- data/lib/flare/tools/cli/down.rb +19 -14
- data/lib/flare/tools/cli/dump.rb +19 -14
- data/lib/flare/tools/cli/dumpkey.rb +21 -16
- data/lib/flare/tools/cli/flare_admin.rb +16 -72
- data/lib/flare/tools/cli/flare_argv0.rb +7 -51
- data/lib/flare/tools/cli/index.rb +10 -7
- data/lib/flare/tools/cli/index_server_config.rb +94 -0
- data/lib/flare/tools/cli/list.rb +14 -12
- data/lib/flare/tools/cli/master.rb +18 -12
- data/lib/flare/tools/cli/option.rb +55 -0
- data/lib/flare/tools/cli/part.rb +13 -12
- data/lib/flare/tools/cli/ping.rb +11 -13
- data/lib/flare/tools/cli/reconstruct.rb +22 -15
- data/lib/flare/tools/cli/remove.rb +20 -17
- data/lib/flare/tools/cli/restore.rb +20 -20
- data/lib/flare/tools/cli/slave.rb +20 -14
- data/lib/flare/tools/cli/stats.rb +171 -118
- data/lib/flare/tools/cli/sub_command.rb +16 -5
- data/lib/flare/tools/cli/summary.rb +12 -10
- data/lib/flare/tools/cli/threads.rb +15 -9
- data/lib/flare/tools/cli/verify.rb +20 -18
- data/lib/flare/tools/cluster.rb +3 -2
- data/lib/flare/util/constant.rb +3 -0
- data/lib/flare/util/pretty_table.rb +8 -0
- data/lib/flare/util/pretty_table/column.rb +41 -0
- data/lib/flare/util/pretty_table/row.rb +29 -0
- data/lib/flare/util/pretty_table/table.rb +37 -0
- data/package/Rakefile +44 -0
- data/package/flare-tools/Makefile +23 -0
- data/package/flare-tools/debian/changelog +135 -0
- data/package/flare-tools/debian/compat +1 -0
- data/package/flare-tools/debian/control +20 -0
- data/package/flare-tools/debian/copyright +35 -0
- data/package/flare-tools/debian/dirs +2 -0
- data/{.gemtest → package/flare-tools/debian/docs} +0 -0
- data/package/flare-tools/debian/rules +125 -0
- data/test/{test/experimental → experimental}/cache_test.rb +0 -0
- data/test/{test/experimental → experimental}/key_distribution_test.rb +0 -0
- data/test/{test/experimental → experimental}/keychecker_test.rb +0 -0
- data/test/{test/experimental → experimental}/list_test.rb +0 -0
- data/test/{test/extra → extra}/replication_test.rb +0 -0
- data/test/{test/integration → integration}/cli_test.rb +9 -7
- data/test/{test/integration → integration}/dump_expired_test.rb +4 -3
- data/test/{test/integration → integration}/dump_test.rb +5 -5
- data/test/{test/integration → integration}/index_server_test.rb +1 -1
- data/test/{test/integration → integration}/node_test.rb +1 -1
- data/test/{test/integration → integration}/partition_test.rb +6 -5
- data/test/{test/integration → integration}/proxy_test.rb +4 -3
- data/test/{test/integration → integration}/stats_test.rb +1 -1
- data/test/integration/subcommands.rb +128 -0
- data/test/{test/system → system}/flare_admin_test.rb +7 -5
- data/test/{test/unit → unit}/bwlimit_test.rb +0 -0
- data/test/{test/unit → unit}/cluster_test.rb +1 -1
- data/test/{test/unit → unit}/daemon_test.rb +0 -0
- data/test/{test/unit → unit}/logger_test.rb +0 -0
- data/test/{test/unit → unit}/tools_test.rb +0 -0
- data/test/unit/util/pretty_table_test.rb +46 -0
- data/test/{test/unit → unit}/util_test.rb +7 -2
- metadata +88 -100
- data/PostInstall.txt +0 -7
- data/lib/flare/tools/cli/cli_util.rb +0 -77
- data/lib/flare/util/command_line.rb +0 -79
@@ -6,68 +6,70 @@
|
|
6
6
|
require 'flare/util'
|
7
7
|
require 'flare/tools/index_server'
|
8
8
|
require 'flare/tools/cli/sub_command'
|
9
|
+
require 'flare/tools/cli/index_server_config'
|
9
10
|
|
10
|
-
#
|
11
11
|
module Flare
|
12
12
|
module Tools
|
13
13
|
module Cli
|
14
14
|
|
15
|
-
# == Description
|
16
|
-
#
|
17
15
|
class Deploy < SubCommand
|
18
16
|
include Flare::Util::Conversion
|
19
17
|
include Flare::Util::FileSystem
|
18
|
+
include Flare::Tools::Cli::IndexServerConfig
|
20
19
|
|
21
20
|
myname :deploy
|
22
21
|
desc "deploy for Debian-based system."
|
23
22
|
usage "deploy [hostname:port:balance:partition] ..."
|
24
|
-
|
25
|
-
def setup
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
23
|
+
|
24
|
+
def setup
|
25
|
+
super
|
26
|
+
set_option_index_server
|
27
|
+
@optp.on('--deploy-index', "deploy the index server") {@deploy_index = true}
|
28
|
+
@optp.on('--delete', "delete existing contents before deploying") {@delete = true}
|
29
|
+
@optp.on('--flarei=PATH', "a path for flarei executable") {|v| @flarei = v}
|
30
|
+
@optp.on('--flared=PATH', "a path for flared executable") {|v| @flared = v}
|
31
|
+
@optp.separator('flarei/flared options:')
|
32
|
+
@optp.on('--back-log=BACKLOG', "back log parameter for listen()" ) {|v| @iconf["back-log"] = v}
|
33
|
+
@optp.on('--thread-pool-size=SIZE', "thread pool size" ) {|v| @iconf["thread_pool_size"] = @dconf["thread_pool_size"] = v}
|
34
|
+
@optp.on('--daemonize=BOOL', "daemonize" ) {|v| @iconf["daemonize"] = @dconf["daemonize"] = v}
|
35
|
+
@optp.on('--data-dir=PATH', "data directory" ) {|v| @iconf["data-dir"] = @dconf["data-dir"] = v}
|
36
|
+
@optp.on('--log-facility=NAME', "log facility" ) {|v| @iconf["log-facility"] = @dconf["log-facility"] = v}
|
37
|
+
@optp.on('--max-connection=SIZE', "max connection" ) {|v| @iconf["max-connection"] = @dconf["max-connection"] = v}
|
38
|
+
@optp.on('--net-read-timeout=MILLISECOND', "read timeout for server connections") {|v| @iconf["net-read-timeout"] = @dconf["net-read-timeout"] = v}
|
39
|
+
@optp.on('--stack-size=KB', "stack size" ) {|v| @iconf["stack-size"] = @dconf["stack-size"] = v}
|
40
|
+
@optp.separator('flarei options:')
|
41
|
+
@optp.on('--monitor-threshold=COUNT', "monitor threshold" ) {|v| @iconf["monitor-threshold"] = v}
|
42
|
+
@optp.on('--monitor-interval=SECOND', "monitor interval" ) {|v| @iconf["monitor-interval"] = v}
|
43
|
+
@optp.on('--monitor-read-timeout=MILLISECOND', "monitor read timeout in millisecond") {|v| @iconf["monitor-read-timeout"] = v}
|
44
|
+
@optp.on('--partition-type=NAME', "partition type(modular)" ) {|v| @iconf["partition-type"] = v}
|
45
|
+
@optp.on('--key-hash-algorithm=NAME' "hash algorithm for key distribution") {|v| @iconf["key-hash-algorithm"] = v}
|
46
|
+
@optp.separator('flared options:')
|
47
|
+
@optp.on('--proxy-concurrency=SIZE', "proxy concurrency" ) {|v| @dconf["proxy-concurrency"] = v}
|
48
|
+
@optp.on('--mutex-slot=SIZE', "mutex slot size" ) {|v| @dconf["mutex-slot"]= v}
|
49
|
+
@optp.on('--reconstruction-interval=MICROSEC', "reconstruction interval" ) {|v| @dconf["reconstruction-interval"] = v}
|
50
|
+
@optp.on('--reconstruction-bwlimit=BYTES', "reconstruction bandwitdh limit" ) {|v| @dconf["reconstruction-bwlimit"] = v}
|
51
|
+
@optp.on('--storage-ap=SIZE', "alignment power" ) {|v| @dconf["storage-ap"] = v}
|
52
|
+
@optp.on('--storage-bucket-size=SIZE', "storage bucket size" ) {|v| @dconf["storage-bucket-size"] = v}
|
53
|
+
@optp.on('--storage-cache-size=SIZE', "storage cache size" ) {|v| @dconf["storage-cache-size"] = v}
|
54
|
+
@optp.on('--storage-compress=NAME', "storage compress type(deflate|bz2|tcbs)") {|v| @dconf["storage-compress"] = v}
|
55
|
+
@optp.on('--storage-large', "strage large" ) {@dconf["storage-large"] = true}
|
56
|
+
@optp.on('--storage-type=NAME', "storage type" ) {|v| @dconf["storage-type"] = v}
|
57
|
+
@optp.on('--proxy-prior-netmask=SIZE', "proxy priority mask (ex. 24 for 255.255.255.0)") {|v| @dconf["proxy-prior-netmask"] = v}
|
58
|
+
@optp.on('--max-total-thread-queue=SIZE', "max total thread queue" ) {|v| @dconf["max-total-thread-queue"] = v}
|
59
|
+
@optp.on('--index-servers=NAME', "index servers" ) {|v| @dconf["index-servers"] = v}
|
60
|
+
@optp.on('--noreply-window-limit=SIZE', "noreply window limit (experimental)") {|v| @dconf["noreply-window-limit"] = v}
|
61
|
+
@optp.on('--mysql-replication', "MySQL replication (experimental)" ) {@dconf["mysql-replication"] = true}
|
62
|
+
@optp.on('--mysql-replication-port=PORT', "MySQL replication port (experimental)") {|v| @dconf["mysql-replication-port"] = v}
|
63
|
+
@optp.on('--mysql-replication-id=ID', "MySQL replication ID (experimental)") {|v| @dconf["mysql-replication-id"] = v}
|
64
|
+
@optp.on('--mysql-replication-db=NAME', "MySQL replication DB (experimental)") {|v| @dconf["mysql-replication-db"] = v}
|
65
|
+
@optp.on('--mysql-replication-table=NAME', "MySQL replication table (experimental)") {|v| @dconf["mysql-replication-table"] = v}
|
66
|
+
@optp.on('--proxy-cache-size=SIZE', "proxy cache entry size (experimental)") {|v| @dconf["proxy-cache-size"] = v}
|
67
|
+
@optp.on('--proxy-cache-expire=SECOND', "cache life-time in second (experimental)") {|v| @dconf["proxy-cache-expire"] = v}
|
67
68
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def initialize
|
72
|
+
super
|
71
73
|
@deploy_index = false
|
72
74
|
@delete = false
|
73
75
|
@flarei = "/usr/local/bin/flarei"
|
@@ -87,14 +89,14 @@ module Flare
|
|
87
89
|
f.puts starting
|
88
90
|
end
|
89
91
|
File.chmod(0744, start)
|
90
|
-
|
92
|
+
|
91
93
|
stop = basedir+"/stop.sh"
|
92
94
|
open(stop, "w") do |f|
|
93
95
|
f.puts "#!/bin/sh"
|
94
96
|
f.puts stopping
|
95
97
|
end
|
96
98
|
File.chmod(0744, stop)
|
97
|
-
|
99
|
+
|
98
100
|
restart = basedir+"/restart.sh"
|
99
101
|
open(restart, "w") do |f|
|
100
102
|
f.puts "#!/bin/sh"
|
@@ -105,7 +107,9 @@ module Flare
|
|
105
107
|
File.chmod(0744, restart)
|
106
108
|
end
|
107
109
|
|
108
|
-
def execute(config,
|
110
|
+
def execute(config, args)
|
111
|
+
parse_index_server(config, args)
|
112
|
+
|
109
113
|
if @deploy_index
|
110
114
|
hostname = config[:index_server_hostname]
|
111
115
|
port = config[:index_server_port]
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'resolv'
|
3
|
+
require 'flare/tools'
|
4
|
+
require 'flare/util/logging'
|
5
|
+
require 'flare/util/conversion.rb'
|
6
|
+
require 'flare/tools/cli/option'
|
7
|
+
require 'flare/util/constant'
|
8
|
+
|
9
|
+
module Flare; end
|
10
|
+
module Flare::Tools; end
|
11
|
+
module Flare::Tools::Cli; end
|
12
|
+
class Flare::Tools::Cli::Dispatch
|
13
|
+
include Flare::Util::Logging
|
14
|
+
include Flare::Tools::Cli::Option
|
15
|
+
include Flare::Util::Constant
|
16
|
+
Cli = Flare::Tools::Cli
|
17
|
+
|
18
|
+
attr_accessor :subcommands
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@subcommands = {
|
22
|
+
'list' => Cli::List,
|
23
|
+
'balance' => Cli::Balance,
|
24
|
+
'down' => Cli::Down,
|
25
|
+
'slave' => Cli::Slave,
|
26
|
+
'reconstruct' => Cli::Reconstruct,
|
27
|
+
'master' => Cli::Master,
|
28
|
+
'threads' => Cli::Threads,
|
29
|
+
'ping' => Cli::Ping,
|
30
|
+
'remove' => Cli::Remove,
|
31
|
+
'index' => Cli::Index,
|
32
|
+
'activate' => Cli::Activate,
|
33
|
+
'dump' => Cli::Dump,
|
34
|
+
'dumpkey' => Cli::Dumpkey,
|
35
|
+
'verify' => Cli::Verify,
|
36
|
+
'stats' => Cli::Stats,
|
37
|
+
'restore' => Cli::Restore,
|
38
|
+
'summary' => Cli::Summary,
|
39
|
+
'part' => Cli::Part,
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def main(subcommand_name, argv, as_subcommand)
|
44
|
+
_main(subcommand_name, argv, as_subcommand)
|
45
|
+
rescue => e
|
46
|
+
level = 1
|
47
|
+
error(e.to_s)
|
48
|
+
e.backtrace.each do |line|
|
49
|
+
error(" %3s: %s" % [level, line])
|
50
|
+
level += 1
|
51
|
+
end
|
52
|
+
raise e if $DEBUG
|
53
|
+
STATUS_NG
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def _main(subcommand_name, argv, as_subcommand)
|
59
|
+
@subcommand_name = subcommand_name
|
60
|
+
|
61
|
+
subc = dispatch_subcommmand(@subcommand_name)
|
62
|
+
unless subc
|
63
|
+
show_undefined_command_error(as_subcommand)
|
64
|
+
exit STATUS_NG
|
65
|
+
end
|
66
|
+
set_banner subc.optp, as_subcommand
|
67
|
+
config = {
|
68
|
+
:command => File.basename($PROGRAM_NAME),
|
69
|
+
}
|
70
|
+
subc.execute_subcommand(config, argv)
|
71
|
+
end
|
72
|
+
|
73
|
+
def dispatch_subcommmand(name)
|
74
|
+
return nil unless @subcommands.include?(name)
|
75
|
+
@subcommands[name].new
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_banner(optp, as_subcommand)
|
79
|
+
if as_subcommand
|
80
|
+
optp.banner = "#{Flare::Tools::TITLE}\nUsage: flare-#{@subcommand_name} [options]"
|
81
|
+
else
|
82
|
+
optp.banner = "#{Flare::Tools::TITLE}\nUsage: flare-admin #{@subcommand_name} [options]"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def show_undefined_command_error(as_subcommand)
|
87
|
+
if as_subcommand
|
88
|
+
error "unknown subcommand '#{@subcommand_name}'"
|
89
|
+
puts "subcommands:"
|
90
|
+
@subcommands.each do |name, klass|
|
91
|
+
sc = klass.new
|
92
|
+
sc.setup
|
93
|
+
sc.optp.banner = "[#{klass.to_s}] " + klass.desc
|
94
|
+
sc.optp.separator(" Usage: flare-admin " + klass.usage)
|
95
|
+
puts sc.optp.help
|
96
|
+
end
|
97
|
+
else
|
98
|
+
puts "unknown command"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/flare/tools/cli/down.rb
CHANGED
@@ -11,30 +11,35 @@ require 'flare/tools/cluster'
|
|
11
11
|
require 'flare/util/conversion'
|
12
12
|
require 'flare/util/constant'
|
13
13
|
require 'flare/tools/cli/sub_command'
|
14
|
+
require 'flare/tools/cli/index_server_config'
|
14
15
|
|
15
16
|
module Flare
|
16
17
|
module Tools
|
17
18
|
module Cli
|
18
|
-
|
19
|
+
|
19
20
|
class Down < SubCommand
|
20
21
|
include Flare::Util::Conversion
|
21
22
|
include Flare::Util::Constant
|
22
23
|
include Flare::Tools::Common
|
23
|
-
|
24
|
+
include Flare::Tools::Cli::IndexServerConfig
|
25
|
+
|
24
26
|
myname :down
|
25
27
|
desc "turn down nodes and move them to proxy state."
|
26
28
|
usage "down [hostname:port] ..."
|
27
|
-
|
28
|
-
def setup
|
29
|
-
|
29
|
+
|
30
|
+
def setup
|
31
|
+
super
|
32
|
+
set_option_index_server
|
33
|
+
set_option_dry_run
|
34
|
+
set_option_force
|
30
35
|
end
|
31
36
|
|
32
37
|
def initialize
|
33
38
|
super
|
34
|
-
@force = false
|
35
39
|
end
|
36
40
|
|
37
|
-
def execute(config,
|
41
|
+
def execute(config, args)
|
42
|
+
parse_index_server(config, args)
|
38
43
|
return S_NG if args.size < 1
|
39
44
|
|
40
45
|
hosts = args.map {|x| x.split(':')}
|
@@ -44,15 +49,15 @@ module Flare
|
|
44
49
|
return S_NG
|
45
50
|
end
|
46
51
|
end
|
47
|
-
|
48
|
-
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port],
|
52
|
+
|
53
|
+
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
|
49
54
|
cluster = Flare::Tools::Cluster.new(s.host, s.port, s.stats_nodes)
|
50
|
-
|
55
|
+
|
51
56
|
hosts.each do |hostname,port|
|
52
57
|
down = 'down'
|
53
58
|
nodekey = nodekey_of hostname, port
|
54
59
|
ipaddr = address_of_hostname(hostname)
|
55
|
-
|
60
|
+
|
56
61
|
unless cluster.has_nodekey? nodekey
|
57
62
|
error "invalid 'hostname:port' pair: #{nodekey}"
|
58
63
|
return S_NG
|
@@ -69,16 +74,16 @@ module Flare
|
|
69
74
|
exec = interruptible {(gets.chomp.upcase == "Y")}
|
70
75
|
end
|
71
76
|
if exec
|
72
|
-
s.set_state(hostname, port, down) unless
|
77
|
+
s.set_state(hostname, port, down) unless @dry_run
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
76
81
|
puts string_of_nodelist(s.stats_nodes, hosts.map {|x| "#{x[0]}:#{x[1]}"})
|
77
82
|
end
|
78
|
-
|
83
|
+
|
79
84
|
S_OK
|
80
85
|
end # execute()
|
81
|
-
|
86
|
+
|
82
87
|
end
|
83
88
|
end
|
84
89
|
end
|
data/lib/flare/tools/cli/dump.rb
CHANGED
@@ -10,6 +10,7 @@ require 'flare/util/conversion'
|
|
10
10
|
require 'flare/util/constant'
|
11
11
|
require 'flare/util/bwlimit'
|
12
12
|
require 'flare/tools/cli/sub_command'
|
13
|
+
require 'flare/tools/cli/index_server_config'
|
13
14
|
require 'csv'
|
14
15
|
|
15
16
|
begin
|
@@ -20,7 +21,7 @@ end
|
|
20
21
|
module Flare
|
21
22
|
module Tools
|
22
23
|
module Cli
|
23
|
-
|
24
|
+
|
24
25
|
class Dump < SubCommand
|
25
26
|
|
26
27
|
class Dumper
|
@@ -105,19 +106,22 @@ module Flare
|
|
105
106
|
include Flare::Util::Conversion
|
106
107
|
include Flare::Util::Constant
|
107
108
|
include Flare::Tools::Common
|
108
|
-
|
109
|
+
include Flare::Tools::Cli::IndexServerConfig
|
110
|
+
|
109
111
|
myname :dump
|
110
112
|
desc "dump data from nodes. (experimental)"
|
111
113
|
usage "dump [hostname:port] ..."
|
112
|
-
|
113
|
-
def setup
|
114
|
-
|
115
|
-
|
116
|
-
|
114
|
+
|
115
|
+
def setup
|
116
|
+
super
|
117
|
+
set_option_index_server
|
118
|
+
@optp.on('-o', '--output=FILE', "output to file") {|v| @output = v}
|
119
|
+
@optp.on('-f', '--format=FORMAT', "specify output format [#{Formats.join(',')}]") {|v| @format = v}
|
120
|
+
@optp.on( '--bwlimit=BANDWIDTH', "specify bandwidth limit (bps)") {|v|
|
117
121
|
@bwlimit = Flare::Util::Bwlimit.bps(v)
|
118
122
|
}
|
119
|
-
|
120
|
-
|
123
|
+
@optp.on('--all', "dump from all master nodes") {|v| @all = true}
|
124
|
+
@optp.on('--raw', "raw dump mode (for debugging)") {|v| @raw = true}
|
121
125
|
end
|
122
126
|
|
123
127
|
def initialize
|
@@ -130,11 +134,12 @@ module Flare
|
|
130
134
|
@partition_size = 1
|
131
135
|
end
|
132
136
|
|
133
|
-
def execute(config,
|
137
|
+
def execute(config, args)
|
138
|
+
parse_index_server(config, args)
|
134
139
|
STDERR.puts "please install tokyocabinet via gem command." unless defined? TokyoCabinet
|
135
140
|
|
136
141
|
cluster = nil
|
137
|
-
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port],
|
142
|
+
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
|
138
143
|
cluster = Flare::Tools::Cluster.new(s.host, s.port, s.stats_nodes)
|
139
144
|
end
|
140
145
|
return S_NG if cluster.nil?
|
@@ -177,7 +182,7 @@ module Flare
|
|
177
182
|
return S_NG
|
178
183
|
end
|
179
184
|
end
|
180
|
-
|
185
|
+
|
181
186
|
dumper = case @format
|
182
187
|
when CsvDumper.myname
|
183
188
|
CsvDumper.new(@output || STDOUT)
|
@@ -188,7 +193,7 @@ module Flare
|
|
188
193
|
end
|
189
194
|
|
190
195
|
hosts.each do |hostname,port,partition|
|
191
|
-
Flare::Tools::Node.open(hostname, port.to_i,
|
196
|
+
Flare::Tools::Node.open(hostname, port.to_i, @timeout, 0, @bwlimit) do |n|
|
192
197
|
interval = 0
|
193
198
|
part, partsize = if @raw
|
194
199
|
[0, 1]
|
@@ -208,7 +213,7 @@ module Flare
|
|
208
213
|
end
|
209
214
|
|
210
215
|
dumper.close
|
211
|
-
|
216
|
+
|
212
217
|
S_OK
|
213
218
|
end # execute()
|
214
219
|
|
@@ -10,29 +10,33 @@ require 'flare/util/conversion'
|
|
10
10
|
require 'flare/util/constant'
|
11
11
|
require 'flare/util/bwlimit'
|
12
12
|
require 'flare/tools/cli/sub_command'
|
13
|
+
require 'flare/tools/cli/index_server_config'
|
13
14
|
|
14
15
|
require 'csv'
|
15
16
|
|
16
17
|
module Flare
|
17
18
|
module Tools
|
18
19
|
module Cli
|
19
|
-
|
20
|
+
|
20
21
|
class Dumpkey < SubCommand
|
21
22
|
include Flare::Util::Conversion
|
22
23
|
include Flare::Util::Constant
|
23
24
|
include Flare::Tools::Common
|
24
|
-
|
25
|
+
include Flare::Tools::Cli::IndexServerConfig
|
26
|
+
|
25
27
|
myname :dumpkey
|
26
28
|
desc "dump key from nodes."
|
27
29
|
usage "dumpkey [hostname:port] ..."
|
28
|
-
|
29
|
-
def setup
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
|
31
|
+
def setup
|
32
|
+
super
|
33
|
+
set_option_index_server
|
34
|
+
@optp.on('-o', '--output=FILE', "output to file" ) {|v| @output = v}
|
35
|
+
@optp.on('-f', '--format=FORMAT', "output format [csv]" ) {|v| @format = v}
|
36
|
+
@optp.on('-p', '--partition=NUMBER', "partition number" ) {|v| @part = v.to_i if v.to_i >= 0}
|
37
|
+
@optp.on('-s', '--partition-size=SIZE', "partition size" ) {|v| @partsize = v.to_i if v.to_i > 0}
|
38
|
+
@optp.on( '--bwlimit=BANDWIDTH', "bandwidth limit (bps)" ) {|v| @bwlimit = v if v.to_i > 0}
|
39
|
+
@optp.on( '--all', "dump form all partitions") {@all = true}
|
36
40
|
end
|
37
41
|
|
38
42
|
def initialize
|
@@ -45,9 +49,10 @@ module Flare
|
|
45
49
|
@all = false
|
46
50
|
end
|
47
51
|
|
48
|
-
def execute(config,
|
52
|
+
def execute(config, args)
|
53
|
+
parse_index_server(config, args)
|
49
54
|
cluster = nil
|
50
|
-
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port],
|
55
|
+
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
|
51
56
|
cluster = Flare::Tools::Cluster.new(s.host, s.port, s.stats_nodes)
|
52
57
|
end
|
53
58
|
return S_NG if cluster.nil?
|
@@ -80,9 +85,9 @@ module Flare
|
|
80
85
|
return S_NG
|
81
86
|
end
|
82
87
|
end
|
83
|
-
|
88
|
+
|
84
89
|
hosts.each do |hostname,port|
|
85
|
-
Flare::Tools::Node.open(hostname, port.to_i,
|
90
|
+
Flare::Tools::Node.open(hostname, port.to_i, @timeout, @bwlimit, @bwlimit) do |n|
|
86
91
|
output = STDOUT
|
87
92
|
unless @output.nil?
|
88
93
|
output = File.open(@output, "w")
|
@@ -106,10 +111,10 @@ module Flare
|
|
106
111
|
output.close if output != STDOUT
|
107
112
|
end
|
108
113
|
end
|
109
|
-
|
114
|
+
|
110
115
|
S_OK
|
111
116
|
end # execute()
|
112
|
-
|
117
|
+
|
113
118
|
end
|
114
119
|
end
|
115
120
|
end
|