hydra 0.7.0 → 0.7.2

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.0
1
+ 0.7.2
data/hydra.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hydra}
8
- s.version = "0.7.0"
8
+ s.version = "0.7.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nick Gauthier"]
12
- s.date = %q{2010-02-04}
12
+ s.date = %q{2010-02-05}
13
13
  s.description = %q{Spread your tests over multiple machines to test your code faster.}
14
14
  s.email = %q{nick@smartlogicsolutions.com}
15
15
  s.extra_rdoc_files = [
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  "lib/hydra/messaging_io.rb",
38
38
  "lib/hydra/pipe.rb",
39
39
  "lib/hydra/runner.rb",
40
+ "lib/hydra/safe_fork.rb",
40
41
  "lib/hydra/ssh.rb",
41
42
  "lib/hydra/stdio.rb",
42
43
  "lib/hydra/trace.rb",
data/lib/hydra.rb CHANGED
@@ -3,6 +3,7 @@ require 'hydra/pipe'
3
3
  require 'hydra/ssh'
4
4
  require 'hydra/stdio'
5
5
  require 'hydra/message'
6
+ require 'hydra/safe_fork'
6
7
  require 'hydra/runner'
7
8
  require 'hydra/worker'
8
9
  require 'hydra/master'
data/lib/hydra/master.rb CHANGED
@@ -23,6 +23,7 @@ module Hydra #:nodoc:
23
23
  opts.merge!(YAML.load_file(config_file).stringify_keys!)
24
24
  end
25
25
  @files = opts.fetch('files') { [] }
26
+ @files.sort!{|a,b| File.size(b) <=> File.size(a)} # dumb heuristic
26
27
  @incomplete_files = @files.dup
27
28
  @workers = []
28
29
  @listeners = []
@@ -83,7 +84,7 @@ module Hydra #:nodoc:
83
84
  runners = worker.fetch('runners') { raise "You must specify the number of runners" }
84
85
  trace "Booting local worker"
85
86
  pipe = Hydra::Pipe.new
86
- child = Process.fork do
87
+ child = SafeFork.fork do
87
88
  pipe.identify_as_child
88
89
  Hydra::Worker.new(:io => pipe, :runners => runners, :verbose => @verbose)
89
90
  end
@@ -129,7 +130,11 @@ module Hydra #:nodoc:
129
130
  begin
130
131
  message = worker[:io].gets
131
132
  trace "got message: #{message}"
132
- message.handle(self, worker) if message
133
+ # if it exists and its for me.
134
+ # SSH gives us back echoes, so we need to ignore our own messages
135
+ if message and !message.class.to_s.index("Worker").nil?
136
+ message.handle(self, worker)
137
+ end
133
138
  rescue IOError
134
139
  trace "lost Worker [#{worker.inspect}]"
135
140
  Thread.exit
@@ -13,7 +13,7 @@ module Hydra #:nodoc:
13
13
  return nil unless message
14
14
  return Message.build(eval(message.chomp))
15
15
  rescue SyntaxError, NameError
16
- $stderr.write "Not a message: [#{message.inspect}]\n"
16
+ #$stderr.write "Not a message: [#{message.inspect}]\n"
17
17
  return gets
18
18
  end
19
19
 
data/lib/hydra/runner.rb CHANGED
@@ -66,7 +66,7 @@ module Hydra #:nodoc:
66
66
  while @running
67
67
  begin
68
68
  message = @io.gets
69
- if message
69
+ if message and !message.class.to_s.index("Worker").nil?
70
70
  trace "Received message from worker"
71
71
  trace "\t#{message.inspect}"
72
72
  message.handle(self)
@@ -92,9 +92,12 @@ module Hydra #:nodoc:
92
92
  eval(c.first)
93
93
  end
94
94
  rescue NameError
95
- trace "Could not load [#{c.first}] from [#{f}]"
95
+ # means we could not load [c.first], but thats ok, its just not
96
+ # one of the classes we want to test
97
+ nil
96
98
  rescue SyntaxError
97
- trace "Could not load [#{c.first}] from [#{f}]"
99
+ # see above
100
+ nil
98
101
  end
99
102
  end
100
103
  return klasses.select{|k| k.respond_to? 'suite'}
@@ -0,0 +1,23 @@
1
+ class SafeFork
2
+ def self.fork
3
+ begin
4
+ # remove our connection so it doesn't get cloned
5
+ ActiveRecord::Base.remove_connection if defined?(ActiveRecord)
6
+ # fork a process
7
+ child = Process.fork do
8
+ begin
9
+ # create a new connection and perform the action
10
+ ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
11
+ yield
12
+ ensure
13
+ # make sure we remove the connection before we're done
14
+ ActiveRecord::Base.remove_connection if defined?(ActiveRecord)
15
+ end
16
+ end
17
+ ensure
18
+ # make sure we re-establish the connection before returning to the main instance
19
+ ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
20
+ end
21
+ return child
22
+ end
23
+ end
data/lib/hydra/ssh.rb CHANGED
@@ -24,9 +24,14 @@ module Hydra #:nodoc:
24
24
  # Hydra::SSH.new('-p 3022 user@server.com')
25
25
  # etc..
26
26
  def initialize(connection_options, directory, command)
27
- @writer, @reader, @error = popen3("ssh #{connection_options}")
27
+ @writer, @reader, @error = popen3("ssh -tt #{connection_options}")
28
28
  @writer.write("cd #{directory}\n")
29
29
  @writer.write(command+"\n")
30
30
  end
31
+
32
+ def close
33
+ @writer.write "exit\n"
34
+ super
35
+ end
31
36
  end
32
37
  end
data/lib/hydra/trace.rb CHANGED
@@ -16,7 +16,7 @@ module Hydra #:nodoc:
16
16
  # Trace some output with the class's prefix and a newline.
17
17
  # Checks to ensure we're running verbosely.
18
18
  def trace(str)
19
- $stdout.write "#{self.class._traceable_prefix}| #{str}\n" if @verbose
19
+ $stdout.write "#{Time.now.to_f} #{self.class._traceable_prefix}| #{str}\n" if @verbose
20
20
  end
21
21
  end
22
22
  end
data/lib/hydra/worker.rb CHANGED
@@ -68,7 +68,7 @@ module Hydra #:nodoc:
68
68
  trace "Booting #{num_runners} Runners"
69
69
  num_runners.times do
70
70
  pipe = Hydra::Pipe.new
71
- child = Process.fork do
71
+ child = SafeFork.fork do
72
72
  pipe.identify_as_child
73
73
  Hydra::Runner.new(:io => pipe, :verbose => @verbose)
74
74
  end
@@ -98,7 +98,7 @@ module Hydra #:nodoc:
98
98
  while @running
99
99
  begin
100
100
  message = @io.gets
101
- if message
101
+ if message and !message.class.to_s.index("Master").nil?
102
102
  trace "Received Message from Master"
103
103
  trace "\t#{message.inspect}"
104
104
  message.handle(self)
@@ -120,7 +120,7 @@ module Hydra #:nodoc:
120
120
  while @running
121
121
  begin
122
122
  message = r[:io].gets
123
- if message
123
+ if message and !message.class.to_s.index("Runner").nil?
124
124
  trace "Received Message from Runner"
125
125
  trace "\t#{message.inspect}"
126
126
  message.handle(self, r)
@@ -139,7 +139,6 @@ module Hydra #:nodoc:
139
139
  idle_r = nil
140
140
  while idle_r.nil?
141
141
  idle_r = @runners.detect{|runner| runner[:idle]}
142
- sleep(1)
143
142
  end
144
143
  return idle_r
145
144
  end
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Echoes back to the sender
3
3
  $stdout.sync = true
4
- while line = $stdin.gets
5
- $stdout.write(line)
4
+ while line = $stdin.get
5
+ $stdout.write line
6
6
  end
7
7
 
data/test/runner_test.rb CHANGED
@@ -38,16 +38,21 @@ class RunnerTest < Test::Unit::TestCase
38
38
  ssh = Hydra::SSH.new(
39
39
  'localhost',
40
40
  File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')),
41
- "ruby -e \"require 'rubygems'; require 'hydra'; Hydra::Runner.new(:io => Hydra::Stdio.new);\""
41
+ "ruby -e \"require 'rubygems'; require 'hydra'; Hydra::Runner.new(:io => Hydra::Stdio.new, :verbose => true);\""
42
42
  )
43
43
  assert ssh.gets.is_a?(Hydra::Messages::Runner::RequestFile)
44
44
  ssh.write(Hydra::Messages::Worker::RunFile.new(:file => test_file))
45
45
 
46
46
  # grab its response. This makes us wait for it to finish
47
+ echo = ssh.gets # get the ssh echo
47
48
  response = ssh.gets
49
+
50
+ assert_equal Hydra::Messages::Runner::Results, response.class
48
51
 
49
52
  # tell it to shut down
50
53
  ssh.write(Hydra::Messages::Worker::Shutdown.new)
54
+
55
+ ssh.close
51
56
 
52
57
  # ensure it ran
53
58
  assert File.exists?(target_file)
data/test/ssh_test.rb CHANGED
@@ -1,21 +1,15 @@
1
1
  require File.join(File.dirname(__FILE__), 'test_helper')
2
2
 
3
3
  class SSHTest < Test::Unit::TestCase
4
- context "an ssh connection" do
5
- setup do
6
- @ssh = Hydra::SSH.new(
7
- 'localhost', # connect to this machine
8
- File.expand_path(File.join(File.dirname(__FILE__))), # move to the test directory
9
- "ruby fixtures/echo_the_dolphin.rb"
10
- )
11
- @message = Hydra::Messages::TestMessage.new
12
- end
13
- teardown do
14
- @ssh.close
15
- end
16
- should "be able to execute a command" do
17
- @ssh.write @message
18
- assert_equal @message.text, @ssh.gets.text
19
- end
4
+ should "be able to execute a command over ssh" do
5
+ ssh = Hydra::SSH.new(
6
+ 'localhost', # connect to this machine
7
+ File.expand_path(File.join(File.dirname(__FILE__))), # move to the test directory
8
+ "ruby fixtures/echo_the_dolphin.rb"
9
+ )
10
+ message = Hydra::Messages::TestMessage.new
11
+ ssh.write message
12
+ assert_equal message.text, ssh.gets.text
13
+ ssh.close
20
14
  end
21
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Gauthier
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-04 00:00:00 -05:00
12
+ date: 2010-02-05 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,6 +62,7 @@ files:
62
62
  - lib/hydra/messaging_io.rb
63
63
  - lib/hydra/pipe.rb
64
64
  - lib/hydra/runner.rb
65
+ - lib/hydra/safe_fork.rb
65
66
  - lib/hydra/ssh.rb
66
67
  - lib/hydra/stdio.rb
67
68
  - lib/hydra/trace.rb