gizzmo 0.7.5 → 0.8.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/VERSION +1 -1
- data/gizzmo.gemspec +2 -2
- data/lib/gizzard/commands.rb +54 -14
- data/lib/gizzmo.rb +36 -5
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
data/gizzmo.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{gizzmo}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.8.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kyle Maxwell"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-20}
|
13
13
|
s.default_executable = %q{gizzmo}
|
14
14
|
s.description = %q{Gizzmo is a command-line client for managing gizzard clusters.}
|
15
15
|
s.email = %q{kmaxwell@twitter.com}
|
data/lib/gizzard/commands.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "pp"
|
2
|
+
require "digest/md5"
|
2
3
|
module Gizzard
|
3
4
|
class Command
|
4
5
|
include Thrift
|
@@ -390,21 +391,60 @@ module Gizzard
|
|
390
391
|
|
391
392
|
class ReportCommand < ShardCommand
|
392
393
|
def run
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
394
|
+
things = @argv.map do |shard|
|
395
|
+
parse(down(ShardId.parse(shard))).join("\n")
|
396
|
+
end
|
397
|
+
|
398
|
+
group(things).each do |string, things|
|
399
|
+
puts "=== " + sign(string) + ": #{things.length}" + " ===================="
|
400
|
+
puts string
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def sign(string)
|
405
|
+
::Digest::MD5.hexdigest(string)[0..10]
|
406
|
+
end
|
407
|
+
|
408
|
+
def group(arr)
|
409
|
+
arr.inject({}) do |m, e|
|
410
|
+
m[e] ||= []
|
411
|
+
m[e] << e
|
412
|
+
m
|
413
|
+
end.to_a.sort_by{|k, v| v.length}.reverse
|
414
|
+
end
|
415
|
+
|
416
|
+
def parse(obj, id = nil, depth = 0, sub = true)
|
417
|
+
case obj
|
418
|
+
when Hash
|
419
|
+
id, prefix = parse(obj.keys.first, id, depth, sub)
|
420
|
+
[prefix] + parse(obj.values.first, id, depth + 1, sub)
|
421
|
+
when String
|
422
|
+
host, prefix = obj.split("/")
|
423
|
+
host = "db" if host != "localhost" && sub
|
424
|
+
id ||= prefix[/\w+ward_\d+_\d+/]
|
425
|
+
prefix = (" " * depth) + host + "/" + (sub ? prefix.sub(id, "[ID]") : prefix)
|
426
|
+
[id, prefix]
|
427
|
+
when Array
|
428
|
+
obj.map do |e|
|
429
|
+
parse e, id, depth, sub
|
405
430
|
end
|
406
|
-
|
407
|
-
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def down(id)
|
435
|
+
vals = service.list_downward_links(id).map do |link|
|
436
|
+
down(link.down_id)
|
437
|
+
end
|
438
|
+
{id.to_unix => vals}
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
class DrillCommand < ReportCommand
|
443
|
+
def run
|
444
|
+
signature = @argv.shift
|
445
|
+
@argv.map do |shard|
|
446
|
+
if sign(parse(down(ShardId.parse(shard))).join("\n")) == signature
|
447
|
+
puts parse(down(ShardId.parse(shard)), nil, 0, false).join("\n")
|
408
448
|
end
|
409
449
|
end
|
410
450
|
end
|
data/lib/gizzmo.rb
CHANGED
@@ -78,10 +78,6 @@ subcommands = {
|
|
78
78
|
opts.banner = "Usage: #{zero} wrap CLASS_NAME SHARD_ID_TO_WRAP [MORE SHARD_IDS...]"
|
79
79
|
separators(opts, DOC_STRINGS["wrap"])
|
80
80
|
end,
|
81
|
-
'report' => OptionParser.new do |opts|
|
82
|
-
opts.banner = "Usage: #{zero} report RUBY_REGEX"
|
83
|
-
separators(opts, DOC_STRINGS["report"])
|
84
|
-
end,
|
85
81
|
'rebalance' => OptionParser.new do |opts|
|
86
82
|
opts.banner = "Usage: #{zero} rebalance"
|
87
83
|
separators(opts, DOC_STRINGS["rebalance"])
|
@@ -166,6 +162,10 @@ subcommands = {
|
|
166
162
|
opts.banner = "Usage: #{zero} reload"
|
167
163
|
separators(opts, DOC_STRINGS["reload"])
|
168
164
|
end,
|
165
|
+
'drill' => OptionParser.new do |opts|
|
166
|
+
opts.banner = "Usage: #{zero} drill SIGNATURE"
|
167
|
+
separators(opts, DOC_STRINGS["drill"])
|
168
|
+
end,
|
169
169
|
'addlink' => OptionParser.new do |opts|
|
170
170
|
opts.banner = "Usage: #{zero} addlink PARENT_SHARD_ID CHILD_SHARD_ID WEIGHT"
|
171
171
|
separators(opts, DOC_STRINGS["addlink"])
|
@@ -174,6 +174,12 @@ subcommands = {
|
|
174
174
|
opts.banner = "Usage: #{zero} unlink PARENT_SHARD_ID CHILD_SHARD_ID"
|
175
175
|
separators(opts, DOC_STRINGS["unlink"])
|
176
176
|
end,
|
177
|
+
|
178
|
+
'report' => OptionParser.new do |opts|
|
179
|
+
opts.banner = "Usage: #{zero} report"
|
180
|
+
separators(opts, DOC_STRINGS["report"])
|
181
|
+
end,
|
182
|
+
|
177
183
|
'lookup' => OptionParser.new do |opts|
|
178
184
|
opts.banner = "Usage: #{zero} lookup [options] TABLE_ID SOURCE"
|
179
185
|
separators(opts, DOC_STRINGS["lookup"])
|
@@ -254,6 +260,10 @@ global = OptionParser.new do |opts|
|
|
254
260
|
opts.on("-r", "--retry=TIMES", "TIMES to retry the command") do |r|
|
255
261
|
global_options.retry = r
|
256
262
|
end
|
263
|
+
|
264
|
+
opts.on("-t", "--timeout=SECONDS", "SECONDS to let the command run") do |r|
|
265
|
+
global_options.timeout = r
|
266
|
+
end
|
257
267
|
|
258
268
|
opts.on("--subtree", "Render in subtree mode") do
|
259
269
|
global_options.render << "subtree"
|
@@ -328,11 +338,32 @@ while !$stdin.tty? && line = STDIN.gets
|
|
328
338
|
argv << line.strip
|
329
339
|
end
|
330
340
|
|
341
|
+
def custom_timeout(seconds)
|
342
|
+
if seconds
|
343
|
+
begin
|
344
|
+
require "rubygems"
|
345
|
+
require "system_timer"
|
346
|
+
SystemTimer.timeout_after(seconds.to_i) do
|
347
|
+
yield
|
348
|
+
end
|
349
|
+
rescue LoadError
|
350
|
+
require "timeout"
|
351
|
+
Timeout.timeout(seconds.to_i) do
|
352
|
+
yield
|
353
|
+
end
|
354
|
+
end
|
355
|
+
else
|
356
|
+
yield
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
331
360
|
tries_left = global_options.retry.to_i + 1
|
332
361
|
begin
|
333
362
|
while (tries_left -= 1) >= 0
|
334
363
|
begin
|
335
|
-
|
364
|
+
custom_timeout(global_options.timeout) do
|
365
|
+
Gizzard::Command.run(subcommand_name, global_options, argv, subcommand_options, log)
|
366
|
+
end
|
336
367
|
break
|
337
368
|
rescue
|
338
369
|
if tries_left > 0
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 8
|
8
|
+
- 0
|
9
|
+
version: 0.8.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Kyle Maxwell
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-20 00:00:00 -07:00
|
18
18
|
default_executable: gizzmo
|
19
19
|
dependencies: []
|
20
20
|
|