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
@@ -11,6 +11,7 @@ require 'flare/tools/common'
|
|
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
|
@@ -19,17 +20,21 @@ module Flare
|
|
19
20
|
include Flare::Util::Conversion
|
20
21
|
include Flare::Util::Constant
|
21
22
|
include Flare::Tools::Common
|
23
|
+
include Flare::Tools::Cli::IndexServerConfig
|
22
24
|
|
23
25
|
DefaultRetry = 10
|
24
|
-
|
26
|
+
|
25
27
|
myname :slave
|
26
28
|
desc "construct slaves from proxy nodes."
|
27
29
|
usage "slave [hostname:port:balance:partition] ..."
|
28
30
|
|
29
|
-
def setup
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
def setup
|
32
|
+
super
|
33
|
+
set_option_index_server
|
34
|
+
set_option_dry_run
|
35
|
+
set_option_force
|
36
|
+
@optp.on('--retry=COUNT', "specify retry count(default:#{@retry})") {|v| @retry = v.to_i}
|
37
|
+
@optp.on('--clean', "clear datastore before construction") {@clean = true}
|
33
38
|
end
|
34
39
|
|
35
40
|
def initialize
|
@@ -39,7 +44,8 @@ module Flare
|
|
39
44
|
@clean = false
|
40
45
|
end
|
41
46
|
|
42
|
-
def execute(config,
|
47
|
+
def execute(config, args)
|
48
|
+
parse_index_server(config, args)
|
43
49
|
return S_NG if args.empty?
|
44
50
|
|
45
51
|
hosts = args.map do |arg|
|
@@ -50,10 +56,10 @@ module Flare
|
|
50
56
|
end
|
51
57
|
[hostname, port, balance.to_i, partition.to_i]
|
52
58
|
end
|
53
|
-
|
54
|
-
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port],
|
59
|
+
|
60
|
+
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
|
55
61
|
cluster = fetch_cluster(s)
|
56
|
-
|
62
|
+
|
57
63
|
hosts.each do |hostname,port,balance,partition|
|
58
64
|
nodekey = nodekey_of hostname, port
|
59
65
|
|
@@ -68,7 +74,7 @@ module Flare
|
|
68
74
|
puts "#{nodekey} is not a proxy."
|
69
75
|
next
|
70
76
|
end
|
71
|
-
|
77
|
+
|
72
78
|
exec = @force
|
73
79
|
unless exec
|
74
80
|
STDERR.print "making node slave (node=#{nodekey}, role=#{node['role']} -> slave) (y/n): "
|
@@ -76,9 +82,9 @@ module Flare
|
|
76
82
|
exec = true if gets.chomp.upcase == "Y"
|
77
83
|
end
|
78
84
|
end
|
79
|
-
if exec &&
|
85
|
+
if exec && !@dry_run
|
80
86
|
if @clean
|
81
|
-
Flare::Tools::Node.open(hostname, port,
|
87
|
+
Flare::Tools::Node.open(hostname, port, @timeout) do |n|
|
82
88
|
n.flush_all
|
83
89
|
end
|
84
90
|
end
|
@@ -97,7 +103,7 @@ module Flare
|
|
97
103
|
end
|
98
104
|
end
|
99
105
|
if resp
|
100
|
-
wait_for_slave_construction(s, nodekey,
|
106
|
+
wait_for_slave_construction(s, nodekey, @timeout)
|
101
107
|
if balance > 0
|
102
108
|
unless @force
|
103
109
|
STDERR.print "changing node's balance (node=#{nodekey}, balance=0 -> #{balance}) (y/n): "
|
@@ -115,7 +121,7 @@ module Flare
|
|
115
121
|
end
|
116
122
|
STDOUT.puts string_of_nodelist(s.stats_nodes, hosts.map {|x| x[0..1].join(':')})
|
117
123
|
end
|
118
|
-
|
124
|
+
|
119
125
|
return S_OK
|
120
126
|
end # execute()
|
121
127
|
|
@@ -8,8 +8,9 @@ require 'flare/tools/index_server'
|
|
8
8
|
require 'flare/tools/cli/sub_command'
|
9
9
|
require 'flare/tools/common'
|
10
10
|
require 'flare/util/conversion'
|
11
|
+
require 'flare/util/pretty_table'
|
12
|
+
require 'flare/tools/cli/index_server_config'
|
11
13
|
|
12
|
-
#
|
13
14
|
module Flare
|
14
15
|
module Tools
|
15
16
|
module Cli
|
@@ -20,29 +21,40 @@ module Flare
|
|
20
21
|
include Flare::Util::Conversion
|
21
22
|
include Flare::Util::Logging
|
22
23
|
include Flare::Tools::Common
|
23
|
-
|
24
|
+
include Flare::Util::PrettyTable
|
25
|
+
include Flare::Tools::Cli::IndexServerConfig
|
26
|
+
|
24
27
|
myname :stats
|
25
28
|
desc "show the statistics of a flare cluster."
|
26
29
|
usage "stats [hostname:port] ..."
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
31
|
+
HeaderConfigs = [
|
32
|
+
['hostname:port', {}],
|
33
|
+
['state', {}],
|
34
|
+
['role', {}],
|
35
|
+
['partition', {:align => :right}],
|
36
|
+
['balance', {:align => :right}],
|
37
|
+
['items', {:align => :right}],
|
38
|
+
['conn', {:align => :right}],
|
39
|
+
['behind', {:align => :right}],
|
40
|
+
['hit', {:align => :right}],
|
41
|
+
['size', {:align => :right}],
|
42
|
+
['uptime', {:align => :right}],
|
43
|
+
['version', {:align => :right}],
|
44
|
+
]
|
45
|
+
HeaderConfigQpss = [
|
46
|
+
['qps', {:align => :right}],
|
47
|
+
['qps-r', {:align => :right}],
|
48
|
+
['qps-w', {:align => :right}],
|
49
|
+
]
|
50
|
+
|
51
|
+
def setup
|
52
|
+
super
|
53
|
+
set_option_index_server
|
54
|
+
@optp.on("-q", '--qps', "show qps") {|v| @qps = v}
|
55
|
+
@optp.on("-w", '--wait=SECOND', "specify wait time for repeat(second)") {|v| @wait = v.to_i}
|
56
|
+
@optp.on("-c", '--count=REPEATTIME', "specify repeat count") {|v| @count = v.to_i}
|
57
|
+
@optp.on("-d", '--delimiter=CHAR', "specify delimiter") {|v| @delimiter = v}
|
46
58
|
end
|
47
59
|
|
48
60
|
def initialize
|
@@ -53,19 +65,18 @@ module Flare
|
|
53
65
|
@cont = true
|
54
66
|
@delimiter = ' '
|
55
67
|
end
|
56
|
-
|
68
|
+
|
57
69
|
def interrupt
|
58
70
|
puts "INTERRUPTED"
|
59
71
|
@cont = false
|
60
72
|
end
|
61
73
|
|
62
|
-
def execute(config,
|
74
|
+
def execute(config, args)
|
75
|
+
parse_index_server(config, args)
|
63
76
|
nodes = {}
|
64
77
|
threads = {}
|
65
|
-
header = Marshal.load(Marshal.dump(HeaderConfig))
|
66
|
-
header << ['%5.5s', 'qps'] << ['%5.5s', 'qps-r'] << ['%5.5s', 'qps-w'] if @qps
|
67
78
|
|
68
|
-
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port],
|
79
|
+
Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
|
69
80
|
nodes = s.stats_nodes
|
70
81
|
unless nodes
|
71
82
|
error "Invalid index server."
|
@@ -79,64 +90,11 @@ module Flare
|
|
79
90
|
queue = {}
|
80
91
|
|
81
92
|
nodes.each do |hostname_port,data|
|
82
|
-
hostname, port = hostname_port.split(":", 2)
|
83
93
|
queue[hostname_port] = SizedQueue.new(1)
|
84
94
|
worker_threads << Thread.new(queue[hostname_port]) do |q|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
begin
|
89
|
-
s = Flare::Tools::Stats.open(hostname, data['port'], config[:timeout])
|
90
|
-
stats = s.stats
|
91
|
-
time = Time.now
|
92
|
-
behind = threads[hostname_port].has_key?('behind') ? threads[hostname_port]['behind'] : "-"
|
93
|
-
uptime_short = short_desc_of_second(stats['uptime'])
|
94
|
-
hit_rate = if stats.has_key?('cmd_get') && stats['cmd_get'] != "0"
|
95
|
-
cmd_get = stats['cmd_get'].to_f
|
96
|
-
get_hits = stats['get_hits'].to_f
|
97
|
-
(get_hits / cmd_get * 100.0).round
|
98
|
-
else
|
99
|
-
"-"
|
100
|
-
end
|
101
|
-
size = stats['bytes'] == "0" ? "-" : (stats['bytes'].to_i / 1024 / 1024 / 1024) # gigabyte
|
102
|
-
stats_data = {
|
103
|
-
:hostname => hostname,
|
104
|
-
:port => port,
|
105
|
-
:hostname_port => "#{hostname}:#{port}",
|
106
|
-
:state => data['state'],
|
107
|
-
:role => data['role'],
|
108
|
-
:partition => data['partition'] == "-1" ? "-" : data['partition'],
|
109
|
-
:balance => data['balance'],
|
110
|
-
:items => stats['curr_items'],
|
111
|
-
:conn => stats['curr_connections'],
|
112
|
-
:behind => behind,
|
113
|
-
:hit_rate => hit_rate,
|
114
|
-
:size => size,
|
115
|
-
:uptime => stats['uptime'],
|
116
|
-
:uptime_short => uptime_short,
|
117
|
-
:version => stats['version'],
|
118
|
-
:cmd_get => stats['cmd_get'],
|
119
|
-
:cmd_set => stats['cmd_set'],
|
120
|
-
:time => time,
|
121
|
-
}
|
122
|
-
rescue Errno::ECONNREFUSED => e
|
123
|
-
rescue => e
|
124
|
-
begin
|
125
|
-
s.close unless s.nil?
|
126
|
-
rescue => close_error
|
127
|
-
end
|
128
|
-
s = nil
|
129
|
-
end
|
130
|
-
if stats_data.nil?
|
131
|
-
stats_data = {
|
132
|
-
:hostname_port => "#{hostname}:#{port}",
|
133
|
-
}
|
134
|
-
end
|
135
|
-
q.push stats_data
|
136
|
-
end
|
137
|
-
s.close unless s.nil?
|
138
|
-
end # Thread.new
|
139
|
-
end # nodes.each
|
95
|
+
enqueueing_node_stats(q, threads, config, hostname_port, data)
|
96
|
+
end
|
97
|
+
end
|
140
98
|
|
141
99
|
query_prev = {} if @qps
|
142
100
|
|
@@ -144,7 +102,11 @@ module Flare
|
|
144
102
|
interruptible {sleep 1}
|
145
103
|
end
|
146
104
|
|
147
|
-
s = Flare::Tools::IndexServer.open(
|
105
|
+
s = Flare::Tools::IndexServer.open(
|
106
|
+
@index_server_entity.host,
|
107
|
+
@index_server_entity.port,
|
108
|
+
@timeout
|
109
|
+
)
|
148
110
|
unless s
|
149
111
|
error "Couldn't connect to the index server."
|
150
112
|
return S_NG
|
@@ -164,62 +126,39 @@ module Flare
|
|
164
126
|
nodes.each do |k, n|
|
165
127
|
max_nodekey_length = k.length if k.length > max_nodekey_length
|
166
128
|
end
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
puts label
|
171
|
-
nodes.each do |k, n|
|
129
|
+
table = Table.new
|
130
|
+
add_header_to_table(table, header_configs)
|
131
|
+
nodes.each do |k, node|
|
172
132
|
stats_data = queue[k].pop
|
173
133
|
next if (args.size > 0 && !args.include?(k))
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
stats_data[:balance] = n['balance']
|
178
|
-
stats_data[:behind] = (threads.has_key?(k) || threads[k].has_key?('behind')) ? threads[k]['behind'] : "-"
|
179
|
-
output = [:hostname_port, :state, :role, :partition, :balance, :items,
|
180
|
-
:conn, :behind, :hit_rate, :size, :uptime_short, :version].map {|x| stats_data[x]}
|
181
|
-
if @qps
|
182
|
-
query = {}
|
183
|
-
query[:query] = stats_data[:cmd_get].to_i+stats_data[:cmd_set].to_i
|
184
|
-
query[:query_r] = stats_data[:cmd_get].to_i
|
185
|
-
query[:query_w] = stats_data[:cmd_set].to_i
|
186
|
-
query[:time] = time = stats_data[:time]
|
187
|
-
if query_prev.has_key?(k)
|
188
|
-
duration = (time-query_prev[k][:time]).to_f
|
189
|
-
[:query, :query_r, :query_w].each do |x|
|
190
|
-
diff = (query[x]-query_prev[k][x]).to_f
|
191
|
-
qps = if diff > 0 then diff/duration else 0 end
|
192
|
-
output << qps
|
193
|
-
end
|
194
|
-
else
|
195
|
-
output << 0 << 0 << 0
|
196
|
-
end
|
197
|
-
query_prev[k] = query.dup
|
198
|
-
end
|
199
|
-
|
200
|
-
puts format % output
|
134
|
+
behind = (threads.has_key?(k) || threads[k].has_key?('behind')) ? threads[k]['behind'] : "-"
|
135
|
+
r = record(stats_data, node, behind, query_prev, k)
|
136
|
+
add_record_to_table(table, header_configs, r)
|
201
137
|
end
|
202
138
|
interruptible {
|
203
139
|
wait_for_stats
|
204
140
|
}
|
141
|
+
puts table.prettify
|
205
142
|
end
|
206
143
|
s.close
|
207
144
|
|
208
145
|
@cont = false
|
209
146
|
|
210
147
|
queue.each do |k,q|
|
211
|
-
q.
|
148
|
+
q.pop until q.empty?
|
212
149
|
end
|
213
|
-
|
150
|
+
|
214
151
|
interruptible {
|
215
152
|
worker_threads.each do |t|
|
216
153
|
t.join
|
217
154
|
end
|
218
155
|
}
|
219
|
-
|
156
|
+
|
220
157
|
S_OK
|
221
158
|
end
|
222
159
|
|
160
|
+
private
|
161
|
+
|
223
162
|
def wait_for_stats
|
224
163
|
if @qps || @count > 1
|
225
164
|
wait = @wait
|
@@ -229,7 +168,121 @@ module Flare
|
|
229
168
|
end
|
230
169
|
end
|
231
170
|
end
|
232
|
-
|
171
|
+
|
172
|
+
def enqueueing_node_stats(q, threads, config, hostname_port, data)
|
173
|
+
hostname, port = hostname_port.split(":", 2)
|
174
|
+
s = nil
|
175
|
+
while @cont
|
176
|
+
stats_data = nil
|
177
|
+
begin
|
178
|
+
s = Flare::Tools::Stats.open(hostname, data['port'], @timeout)
|
179
|
+
stats = s.stats
|
180
|
+
time = Time.now
|
181
|
+
behind = threads[hostname_port].has_key?('behind') ? threads[hostname_port]['behind'] : "-"
|
182
|
+
uptime_short = short_desc_of_second(stats['uptime'])
|
183
|
+
hit_rate = if stats.has_key?('cmd_get') && stats['cmd_get'] != "0"
|
184
|
+
cmd_get = stats['cmd_get'].to_f
|
185
|
+
get_hits = stats['get_hits'].to_f
|
186
|
+
(get_hits / cmd_get * 100.0).round
|
187
|
+
else
|
188
|
+
"-"
|
189
|
+
end
|
190
|
+
size = stats['bytes'] == "0" ? "-" : (stats['bytes'].to_i / 1024 / 1024 / 1024) # gigabyte
|
191
|
+
stats_data = {
|
192
|
+
:hostname => hostname,
|
193
|
+
:port => port,
|
194
|
+
:hostname_port => "#{hostname}:#{port}",
|
195
|
+
:state => data['state'],
|
196
|
+
:role => data['role'],
|
197
|
+
:partition => data['partition'] == "-1" ? "-" : data['partition'],
|
198
|
+
:balance => data['balance'],
|
199
|
+
:items => stats['curr_items'],
|
200
|
+
:conn => stats['curr_connections'],
|
201
|
+
:behind => behind,
|
202
|
+
:hit_rate => hit_rate,
|
203
|
+
:size => size,
|
204
|
+
:uptime => stats['uptime'],
|
205
|
+
:uptime_short => uptime_short,
|
206
|
+
:version => stats['version'],
|
207
|
+
:cmd_get => stats['cmd_get'],
|
208
|
+
:cmd_set => stats['cmd_set'],
|
209
|
+
:time => time,
|
210
|
+
}
|
211
|
+
rescue Errno::ECONNREFUSED => e
|
212
|
+
rescue => e
|
213
|
+
begin
|
214
|
+
s.close unless s.nil?
|
215
|
+
rescue => close_error
|
216
|
+
error "Socket close failed: #{close_error.inspect}"
|
217
|
+
end
|
218
|
+
s = nil
|
219
|
+
end
|
220
|
+
if stats_data.nil?
|
221
|
+
stats_data = {
|
222
|
+
:hostname_port => "#{hostname}:#{port}",
|
223
|
+
}
|
224
|
+
end
|
225
|
+
q.push stats_data
|
226
|
+
end
|
227
|
+
s.close unless s.nil?
|
228
|
+
end
|
229
|
+
|
230
|
+
def add_header_to_table(table, header_configs)
|
231
|
+
row = Row.new(:separator => @delimiter)
|
232
|
+
header_configs.each do |header_config|
|
233
|
+
row.add_column(Column.new(header_config[0]))
|
234
|
+
end
|
235
|
+
table.add_row(row)
|
236
|
+
end
|
237
|
+
|
238
|
+
def add_record_to_table(table, header_configs, record)
|
239
|
+
row = Row.new(:separator => @delimiter)
|
240
|
+
header_configs.each_with_index do |header_config, index|
|
241
|
+
row.add_column(Column.new(record[index], header_config[1]))
|
242
|
+
end
|
243
|
+
table.add_row(row)
|
244
|
+
end
|
245
|
+
|
246
|
+
# You can override this method to extend stats infos.
|
247
|
+
def record(stats_data, node, behind, query_prev, index)
|
248
|
+
stats_data[:state] = node['state']
|
249
|
+
stats_data[:role] = node['role']
|
250
|
+
stats_data[:partition] = node['partition']
|
251
|
+
stats_data[:balance] = node['balance']
|
252
|
+
stats_data[:behind] = behind
|
253
|
+
output = [:hostname_port, :state, :role, :partition, :balance, :items,
|
254
|
+
:conn, :behind, :hit_rate, :size, :uptime_short, :version].map {|x| stats_data[x]}
|
255
|
+
if @qps
|
256
|
+
query = {}
|
257
|
+
query[:query] = stats_data[:cmd_get].to_i+stats_data[:cmd_set].to_i
|
258
|
+
query[:query_r] = stats_data[:cmd_get].to_i
|
259
|
+
query[:query_w] = stats_data[:cmd_set].to_i
|
260
|
+
query[:time] = time = stats_data[:time]
|
261
|
+
if query_prev.has_key?(index)
|
262
|
+
duration = (time-query_prev[index][:time]).to_f
|
263
|
+
[:query, :query_r, :query_w].each do |x|
|
264
|
+
diff = (query[x]-query_prev[index][x]).to_f
|
265
|
+
qps = if diff > 0
|
266
|
+
sprintf("%.1f", diff/duration)
|
267
|
+
else
|
268
|
+
'-'
|
269
|
+
end
|
270
|
+
output << qps
|
271
|
+
end
|
272
|
+
else
|
273
|
+
output << '-' << '-' << '-'
|
274
|
+
end
|
275
|
+
query_prev[index] = query.dup
|
276
|
+
end
|
277
|
+
output
|
278
|
+
end
|
279
|
+
|
280
|
+
# You can override this method to extend stats infos.
|
281
|
+
def header_configs
|
282
|
+
configs = Marshal.load(Marshal.dump(HeaderConfigs))
|
283
|
+
configs += Marshal.load(Marshal.dump(HeaderConfigQpss)) if @qps
|
284
|
+
configs
|
285
|
+
end
|
233
286
|
end
|
234
287
|
end
|
235
288
|
end
|