Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Move to deprecated branches dir

  • Loading branch information...
commit 037b14cef43b5b5564cdb6c8d49cd94704ac4d31 1 parent 24426a5
authored

Showing 75 changed files with 10,890 additions and 0 deletions. Show diff stats Hide diff stats

  1. 118  ts_manager/History.txt
  2. 20  ts_manager/License.txt
  3. 489  ts_manager/Manifest.txt
  4. 186  ts_manager/README.txt
  5. 4  ts_manager/Rakefile
  6. 5  ts_manager/app_generators/skynet_install/USAGE
  7. 95  ts_manager/app_generators/skynet_install/skynet_install_generator.rb
  8. 66  ts_manager/app_generators/skynet_install/templates/migration.rb
  9. 41  ts_manager/app_generators/skynet_install/templates/skynet
  10. 9  ts_manager/app_generators/skynet_install/templates/skynet_initializer.rb
  11. 56  ts_manager/app_generators/skynet_install/templates/skynet_mysql_schema.sql
  12. 44  ts_manager/bin/skynet
  13. 36  ts_manager/bin/skynet_install
  14. 66  ts_manager/bin/skynet_tuplespace_server
  15. 75  ts_manager/config/hoe.rb
  16. 17  ts_manager/config/requirements.rb
  17. 7  ts_manager/extras/README
  18. 87  ts_manager/extras/init.d/skynet
  19. 121  ts_manager/extras/nagios/check_skynet.sh
  20. 41  ts_manager/extras/rails/controllers/skynet_controller.rb
  21. 137  ts_manager/extras/rails/views/skynet/index.rhtml
  22. 91  ts_manager/lib/skynet.rb
  23. 74  ts_manager/lib/skynet/mapreduce_helper.rb
  24. 56  ts_manager/lib/skynet/mapreduce_test.rb
  25. 70  ts_manager/lib/skynet/message_queue_adapters/message_queue_adapter.rb
  26. 502  ts_manager/lib/skynet/message_queue_adapters/mysql.rb
  27. 324  ts_manager/lib/skynet/message_queue_adapters/tuple_space.rb
  28. 280  ts_manager/lib/skynet/skynet_active_record_extensions.rb
  29. 233  ts_manager/lib/skynet/skynet_config.rb
  30. 50  ts_manager/lib/skynet/skynet_console.rb
  31. 66  ts_manager/lib/skynet/skynet_console_helper.rb
  32. 122  ts_manager/lib/skynet/skynet_debugger.rb
  33. 68  ts_manager/lib/skynet/skynet_guid_generator.rb
  34. 876  ts_manager/lib/skynet/skynet_job.rb
  35. 27  ts_manager/lib/skynet/skynet_launcher.rb
  36. 62  ts_manager/lib/skynet/skynet_logger.rb
  37. 644  ts_manager/lib/skynet/skynet_manager.rb
  38. 359  ts_manager/lib/skynet/skynet_message.rb
  39. 132  ts_manager/lib/skynet/skynet_message_queue.rb
  40. 93  ts_manager/lib/skynet/skynet_partitioners.rb
  41. 53  ts_manager/lib/skynet/skynet_ruby_extensions.rb
  42. 118  ts_manager/lib/skynet/skynet_task.rb
  43. 80  ts_manager/lib/skynet/skynet_tuplespace_server.rb
  44. 406  ts_manager/lib/skynet/skynet_worker.rb
  45. 19  ts_manager/lib/skynet/skynet_worker_queue.rb
  46. 9  ts_manager/lib/skynet/version.rb
  47. 71  ts_manager/lib/skynet/worker_queue_adapters/mysql.rb
  48. 49  ts_manager/lib/skynet/worker_queue_adapters/tuple_space.rb
  49. 0  ts_manager/log/debug.log
  50. 29  ts_manager/log/skynet.log
  51. 7  ts_manager/log/skynet_tuplespace_server.log
  52. 1  ts_manager/log/skynet_worker.pid
  53. 14  ts_manager/script/destroy
  54. 14  ts_manager/script/generate
  55. 74  ts_manager/script/txt2html
  56. 1,585  ts_manager/setup.rb
  57. 34  ts_manager/tasks/deployment.rake
  58. 7  ts_manager/tasks/environment.rake
  59. 17  ts_manager/tasks/website.rake
  60. 138  ts_manager/test/test_active_record_extensions.rb
  61. 20  ts_manager/test/test_generator_helper.rb
  62. 10  ts_manager/test/test_helper.rb
  63. 263  ts_manager/test/test_mysql_message_queue_adapter.rb
  64. 19  ts_manager/test/test_skynet.rb
  65. 49  ts_manager/test/test_skynet_install_generator.rb
  66. 717  ts_manager/test/test_skynet_job.rb
  67. 157  ts_manager/test/test_skynet_manager.rb
  68. 229  ts_manager/test/test_skynet_message.rb
  69. 24  ts_manager/test/test_skynet_task.rb
  70. 174  ts_manager/test/test_tuplespace_message_queue.rb
  71. 124  ts_manager/website/index.html
  72. 59  ts_manager/website/index.txt
  73. 285  ts_manager/website/javascripts/rounded_corners_lite.inc.js
  74. 138  ts_manager/website/stylesheets/screen.css
  75. 48  ts_manager/website/template.rhtml
118  ts_manager/History.txt
... ...
@@ -0,0 +1,118 @@
  1
+== 0.9.3 2008-04-10
  2
+ - Support starting Skynet with ./script/skynet start and stop to daemonize
  3
+ - Close file handles on exec.
  4
+     Skynet::Worker and Skynet::Manager now call Skynet.fork_and_exec instead of their own versions.
  5
+     Skynet.fork_and_exec prevents file descriptor exhaustion by calling Skynet.close_file_handles.
  6
+     Skynet::Manager detatches from console by calling Skynet.close_console
  7
+ - Added printlog logging method which always prints to the log as [LOG]
  8
+ - Deprecated Skynet.new to Skynet.start 
  9
+ - Mysql Message Queue Adapter - Make delete_expired_messages much safer.
  10
+ - ActiveRecord::Base.distributed_find - Patch submitted by Lourens Naude (lourens@methodmissing.com) which checks the model for the primary_key name as opposed to assuming it is
  11
+  'id'
  12
+ - We don't want to use rails constantize so I've temporarily borrowed the method from ActiveSupport inflector and added it to skynet_ruby_extensions.
  13
+ - Fix bug in Job comment where it referenced MapreduceTest instead of Skynet::MapreduceTest 
  14
+ - Fix tests. For some reason you still can't run ALL the test at once with rake test, but if the files are run individually they all pass.
  15
+
  16
+== 0.9.2 2008-01-22
  17
+Highlights: 
  18
+ - Multiple Message Queues
  19
+ - Many more Job options including options to control how jobs are distributed.
  20
+ - The various options for how a job is run has been made much clearer.
  21
+ - The Mysql Message Queue Adapter has been optimized and made more reliable.
  22
+ - You can now control how many times skynet retries failed master, map and reduce tasks.
  23
+ - Large data sets can now be streamed to the queue.
  24
+
  25
+Details:
  26
+
  27
+Active::Record#distributed_find
  28
+  - Active Record distributed_find now handles REALLY large sets by breaking them into seperate jobs. 1MM models per master broken into ranges of 1000.
  29
+
  30
+Skynet::Job
  31
+  - code path through Skynet::Job is now clear. There are 3 ways to run Skynet::Job. Local Master (default), Remote Master, Async (implies remote master)
  32
+  - Skynet::Job supports keep_map_tasks and keep_reduce_tasks settings.  
  33
+    If true, the master will run the tasks locally.
  34
+    If a number is provided, the master will run the tasks locally if there are LESS THAN OR EQUAL TO the number provided
  35
+    There are also Skynet::CONFIG settings for defaults. DEFAULT_KEEP_REDUCE_TASKS, DEFAULT_KEEP_MAP_TASKS
  36
+    I can see there being a problem with the timeouts being a little off... Since your kinda in a master and kinda in a map or reduce timeout.  The task timeouts will be correct at least.  Though, you won't get the benefit of redoes yet.
  37
+  - Skynet::Job now supports setting RETRY times per job by MASTER, MAP and REDUCE. So you can have a MASTER_RETRY=0, but have MAP_RETRY=2 and REDUCE_RETRY=3.  There are now defaults for those as well :DEFAULT_MASTER_RETRY, :DEFAULT_MAP_RETRY, :DEFAULT_REDUCE_RETRY.    If a message passes its RETRY it will be marked with an iteration of -1.   delete_expired_messages removes those messages as well.  These show up in the stats as :failed_tasks.  Skynet::Task and Skynet::Message now have retry fields denoting the maximum number of retries.
  38
+  - You can now pass queue_id or queue to Skynet::Job
  39
+  - There is now a :MAX_RETRIES config setting that controls how many iterations Skynet will even look for tasks as well.
  40
+  - You can now stream map_data to the queue by passing an Enumerable for your map_data
  41
+  - Refactored Skynet::Job to be much cleaner and easier to test. 
  42
+  - Skynet::Job now has access to a local queue which it can treat almost like the real one.
  43
+  - deprecate Skynet::Job#run_master
  44
+  - rename reduce_partitioner method to just reduce_partition
  45
+  - Skynet::Job has better support for running tasks locally.  A job may run tasks in its own process if
  46
+    you are running in solo mode, you've made a "single" job, or you set the keep_map_tasks or keep_reduce_tasks below.
  47
+    When a job runs tasks locally it now honors the retry settings and timeouts.  
  48
+  - Skynet::Job and Skynet::AsyncJob are now almost identical.  In fact you can just use Skynet::Job and tell it to run async.  
  49
+  - Skynet::Job Changed map_tasks and reduce_tasks to mappers and reducers respectively.  This was to remove the ambiguity between the actual map/reduce tasks and the number of mappers/reducers desired.
  50
+  - Skynet::Jobs can not be told what queue to use for that job by passing :queue or :queue_id DEFAULT 0
  51
+  - Skynet::Job won't call the reduce_partitioner if there are no valid results from the map_step.
  52
+
  53
+MapreduceHelper mixin
  54
+  - You can include MapreduceHelper into your class and then implement self.map_each and self.reduce_each methods.  The included self.map and self.reduce methods will handle iterating over the map_data and reduce_data, passing each element to your map_each and reduce_each methods respectively.  They will also handle error handling within that loop to make sure even if a single map or reduce fails, processing will continue.  If you do not want processing to continue if a map fails, do not use the MapreduceHelper mixin.
  55
+
  56
+Multiple Message Queues!
  57
+  - Add the ability to have multiple message queues in the same table message_queue_table. 
  58
+  - You can start skynet with a --queue_id or --queue option to determine which queue workers should look in.
  59
+  - Skynet::Jobs can not be told what queue to use for that job by passing :queue or :queue_id.  DEFAULT 0
  60
+  - Queues can be configred via Skynet::CONFIG[:MESSAGE_QUEUES] = [] which comes with an array of queues id 1 through 10 named "one" through "ten"
  61
+
  62
+Skynet Console
  63
+  - You now start the skynet console by running 'skynet console' at the command line.   There is no longer a skynet_console app.
  64
+  - The console now loads the configs that are in your local skynet script.
  65
+  
  66
+Skynet::Config
  67
+  - Added Skynet.silent {} Runs your code with no debugging output.
  68
+  - Made sure all config options for TupleSpace? adapter begin with TS and all Mysql adapter CONFIG settings start with MYSQL.        
  69
+  - There is now a :MAX_RETRIES config setting that controls how many iterations Skynet will even look for tasks as well.
  70
+
  71
+Skynet::Partitioners
  72
+  - Created a Skynet::Partitioners class where various partitioners can be found.  To specify one of them merely provide that specific Skynet::Partitioners subclass as your reduce_partitioner in your Skynet::Job
  73
+
  74
+Skynet Install
  75
+ - skynet_install now has a --mysql option.  This installs the migration as well as a skynet_schema.sql file.
  76
+
  77
+Mysql Message Queue Adapter
  78
+  - You can now configure your database options outside of rails with Skynet::CONFIG[:MYSQL_*] options.
  79
+  - Mysql adapter now updates the updated_on time of rows in skynet_message_queues
  80
+  - Fixed Mysql Message Adaptor to take_next_task safer and more efficiently.   There seems to be far less risk of a race condition where two workers would take the same task.
  81
+  - Eliminated 1 db update per every task taken making it MUCH more efficient.
  82
+  - Skynet::MessageQueueAdaptor::Mysql now tries to reconnect if it gets disconnected.   This was to solve the "Mysql Server has Gone Away" errors.
  83
+  - Implemented version_active? in mysql message queue adapter.   It's a way for workers to check to see if a version is still in the queue.  
  84
+  
  85
+Skynet::Task
  86
+  - Skynet::Task#master_task takes care of creating the master job and task now. I have mixed feelings about this.
  87
+  - ENFORCED TIMEOUTS - Even though a master might give up on a worker if it didn't respond in time, there was nothing to step any given worker from running forever.  We now enforce the timeouts (master_timeout, map_timeout, reduce_timeout) given in Skynet::Job using the Timeout module.  This causes a Timeout::Error to be thrown.   If you are using the mysql adapter, this can cause strange results sometimes.   If the Timeout error is thrown during a DB query, ActiveRecord will throw an ActiveRecord::StatementInvalid exception which includes the Timeout::Error exception in it.  Not sure how to prevent that from happening.
  88
+
  89
+Skynet::Worker
  90
+  - Workers now have a Skynet::CONFIG[:WORKER_MAX_PROCESSED] setting to control when to respawn based on how many that worker has processed.
  91
+  - You can start skynet with a --queue_id or --queue option to determine which queue workers should look in.
  92
+  - Workers do not restart until there are no more items in the queue of that version.
  93
+
  94
+Skynet::Message
  95
+  - Skynet::Message now stores fields as an array.  It is far more efficient now as well.
  96
+
  97
+Now 90% more Tests!
  98
+
  99
+BUGFIXES
  100
+- Skynet Workers now restart properly when the worker_version changes.
  101
+- starting tuplespce_server, you no longer need to provide the --port if you're already providing the drburi- 
  102
+- Fixed a bug where Skynet::MessageQueueAdapter::Mysql would sometimes pick up tasks another worker had already picked up.
  103
+- Fix bug in Skynet::Worker where it wouldn't die right if the max processed was reached. 
  104
+- Workers were supposed to restart when the worker_version changed.  They do that properly now.
  105
+
  106
+Thanks to Jason Rimmer for finding these bugs.
  107
+- Fix bug in Skynet::Message where it would calculate the iteration improperly.
  108
+- The skynet gem appears to be missing the Rubigen dependency
  109
+- Running skynet_install even without the rails arg still generates code with rails dependencies and tailings: RAILS_ROOT, RAILS_ENV, and the various directory tailings such as 'db/migrate', etc.
  110
+- Generated skynet script is missing "require 'rubygems'"
  111
+- Specification of pid directory and file is incorrect as 'skynet_manager.rb' wants only a directory with it specifying the file
  112
+- The sleep while waiting to start the queue server isn't long enough. There is now a CONFIG setting TS_SERVER_START_DELAY.
  113
+
  114
+
  115
+== 0.0.1 2007-12-16
  116
+
  117
+* 1 major enhancement:
  118
+  * Initial release
20  ts_manager/License.txt
... ...
@@ -0,0 +1,20 @@
  1
+Copyright (c) 2007 Adam Pisoni, Geni.com
  2
+
  3
+Permission is hereby granted, free of charge, to any person obtaining
  4
+a copy of this software and associated documentation files (the
  5
+"Software"), to deal in the Software without restriction, including
  6
+without limitation the rights to use, copy, modify, merge, publish,
  7
+distribute, sublicense, and/or sell copies of the Software, and to
  8
+permit persons to whom the Software is furnished to do so, subject to
  9
+the following conditions:
  10
+
  11
+The above copyright notice and this permission notice shall be
  12
+included in all copies or substantial portions of the Software.
  13
+
  14
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  16
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  17
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  18
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  19
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
489  ts_manager/Manifest.txt
... ...
@@ -0,0 +1,489 @@
  1
+History.txt
  2
+License.txt
  3
+Manifest.txt
  4
+README.txt
  5
+Rakefile
  6
+app_generators/skynet_install/USAGE
  7
+app_generators/skynet_install/skynet_install_generator.rb
  8
+app_generators/skynet_install/templates/migration.rb
  9
+app_generators/skynet_install/templates/skynet
  10
+app_generators/skynet_install/templates/skynet_initializer.rb
  11
+app_generators/skynet_install/templates/skynet_mysql_schema.sql
  12
+bin/skynet
  13
+bin/skynet_install
  14
+bin/skynet_tuplespace_server
  15
+config/hoe.rb
  16
+config/requirements.rb
  17
+extras/README
  18
+extras/init.d/skynet
  19
+extras/nagios/check_skynet.sh
  20
+extras/rails/controllers/skynet_controller.rb
  21
+extras/rails/views/skynet/index.rhtml
  22
+lib/skynet.rb
  23
+lib/skynet/mapreduce_helper.rb
  24
+lib/skynet/mapreduce_test.rb
  25
+lib/skynet/message_queue_adapters/message_queue_adapter.rb
  26
+lib/skynet/message_queue_adapters/mysql.rb
  27
+lib/skynet/message_queue_adapters/tuple_space.rb
  28
+lib/skynet/skynet_active_record_extensions.rb
  29
+lib/skynet/skynet_config.rb
  30
+lib/skynet/skynet_console.rb
  31
+lib/skynet/skynet_console_helper.rb
  32
+lib/skynet/skynet_debugger.rb
  33
+lib/skynet/skynet_guid_generator.rb
  34
+lib/skynet/skynet_job.rb
  35
+lib/skynet/skynet_launcher.rb
  36
+lib/skynet/skynet_logger.rb
  37
+lib/skynet/skynet_manager.rb
  38
+lib/skynet/skynet_message.rb
  39
+lib/skynet/skynet_message_queue.rb
  40
+lib/skynet/skynet_partitioners.rb
  41
+lib/skynet/skynet_ruby_extensions.rb
  42
+lib/skynet/skynet_task.rb
  43
+lib/skynet/skynet_tuplespace_server.rb
  44
+lib/skynet/skynet_worker.rb
  45
+lib/skynet/skynet_worker_queue.rb
  46
+lib/skynet/version.rb
  47
+lib/skynet/worker_queue_adapters/mysql.rb
  48
+lib/skynet/worker_queue_adapters/tuple_space.rb
  49
+log/debug.log
  50
+log/skynet.log
  51
+log/skynet_tuplespace_server.log
  52
+log/skynet_worker.pid
  53
+script/destroy
  54
+script/generate
  55
+script/txt2html
  56
+setup.rb
  57
+tasks/deployment.rake
  58
+tasks/environment.rake
  59
+tasks/website.rake
  60
+test/test_active_record_extensions.rb
  61
+test/test_generator_helper.rb
  62
+test/test_helper.rb
  63
+test/test_mysql_message_queue_adapter.rb
  64
+test/test_skynet.rb
  65
+test/test_skynet_install_generator.rb
  66
+test/test_skynet_job.rb
  67
+test/test_skynet_manager.rb
  68
+test/test_skynet_message.rb
  69
+test/test_skynet_task.rb
  70
+test/test_tuplespace_message_queue.rb
  71
+tmtags
  72
+website/doc/classes/ActiveRecord.html
  73
+website/doc/classes/ActiveRecord/Base.html
  74
+website/doc/classes/ActiveRecord/Base.src/M000307.html
  75
+website/doc/classes/ActiveRecord/Mapreduce.html
  76
+website/doc/classes/ActiveRecord/Mapreduce.src/M000293.html
  77
+website/doc/classes/ActiveRecord/Mapreduce.src/M000294.html
  78
+website/doc/classes/ActiveRecord/Mapreduce.src/M000295.html
  79
+website/doc/classes/ActiveRecord/Mapreduce.src/M000296.html
  80
+website/doc/classes/ActiveRecord/Mapreduce.src/M000297.html
  81
+website/doc/classes/ActiveRecord/Mapreduce.src/M000298.html
  82
+website/doc/classes/ActiveRecord/Mapreduce.src/M000299.html
  83
+website/doc/classes/ActiveRecord/Mapreduce.src/M000300.html
  84
+website/doc/classes/ActiveRecord/Mapreduce.src/M000301.html
  85
+website/doc/classes/ActiveRecord/Mapreduce.src/M000303.html
  86
+website/doc/classes/ActiveRecord/Mapreduce.src/M000304.html
  87
+website/doc/classes/ActiveRecord/Mapreduce.src/M000305.html
  88
+website/doc/classes/ActiveRecord/Mapreduce.src/M000306.html
  89
+website/doc/classes/Enumerable.html
  90
+website/doc/classes/Enumerable.src/M000308.html
  91
+website/doc/classes/ExceptionReport.html
  92
+website/doc/classes/ExceptionReport.src/M000001.html
  93
+website/doc/classes/ExceptionReport.src/M000002.html
  94
+website/doc/classes/MapreduceHelper.html
  95
+website/doc/classes/MapreduceHelper.src/M000312.html
  96
+website/doc/classes/MapreduceHelper.src/M000313.html
  97
+website/doc/classes/MapreduceHelper.src/M000314.html
  98
+website/doc/classes/Rinda.html
  99
+website/doc/classes/Rinda/Tuple.html
  100
+website/doc/classes/Rinda/Tuple.src/M000309.html
  101
+website/doc/classes/Rinda/TupleSpaceProxy.html
  102
+website/doc/classes/Rinda/TupleSpaceProxy.src/M000310.html
  103
+website/doc/classes/Rinda/TupleSpaceProxy.src/M000311.html
  104
+website/doc/classes/Skynet/AbstractClassError.html
  105
+website/doc/classes/Skynet/ActiveRecordAsync.html
  106
+website/doc/classes/Skynet/ActiveRecordAsync.src/M000101.html
  107
+website/doc/classes/Skynet/AsyncJob.html
  108
+website/doc/classes/Skynet/AsyncJob.src/M000070.html
  109
+website/doc/classes/Skynet/AsyncJob.src/M000071.html
  110
+website/doc/classes/Skynet/AsyncJob.src/M000072.html
  111
+website/doc/classes/Skynet/Config.html
  112
+website/doc/classes/Skynet/Config.src/M000073.html
  113
+website/doc/classes/Skynet/Config.src/M000074.html
  114
+website/doc/classes/Skynet/Config.src/M000075.html
  115
+website/doc/classes/Skynet/Config.src/M000076.html
  116
+website/doc/classes/Skynet/Config.src/M000077.html
  117
+website/doc/classes/Skynet/ConnectionError.html
  118
+website/doc/classes/Skynet/Console.html
  119
+website/doc/classes/Skynet/Console.src/M000100.html
  120
+website/doc/classes/Skynet/ConsoleHelper.html
  121
+website/doc/classes/Skynet/ConsoleHelper.src/M000011.html
  122
+website/doc/classes/Skynet/ConsoleHelper.src/M000012.html
  123
+website/doc/classes/Skynet/ConsoleHelper.src/M000013.html
  124
+website/doc/classes/Skynet/ConsoleHelper.src/M000014.html
  125
+website/doc/classes/Skynet/ConsoleHelper.src/M000015.html
  126
+website/doc/classes/Skynet/ConsoleHelper.src/M000016.html
  127
+website/doc/classes/Skynet/ConsoleHelper.src/M000017.html
  128
+website/doc/classes/Skynet/ConsoleHelper.src/M000018.html
  129
+website/doc/classes/Skynet/ConsoleHelper.src/M000019.html
  130
+website/doc/classes/Skynet/ConsoleHelper.src/M000020.html
  131
+website/doc/classes/Skynet/Error.html
  132
+website/doc/classes/Skynet/GuidGenerator.html
  133
+website/doc/classes/Skynet/GuidGenerator.src/M000004.html
  134
+website/doc/classes/Skynet/InvalidMessage.html
  135
+website/doc/classes/Skynet/Job.html
  136
+website/doc/classes/Skynet/Job.src/M000208.html
  137
+website/doc/classes/Skynet/Job.src/M000209.html
  138
+website/doc/classes/Skynet/Job.src/M000210.html
  139
+website/doc/classes/Skynet/Job.src/M000211.html
  140
+website/doc/classes/Skynet/Job.src/M000212.html
  141
+website/doc/classes/Skynet/Job.src/M000213.html
  142
+website/doc/classes/Skynet/Job.src/M000214.html
  143
+website/doc/classes/Skynet/Job.src/M000215.html
  144
+website/doc/classes/Skynet/Job.src/M000216.html
  145
+website/doc/classes/Skynet/Job.src/M000217.html
  146
+website/doc/classes/Skynet/Job.src/M000218.html
  147
+website/doc/classes/Skynet/Job.src/M000219.html
  148
+website/doc/classes/Skynet/Job.src/M000220.html
  149
+website/doc/classes/Skynet/Job.src/M000221.html
  150
+website/doc/classes/Skynet/Job.src/M000222.html
  151
+website/doc/classes/Skynet/Job.src/M000223.html
  152
+website/doc/classes/Skynet/Job.src/M000224.html
  153
+website/doc/classes/Skynet/Job.src/M000225.html
  154
+website/doc/classes/Skynet/Job.src/M000226.html
  155
+website/doc/classes/Skynet/Job.src/M000227.html
  156
+website/doc/classes/Skynet/Job.src/M000228.html
  157
+website/doc/classes/Skynet/Job.src/M000229.html
  158
+website/doc/classes/Skynet/Job.src/M000230.html
  159
+website/doc/classes/Skynet/Job.src/M000231.html
  160
+website/doc/classes/Skynet/Job.src/M000232.html
  161
+website/doc/classes/Skynet/Job.src/M000233.html
  162
+website/doc/classes/Skynet/Job.src/M000234.html
  163
+website/doc/classes/Skynet/Job.src/M000235.html
  164
+website/doc/classes/Skynet/Job.src/M000236.html
  165
+website/doc/classes/Skynet/Job.src/M000237.html
  166
+website/doc/classes/Skynet/Job.src/M000238.html
  167
+website/doc/classes/Skynet/Job.src/M000239.html
  168
+website/doc/classes/Skynet/Job.src/M000240.html
  169
+website/doc/classes/Skynet/Job.src/M000241.html
  170
+website/doc/classes/Skynet/Job.src/M000242.html
  171
+website/doc/classes/Skynet/Job.src/M000243.html
  172
+website/doc/classes/Skynet/Job.src/M000244.html
  173
+website/doc/classes/Skynet/Job.src/M000245.html
  174
+website/doc/classes/Skynet/Job.src/M000246.html
  175
+website/doc/classes/Skynet/Job.src/M000247.html
  176
+website/doc/classes/Skynet/Job.src/M000248.html
  177
+website/doc/classes/Skynet/Job.src/M000249.html
  178
+website/doc/classes/Skynet/Job.src/M000250.html
  179
+website/doc/classes/Skynet/Job.src/M000251.html
  180
+website/doc/classes/Skynet/Job.src/M000252.html
  181
+website/doc/classes/Skynet/Job.src/M000253.html
  182
+website/doc/classes/Skynet/Job/BadMapOrReduceError.html
  183
+website/doc/classes/Skynet/Job/Error.html
  184
+website/doc/classes/Skynet/Job/LocalMessageQueue.html
  185
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000254.html
  186
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000255.html
  187
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000256.html
  188
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000257.html
  189
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000258.html
  190
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000259.html
  191
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000260.html
  192
+website/doc/classes/Skynet/Job/LocalMessageQueue.src/M000261.html
  193
+website/doc/classes/Skynet/Job/WorkerError.html
  194
+website/doc/classes/Skynet/Loggable.html
  195
+website/doc/classes/Skynet/Loggable.src/M000005.html
  196
+website/doc/classes/Skynet/Loggable.src/M000006.html
  197
+website/doc/classes/Skynet/Loggable.src/M000007.html
  198
+website/doc/classes/Skynet/Loggable.src/M000008.html
  199
+website/doc/classes/Skynet/Loggable.src/M000009.html
  200
+website/doc/classes/Skynet/Loggable.src/M000010.html
  201
+website/doc/classes/Skynet/Logger.html
  202
+website/doc/classes/Skynet/Logger.src/M000269.html
  203
+website/doc/classes/Skynet/Logger.src/M000270.html
  204
+website/doc/classes/Skynet/Manager.html
  205
+website/doc/classes/Skynet/Manager.src/M000168.html
  206
+website/doc/classes/Skynet/Manager.src/M000169.html
  207
+website/doc/classes/Skynet/Manager.src/M000170.html
  208
+website/doc/classes/Skynet/Manager.src/M000171.html
  209
+website/doc/classes/Skynet/Manager.src/M000172.html
  210
+website/doc/classes/Skynet/Manager.src/M000173.html
  211
+website/doc/classes/Skynet/Manager.src/M000174.html
  212
+website/doc/classes/Skynet/Manager.src/M000175.html
  213
+website/doc/classes/Skynet/Manager.src/M000176.html
  214
+website/doc/classes/Skynet/Manager.src/M000177.html
  215
+website/doc/classes/Skynet/Manager.src/M000178.html
  216
+website/doc/classes/Skynet/Manager.src/M000179.html
  217
+website/doc/classes/Skynet/Manager.src/M000180.html
  218
+website/doc/classes/Skynet/Manager.src/M000181.html
  219
+website/doc/classes/Skynet/Manager.src/M000182.html
  220
+website/doc/classes/Skynet/Manager.src/M000183.html
  221
+website/doc/classes/Skynet/Manager.src/M000184.html
  222
+website/doc/classes/Skynet/Manager.src/M000185.html
  223
+website/doc/classes/Skynet/Manager.src/M000186.html
  224
+website/doc/classes/Skynet/Manager.src/M000187.html
  225
+website/doc/classes/Skynet/Manager.src/M000188.html
  226
+website/doc/classes/Skynet/Manager.src/M000189.html
  227
+website/doc/classes/Skynet/Manager.src/M000190.html
  228
+website/doc/classes/Skynet/Manager.src/M000191.html
  229
+website/doc/classes/Skynet/Manager.src/M000192.html
  230
+website/doc/classes/Skynet/Manager.src/M000193.html
  231
+website/doc/classes/Skynet/Manager.src/M000194.html
  232
+website/doc/classes/Skynet/Manager.src/M000195.html
  233
+website/doc/classes/Skynet/Manager.src/M000196.html
  234
+website/doc/classes/Skynet/Manager.src/M000197.html
  235
+website/doc/classes/Skynet/Manager.src/M000198.html
  236
+website/doc/classes/Skynet/Manager.src/M000199.html
  237
+website/doc/classes/Skynet/Manager/Error.html
  238
+website/doc/classes/Skynet/MapreduceTest.html
  239
+website/doc/classes/Skynet/MapreduceTest.src/M000271.html
  240
+website/doc/classes/Skynet/MapreduceTest.src/M000272.html
  241
+website/doc/classes/Skynet/Message.html
  242
+website/doc/classes/Skynet/Message.src/M000021.html
  243
+website/doc/classes/Skynet/Message.src/M000022.html
  244
+website/doc/classes/Skynet/Message.src/M000023.html
  245
+website/doc/classes/Skynet/Message.src/M000024.html
  246
+website/doc/classes/Skynet/Message.src/M000025.html
  247
+website/doc/classes/Skynet/Message.src/M000026.html
  248
+website/doc/classes/Skynet/Message.src/M000027.html
  249
+website/doc/classes/Skynet/Message.src/M000028.html
  250
+website/doc/classes/Skynet/Message.src/M000029.html
  251
+website/doc/classes/Skynet/Message.src/M000030.html
  252
+website/doc/classes/Skynet/Message.src/M000031.html
  253
+website/doc/classes/Skynet/Message.src/M000032.html
  254
+website/doc/classes/Skynet/Message.src/M000033.html
  255
+website/doc/classes/Skynet/Message.src/M000034.html
  256
+website/doc/classes/Skynet/Message.src/M000035.html
  257
+website/doc/classes/Skynet/Message.src/M000036.html
  258
+website/doc/classes/Skynet/Message.src/M000037.html
  259
+website/doc/classes/Skynet/Message.src/M000038.html
  260
+website/doc/classes/Skynet/Message.src/M000039.html
  261
+website/doc/classes/Skynet/Message.src/M000040.html
  262
+website/doc/classes/Skynet/Message.src/M000041.html
  263
+website/doc/classes/Skynet/Message.src/M000042.html
  264
+website/doc/classes/Skynet/Message.src/M000043.html
  265
+website/doc/classes/Skynet/Message.src/M000044.html
  266
+website/doc/classes/Skynet/Message.src/M000045.html
  267
+website/doc/classes/Skynet/Message.src/M000046.html
  268
+website/doc/classes/Skynet/Message.src/M000047.html
  269
+website/doc/classes/Skynet/Message.src/M000048.html
  270
+website/doc/classes/Skynet/Message.src/M000049.html
  271
+website/doc/classes/Skynet/Message.src/M000050.html
  272
+website/doc/classes/Skynet/Message/BadMessage.html
  273
+website/doc/classes/Skynet/Message/Payload.html
  274
+website/doc/classes/Skynet/MessageQueue.html
  275
+website/doc/classes/Skynet/MessageQueue.src/M000078.html
  276
+website/doc/classes/Skynet/MessageQueue.src/M000079.html
  277
+website/doc/classes/Skynet/MessageQueue.src/M000080.html
  278
+website/doc/classes/Skynet/MessageQueue.src/M000081.html
  279
+website/doc/classes/Skynet/MessageQueue.src/M000082.html
  280
+website/doc/classes/Skynet/MessageQueue.src/M000083.html
  281
+website/doc/classes/Skynet/MessageQueue.src/M000084.html
  282
+website/doc/classes/Skynet/MessageQueue.src/M000085.html
  283
+website/doc/classes/Skynet/MessageQueue.src/M000086.html
  284
+website/doc/classes/Skynet/MessageQueue.src/M000087.html
  285
+website/doc/classes/Skynet/MessageQueue.src/M000088.html
  286
+website/doc/classes/Skynet/MessageQueueAdapter.html
  287
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000102.html
  288
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000103.html
  289
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000104.html
  290
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000105.html
  291
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000106.html
  292
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000107.html
  293
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000108.html
  294
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000109.html
  295
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000110.html
  296
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000111.html
  297
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000112.html
  298
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000113.html
  299
+website/doc/classes/Skynet/MessageQueueAdapter.src/M000114.html
  300
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.html
  301
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000134.html
  302
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000135.html
  303
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000136.html
  304
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000137.html
  305
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000138.html
  306
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000139.html
  307
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000140.html
  308
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000141.html
  309
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000142.html
  310
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000143.html
  311
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000144.html
  312
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000145.html
  313
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000146.html
  314
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000147.html
  315
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000148.html
  316
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000149.html
  317
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000150.html
  318
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000151.html
  319
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000152.html
  320
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000153.html
  321
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000154.html
  322
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000155.html
  323
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000156.html
  324
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000157.html
  325
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000158.html
  326
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000159.html
  327
+website/doc/classes/Skynet/MessageQueueAdapter/Mysql.src/M000160.html
  328
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.html
  329
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000115.html
  330
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000116.html
  331
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000117.html
  332
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000118.html
  333
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000119.html
  334
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000120.html
  335
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000121.html
  336
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000122.html
  337
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000123.html
  338
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000124.html
  339
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000125.html
  340
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000126.html
  341
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000127.html
  342
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000128.html
  343
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000129.html
  344
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000130.html
  345
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000131.html
  346
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000132.html
  347
+website/doc/classes/Skynet/MessageQueueAdapter/TupleSpace.src/M000133.html
  348
+website/doc/classes/Skynet/Partitioners.html
  349
+website/doc/classes/Skynet/Partitioners/ArrayDataSplitByFirstEntry.html
  350
+website/doc/classes/Skynet/Partitioners/ArrayDataSplitByFirstEntry.src/M000163.html
  351
+website/doc/classes/Skynet/Partitioners/RecombineAndSplit.html
  352
+website/doc/classes/Skynet/Partitioners/RecombineAndSplit.src/M000162.html
  353
+website/doc/classes/Skynet/Partitioners/SimplePartitionData.html
  354
+website/doc/classes/Skynet/Partitioners/SimplePartitionData.src/M000161.html
  355
+website/doc/classes/Skynet/ProfileCountTest.html
  356
+website/doc/classes/Skynet/ProfileCountTest.src/M000204.html
  357
+website/doc/classes/Skynet/ProfileCountTest.src/M000205.html
  358
+website/doc/classes/Skynet/ProfileCountTest.src/M000206.html
  359
+website/doc/classes/Skynet/QueueTimeout.html
  360
+website/doc/classes/Skynet/RequestExpiredError.html
  361
+website/doc/classes/Skynet/Server.html
  362
+website/doc/classes/Skynet/Server.src/M000207.html
  363
+website/doc/classes/Skynet/Task.html
  364
+website/doc/classes/Skynet/Task.src/M000089.html
  365
+website/doc/classes/Skynet/Task.src/M000090.html
  366
+website/doc/classes/Skynet/Task.src/M000091.html
  367
+website/doc/classes/Skynet/Task.src/M000092.html
  368
+website/doc/classes/Skynet/Task.src/M000093.html
  369
+website/doc/classes/Skynet/Task.src/M000094.html
  370
+website/doc/classes/Skynet/Task.src/M000095.html
  371
+website/doc/classes/Skynet/Task.src/M000096.html
  372
+website/doc/classes/Skynet/Task/ConstructorError.html
  373
+website/doc/classes/Skynet/Task/TimeoutError.html
  374
+website/doc/classes/Skynet/TaskIterator.html
  375
+website/doc/classes/Skynet/TaskIterator.src/M000262.html
  376
+website/doc/classes/Skynet/TaskIterator.src/M000263.html
  377
+website/doc/classes/Skynet/TaskIterator.src/M000264.html
  378
+website/doc/classes/Skynet/TaskIterator.src/M000265.html
  379
+website/doc/classes/Skynet/TaskIterator.src/M000266.html
  380
+website/doc/classes/Skynet/TaskIterator.src/M000267.html
  381
+website/doc/classes/Skynet/TaskIterator.src/M000268.html
  382
+website/doc/classes/Skynet/TaskIterator/Error.html
  383
+website/doc/classes/Skynet/UniqueDBNumGenerator.html
  384
+website/doc/classes/Skynet/UniqueDBNumGenerator.src/M000200.html
  385
+website/doc/classes/Skynet/UniqueDBNumGenerator.src/M000201.html
  386
+website/doc/classes/Skynet/UniqueDBNumGenerator.src/M000202.html
  387
+website/doc/classes/Skynet/UniqueDBNumGenerator.src/M000203.html
  388
+website/doc/classes/Skynet/UniqueDBNumGenerator/Config.html
  389
+website/doc/classes/Skynet/Worker.html
  390
+website/doc/classes/Skynet/Worker.src/M000051.html
  391
+website/doc/classes/Skynet/Worker.src/M000052.html
  392
+website/doc/classes/Skynet/Worker.src/M000053.html
  393
+website/doc/classes/Skynet/Worker.src/M000054.html
  394
+website/doc/classes/Skynet/Worker.src/M000055.html
  395
+website/doc/classes/Skynet/Worker.src/M000056.html
  396
+website/doc/classes/Skynet/Worker.src/M000057.html
  397
+website/doc/classes/Skynet/Worker.src/M000058.html
  398
+website/doc/classes/Skynet/Worker.src/M000059.html
  399
+website/doc/classes/Skynet/Worker.src/M000060.html
  400
+website/doc/classes/Skynet/Worker.src/M000061.html
  401
+website/doc/classes/Skynet/Worker.src/M000062.html
  402
+website/doc/classes/Skynet/Worker.src/M000063.html
  403
+website/doc/classes/Skynet/Worker.src/M000064.html
  404
+website/doc/classes/Skynet/Worker.src/M000065.html
  405
+website/doc/classes/Skynet/Worker.src/M000066.html
  406
+website/doc/classes/Skynet/Worker.src/M000067.html
  407
+website/doc/classes/Skynet/Worker.src/M000068.html
  408
+website/doc/classes/Skynet/Worker.src/M000069.html
  409
+website/doc/classes/Skynet/Worker/ConnectionFailure.html
  410
+website/doc/classes/Skynet/Worker/Error.html
  411
+website/doc/classes/Skynet/Worker/NoManagerError.html
  412
+website/doc/classes/Skynet/Worker/RespawnWorker.html
  413
+website/doc/classes/Skynet/WorkerStatusMessage.html
  414
+website/doc/classes/Skynet/WorkerStatusMessage.src/M000097.html
  415
+website/doc/classes/Skynet/WorkerStatusMessage.src/M000098.html
  416
+website/doc/classes/Skynet/WorkerStatusMessage.src/M000099.html
  417
+website/doc/classes/Skynet/WorkerVersionMessage.html
  418
+website/doc/classes/Skynet/WorkerVersionMessage.src/M000164.html
  419
+website/doc/classes/Skynet/WorkerVersionMessage.src/M000165.html
  420
+website/doc/classes/Skynet/WorkerVersionMessage.src/M000166.html
  421
+website/doc/classes/Skynet/WorkerVersionMessage.src/M000167.html
  422
+website/doc/classes/SkynetDebugger.html
  423
+website/doc/classes/SkynetDebugger.src/M000273.html
  424
+website/doc/classes/SkynetDebugger.src/M000274.html
  425
+website/doc/classes/SkynetDebugger.src/M000275.html
  426
+website/doc/classes/SkynetDebugger.src/M000276.html
  427
+website/doc/classes/SkynetDebugger.src/M000277.html
  428
+website/doc/classes/SkynetDebugger.src/M000278.html
  429
+website/doc/classes/SkynetDebugger.src/M000279.html
  430
+website/doc/classes/SkynetDebugger.src/M000280.html
  431
+website/doc/classes/SkynetDebugger.src/M000281.html
  432
+website/doc/classes/SkynetDebugger.src/M000282.html
  433
+website/doc/classes/SkynetDebugger/ClassMethods.html
  434
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000283.html
  435
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000284.html
  436
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000285.html
  437
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000286.html
  438
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000287.html
  439
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000288.html
  440
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000289.html
  441
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000290.html
  442
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000291.html
  443
+website/doc/classes/SkynetDebugger/ClassMethods.src/M000292.html
  444
+website/doc/classes/SkynetMessageQueue.html
  445
+website/doc/classes/SkynetWorkerQueue.html
  446
+website/doc/classes/String.html
  447
+website/doc/classes/String.src/M000003.html
  448
+website/doc/created.rid
  449
+website/doc/files/History_txt.html
  450
+website/doc/files/License_txt.html
  451
+website/doc/files/README_txt.html
  452
+website/doc/files/bin/skynet.html
  453
+website/doc/files/bin/skynet_install.html
  454
+website/doc/files/bin/skynet_tuplespace_server.html
  455
+website/doc/files/lib/skynet/mapreduce_helper_rb.html
  456
+website/doc/files/lib/skynet/mapreduce_test_rb.html
  457
+website/doc/files/lib/skynet/message_queue_adapters/message_queue_adapter_rb.html
  458
+website/doc/files/lib/skynet/message_queue_adapters/mysql_rb.html
  459
+website/doc/files/lib/skynet/message_queue_adapters/tuple_space_rb.html
  460
+website/doc/files/lib/skynet/skynet_active_record_extensions_rb.html
  461
+website/doc/files/lib/skynet/skynet_config_rb.html
  462
+website/doc/files/lib/skynet/skynet_console_helper_rb.html
  463
+website/doc/files/lib/skynet/skynet_console_rb.html
  464
+website/doc/files/lib/skynet/skynet_debugger_rb.html
  465
+website/doc/files/lib/skynet/skynet_guid_generator_rb.html
  466
+website/doc/files/lib/skynet/skynet_job_rb.html
  467
+website/doc/files/lib/skynet/skynet_launcher_rb.html
  468
+website/doc/files/lib/skynet/skynet_logger_rb.html
  469
+website/doc/files/lib/skynet/skynet_manager_rb.html
  470
+website/doc/files/lib/skynet/skynet_message_queue_rb.html
  471
+website/doc/files/lib/skynet/skynet_message_rb.html
  472
+website/doc/files/lib/skynet/skynet_partitioners_rb.html
  473
+website/doc/files/lib/skynet/skynet_ruby_extensions_rb.html
  474
+website/doc/files/lib/skynet/skynet_task_rb.html
  475
+website/doc/files/lib/skynet/skynet_tuplespace_server_rb.html
  476
+website/doc/files/lib/skynet/skynet_worker_rb.html
  477
+website/doc/files/lib/skynet/version_rb.html
  478
+website/doc/files/lib/skynet_rb.html
  479
+website/doc/files/website/index_txt.html
  480
+website/doc/fr_class_index.html
  481
+website/doc/fr_file_index.html
  482
+website/doc/fr_method_index.html
  483
+website/doc/index.html
  484
+website/doc/rdoc-style.css
  485
+website/index.html
  486
+website/index.txt
  487
+website/javascripts/rounded_corners_lite.inc.js
  488
+website/stylesheets/screen.css
  489
+website/template.rhtml
186  ts_manager/README.txt
... ...
@@ -0,0 +1,186 @@
  1
+Skynet
  2
+	http://skynet.rubyforge.org/
  3
+	by Adam Pisoni and Geni.com
  4
+
  5
+== DESCRIPTION:
  6
+
  7
+Skynet is an open source Ruby implementation of Google's Map/Reduce framework, created at Geni. With Skynet, one can easily convert a time-consuming serial task, such as a computationally expensive Rails migration, into a distributed program running on many computers.
  8
+
  9
+Skynet is an adaptive, self-upgrading, fault-tolerant, and fully distributed system with no single point of failure. It uses a "peer recovery" system where workers watch out for each other. If a worker dies or fails for any reason, another worker will notice and pick up that task. Skynet also has no special 'master' servers, only workers which can act as a master for any task at any time. Even these master tasks can fail and will be picked up by other workers.
  10
+
  11
+== DOCUMENTATION
  12
+
  13
+Feel free to read on if you want more of an overview of Skynet with some specific examples. More specific documentation can be found here:
  14
+
  15
+Skynet::Job - The main interface to Skynet.  These docs include an example of how to use Skynet.
  16
+
  17
+Skynet::Config - Configuration Options
  18
+
  19
+bin/skynet[link:files/bin/skynet.html] - Starting Skynet
  20
+
  21
+bin/skynet_install[link:files/bin/skynet_install.html] - Installing Skynet into a local project
  22
+
  23
+== Map/Reduce
  24
+
  25
+First of all, Skynet is merely a distributed computing system that allows you to follow the map/reduce steps.  You don't have to use it as a map/reduce framework.  You can use it as a simple distributed system, or even a simple asynchronous processing system.
  26
+
  27
+If you already know what Map/Reduce is, skip this section.                                                             
  28
+
  29
+If you want to know where all this Map/Reduce hype started, you should read Google's paper on it.  http://labs.google.com/papers/mapreduce.html
  30
+
  31
+When I first read that Google paper some years ago, I was a little confused about what all the hypes was.   At the most basic level, it seemed too simple to be revolutionary.  So you've got a job with 3 steps,  you put some data in, it gets split out to a map step run no many machines, the returned data gets reshuffled and parceled out to a reduce step run on many machines.  All the results are then put together again.   You can see it as 5 steps actually.   Data -> Partition -> Map -> Partition -> Reduce.  Simple enough.  Almost too simple.   It was only years later when I began working on Skynet that I realize what the revolutionary part of Google's framwork was.  It made distributed computing accessible.   Any engineer could write a complex distributed system without needing to know about the complexities of such systems.   Also, since the distributed system was generalized, you would only need one class of machines to run ALL of your distributed processing, instead of specialized machines for specialized functions.  THAT was revolutionary.   
  32
+
  33
+There are a number of key differences between Google's MR system and skynet.  Firstly, currently you can not actually send raw code to the workers.  You are really only telling it where the code is.   At first this bothered me a lot.  Then I realized that in most OO systems, the amount of code you'd need duplicate and to send over the wire to every worker could be ridiculous.  For example, if you want to distribute a task you need to run in Rails, you'd have to send almost all of your app and rails to every worker with every chunk of data.  So, even if you COULD send code, you'd probably only be sending code that just called some other code in your system.  If you can't send ALL the code it needs, then you might as well just tell it where the code is.
  34
+
  35
+The second big difference is that Google's MR framework uses Master federater processes to dole out tasks, recombine them, and generally watch the system.  Skynet has not such masters.   Instead Skynet uses a standard message queue for all communication.  That same message queue allows workers to watch each other in the same way a master would, but without the single point of failure (except the queue itself). 
  36
+
  37
+At its simplest level, a single map reduce job defines a data set, a map method and a reduce method. It may also define a partition method. The map/reduce server evenly splits up (partitions) the data given to it and sends those chunks of data, along with a copy of the code in the map method, to workers that execute the map method against the data it was given. The output from each worker is sent back to the map/reduce server. At this point the Mapreduce server evenly partitions the RESULT data returned from the workers and sends those chunks of data along with the reduce code to the workers to be executed. The reducers return the final result which is returned to whomever requested the job be done in the first place. Not all job need a reduce step, some may just have a map step.
  38
+
  39
+The most common example of a mapreduce job is a distributed word counter. Say you wanted to determine how many times a single word appears in a 1GB text file. The map/reduce server would break up the 1GB file into reasonable chunks, say 100 lines per chunk (or partition) and then send each 100 line partition along with the code that looks for that word, to workers. Each worker would grab its partition of the data, count how many times the word appears in the data and return that number. It might take dozens of workers to complete the task. When the map step is done, you are left with a huge list of counts returned by the workers. In this example, the reduce step would involve sending that list of counts to another worker, with the code required to sum those counts and finally return the total. In this way a task that used to be done in a linear fashion can be parallelized easily.
  40
+
  41
+== INSTALLATION:
  42
+
  43
+Skynet can be installed via RubyGems:
  44
+
  45
+  $ sudo gem install skynet
  46
+
  47
+== GETTING STARTED
  48
+
  49
+Skynet works by putting "tasks" on a message queue which are picked up by skynet workers, who execute the tasks, then put their results back on the message queue.   Skynet works best when it runs with your code.  For example, you might have a rails app and want some code you've already written to run asynchronously or in a distributed way.   Skynet can run within your code by installing a skynet launcher into your app.   Running this skynet launcher within your app guarantees all skynet workers will have access to your code.   This will be covered later.
  50
+
  51
+Skynet currently supports 2 message queue systems, TupleSpace and Mysql.   By default, the TupleSpace queue is used as it is the easiest to set up, though it is less powerful and less scaleable for large installations.  
  52
+
  53
+== RUNING SKYNET FOR THE FIRST TIME
  54
+Since Skynet is a distributed system, it requires you have a skynet message queue as well as any number of skynet workers running.  To start a skynet message queue and a small number of workers:
  55
+
  56
+  $ skynet
  57
+
  58
+This starts a skynet tuple space message queue and 4 workers.   You can now run the skynet console to play with skynet a little.  See Skynet::ConsoleHelper for commands.
  59
+
  60
+  $ skynet console
  61
+  
  62
+For help try:
  63
+  $ skynet --help
  64
+or
  65
+  $ skynet console --help
  66
+
  67
+Here are some commands you can run in the skynet console.
  68
+  > stats
  69
+  > manager.worker_pids
  70
+  > [1,2,3,1,1,4].mapreduce(Skynet::MapreduceTest)
  71
+  
  72
+That last command actually took whatever array you gave it and counted the number of times each element appeared in the array.  It's not a very useful task, but it shows how easy it is to use.
  73
+
  74
+For more information on creating your own Skynet jobs read the Skynet::Job documentation.
  75
+
  76
+== RUNING SKYNET IN YOUR APPLICATION
  77
+
  78
+To be really useful, you'll want to run skynet in your own application.   To do that run:
  79
+
  80
+  $ skynet_install [--rails] [--mysql] YOUR_APP_DIRECTORY
  81
+
  82
+If you pass --rails it will assume it is installing in a rails app.  If you pass --mysql it will assume you are using the mysql as your message queue.
  83
+
  84
+Once it is installed in your application, you can run skynet with
  85
+
  86
+  $ ./script/skynet
  87
+  $ ./script/skynet console
  88
+
  89
+Now you can create your own Skynet jobs. Make sure to require your libraries in your ./script/skynet BEFORE running skynet so that skynet can use your code.
  90
+
  91
+== USAGE:
  92
+
  93
+Skynet was designed to make doing easy things easy and hard things possible.   The easiest way to use skynet is to create a new class with a self.map class method.  You can optionally include self.reduce, self.reduce_partitioner, self.map_partitioner as well.  Each of those methods should expect a single array (regardless of what data you pass).   Then, simple create an array and call mapreduce on it passing your class name.   Skynet will figure out which methods your class supports and use them accordingly.
  94
+
  95
+== USING SKYNET IN RAILS
  96
+
  97
+Skynet includes an addition to ActiveRecord that is very powerful.   
  98
+
  99
+=== distributed_find         
  100
+
  101
+  $ YourModel.distributed_find(:all).each(YourClass)
  102
+or
  103
+  $ YourModel.distributed_find(:all).each(:somemethod)
  104
+  
  105
+In the first example, a find is 'virtually' run with your model class, and the results are distributed to the skynet workers.  If you've implemented a self.map method in YourClass, the retrieved objects will be passed (as arrays) on all the workers.
  106
+
  107
+In the second example, once the objects of YourModel are distributed, each worker merely calls :somemethod against each object.
  108
+
  109
+=== send_later
  110
+
  111
+  $ model_object.send_later(:method,options,:save)
  112
+  
  113
+Sometimes you have a method you want to call on a model asynchronously.  Using :send_later you can call a method, pass it options, and decide whether you want Skynet to save that model or not once its done calling your method.
  114
+
  115
+== Creating Skynet Jobs
  116
+
  117
+The main interface to Skynet is through Skynet::Job
  118
+
  119
+  job = Skynet::Job.new(options)
  120
+  job.run
  121
+  
  122
+There are many options you can pass or change once you have a job object.  See Skynet::Job for more info.
  123
+  
  124
+Most of the time, you will only need to pass a map_reduce_class and map_data.  All other options just give you finer grain control.   map_data must be an array.   The map_reduce_class must AT LEAST implement a self.map class method.  It may also implement self.reduce, self.reduce_partitioner, and self.map_partitioner.  Skynet will assume it can use all of those methods in the map_reduce_class you pass.
  125
+
  126
+Your map and reduce class methods should ALWAYS assume they are being passed an array.  Your map method must always return an array as well.
  127
+
  128
+== Skynet Logging
  129
+
  130
+  You might be interested in seeing what skynet is doing.  There are 2 Skynet::Config options which control logging.  
  131
+  Skynet::CONFIG[:SKYNET_LOG_LEVEL] and Skynet::CONFIG[:SKYNET_LOG_FILE]
  132
+  Skynet::CONFIG[:SKYNET_LOG_LEVEL] is set to Logger::ERROR by default.  Other possibilities are Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL 
  133
+
  134
+  You might try Logger::INFO to see more of what's going on.  To use the Skynet::Logger inside your own classes simple
  135
+    include SkynetDebugger
  136
+
  137
+SkynetDebugger[link:files/lib/skynet/skynet_debugger_rb.html]    
  138
+
  139
+== CREDITS
  140
+
  141
+There are a number of people who either directly or indirectly worked on Skynet.
  142
+* John Beppu (wrote the original worker/manager code)
  143
+* Justin Balthrop
  144
+* Zack Parker
  145
+* Amos Elliston
  146
+* Zack Hobson
  147
+* Alan Braverman
  148
+* Mike Stangel
  149
+* Scott Steadman
  150
+* Andrew Arrow
  151
+* Jason Rojas
  152
+
  153
+Skynet was inspired by and heavily influenced by Josh Carter and this blog post.
  154
+http://multipart-mixed.com/software/simple_mapreduce_in_ruby.html
  155
+
  156
+Also by Starfish by Lucas Carlson
  157
+http://tech.rufy.com/2006/08/mapreduce-for-ruby-ridiculously-easy.html
  158
+http://rufy.com/starfish/doc/
  159
+
  160
+== CONTACT:
  161
+  Adam Pisoni, Geni.com (apisoni at geni.com)
  162
+
  163
+== LICENSE:
  164
+
  165
+(The MIT License)
  166
+
  167
+Copyright (c) 2007 Adam Pisoni, Geni.com
  168
+
  169
+Permission is hereby granted, free of charge, to any person obtaining
  170
+a copy of this software and associated documentation files (the
  171
+"Software"), to deal in the Software without restriction, including
  172
+without limitation the rights to use, copy, modify, merge, publish,
  173
+distribute, sublicense, and/or sell copies of the Software, and to
  174
+permit persons to whom the Software is furnished to do so, subject to
  175
+the following conditions:
  176
+
  177
+The above copyright notice and this permission notice shall be
  178
+included in all copies or substantial portions of the Software.
  179
+
  180
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  181
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  182
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  183
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  184
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  185
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  186
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4  ts_manager/Rakefile
... ...
@@ -0,0 +1,4 @@
  1
+require 'config/requirements'
  2
+require 'config/hoe' # setup Hoe + all gem configuration
  3
+
  4
+Dir['tasks/**/*.rake'].each { |rake| load rake }
5  ts_manager/app_generators/skynet_install/USAGE
... ...
@@ -0,0 +1,5 @@
  1
+Description:
  2
+  
  3
+  
  4
+Usage:
  5
+  
95  ts_manager/app_generators/skynet_install/skynet_install_generator.rb
... ...
@@ -0,0 +1,95 @@
  1
+class SkynetInstallGenerator < RubiGen::Base
  2
+  
  3
+  DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
  4
+                              Config::CONFIG['ruby_install_name'])
  5
+  
  6
+  default_options :in_rails => false
  7
+  default_options :mysql    => false
  8
+  
  9
+  attr_reader :name
  10
+  attr_reader :in_rails
  11
+  attr_reader :mysql
  12
+  
  13
+  def initialize(runtime_args, runtime_options = {})
  14
+    super
  15
+    usage if args.empty?
  16
+    @destination_root = File.expand_path(args.shift)
  17
+    @name = base_name
  18
+    extract_options
  19
+  end
  20
+
  21
+  def manifest
  22
+    record do |m|
  23
+      # Ensure appropriate folder(s) exists
  24
+      m.directory 'script'
  25
+      BASEDIRS.each { |path| m.directory path }
  26
+      
  27
+      # Create stubs
  28
+      m.template     "skynet",         "script/skynet", :collision => :ask, :chmod => 0775, :shebang => options[:shebang]
  29
+      if @in_rails
  30
+        m.template  "skynet_initializer.rb", "config/initializers/skynet.rb", :collision => :ask, :chmod => 0655
  31
+        m.directory 'config/initializers'
  32
+      end
  33
+      if @mysql
  34
+        m.template   "skynet_mysql_schema.sql", "db/skynet_mysql_schema.sql", :collision => :ask, :chmod => 0655
  35
+        m.directory 'db/migrate'
  36
+        m.migration_template "migration.rb", "db/migrate", 
  37
+          :collision => :ask, 
  38
+          :assigns => {
  39
+              :migration_name => "CreateSkynetTables"
  40
+          },  :migration_file_name => "create_skynet_tables"
  41
+      end
  42
+    end
  43
+  end
  44
+
  45
+  protected
  46
+    def banner
  47
+      <<-EOS
  48
+Creates a ...
  49
+
  50
+USAGE: #{spec.name} [--rails] [--mysql] directory (can be '.' for current)"
  51
+Installs: 
  52
+  ./script/skynet
  53
+EOS
  54
+    end
  55
+
  56
+    def add_options!(opts)
  57
+      opts.separator ''
  58
+      opts.separator 'Options:'
  59
+      # For each option below, place the default
  60
+      # at the top of the file next to "default_options"
  61
+      opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
  62
+      opts.on("--mysql", 
  63
+             "Include mysql migration if you want to use mysql as your message queue.  
  64
+             Installs:
  65
+             ./db/skynet_mysql_schema.sql
  66
+             ./db/migrate/db/migrate/###_create_skynet_tables.rb
  67
+             ") do |mysql|
  68
+               options[:mysql] = true if mysql
  69
+             end
  70
+      opts.on("-r", "--rails",
  71
+              "Install into rails app.
  72
+              Installs:
  73
+              ./config/initializers/skynet.rb
  74
+              (If using rails 1, make sure to add require 'skynet' to your environment.rb)",
  75
+              "Default: false") do |rails| 
  76
+                options[:rails] = true if rails
  77
+              end
  78
+    end
  79
+    
  80
+    def extract_options
  81
+      # for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
  82
+      # Templates can access these value via the attr_reader-generated methods, but not the
  83
+      # raw instance variable value.
  84
+      @in_rails = options[:rails]
  85
+      @mysql    = options[:mysql]
  86
+    end
  87
+
  88
+    # Installation skeleton.  Intermediate directories are automatically
  89
+    # created so don't sweat their absence here.
  90
+    BASEDIRS = %w(
  91
+      db
  92
+      log
  93
+      script
  94
+    )
  95
+end
66  ts_manager/app_generators/skynet_install/templates/migration.rb
... ...
@@ -0,0 +1,66 @@
  1
+class <%= migration_name %> < ActiveRecord::Migration
  2
+  def self.up
  3
+    create_table :skynet_worker_queues do |t|
  4
+      t.column  :id,            "bigint unsigned primary key"
  5
+      t.column  :queue_id,      :integer, :default => 0      
  6
+      t.column  :created_on,    :timestamp
  7
+      t.column  :updated_on,    :timestamp
  8
+      t.column  :tasktype,      :string
  9
+      t.column  :tasksubtype,   :string
  10
+      t.column  :worker_id,     'bigint unsigned'
  11
+      t.column  :hostname,      :string
  12
+      t.column  :process_id,    :integer
  13
+      t.column  :job_id,        'bigint unsigned'
  14
+      t.column  :task_id,       'bigint unsigned'
  15
+      t.column  :iteration,     :integer
  16
+      t.column  :name,          :string
  17
+      t.column  :map_or_reduce, :string
  18
+      t.column  :started_at,    "decimal(16,4)"
  19
+      t.column  :version,       :integer
  20
+      t.column  :processed,     :integer
  21
+      t.column  :timeout,       "decimal(16,4)"            
  22
+    end                                 
  23
+    create_table :skynet_message_queues do |t|
  24
+      t.column  :id,            "bigint unsigned primary key"
  25
+      t.column  :queue_id,      :integer, :default => 0
  26
+      t.column  :tran_id,       "bigint unsigned"
  27
+      t.column  :created_on,    :timestamp
  28
+      t.column  :updated_on,    :timestamp
  29
+      t.column  :tasktype,      :string
  30
+      t.column  :task_id,       'bigint unsigned'
  31
+      t.column  :job_id,        'bigint unsigned'
  32
+      t.column  :raw_payload,   "longtext"
  33
+      t.column  :payload_type,  :string
  34
+      t.column  :name,          :string
  35
+      t.column  :expiry,        :integer
  36
+      t.column  :expire_time,   "decimal(16,4)"
  37
+      t.column  :iteration,     :integer
  38
+      t.column  :version,       :integer
  39
+      t.column  :timeout,       "decimal(16,4)"
  40
+      t.column  :retry,         :integer, :default => 0
  41
+    end                                   
  42
+    create_table :skynet_queue_temperature do |t|
  43
+      t.column  :id,            "bigint unsigned primary key"
  44
+      t.column  :queue_id,      :integer, :default => 0      
  45
+      t.column  :updated_on,    :timestamp
  46
+      t.column  :count,         :integer, :default => 0
  47
+      t.column  :temperature,   "decimal(6,4) default 1"
  48
+      t.column  :type,          :string
  49
+    end
  50
+    add_index :skynet_message_queues, :job_id
  51
+    add_index :skynet_message_queues, :task_id
  52
+    add_index :skynet_message_queues, :tran_id, :unique => true
  53
+    add_index :skynet_message_queues, [:queue_id,:tasktype,:payload_type,:expire_time], :name => "index_skynet_mqueue_for_take"
  54
+    add_index :skynet_worker_queues, [:hostname, :process_id]
  55
+    add_index :skynet_worker_queues, :worker_id, :unique=> true
  56
+    execute "insert into skynet_queue_temperature (queue_id,type) values (0,'master')"
  57
+    execute "insert into skynet_queue_temperature (queue_id,type) values (0,'any')"
  58
+    execute "insert into skynet_queue_temperature (queue_id,type) values (0,'task')"
  59
+  end
  60
+
  61
+  def self.down
  62
+    drop_table :skynet_worker_queues
  63
+    drop_table :skynet_queue_temperature
  64
+    drop_table :skynet_message_queues
  65
+  end
  66
+end
41  ts_manager/app_generators/skynet_install/templates/skynet
... ...
@@ -0,0 +1,41 @@
  1
+#!/usr/bin/env ruby
  2
+
  3
+<% if in_rails -%>
  4
+# Load your rails app
  5
+require File.expand_path(File.dirname(__FILE__) + '/../config/boot')
  6
+require File.expand_path(File.dirname(__FILE__)) + '/../config/environment'
  7
+<% end -%>
  8
+require 'rubygems'
  9
+require 'skynet'         
  10
+
  11
+Skynet::CONFIG[:LAUNCHER_PATH]    = File.expand_path(__FILE__)
  12
+Skynet::CONFIG[:SKYNET_LOG_LEVEL] = Logger::ERROR
  13
+<% if not in_rails -%>
  14
+Skynet::CONFIG[:SKYNET_LOG_DIR]   = File.expand_path(File.dirname(__FILE__) + "/../log")
  15
+Skynet::CONFIG[:SKYNET_PID_DIR]   = File.expand_path(File.dirname(__FILE__) + "/../log")
  16
+<% end -%>
  17
+
  18
+<% if mysql -%>
  19
+<% if not in_rails -%>
  20
+# Use the mysql message queue adapter
  21
+Skynet::CONFIG[:MESSAGE_QUEUE_ADAPTER] = "Skynet::MessageQueueAdapter::Mysql"
  22
+Skynet::CONFIG[:MYSQL_HOST]            = "localhost"
  23
+Skynet::CONFIG[:MYSQL_USERNAME]        = "root"
  24
+Skynet::CONFIG[:MYSQL_PASSWORD]        = ""
  25
+Skynet::CONFIG[:MYSQL_DATABASE]        = "skynet"
  26
+<% end -%>
  27
+<% end -%>
  28
+
  29
+begin
  30
+  mq = Skynet::MessageQueue.new
  31
+rescue Skynet::ConnectionError
  32
+  if Skynet::MessageQueue.adapter == :tuplespace
  33
+    pid = fork do
  34
+      exec("skynet_tuplespace_server start")
  35
+    end
  36
+    sleep Skynet::CONFIG[:TS_SERVER_START_DELAY]
  37
+  end
  38
+end
  39
+
  40
+
  41
+Skynet.start
9  ts_manager/app_generators/skynet_install/templates/skynet_initializer.rb
... ...
@@ -0,0 +1,9 @@
  1
+require 'skynet'
  2
+Skynet::CONFIG[:SKYNET_LOG_DIR]   = File.expand_path("#{RAILS_ROOT}/log")
  3
+Skynet::CONFIG[:SKYNET_LOG_FILE]  = "skynet_#{RAILS_ENV}.log"
  4
+Skynet::CONFIG[:SKYNET_PID_DIR]   = File.expand_path("#{RAILS_ROOT}/log")
  5
+Skynet::CONFIG[:SKYNET_LOG_LEVEL] = Logger::ERROR
  6
+<% if mysql -%>
  7
+# Use the mysql message queue adapter
  8
+Skynet::CONFIG[:MESSAGE_QUEUE_ADAPTER] = "Skynet::MessageQueueAdapter::Mysql"
  9
+<% end %>
56  ts_manager/app_generators/skynet_install/templates/skynet_mysql_schema.sql
... ...
@@ -0,0 +1,56 @@
  1
+CREATE TABLE skynet_message_queues (
  2
+  id int(11) NOT NULL auto_increment,
  3
+  queue_id int(11) default '0',
  4
+  tran_id bigint(20) unsigned default NULL,
  5
+  created_on datetime default NULL,
  6
+  updated_on datetime default NULL,
  7
+  tasktype varchar(255) default NULL,
  8
+  task_id bigint(20) unsigned default NULL,
  9
+  job_id bigint(20) unsigned default NULL,
  10
+  raw_payload longtext,
  11
+  payload_type varchar(255) default NULL,
  12
+  name varchar(255) default NULL,
  13
+  expiry int(11) default NULL,
  14
+  expire_time decimal(16,4) default NULL,
  15
+  iteration int(11) default NULL,
  16
+  version int(11) default NULL,
  17
+  timeout decimal(16,4) default NULL,
  18
+  retry int(11) default '0',
  19
+  PRIMARY KEY  (id),
  20
+  UNIQUE KEY index_skynet_message_queues_on_tran_id (tran_id),
  21
+  KEY index_skynet_message_queues_on_job_id (job_id),
  22
+  KEY index_skynet_message_queues_on_task_id (task_id),
  23
+  KEY index_skynet_mqueue_for_take (queue_id,tasktype,payload_type,expire_time)
  24
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  25
+CREATE TABLE skynet_worker_queues (
  26
+  id int(11) NOT NULL auto_increment,
  27
+  queue_id int(11) default '0',
  28
+  created_on datetime default NULL,
  29
+  updated_on datetime default NULL,
  30
+  tasktype varchar(255) default NULL,
  31
+  tasksubtype varchar(255) default NULL,
  32
+  worker_id bigint(20) unsigned default NULL,
  33
+  hostname varchar(255) default NULL,
  34
+  process_id int(11) default NULL,
  35
+  job_id bigint(20) unsigned default NULL,
  36
+  task_id bigint(20) unsigned default NULL,