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,359 @@
1
+ class Skynet
2
+ class Message
3
+
4
+ include SkynetDebugger
5
+
6
+ class BadMessage < Skynet::Error; end
7
+
8
+ class << self
9
+ attr_accessor :fields
10
+ end
11
+
12
+ self.fields = [
13
+ :tasktype,
14
+ :drburi,
15
+ :task_id,
16
+ :job_id,
17
+ :payload,
18
+ :payload_type,
19
+ :name,
20
+ :expiry,
21
+ :expire_time,
22
+ :iteration,
23
+ :version,
24
+ :retry,
25
+ :queue_id
26
+ ]
27
+
28
+ self.fields.each do |method|
29
+ next if [:payload, :tasktype, :payload_type].include?(method)
30
+ attr_accessor method
31
+ end
32
+
33
+ attr_reader :payload_type, :tasktype
34
+
35
+ def self.new_task_message(task,job)
36
+ self.new(
37
+ :job_id => job.job_id,
38
+ :expire_time => job.start_after,
39
+ :version => job.version,
40
+ :queue_id => job.queue_id || 0,
41
+ :iteration => 0,
42
+ :tasktype => :task,
43
+ :task_id => task.task_id,
44
+ :payload => task,
45
+ :payload_type => task.task_or_master,
46
+ :expiry => task.result_timeout,
47
+ :name => task.name,
48
+ :retry => task.retry
49
+ )
50
+ end
51
+
52
+ def initialize(opts)
53
+ if opts.is_a?(Array)
54
+ self.class.fields.each_with_index do |field, ii|
55
+ self.send("#{field}=",opts[ii] || nil)
56
+ end
57
+ elsif opts
58
+ self.class.fields.each do |field|
59
+ value = opts[field] || opts[field.to_s] || nil
60
+ self.send("#{field}=",value) if value
61
+ end
62
+ opts_raw_payload = opts[:raw_payload] || opts["raw_payload"]
63
+ if opts_raw_payload
64
+ self.raw_payload = opts_raw_payload
65
+ end
66
+ self.retry ||= 0
67
+ end
68
+ self.payload
69
+ end
70
+
71
+ def fields
72
+ self.class.fields
73
+ end
74
+
75
+ def tasktype=(ttype)
76
+ @tasktype = ttype.to_sym
77
+ end
78
+
79
+ def payload_type=(ptype)
80
+ @payload_type = ptype.to_sym if ptype
81
+ end
82
+
83
+ # alias for payload
84
+ def task
85
+ payload
86
+ end
87
+
88
+ def payload=(data)
89
+ @payload = data
90
+ self.raw_payload = data.to_yaml if data.respond_to?(:to_yaml) and not payload.kind_of?(Proc)
91
+ end
92
+
93
+ def payload
94
+ @payload ||= begin
95
+ YAML::load(self.raw_payload) if self.raw_payload
96
+ rescue Exception => e
97
+ raise BadMessage.new("Couldnt marshal payload #{e.inspect} #{e.backtrace.join("\n")}")
98
+ end
99
+ end
100
+
101
+ def raw_payload=(data)
102
+ @raw_payload = data
103
+ @payload=nil
104
+ end
105
+
106
+ def raw_payload
107
+ @raw_payload
108
+ end
109
+
110
+ def [](ii)
111
+ send(self.class.fields[ii])
112
+ end
113
+
114
+ def to_a
115
+ self.class.fields.collect do |field|
116
+ self.send(field)
117
+ end
118
+ end
119
+
120
+ def to_hash
121
+ hash = {}
122
+ self.class.fields.each do |field|
123
+ hash[field] = self.send(field)
124
+ end
125
+ hash
126
+ end
127
+
128
+ def to_h
129
+ to_hash
130
+ end
131
+
132
+ def to_s
133
+ to_a
134
+ end
135
+
136
+ def timeout
137
+ expire_time * 2
138
+ end
139
+
140
+ def self.next_task_template(version=nil, payload_type=nil, queue_id=0)
141
+ template = {
142
+ :expire_time => (0 .. Time.now.to_i),
143
+ :tasktype => :task,
144
+ :queue_id => queue_id,
145
+ :version => version,
146
+ :payload_type => payload_type,
147
+ :iteration => (0..Skynet::CONFIG[:MAX_RETRIES]),
148
+ }
149
+
150
+ fields.collect do |field|
151
+ template[field]
152
+ end
153
+ end
154
+
155
+ def self.result_template(job_id,tasktype=:result)
156
+ template = {
157
+ :tasktype => tasktype,
158
+ :job_id => job_id
159
+ }
160
+ fields.collect do |field|
161
+ template[field]
162
+ end
163
+ end
164
+
165
+ def self.result_message(message,result,tasktype=:result, resulttype=:result)
166
+ template = {
167
+ :tasktype => tasktype,
168
+ :payload => result,
169
+ :payload_type => resulttype
170
+ }
171
+
172
+ fields.each do |field|
173
+ template[field] = message.send(field) unless template.has_key?(field)
174
+ end
175
+ new(template)
176
+ end
177
+
178
+ def result_message(result,tasktype=:result, resulttype=:result)
179
+ self.class.result_message(self,result,tasktype,resulttype)
180
+ end
181
+
182
+ def self.outstanding_tasks_template(iteration=nil,queue_id=0)
183
+ template = {
184
+ :tasktype => :task,
185
+ :queue_id => queue_id,
186
+ :iteration => iteration
187
+ }
188
+ fields.collect do |field|
189
+ template[field]
190
+ end
191
+ end
192
+
193
+ def self.outstanding_results_template(queue_id=0)
194
+ template = {
195
+ :tasktype => :result,
196
+ :queue_id => queue_id
197
+ }
198
+ fields.collect do |field|
199
+ template[field]
200
+ end
201
+ end
202
+
203
+ def self.error_message(message,error)
204
+ result_message(message,error,:result,:error)
205
+ end
206
+
207
+ def error_message(error)
208
+ self.class.error_message(self,error)
209
+ end
210
+
211
+ def self.error_template(message)
212
+ template = {
213
+ :tasktype => message.tasktype,
214
+ :drburi => message.drburi,
215
+ :version => message.version,
216
+ :task_id => message.task_id,
217
+ :queue_id => message.queue_id
218
+ }
219
+ fields.collect do |field|
220
+ template[field]
221
+ end
222
+ end
223
+
224
+ def error_template
225
+ self.class.error_template(self)
226
+ end
227
+
228
+ def self.fallback_task_message(message)
229
+ template = {}
230
+ if message.retry
231
+ if (message.retry and message.iteration >= message.retry)
232
+ template[:iteration] = -1
233
+ else
234
+ template[:iteration] = message.iteration + 1
235
+ end
236
+ # Originally I was gonna do this for map and reduce, but we don't know that here, just whether its a master.
237
+ elsif message.payload_type.to_sym == :master and Skynet::CONFIG[:DEFAULT_MASTER_RETRY] and message.iteration >= Skynet::CONFIG[:DEFAULT_MASTER_RETRY]
238
+ template[:iteration] = -1
239
+ elsif Skynet::CONFIG[:MAX_RETRIES] and message.iteration >= Skynet::CONFIG[:MAX_RETRIES]
240
+ template[:iteration] = -1
241
+ else
242
+ template[:iteration] = message.iteration + 1
243
+ end
244
+
245
+ template[:expire_time] = Time.now.to_i + message.expiry
246
+
247
+ fields.each do |field|
248
+ template[field] = message.send(field) unless template.has_key?(field)
249
+ end
250
+ # debug "BUILDING NEXT FALLBACK TASK MESSAGE OFF"#, template
251
+ Skynet::Message.new(template)
252
+ end
253
+
254
+ def fallback_task_message
255
+ self.class.fallback_task_message(self)
256
+ end
257
+
258
+ def self.fallback_template(message)
259
+ template = {
260
+ :tasktype => message.tasktype,
261
+ :drburi => message.drburi,
262
+ :version => message.version,
263
+ :task_id => message.task_id,
264
+ :queue_id => message.queue_id,
265
+ :iteration => (1..Skynet::CONFIG[:MAX_RETRIES]),
266
+ }
267
+ fields.collect do |field|
268
+ template[field]
269
+ end
270
+ end
271
+
272
+ def fallback_template
273
+ self.class.fallback_template(self)
274
+ end
275
+
276
+ end ## END class Message
277
+
278
+ class WorkerVersionMessage < Skynet::Message
279
+
280
+ self.fields = self.superclass.fields
281
+
282
+ def initialize(opts)
283
+ super
284
+ self.expire_time ||= Time.now.to_i
285
+ self.tasktype = :current_worker_rev
286
+ end
287
+
288
+ def version
289
+ @version.to_i
290
+ end
291
+
292
+ def self.template
293
+ template = {
294
+ :tasktype => :current_worker_rev
295
+ }
296
+ fields.collect do |field|
297
+ template[field]
298
+ end
299
+ end
300
+
301
+ def template
302
+ template = {
303
+ :tasktype => :current_worker_rev,
304
+ :expire_time => nil
305
+ }
306
+ fields.collect do |field|
307
+ template[field] || self.send(field)
308
+ end
309
+ end
310
+ end
311
+
312
+ class WorkerStatusMessage < Skynet::Message
313
+ # I'd love to rename tasktype and tasksubtype to something more reasonable
314
+ self.fields = [
315
+ :tasktype,
316
+ :tasksubtype,
317
+ :worker_id,
318
+ :hostname,
319
+ :process_id,
320
+ :job_id,
321
+ :task_id,
322
+ :iteration,
323
+ :name,
324
+ :map_or_reduce,
325
+ :started_at,
326
+ :version,
327
+ :processed,
328
+ :queue_id
329
+ ]
330
+ self.fields.each { |method| attr_accessor method }
331
+
332
+ def initialize(opts)
333
+ super
334
+ self.tasksubtype = :worker
335
+ end
336
+
337
+ def self.worker_status_template(opts)
338
+ template = {
339
+ :tasksubtype => :worker,
340
+ :hostname => opts[:hostname],
341
+ :process_id => opts[:process_id]
342
+ }
343
+ fields.collect do |field|
344
+ template[field]
345
+ end
346
+ end
347
+
348
+ def self.all_workers_template(hostname=nil)
349
+ template = {
350
+ :tasksubtype => :worker,
351
+ :hostname => hostname,
352
+ }
353
+ fields.collect do |field|
354
+ template[field]
355
+ end
356
+ end
357
+ end # class WorkerStatusMessage
358
+
359
+ end
@@ -0,0 +1,136 @@
1
+ class Skynet
2
+
3
+ class Error < StandardError
4
+ end
5
+
6
+ class ConnectionError < Skynet::Error
7
+ end
8
+
9
+ class QueueTimeout < Skynet::Error
10
+ end
11
+
12
+ class RequestExpiredError < Skynet::Error
13
+ end
14
+
15
+ # This class is the interface to the Skynet Message Queue.
16
+ class MessageQueue
17
+
18
+ include SkynetDebugger
19
+
20
+ require 'forwardable'
21
+ extend Forwardable
22
+
23
+ def self.adapter
24
+ adapter_class.constantize.adapter
25
+ end
26
+
27
+ def self.adapter_class
28
+ Skynet::CONFIG[:MESSAGE_QUEUE_ADAPTER]
29
+ end
30
+
31
+ def self.start_or_connect(adapter_class = self.adapter_class)
32
+ begin
33
+ mq = new
34
+ rescue Skynet::ConnectionError
35
+ if self.adapter == :tuplespace
36
+ pid = fork do
37
+ exec("skynet_tuplespace_server start")
38
+ end
39
+ sleep 5
40
+ end
41
+ new
42
+ end
43
+ end
44
+
45
+ def initialize(message_queue_proxy_class=Skynet::CONFIG[:MESSAGE_QUEUE_ADAPTER])
46
+ mq
47
+ end
48
+
49
+ def self.message_queue_proxy_class
50
+ adapter_class.constantize
51
+ end
52
+
53
+ def message_queue_proxy_class
54
+ @message_queue_proxy_class ||= self.class.message_queue_proxy_class
55
+ end
56
+
57
+ # Is this version still active in the queue?
58
+ def version_active?(version,queue_id=0)
59
+ mq.version_active?(version,queue_id)
60
+ end
61
+
62
+ # Retrieves the current worker version
63
+ def get_worker_version
64
+ mq.get_worker_version
65
+ end
66
+
67
+ # Sets the current worker version (causing workers to restart)
68
+ def set_worker_version(version)
69
+ mq.set_worker_version(version)
70
+ end
71
+
72
+ # Increments the current worker version (causing workers to restart)
73
+ def increment_worker_version
74
+ newver = self.get_worker_version + 1
75
+ self.set_worker_version(newver)
76
+ newver
77
+ end
78
+
79
+ def mq
80
+ @mq ||= message_queue_proxy_class.new(
81
+ :use_ringserver => Skynet::CONFIG[:TS_USE_RINGSERVER],
82
+ :ringserver_hosts => Skynet::CONFIG[:TS_SERVER_HOSTS],
83
+ :drburi => Skynet::CONFIG[:TS_DRBURI]
84
+ )
85
+ end
86
+
87
+ def_delegators :mq, :take_next_task, :write_message, :take_result, :write_error, :write_result,
88
+ :list_tasks, :list_results, :clear_outstanding_tasks, :clear_outstanding_results, :stats
89
+
90
+
91
+
92
+ def message_fields
93
+ Skynet::Message.fields
94
+ end
95
+
96
+ def print_stats
97
+ "TAKEN TASKS: #{list_tasks(1).size}, UNTAKEN_TASKS: #{list_tasks(0).size} RESULTS: #{list_results.size}"
98
+ end
99
+
100
+ def list
101
+ list_tasks + list_results
102
+ end
103
+
104
+ def ansi_clear
105
+ puts "\033[2J\033[H"
106
+ end
107
+ end
108
+ end
109
+
110
+ # def monitor_view
111
+ # ws = Skynet::WorkerStatusMessage.new([:status, :worker])
112
+ # ms = Skynet::ManagerStatusMessage.new([:status, :manager])
113
+ # local_stats = self.stats
114
+ # stattxt = []
115
+ # stattxt << "Last Update Time: #{Time.now}\n"
116
+ # stattxt << '%10s %10s %10s' % ["Untaken", "Taken", "Results"]
117
+ # stattxt << '%10d %10d %10d' % [local_stats[:untaken_tasks], local_stats[:taken_tasks], local_stats[:results]]
118
+ # stattxt << '%3s %-20s %10s %20s %20s %5s %5s %10s %s' % ['#', 'hostname', 'process_id', 'job_id', 'task_id', 'ver', 'proc', 'm/r', 'name' ]
119
+ # messages = mq.read_all(ws).collect{|tuple| Skynet::WorkerStatusMessage.new(tuple)}
120
+ # messages.sort!{ |a,b| a.process_id <=> b.process_id }
121
+ # messages.each_with_index do |message,index|
122
+ # stattxt << '%3d %-20s %10d %20d %20d %5d %5d %10s %s' % [
123
+ # index,
124
+ # message.hostname,
125
+ # message.process_id,
126
+ # message.job_id,
127
+ # message.task_id,
128
+ # message.version,
129
+ # message.processed,
130
+ # message.map_or_reduce || '-' ,
131
+ # message.name
132
+ # ]
133
+ # end
134
+ # return stattxt.join("\n")
135
+ # end
136
+