timocratic-skynet 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/History.txt +152 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +144 -0
  4. data/README.txt +178 -0
  5. data/Rakefile +5 -0
  6. data/app_generators/skynet_install/USAGE +5 -0
  7. data/app_generators/skynet_install/skynet_install_generator.rb +94 -0
  8. data/app_generators/skynet_install/templates/migration.rb +43 -0
  9. data/app_generators/skynet_install/templates/skynet_config.rb +50 -0
  10. data/app_generators/skynet_install/templates/skynet_initializer.rb +1 -0
  11. data/app_generators/skynet_install/templates/skynet_mysql_schema.sql +33 -0
  12. data/bin/skynet +71 -0
  13. data/bin/skynet_install +36 -0
  14. data/bin/skynet_tuplespace_server +74 -0
  15. data/config/hoe.rb +75 -0
  16. data/config/requirements.rb +17 -0
  17. data/examples/dgrep/README +70 -0
  18. data/examples/dgrep/config/skynet_config.rb +26 -0
  19. data/examples/dgrep/data/shakespeare/README +2 -0
  20. data/examples/dgrep/data/shakespeare/poetry/loverscomplaint +381 -0
  21. data/examples/dgrep/data/shakespeare/poetry/rapeoflucrece +2199 -0
  22. data/examples/dgrep/data/shakespeare/poetry/sonnets +2633 -0
  23. data/examples/dgrep/data/shakespeare/poetry/various +640 -0
  24. data/examples/dgrep/data/shakespeare/poetry/venusandadonis +1423 -0
  25. data/examples/dgrep/data/testfile1.txt +1 -0
  26. data/examples/dgrep/data/testfile2.txt +1 -0
  27. data/examples/dgrep/data/testfile3.txt +1 -0
  28. data/examples/dgrep/data/testfile4.txt +1 -0
  29. data/examples/dgrep/lib/dgrep.rb +59 -0
  30. data/examples/dgrep/lib/mapreduce_test.rb +32 -0
  31. data/examples/dgrep/lib/most_common_words.rb +45 -0
  32. data/examples/dgrep/script/dgrep +75 -0
  33. data/examples/rails_mysql_example/README +66 -0
  34. data/examples/rails_mysql_example/Rakefile +10 -0
  35. data/examples/rails_mysql_example/app/controllers/application.rb +10 -0
  36. data/examples/rails_mysql_example/app/helpers/application_helper.rb +3 -0
  37. data/examples/rails_mysql_example/app/models/user.rb +21 -0
  38. data/examples/rails_mysql_example/app/models/user_favorite.rb +5 -0
  39. data/examples/rails_mysql_example/app/models/user_mailer.rb +12 -0
  40. data/examples/rails_mysql_example/app/views/user_mailer/welcome.erb +5 -0
  41. data/examples/rails_mysql_example/config/boot.rb +109 -0
  42. data/examples/rails_mysql_example/config/database.yml +42 -0
  43. data/examples/rails_mysql_example/config/environment.rb +59 -0
  44. data/examples/rails_mysql_example/config/environments/development.rb +18 -0
  45. data/examples/rails_mysql_example/config/environments/production.rb +19 -0
  46. data/examples/rails_mysql_example/config/environments/test.rb +22 -0
  47. data/examples/rails_mysql_example/config/initializers/inflections.rb +10 -0
  48. data/examples/rails_mysql_example/config/initializers/mime_types.rb +5 -0
  49. data/examples/rails_mysql_example/config/initializers/skynet.rb +1 -0
  50. data/examples/rails_mysql_example/config/routes.rb +35 -0
  51. data/examples/rails_mysql_example/config/skynet_config.rb +36 -0
  52. data/examples/rails_mysql_example/db/migrate/001_create_skynet_tables.rb +43 -0
  53. data/examples/rails_mysql_example/db/migrate/002_create_users.rb +16 -0
  54. data/examples/rails_mysql_example/db/migrate/003_create_user_favorites.rb +14 -0
  55. data/examples/rails_mysql_example/db/schema.rb +85 -0
  56. data/examples/rails_mysql_example/db/skynet_mysql_schema.sql +33 -0
  57. data/examples/rails_mysql_example/doc/README_FOR_APP +2 -0
  58. data/examples/rails_mysql_example/lib/tasks/rails_mysql_example.rake +20 -0
  59. data/examples/rails_mysql_example/public/.htaccess +40 -0
  60. data/examples/rails_mysql_example/public/404.html +30 -0
  61. data/examples/rails_mysql_example/public/422.html +30 -0
  62. data/examples/rails_mysql_example/public/500.html +30 -0
  63. data/examples/rails_mysql_example/public/dispatch.cgi +10 -0
  64. data/examples/rails_mysql_example/public/dispatch.fcgi +24 -0
  65. data/examples/rails_mysql_example/public/dispatch.rb +10 -0
  66. data/examples/rails_mysql_example/public/favicon.ico +0 -0
  67. data/examples/rails_mysql_example/public/images/rails.png +0 -0
  68. data/examples/rails_mysql_example/public/index.html +277 -0
  69. data/examples/rails_mysql_example/public/javascripts/application.js +2 -0
  70. data/examples/rails_mysql_example/public/javascripts/controls.js +963 -0
  71. data/examples/rails_mysql_example/public/javascripts/dragdrop.js +972 -0
  72. data/examples/rails_mysql_example/public/javascripts/effects.js +1120 -0
  73. data/examples/rails_mysql_example/public/javascripts/prototype.js +4225 -0
  74. data/examples/rails_mysql_example/public/robots.txt +5 -0
  75. data/examples/rails_mysql_example/script/about +3 -0
  76. data/examples/rails_mysql_example/script/console +3 -0
  77. data/examples/rails_mysql_example/script/destroy +3 -0
  78. data/examples/rails_mysql_example/script/generate +3 -0
  79. data/examples/rails_mysql_example/script/performance/benchmarker +3 -0
  80. data/examples/rails_mysql_example/script/performance/profiler +3 -0
  81. data/examples/rails_mysql_example/script/performance/request +3 -0
  82. data/examples/rails_mysql_example/script/plugin +3 -0
  83. data/examples/rails_mysql_example/script/process/inspector +3 -0
  84. data/examples/rails_mysql_example/script/process/reaper +3 -0
  85. data/examples/rails_mysql_example/script/process/spawner +3 -0
  86. data/examples/rails_mysql_example/script/runner +3 -0
  87. data/examples/rails_mysql_example/script/server +3 -0
  88. data/examples/rails_mysql_example/test/fixtures/user_favorites.yml +9 -0
  89. data/examples/rails_mysql_example/test/fixtures/users.yml +11 -0
  90. data/examples/rails_mysql_example/test/test_helper.rb +38 -0
  91. data/examples/rails_mysql_example/test/unit/user_favorite_test.rb +8 -0
  92. data/examples/rails_mysql_example/test/unit/user_test.rb +8 -0
  93. data/extras/README +7 -0
  94. data/extras/init.d/skynet +87 -0
  95. data/extras/nagios/check_skynet.sh +121 -0
  96. data/extras/rails/controllers/skynet_controller.rb +43 -0
  97. data/extras/rails/views/skynet/index.rhtml +137 -0
  98. data/lib/skynet.rb +95 -0
  99. data/lib/skynet/mapreduce_helper.rb +74 -0
  100. data/lib/skynet/mapreduce_test.rb +56 -0
  101. data/lib/skynet/message_queue_adapters/message_queue_adapter.rb +70 -0
  102. data/lib/skynet/message_queue_adapters/mysql.rb +509 -0
  103. data/lib/skynet/message_queue_adapters/tuple_space.rb +316 -0
  104. data/lib/skynet/skynet_active_record_extensions.rb +280 -0
  105. data/lib/skynet/skynet_config.rb +232 -0
  106. data/lib/skynet/skynet_console.rb +50 -0
  107. data/lib/skynet/skynet_console_helper.rb +66 -0
  108. data/lib/skynet/skynet_debugger.rb +138 -0
  109. data/lib/skynet/skynet_guid_generator.rb +68 -0
  110. data/lib/skynet/skynet_job.rb +892 -0
  111. data/lib/skynet/skynet_launcher.rb +40 -0
  112. data/lib/skynet/skynet_logger.rb +62 -0
  113. data/lib/skynet/skynet_manager.rb +706 -0
  114. data/lib/skynet/skynet_message.rb +359 -0
  115. data/lib/skynet/skynet_message_queue.rb +136 -0
  116. data/lib/skynet/skynet_partitioners.rb +96 -0
  117. data/lib/skynet/skynet_ruby_extensions.rb +53 -0
  118. data/lib/skynet/skynet_task.rb +118 -0
  119. data/lib/skynet/skynet_tuplespace_server.rb +83 -0
  120. data/lib/skynet/skynet_worker.rb +451 -0
  121. data/lib/skynet/version.rb +9 -0
  122. data/script/destroy +14 -0
  123. data/script/generate +14 -0
  124. data/script/txt2html +74 -0
  125. data/setup.rb +1585 -0
  126. data/tasks/deployment.rake +34 -0
  127. data/tasks/environment.rake +7 -0
  128. data/tasks/website.rake +17 -0
  129. data/test/test_active_record_extensions.rb +138 -0
  130. data/test/test_generator_helper.rb +20 -0
  131. data/test/test_helper.rb +10 -0
  132. data/test/test_mysql_message_queue_adapter.rb +263 -0
  133. data/test/test_skynet.rb +19 -0
  134. data/test/test_skynet_install_generator.rb +49 -0
  135. data/test/test_skynet_job.rb +717 -0
  136. data/test/test_skynet_manager.rb +157 -0
  137. data/test/test_skynet_message.rb +229 -0
  138. data/test/test_skynet_task.rb +24 -0
  139. data/test/test_tuplespace_message_queue.rb +174 -0
  140. data/website/index.html +181 -0
  141. data/website/index.txt +98 -0
  142. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  143. data/website/stylesheets/screen.css +138 -0
  144. data/website/template.rhtml +48 -0
  145. metadata +247 -0
@@ -0,0 +1,157 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'functor'
3
+
4
+ class SkynetManagerTest < Test::Unit::TestCase
5
+
6
+ PIDS = []
7
+ PIDFILE = []
8
+
9
+ def setup
10
+ connection = ActiveRecord::Base.establish_connection(
11
+ :adapter => "mysql",
12
+ :host => "localhost",
13
+ :username => "root",
14
+ :password => "",
15
+ :database => "skynet_test"
16
+ )
17
+
18
+ ActiveRecord::Base.connection.reconnect!
19
+
20
+ Skynet.configure(
21
+ :ENABLE => false,
22
+ # :SKYNET_PIDS_FILE => File.expand_path("#{RAILS_ROOT}/log/skynet_#{RAILS_ENV}.pids"),
23
+ :SKYNET_LOG_FILE => STDOUT,
24
+ :SKYNET_LOG_LEVEL => 4,
25
+ :MESSAGE_QUEUE_ADAPTER => "Skynet::MessageQueueAdapter::Mysql",
26
+ :MYSQL_TEMPERATURE_CHANGE_SLEEP => 1,
27
+ :MYSQL_NEXT_TASK_TIMEOUT => 1,
28
+ :MYSQL_QUEUE_DATABASE => nil
29
+ )
30
+
31
+ mq.clear_outstanding_tasks
32
+ mq.clear_worker_status
33
+
34
+ @pids = []
35
+ @pidfile = []
36
+ @worker_queue = []
37
+
38
+ PIDS.delete_if {true}
39
+ PIDFILE.delete_if {true}
40
+
41
+ Process.stubs(:detatch).returns(true)
42
+ Process.stubs(:kill).returns(true)
43
+
44
+ @minstance = Skynet::Manager.any_instance
45
+ @hostname = Socket.gethostname
46
+
47
+ Skynet::Worker.any_instance.stubs(:max_memory_reached?).returns(false)
48
+ end
49
+
50
+ def setup_manager
51
+ @manager = Skynet::Manager.new(:script_path => "path", :workers => 2)
52
+ @manager.extend(Functor)
53
+
54
+ mq = functor
55
+ @manager.stubs(:mq).returns(mq)
56
+
57
+ mq.get_worker_version = 1
58
+
59
+ worker_queue = @worker_queue
60
+ mq.read_all_worker_statuses = lambda do |hostname|
61
+ worker_queue
62
+ end
63
+
64
+ mq.take_worker_status = lambda do |options, timeout|
65
+ worker_queue.delete_if {|w|w.process_id == options[:process_id] }.first
66
+ end
67
+
68
+ pids = @pids
69
+ hostname = @hostname
70
+ Skynet.extend(Functor)
71
+ Skynet.define_method(:close_files) do
72
+ true
73
+ end
74
+
75
+ Skynet.define_method(:close_console) do
76
+ true
77
+ end
78
+
79
+
80
+ Skynet.define_method(:fork_and_exec) do |cmd|
81
+ newpid = pids.size + 1
82
+ pids << newpid
83
+ worker_info = {
84
+ :hostname => hostname,
85
+ :process_id => newpid,
86
+ :worker_type => :task,
87
+ :worker_id => newpid,
88
+ :version => 1
89
+ }
90
+
91
+ worker_queue << Skynet::WorkerStatusMessage.new(worker_info)
92
+ newpid
93
+ end
94
+ end
95
+
96
+ def test_manager_start
97
+ setup_manager
98
+ @manager.start_workers
99
+ assert_equal 2, @manager.worker_pids.size
100
+ assert_equal @pids.sort, @manager.worker_pids.sort
101
+ assert_equal @pids.sort, @manager.worker_queue.collect {|q|q.process_id}.sort
102
+ end
103
+
104
+ def test_check_workers
105
+ setup_manager
106
+ Skynet::Manager.any_instance.expects(:worker_alive?).times(2).returns(true)
107
+ @manager.start_workers
108
+ @manager.check_workers
109
+ assert_equal 2, @manager.worker_pids.size
110
+ assert_equal @pids.sort, @manager.worker_pids.sort
111
+ assert_equal @pids.sort, @manager.worker_queue.collect {|q|q.process_id}.sort
112
+ end
113
+
114
+ def test_running_pids
115
+ setup_manager
116
+ Skynet::Manager.any_instance.expects(:worker_alive?).with(1).returns(true)
117
+ Skynet::Manager.any_instance.expects(:worker_alive?).with(2).returns(false)
118
+ @manager.start_workers
119
+ @manager.check_workers
120
+ assert_equal 1, @manager.worker_pids.size
121
+ assert_equal [1], @manager.worker_pids.sort
122
+ assert_equal [1], @manager.worker_queue.collect {|q|q.process_id}.sort
123
+ end
124
+
125
+ ## XXX FIXME. What happens if there's a worker missing from the pidfile, but was running?
126
+ def test_more_in_pidfile_than_queue_alive
127
+ setup_manager
128
+ @manager.expects(:worker_alive?).with(1).returns(false)
129
+ Skynet.configure(:SKYNET_LOG_LEVEL => 4) do
130
+ @manager.start_workers
131
+
132
+ @manager.expects(:worker_alive?).with(2).returns(true)
133
+ @worker_queue.delete_if {|w| w.process_id == 1}
134
+ @manager.check_workers
135
+ end
136
+ assert_equal 2, @manager.worker_pids.size
137
+ assert_equal [2,3], @manager.worker_pids.sort
138
+ assert_equal [2,3], @manager.worker_queue.collect {|q|q.process_id}.sort
139
+ end
140
+
141
+ def test_dead_workers
142
+ setup_manager
143
+ Skynet::Manager.any_instance.expects(:worker_alive?).times(1).with(1).returns(false)
144
+ # Skynet::Manager.any_instance.expects(:worker_alive?).with(2).returns(true)
145
+ @manager.start_workers
146
+ @manager.check_workers
147
+ assert_equal [2], @manager.worker_pids.sort
148
+ assert_equal [2], @manager.worker_queue.collect {|q|q.process_id}.sort
149
+ end
150
+
151
+
152
+ private
153
+
154
+ def mq
155
+ Skynet::MessageQueueAdapter::Mysql.new
156
+ end
157
+ end
@@ -0,0 +1,229 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class MysqlMessageQueueTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Skynet.configure(
7
+ :ENABLE => false,
8
+ :SKYNET_LOG_FILE => STDOUT,
9
+ :SKYNET_LOG_LEVEL => Logger::ERROR
10
+ )
11
+ end
12
+
13
+ def setup_worker_message
14
+ @worker_message = Skynet::WorkerStatusMessage.new(
15
+ :tasktype => :task,
16
+ :drburi => "localhost",
17
+ :job_id => 1,
18
+ :task_id => 2,
19
+ :payload => "payload",
20
+ :payload_type => "task",
21
+ :expiry => 20,
22
+ :expire_time => 1095108406.9251,
23
+ :iteration => 0,
24
+ :name => "name",
25
+ :version => 1,
26
+ :queue_id => 0
27
+ )
28
+ end
29
+
30
+ def setup_task_message
31
+ @task_message = Skynet::Message.new(
32
+ :tasktype => :task,
33
+ :drburi => "localhost",
34
+ :job_id => 1,
35
+ :task_id => 2,
36
+ :payload => "payload",
37
+ :payload_type => "task",
38
+ :expiry => 20,
39
+ :expire_time => 0,
40
+ :iteration => 0,
41
+ :name => "name",
42
+ :version => 1,
43
+ :retry => 2,
44
+ :queue_id => 0
45
+ )
46
+ end
47
+
48
+ def test_worker_status_message
49
+ setup_worker_message
50
+ {
51
+ :queue_id => 0,
52
+ :tasksubtype => :worker,
53
+ :tasktype => :status,
54
+ :name => "name",
55
+ :hostname => nil,
56
+ :worker_id => nil,
57
+ :map_or_reduce => nil,
58
+ :process_id => nil,
59
+ :started_at => nil,
60
+ :job_id => 1,
61
+ :iteration => 0,
62
+ :processed => nil,
63
+ :task_id => 2,
64
+ :version => 1
65
+ }.each do |key, val|
66
+ assert_equal val, @worker_message.send(key), key
67
+ end
68
+ assert_equal @worker_message.to_a, Skynet::WorkerStatusMessage.new([:status, :worker, nil, nil, nil, 1, 2, 0, "name", nil, nil, 1, nil, 0]).to_a
69
+ end
70
+
71
+ def test_task_message
72
+ setup_task_message
73
+ {:payload=>"payload",
74
+ :queue_id=>0,
75
+ :tasktype=>:task,
76
+ :name=>"name",
77
+ :payload_type=>:task,
78
+ :expiry=>20,
79
+ :drburi=>"localhost",
80
+ :expire_time=>0,
81
+ :job_id=>1,
82
+ :iteration=>0,
83
+ :retry=>2,
84
+ :task_id=>2,
85
+ :version=>1}.each do |key, val|
86
+ assert_equal val, @task_message.send(key)
87
+ end
88
+ assert_equal @task_message.to_a, Skynet::Message.new([:task, "localhost", 2, 1, "payload", :task, "name", 20, 0, 0, 1, 2, 0]).to_a
89
+ end
90
+
91
+
92
+ def test_worker_status_template
93
+ template = Skynet::WorkerStatusMessage.worker_status_template(:hostname => "localhost", :process_id => $$)
94
+ [:status,:worker, nil, "localhost", :skip, nil, nil, nil, nil, nil, nil, nil, nil, nil].each_with_index do |field, ii|
95
+ next if field == :skip
96
+ assert_equal field, template[ii]
97
+ end
98
+ end
99
+
100
+ def test_fallback_message
101
+ setup_task_message
102
+ fb = @task_message.fallback_task_message
103
+ test_fb = {:payload=>"payload",
104
+ :queue_id=>0,
105
+ :tasktype=>:task,
106
+ :name=>"name",
107
+ :payload_type=>:task,
108
+ :expiry=>20,
109
+ :drburi=>"localhost",
110
+ :expire_time=>1200599892,
111
+ :job_id=>1,
112
+ :iteration=>1,
113
+ :retry=>2,
114
+ :task_id=>2,
115
+ :version=>1}
116
+
117
+ test_fb.each do |key, val|
118
+ next if key == :expire_time
119
+ assert_equal val, fb.send(key)
120
+ end
121
+
122
+ end
123
+
124
+ def test_retry
125
+ setup_task_message
126
+ test_fb = {:payload=>"payload",
127
+ :queue_id=>0,
128
+ :tasktype=>:task,
129
+ :name=>"name",
130
+ :payload_type=>:task,
131
+ :expiry=>20,
132
+ :drburi=>"localhost",
133
+ :job_id=>1,
134
+ :retry=>2,
135
+ :task_id=>2,
136
+ :version=>1}
137
+
138
+ fb1 = @task_message.fallback_task_message
139
+ test_fb.merge(:iteration => 1).each do |k,v|
140
+ assert_equal v, fb1.send(k)
141
+ end
142
+
143
+ fb2 = fb1.fallback_task_message
144
+ test_fb.merge(:iteration => 2).each do |k,v|
145
+ assert_equal v, fb2.send(k)
146
+ end
147
+
148
+ fb3 = fb2.fallback_task_message
149
+ test_fb.merge(:iteration => -1).each do |k,v|
150
+ assert_equal v, fb3.send(k)
151
+ end
152
+ end
153
+
154
+ def test_next_task_template
155
+ template = Skynet::Message.next_task_template(0,:any, 99)
156
+ [:task, nil, nil, nil, nil, :any, nil, nil, :skip, 0..6, 0, nil, 99].each_with_index do |field, ii|
157
+ next if field == :skip
158
+ assert_equal field, template[ii]
159
+ end
160
+ end
161
+
162
+ def test_result_template
163
+ template = Skynet::Message.result_template(88,:task)
164
+ [:task, nil, nil, 88, nil, nil, nil, nil, nil, nil, nil, nil, nil].each_with_index do |field, ii|
165
+ assert_equal field, template[ii]
166
+ end
167
+ end
168
+
169
+ def test_result_message
170
+ setup_task_message
171
+ result = @task_message.result_message("result")
172
+ {
173
+ :payload=>"result",
174
+ :queue_id=>0,
175
+ :tasktype=>:result,
176
+ :name=>"name",
177
+ :payload_type=>:result,
178
+ :expiry=>20,
179
+ :drburi=>"localhost",
180
+ :expire_time=>0,
181
+ :job_id=>1,
182
+ :iteration=>0,
183
+ :retry=>2,
184
+ :task_id=>2,
185
+ :version=>1
186
+ }.each do |key, val|
187
+ assert_equal val, result.send(key)
188
+ end
189
+
190
+ end
191
+
192
+ def test_fallback_template
193
+ setup_task_message
194
+ template = @task_message.fallback_template
195
+ [:task, "localhost", 2, nil, nil, nil, nil, nil, nil, 1..6, 1, nil, 0].each_with_index do |field, ii|
196
+ assert_equal field, template[ii]
197
+ end
198
+ end
199
+
200
+ def test_no_retry
201
+ setup_task_message
202
+ @task_message.retry = 0
203
+ fb1 = @task_message.fallback_task_message
204
+ {
205
+ :payload=>"payload",
206
+ :queue_id=>0,
207
+ :tasktype=>:task,
208
+ :name=>"name",
209
+ :payload_type=>:task,
210
+ :expiry=>20,
211
+ :drburi=>"localhost",
212
+ :job_id=>1,
213
+ :iteration=>-1,
214
+ :retry=>0,
215
+ :task_id=>2,
216
+ :version=>1
217
+ }.each do |k,v|
218
+ assert_equal v, fb1.send(k)
219
+ end
220
+ end
221
+
222
+ def test_payload
223
+ setup_task_message
224
+ @task_message.payload = "hi"
225
+ assert_equal YAML::dump("hi"), @task_message.raw_payload
226
+ end
227
+
228
+
229
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class SkynetTaskTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Skynet.configure(
7
+ :ENABLE => false,
8
+ :SKYNET_LOG_FILE => STDOUT,
9
+ :SKYNET_LOG_LEVEL => Logger::ERROR
10
+ )
11
+ end
12
+
13
+ def test_master_task
14
+ job = Skynet::Job.new(:map_reduce_class => self.class, :async => true, :local_master => false, :solo => true)
15
+ master_task = Skynet::Task.master_task(job)
16
+ master_job = Skynet::Job.new(master_task.process)
17
+ assert_equal self.class.to_s, master_job.map
18
+ assert ! master_job.async
19
+ assert_equal true, master_job.local_master
20
+ end
21
+
22
+ def self.map(datas)
23
+ end
24
+ end
@@ -0,0 +1,174 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TuplespaceMessageQueueTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Skynet.configure(
7
+ :ENABLE => false,
8
+ # :SKYNET_PIDS_FILE => File.expand_path("#{RAILS_ROOT}/log/skynet_#{RAILS_ENV}.pids"),
9
+ :SKYNET_LOG_FILE => STDOUT,
10
+ :SKYNET_LOG_LEVEL => Logger::ERROR,
11
+ :SKYNET_LOCAL_MANAGER_URL => "druby://localhost:40000",
12
+ :MESSAGE_QUEUE_ADAPTER => "Skynet::MessageQueueAdapter::TupleSpace",
13
+ :TS_DRBURIS => ["druby://localhost:77647"],
14
+ :TS_USE_RINGSERVER => false
15
+ )
16
+ @ts ||= Rinda::TupleSpace.new
17
+ @@tss ||= DRb.start_service(Skynet::CONFIG[:TS_DRBURIS].first, @ts)
18
+ mq.clear_outstanding_tasks
19
+
20
+ @worker_message = Skynet::Message.new(
21
+ :tasktype => :task,
22
+ :drburi => "localhost",
23
+ :job_id => 1,
24
+ :task_id => 2,
25
+ :payload => "task",
26
+ :payload_type => "master",
27
+ :expiry => 20,
28
+ :expire_time => 0,
29
+ :iteration => 0,
30
+ :name => "test",
31
+ :version => 1,
32
+ :retry => 3,
33
+ :queue_id => 0
34
+ )
35
+
36
+ end
37
+
38
+ def test_tuple_space
39
+ @ts.write([:test])
40
+ assert_equal [:test], @ts.take([:test])
41
+
42
+ rts = DRbObject.new(nil, Skynet::CONFIG[:TS_DRBURIS].first)
43
+ rts.write([:test])
44
+ assert_equal [:test], rts.take([:test])
45
+ end
46
+
47
+ def test_tuplespace_ranges
48
+ tuple = [:test,10]
49
+ @ts.write(tuple)
50
+ assert_equal tuple, @ts.take([:test,0...11],0.00001)
51
+ write_tuple = [:task,"localhost", 2,1,"task","master","test",0.001,1195078587.001,1,1]
52
+ read_tuple = [:task, nil, nil, nil, nil, nil, nil, nil, 0...1195078588, 0..6, 1]
53
+ assert_equal write_tuple.size, read_tuple.size
54
+ @ts.write(write_tuple)
55
+ assert_equal write_tuple, @ts.take(read_tuple,0.00001)
56
+
57
+ write_tuple = [:task, "localhost", 2, 1, "task", "master", "test", 0.001, 1195079557.001, 1, 1]
58
+ read_tuple = [:task, nil, nil, nil, nil, nil, nil, nil, 0..1195079558, 0..6, 1]
59
+ assert_equal write_tuple.size, read_tuple.size
60
+ @ts.write(write_tuple)
61
+ assert_equal write_tuple, @ts.take(read_tuple,0.00001)
62
+ end
63
+
64
+ ### THE FOLLOWING TESTS THE MessageQueueProxy API
65
+
66
+ def test_write_message
67
+ assert mq.write_message(@worker_message,10)
68
+ assert_equal 1, mq.list_tasks.size
69
+ end
70
+
71
+ def test_take_next_task
72
+ assert mq.write_message(@worker_message,10)
73
+ assert_equal @worker_message.to_a, mq.take_next_task(1).to_a
74
+ end
75
+
76
+
77
+ def test_task_failover
78
+ message = @worker_message.clone
79
+ message.expiry=0.4
80
+ assert mq.write_message(message)
81
+ assert_equal message.to_a, mq.take_next_task(1).to_a
82
+ sleep 1
83
+ ntt = Skynet::Message.next_task_template(1,nil,0)
84
+ assert_equal 2, mq.take_next_task(1,0.00001).task_id
85
+ end
86
+
87
+ def test_write_and_take_result
88
+ assert mq.write_message(@worker_message,10)
89
+ message = mq.take_next_task(1)
90
+ set_result = {:blah => ['hi']}
91
+
92
+ mq.write_result(message,set_result,20)
93
+ assert mq.list_tasks.empty?
94
+ assert_equal 1, mq.list_results.size
95
+ result = mq.take_result(1)
96
+ assert_equal set_result, result.payload
97
+ end
98
+
99
+ def test_write_error
100
+ mq.write_message(@worker_message,10)
101
+ message = mq.take_next_task(1)
102
+ mq.write_error(message,"something_bad_happened",10)
103
+ result = mq.take_result(1)
104
+ assert_equal "something_bad_happened", result.payload
105
+ end
106
+
107
+ def test_write_complex_error
108
+ mq.write_message(@worker_message,10)
109
+ message = mq.take_next_task(1)
110
+ error = {:error => "something_bad_happened"}
111
+ mq.write_error(message,error,10)
112
+ result = mq.take_result(1)
113
+ assert_equal error, result.payload
114
+ end
115
+
116
+ def test_write_worker_status
117
+ assert mq.write_worker_status({
118
+ :worker_id => 5,
119
+ :hostname => 'localhost',
120
+ :process_id => $$,
121
+ :name => "waiting for master or tasks",
122
+ :processed => 0,
123
+ :version => 1,
124
+ :started_at => Time.now.to_i
125
+ })
126
+ end
127
+
128
+ def test_take_worker_status
129
+ assert mq.write_worker_status({
130
+ :worker_id => 5,
131
+ :hostname => 'localhost',
132
+ :process_id => $$,
133
+ :name => "waiting for master or tasks",
134
+ :processed => 0,
135
+ :version => 1,
136
+ :started_at => Time.now.to_i
137
+ })
138
+
139
+ status = mq.take_worker_status({:hostname => 'localhost',:process_id => $$ })
140
+ assert_equal $$, status.process_id
141
+ end
142
+
143
+ def test_read_all_worker_statuses
144
+ assert mq.write_worker_status({
145
+ :worker_id => 5,
146
+ :hostname => 'localhost',
147
+ :process_id => $$,
148
+ :name => "waiting for master or tasks",
149
+ :processed => 0,
150
+ :version => 1,
151
+ :started_at => Time.now.to_i
152
+ })
153
+ status = mq.read_all_worker_statuses.first
154
+
155
+ # status = mq.take_worker_status({:hostname => 'localhost',:process_id => $$ })
156
+ assert_equal $$, status.process_id
157
+ end
158
+
159
+ def test_worker_version
160
+ mq.set_worker_version(2)
161
+ assert_equal 2, mq.get_worker_version
162
+ mq.set_worker_version(10)
163
+ assert_equal 10, mq.get_worker_version
164
+ end
165
+
166
+
167
+
168
+
169
+ private
170
+ def mq
171
+ Skynet::MessageQueueAdapter::TupleSpace.new
172
+ end
173
+
174
+ end