gizzmo 0.7.5 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.5
1
+ 0.8.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gizzmo}
8
- s.version = "0.7.5"
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-05}
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}
@@ -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
- regex = @argv.first
394
- help!("regex is a required option") unless regex
395
- regex = Regexp.compile(regex)
396
- service.list_hostnames.map do |host|
397
- puts host
398
- counts = {}
399
- service.shards_for_hostname(host).each do |shard|
400
- id = shard.id.to_unix
401
- if key = id[regex, 1] || id[regex, 0]
402
- counts[key] ||= 0
403
- counts[key] += 1
404
- end
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
- counts.sort.each do |k, v|
407
- puts " %3d %s" % [v, k]
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
@@ -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
- Gizzard::Command.run(subcommand_name, global_options, argv, subcommand_options, log)
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
- - 7
8
- - 5
9
- version: 0.7.5
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-05 00:00:00 -07:00
17
+ date: 2010-10-20 00:00:00 -07:00
18
18
  default_executable: gizzmo
19
19
  dependencies: []
20
20