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 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