drbqs 0.0.15 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +3 -0
- data/README.md +137 -128
- data/VERSION +1 -1
- data/docs/FormatExecute.md +119 -0
- data/docs/GettingStarted.md +242 -0
- data/drbqs.gemspec +36 -13
- data/example/command/server_def.rb +4 -5
- data/example/execute/execute.rb +41 -0
- data/example/execute/server.rb +14 -0
- data/example/execute/task.rb +0 -0
- data/example/mandelbrot/README.md +15 -0
- data/example/mandelbrot/execute.rb +10 -0
- data/example/mandelbrot/mandelbrot.rb +56 -0
- data/example/mandelbrot/server.rb +49 -0
- data/example/server/server.rb +3 -6
- data/example/simple/README.md +18 -0
- data/example/simple/execute.rb +11 -0
- data/example/simple/server.rb +8 -0
- data/example/simple/task.rb +11 -0
- data/example/sum/server_def.rb +1 -1
- data/example/sum2/execute_def.rb +21 -8
- data/example/sum2/server_def.rb +8 -7
- data/example/transfer/file.rb +42 -8
- data/example/transfer/server_def.rb +43 -9
- data/lib/drbqs.rb +1 -1
- data/lib/drbqs/command_line/command_execute.rb +3 -3
- data/lib/drbqs/command_line/command_line.rb +1 -1
- data/lib/drbqs/execute/execute_node.rb +50 -0
- data/lib/drbqs/execute/process_define.rb +102 -54
- data/lib/drbqs/execute/register.rb +241 -87
- data/lib/drbqs/execute/server_define.rb +69 -58
- data/lib/drbqs/ext/task.rb +2 -0
- data/lib/drbqs/ext/task/command_task.rb +43 -0
- data/lib/drbqs/manage/manage.rb +5 -4
- data/lib/drbqs/manage/ssh_shell.rb +2 -8
- data/lib/drbqs/node/connection.rb +1 -1
- data/lib/drbqs/node/node.rb +8 -14
- data/lib/drbqs/node/task_client.rb +1 -1
- data/lib/drbqs/server/history.rb +5 -1
- data/lib/drbqs/server/message.rb +7 -34
- data/lib/drbqs/server/queue.rb +14 -2
- data/lib/drbqs/server/server.rb +86 -43
- data/lib/drbqs/server/server_hook.rb +3 -0
- data/lib/drbqs/server/test/node.rb +1 -1
- data/lib/drbqs/server/test/prof.rb +50 -0
- data/lib/drbqs/server/test/server.rb +2 -2
- data/lib/drbqs/server/transfer_setting.rb +23 -11
- data/lib/drbqs/setting/base.rb +15 -0
- data/lib/drbqs/setting/data_container.rb +1 -1
- data/lib/drbqs/setting/execute.rb +3 -3
- data/lib/drbqs/setting/node.rb +1 -1
- data/lib/drbqs/setting/server.rb +2 -2
- data/lib/drbqs/task/registrar.rb +39 -0
- data/lib/drbqs/task/task.rb +139 -59
- data/lib/drbqs/task/task_generator.rb +93 -116
- data/lib/drbqs/utility/misc.rb +15 -10
- data/lib/drbqs/utility/temporary.rb +7 -2
- data/lib/drbqs/utility/transfer/transfer.rb +81 -0
- data/lib/drbqs/utility/transfer/transfer_client.rb +68 -69
- data/lib/drbqs/utility/transfer/transfer_client_connect.rb +83 -0
- data/lib/drbqs/utility/transfer/transfer_file_list.rb +40 -0
- data/spec/execute/def/execute1.rb +4 -4
- data/spec/execute/def/execute2.rb +24 -0
- data/spec/execute/process_define_spec.rb +43 -6
- data/spec/execute/register_spec.rb +403 -9
- data/spec/execute/server_define_spec.rb +1 -1
- data/spec/ext/task/command_task_spec.rb +16 -0
- data/spec/integration_test/01_basic_usage_spec.rb +1 -1
- data/spec/integration_test/02_use_generator_spec.rb +2 -2
- data/spec/integration_test/04_use_unix_domain_spec.rb +1 -1
- data/spec/integration_test/05_server_exit_signal_spec.rb +1 -1
- data/spec/integration_test/06_node_exit_after_task_spec.rb +4 -4
- data/spec/integration_test/08_shutdown_unused_nodes_spec.rb +2 -2
- data/spec/integration_test/09_server_process_data_spec.rb +1 -1
- data/spec/integration_test/definition/server01.rb +4 -5
- data/spec/integration_test/definition/server02.rb +2 -4
- data/spec/node/node_spec.rb +34 -0
- data/spec/server/message_spec.rb +1 -1
- data/spec/server/queue_spec.rb +34 -7
- data/spec/server/server_spec.rb +21 -9
- data/spec/server/transfer_setting_spec.rb +59 -24
- data/spec/setting/base_spec.rb +11 -0
- data/spec/setting/data_container_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -7
- data/spec/task/registrar_spec.rb +34 -0
- data/spec/task/task_generator_spec.rb +15 -15
- data/spec/task/task_spec.rb +132 -23
- data/spec/utility/misc_spec.rb +2 -2
- data/spec/utility/transfer/transfer_client_connect_spec.rb +90 -0
- data/spec/utility/transfer/transfer_file_list_spec.rb +27 -0
- data/spec/{task/file_transfer_spec.rb → utility/transfer/transfer_spec.rb} +24 -24
- metadata +66 -45
- data/lib/drbqs/manage/execute_node.rb +0 -50
- data/lib/drbqs/server/prof.rb +0 -48
- data/lib/drbqs/task/command_task.rb +0 -43
- data/lib/drbqs/utility/transfer/file_transfer.rb +0 -73
| @@ -27,6 +27,9 @@ module DRbQS | |
| 27 27 | 
             
                  private :create_proc_name
         | 
| 28 28 |  | 
| 29 29 | 
             
                  def add(key, name = nil, &block)
         | 
| 30 | 
            +
                    unless block_given?
         | 
| 31 | 
            +
                      raise ArgumentError, "The main part of hook must be specified as a block."
         | 
| 32 | 
            +
                    end
         | 
| 30 33 | 
             
                    if (n = @argument_number[key]) && (block.arity != n)
         | 
| 31 34 | 
             
                      raise ArgumentError, "Invalid argument number of hook of #{key.inspect}."
         | 
| 32 35 | 
             
                    end
         | 
| @@ -5,7 +5,7 @@ module DRbQS | |
| 5 5 | 
             
                class Node < DRbQS::Node
         | 
| 6 6 | 
             
                  def initialize(log_level, transfer, queue)
         | 
| 7 7 | 
             
                    super(nil, :log_file => $stdout, :log_level => log_level)
         | 
| 8 | 
            -
                     | 
| 8 | 
            +
                    DRbQS::Transfer::Client.set(transfer.get_client(true)) if transfer
         | 
| 9 9 | 
             
                    @task_client = DRbQS::Node::TaskClient.new(nil, queue, nil)
         | 
| 10 10 | 
             
                  end
         | 
| 11 11 |  | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            require 'ruby-prof'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module DRbQS
         | 
| 4 | 
            +
              module Test
         | 
| 5 | 
            +
                class Prof
         | 
| 6 | 
            +
                  PRINTER_TYPE = [:flat, :graph, :graphhtml, :calltree]
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  # :flat
         | 
| 9 | 
            +
                  # :graph
         | 
| 10 | 
            +
                  # :graphhtml
         | 
| 11 | 
            +
                  # :calltree
         | 
| 12 | 
            +
                  def initialize(printer_type, output)
         | 
| 13 | 
            +
                    @printer_type = printer_type
         | 
| 14 | 
            +
                    unless PRINTER_TYPE.include?(@printer_type)
         | 
| 15 | 
            +
                      raise "Invalid printer type: #{@printer_type.inspect}"
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                    @output = output
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def get_printer(result)
         | 
| 21 | 
            +
                    case @printer_type
         | 
| 22 | 
            +
                    when :flat
         | 
| 23 | 
            +
                      RubyProf::FlatPrinter.new(result)
         | 
| 24 | 
            +
                    when :graph
         | 
| 25 | 
            +
                      RubyProf::GraphPrinter.new(result)
         | 
| 26 | 
            +
                    when :graphhtml
         | 
| 27 | 
            +
                      RubyProf::GraphHtmlPrinter.new(result)
         | 
| 28 | 
            +
                    when :calltree
         | 
| 29 | 
            +
                      RubyProf::CallTreePrinter.new(result)
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                  private :get_printer
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def start
         | 
| 35 | 
            +
                    RubyProf.start
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def finish
         | 
| 39 | 
            +
                    printer = get_printer(RubyProf.stop)
         | 
| 40 | 
            +
                    if IO === @output
         | 
| 41 | 
            +
                      printer.print(@output)
         | 
| 42 | 
            +
                    else
         | 
| 43 | 
            +
                      Kernel.open(@output, 'w') do |f|
         | 
| 44 | 
            +
                        printer.print(f)
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -11,9 +11,9 @@ module DRbQS | |
| 11 11 | 
             
                    result = { :start => Time.now }
         | 
| 12 12 | 
             
                    num = 0
         | 
| 13 13 | 
             
                    if profile
         | 
| 14 | 
            -
                      require 'drbqs/server/prof'
         | 
| 14 | 
            +
                      require 'drbqs/server/test/prof'
         | 
| 15 15 | 
             
                      result[:profile] = FileName.create(PROF_FILE, :position => :middle)
         | 
| 16 | 
            -
                      prof = DRbQS::Prof.new(printer || :flat, result[:profile])
         | 
| 16 | 
            +
                      prof = DRbQS::Test::Prof.new(printer || :flat, result[:profile])
         | 
| 17 17 | 
             
                      prof.start
         | 
| 18 18 | 
             
                    end
         | 
| 19 19 | 
             
                    begin
         | 
| @@ -9,21 +9,33 @@ module DRbQS | |
| 9 9 | 
             
                    @host = host
         | 
| 10 10 | 
             
                    @user = user
         | 
| 11 11 | 
             
                    @directory = directory
         | 
| 12 | 
            -
                    @ | 
| 12 | 
            +
                    @setup_server = false
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 |  | 
| 15 | 
            -
                  def  | 
| 16 | 
            -
                     | 
| 15 | 
            +
                  def prepared_directory
         | 
| 16 | 
            +
                    @setup_server && @directory
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def information
         | 
| 20 | 
            +
                    info = "directory: #{@directory}"
         | 
| 21 | 
            +
                    info << ", sftp: #{@user}@#{@host}" if @host && @user
         | 
| 22 | 
            +
                    info
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def setup_server(directory, opts = {})
         | 
| 26 | 
            +
                    return nil if @setup_server
         | 
| 17 27 | 
             
                    @directory = directory || @directory
         | 
| 18 28 | 
             
                    return nil if !@directory
         | 
| 19 | 
            -
                    @ | 
| 20 | 
            -
                     | 
| 21 | 
            -
                     | 
| 22 | 
            -
                     | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 29 | 
            +
                    @setup_server = true
         | 
| 30 | 
            +
                    @directory = File.expand_path(@directory)
         | 
| 31 | 
            +
                    FileUtils.mkdir_p(@directory)
         | 
| 32 | 
            +
                    @host = opts[:host] || @host
         | 
| 33 | 
            +
                    @user = opts[:user] || @user || ENV['USER']
         | 
| 34 | 
            +
                    true
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def get_client(same_host)
         | 
| 38 | 
            +
                    @setup_server ? DRbQS::Transfer::Client.new(@directory, same_host, @host, @user) : nil
         | 
| 27 39 | 
             
                  end
         | 
| 28 40 | 
             
                end
         | 
| 29 41 | 
             
              end
         | 
    
        data/lib/drbqs/setting/base.rb
    CHANGED
    
    | @@ -47,6 +47,21 @@ module DRbQS | |
| 47 47 | 
             
                    @source.value
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 |  | 
| 50 | 
            +
                  def clone
         | 
| 51 | 
            +
                    new_obj = self.class.new
         | 
| 52 | 
            +
                    instance_variables.each do |var_name|
         | 
| 53 | 
            +
                      var = instance_variable_get(var_name)
         | 
| 54 | 
            +
                      case var
         | 
| 55 | 
            +
                      when NilClass, FalseClass, TrueClass, Symbol
         | 
| 56 | 
            +
                        new_var = var
         | 
| 57 | 
            +
                      else
         | 
| 58 | 
            +
                        new_var = var.clone
         | 
| 59 | 
            +
                      end
         | 
| 60 | 
            +
                      new_obj.instance_variable_set(var_name, new_var)
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                    new_obj
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 50 65 | 
             
                  def preprocess!
         | 
| 51 66 | 
             
                  end
         | 
| 52 67 | 
             
                  private :preprocess!
         | 
| @@ -25,11 +25,11 @@ module DRbQS | |
| 25 25 | 
             
                    @port = get_first(:port) do |val|
         | 
| 26 26 | 
             
                      val.to_i
         | 
| 27 27 | 
             
                    end
         | 
| 28 | 
            -
                    @no_server =  | 
| 28 | 
            +
                    @no_server = set?(:no_server)
         | 
| 29 29 | 
             
                    @server = get_first(:server) do |val|
         | 
| 30 30 | 
             
                      val.intern
         | 
| 31 31 | 
             
                    end
         | 
| 32 | 
            -
                    @no_node =  | 
| 32 | 
            +
                    @no_node = set?(:no_node)
         | 
| 33 33 | 
             
                    @node = get_first(:node) do |val|
         | 
| 34 34 | 
             
                      val.split(',').map do |s|
         | 
| 35 35 | 
             
                        s.intern
         | 
| @@ -43,7 +43,7 @@ module DRbQS | |
| 43 43 | 
             
                    else
         | 
| 44 44 | 
             
                      @mode = nil
         | 
| 45 45 | 
             
                    end
         | 
| 46 | 
            -
                    if  | 
| 46 | 
            +
                    if @mode != :help && !@definition
         | 
| 47 47 | 
             
                      raise DRbQS::Setting::InvalidArgument, "Definition file must be specified."
         | 
| 48 48 | 
             
                    end
         | 
| 49 49 | 
             
                  end
         | 
    
        data/lib/drbqs/setting/node.rb
    CHANGED
    
    | @@ -74,7 +74,7 @@ module DRbQS | |
| 74 74 | 
             
                      io.puts "Execute #{@process_num} processes"
         | 
| 75 75 | 
             
                    end
         | 
| 76 76 |  | 
| 77 | 
            -
                    exec_node = DRbQS::ExecuteNode.new(@uri, @options[:log_prefix], @options[:log_level], @options[:node_opts])
         | 
| 77 | 
            +
                    exec_node = DRbQS::Execution::ExecuteNode.new(@uri, @options[:log_prefix], @options[:log_level], @options[:node_opts])
         | 
| 78 78 | 
             
                    exec_node.execute(@process_num)
         | 
| 79 79 | 
             
                    exec_node.wait
         | 
| 80 80 | 
             
                    true
         | 
    
        data/lib/drbqs/setting/server.rb
    CHANGED
    
    | @@ -131,7 +131,7 @@ module DRbQS | |
| 131 131 | 
             
                    unless IO === @options[:log_file]
         | 
| 132 132 | 
             
                      node_log_file = FileName.create(@options[:log_file], :add => :always, :position => :middle, :delimiter => '', :format => "_node_%02d")
         | 
| 133 133 | 
             
                    end
         | 
| 134 | 
            -
                    exec_node = DRbQS::ExecuteNode.new(uri, node_log_file, @options[:log_level])
         | 
| 134 | 
            +
                    exec_node = DRbQS::Execution::ExecuteNode.new(uri, node_log_file, @options[:log_level])
         | 
| 135 135 | 
             
                    exec_node.execute(@execute_node_number, NODE_INTERVAL_TIME)
         | 
| 136 136 | 
             
                    exec_node.wait
         | 
| 137 137 | 
             
                  end
         | 
| @@ -165,7 +165,7 @@ module DRbQS | |
| 165 165 | 
             
                          io.print "\n" << mes
         | 
| 166 166 | 
             
                        end
         | 
| 167 167 | 
             
                      rescue => err
         | 
| 168 | 
            -
                        new_err = err.class.new("Error in loading | 
| 168 | 
            +
                        new_err = err.class.new("Error in loading: #{err.to_s}")
         | 
| 169 169 | 
             
                        new_err.set_backtrace(err.backtrace)
         | 
| 170 170 | 
             
                        raise new_err
         | 
| 171 171 | 
             
                      end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            module DRbQS
         | 
| 2 | 
            +
              class Task
         | 
| 3 | 
            +
                # The object of this class is mainly used in DRbQS::Task::Generator#set
         | 
| 4 | 
            +
                # and calls Fiber.yield.
         | 
| 5 | 
            +
                class Registrar
         | 
| 6 | 
            +
                  # @param [Hash] data Set instance variables from the hash.
         | 
| 7 | 
            +
                  def initialize(data)
         | 
| 8 | 
            +
                    data.each do |key, val|
         | 
| 9 | 
            +
                      instance_variable_set("@#{key.to_s}", val)
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  # Add tasks to server.
         | 
| 14 | 
            +
                  # @param [DRbQS::Task] arg Add an ojbect of DRbQS::Task.
         | 
| 15 | 
            +
                  # @param [Array] arg Add all elements of an array of objects of DRbQS::Task.
         | 
| 16 | 
            +
                  def add(arg)
         | 
| 17 | 
            +
                    case arg
         | 
| 18 | 
            +
                    when DRbQS::Task
         | 
| 19 | 
            +
                      Fiber.yield(arg)
         | 
| 20 | 
            +
                    when Array
         | 
| 21 | 
            +
                      arg.each { |t| Fiber.yield(t) }
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      raise ArgumentError, "An argument must be DRbQS::Task or an array of DRbQS::Task."
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  # Create an object of DRbQS::Task and add it.
         | 
| 28 | 
            +
                  # The arguments are same as {DRbQS::Task}.
         | 
| 29 | 
            +
                  def create_add(*args, &block)
         | 
| 30 | 
            +
                    add(DRbQS::Task.new(*args, &block))
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  # Wait finishes of all tasks in queue of a server.
         | 
| 34 | 
            +
                  def wait
         | 
| 35 | 
            +
                    Fiber.yield(:wait)
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
    
        data/lib/drbqs/task/task.rb
    CHANGED
    
    | @@ -1,100 +1,180 @@ | |
| 1 | 
            -
            require 'drbqs/utility/transfer/ | 
| 1 | 
            +
            require 'drbqs/utility/transfer/transfer_file_list'
         | 
| 2 | 
            +
            require 'drbqs/utility/transfer/transfer'
         | 
| 3 | 
            +
            require 'drbqs/task/registrar'
         | 
| 2 4 | 
             
            require 'drbqs/task/task_generator'
         | 
| 3 5 |  | 
| 4 6 | 
             
            module DRbQS
         | 
| 5 7 |  | 
| 6 8 | 
             
              # The tasks defined by this class are sent to nodes and
         | 
| 7 9 | 
             
              # calculated by the nodes.
         | 
| 8 | 
            -
              # After the node returns the result of calculation to server,
         | 
| 9 | 
            -
              # the server execute the hook.
         | 
| 10 10 | 
             
              class Task
         | 
| 11 | 
            +
                attr_reader :obj
         | 
| 12 | 
            +
                attr_reader :args
         | 
| 13 | 
            +
                attr_reader :method_name
         | 
| 11 14 | 
             
                attr_reader :hook
         | 
| 15 | 
            +
                attr_accessor :note
         | 
| 12 16 |  | 
| 13 | 
            -
                # Nodes  | 
| 14 | 
            -
                #  | 
| 15 | 
            -
                #  | 
| 16 | 
            -
                 | 
| 17 | 
            +
                # Nodes calculate by obj.method_name(*opts[:args]) and send the result to their server.
         | 
| 18 | 
            +
                # Then the server executes &hook with a server instance and an object of result.
         | 
| 19 | 
            +
                # For the communication of a server and nodes we must convert obj to a string
         | 
| 20 | 
            +
                # by Marshal.dump.
         | 
| 21 | 
            +
                # If we set both opts[:hook] and &hook then &hook is prior to opts[:hook].
         | 
| 22 | 
            +
                # @param [Object] obj An object that has a method "method_name"
         | 
| 23 | 
            +
                # @param [Symbol] method_name Method name of calculation
         | 
| 24 | 
            +
                # @param [Hash] opts The options of tasks.
         | 
| 25 | 
            +
                # @option opts [Array] :args An array of arguments of method "method_name"
         | 
| 26 | 
            +
                # @option opts [String] :note Note for a task
         | 
| 27 | 
            +
                # @option opts [Symbol] :hook Method name for hook
         | 
| 28 | 
            +
                #  that takes two arguments server and the result object.
         | 
| 29 | 
            +
                # @param [Proc] hook A server execute hook as a callback when the server receive the result
         | 
| 30 | 
            +
                # @note Changes of obj on a node are not sent to a server.
         | 
| 31 | 
            +
                #  That is, opts[:hook] must not depend on changes of instance variables on a node.
         | 
| 32 | 
            +
                def initialize(obj, method_name, opts = {}, &hook)
         | 
| 33 | 
            +
                  @obj = obj
         | 
| 17 34 | 
             
                  begin
         | 
| 18 | 
            -
                    @marshal_obj = Marshal.dump(obj)
         | 
| 35 | 
            +
                    @marshal_obj = Marshal.dump(@obj)
         | 
| 19 36 | 
             
                  rescue
         | 
| 20 | 
            -
                    raise "Can not dump  | 
| 37 | 
            +
                    raise "Can not dump #{@obj.inspect}."
         | 
| 21 38 | 
             
                  end
         | 
| 22 | 
            -
                   | 
| 39 | 
            +
                  @method_name = method_name.intern
         | 
| 40 | 
            +
                  @args = opts[:args] || []
         | 
| 41 | 
            +
                  unless Array === @args
         | 
| 23 42 | 
             
                    raise "Arguments of task must be an array."
         | 
| 24 43 | 
             
                  end
         | 
| 25 | 
            -
                   | 
| 26 | 
            -
             | 
| 27 | 
            -
                   | 
| 44 | 
            +
                  begin
         | 
| 45 | 
            +
                    @marshal_args = Marshal.dump(@args)
         | 
| 46 | 
            +
                  rescue
         | 
| 47 | 
            +
                    raise "Can not dump #{@args.inspect}."
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                  @note = opts[:note]
         | 
| 50 | 
            +
                  @hook = hook || opts[:hook]
         | 
| 28 51 | 
             
                end
         | 
| 29 52 |  | 
| 30 53 | 
             
                def drb_args(task_id)
         | 
| 31 | 
            -
                  [task_id, @marshal_obj, @ | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                def same_target?(other)
         | 
| 35 | 
            -
                  @marshal_obj == other.instance_variable_get(:@marshal_obj) &&
         | 
| 36 | 
            -
                    @method_sym == other.instance_variable_get(:@method_sym) &&
         | 
| 37 | 
            -
                    @args == other.instance_variable_get(:@args)
         | 
| 54 | 
            +
                  [task_id, @marshal_obj, @method_name, @marshal_args]
         | 
| 38 55 | 
             
                end
         | 
| 39 56 |  | 
| 40 57 | 
             
                def exec_hook(server, result)
         | 
| 41 | 
            -
                   | 
| 58 | 
            +
                  case @hook
         | 
| 59 | 
            +
                  when Proc
         | 
| 42 60 | 
             
                    @hook.call(server, result)
         | 
| 43 | 
            -
             | 
| 61 | 
            +
                  when Symbol, String
         | 
| 62 | 
            +
                    @obj.__send__(@hook, server, result)
         | 
| 44 63 | 
             
                  else
         | 
| 45 | 
            -
                    nil
         | 
| 64 | 
            +
                    return nil
         | 
| 46 65 | 
             
                  end
         | 
| 66 | 
            +
                  true
         | 
| 47 67 | 
             
                end
         | 
| 48 68 |  | 
| 49 | 
            -
                def  | 
| 50 | 
            -
                   | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 69 | 
            +
                def ==(other)
         | 
| 70 | 
            +
                  if @marshal_obj == other.instance_variable_get(:@marshal_obj) &&
         | 
| 71 | 
            +
                      @method_name == other.instance_variable_get(:@method_name) &&
         | 
| 72 | 
            +
                      @marshal_args == other.instance_variable_get(:@marshal_args)
         | 
| 73 | 
            +
                    if Proc === @hook && Proc === other.hook
         | 
| 74 | 
            +
                      # Return false at this time.
         | 
| 75 | 
            +
                      false
         | 
| 76 | 
            +
                    else
         | 
| 77 | 
            +
                      @hook == other.hook
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  else
         | 
| 80 | 
            +
                    false
         | 
| 60 81 | 
             
                  end
         | 
| 61 82 | 
             
                end
         | 
| 62 83 |  | 
| 63 | 
            -
                def  | 
| 64 | 
            -
                   | 
| 65 | 
            -
                    DRbQS::Task.execute_task(*ary[1..-1])
         | 
| 66 | 
            -
                  end
         | 
| 84 | 
            +
                def self.call_task_method(obj, method_name, args)
         | 
| 85 | 
            +
                  obj.__send__(method_name, *args)
         | 
| 67 86 | 
             
                end
         | 
| 68 87 |  | 
| 69 | 
            -
                def  | 
| 70 | 
            -
                   | 
| 88 | 
            +
                def self.execute_task(marshal_obj, method_name, marshal_args)
         | 
| 89 | 
            +
                  self.call_task_method(Marshal.load(marshal_obj), method_name, Marshal.load(marshal_args))
         | 
| 71 90 | 
             
                end
         | 
| 72 | 
            -
                protected :data
         | 
| 73 91 |  | 
| 74 | 
            -
                 | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 92 | 
            +
                # DRbQS::Task::TaskSet is a child class of DRbQS::Task and consists of group of a number of tasks.
         | 
| 93 | 
            +
                # Objects of the class are generated when we set the option :collect to {DRbQS::Task::Generator#set}
         | 
| 94 | 
            +
                # and therefore we are unaware of the objects of DRbQS::TaskSet in many cases.
         | 
| 95 | 
            +
                class TaskSet < Task
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  class Container
         | 
| 98 | 
            +
                    def data
         | 
| 99 | 
            +
                      @data
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
                    protected :data
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    def ==(other)
         | 
| 104 | 
            +
                      other.data.each_with_index.all? do |ary, i|
         | 
| 105 | 
            +
                        ary == @data[i]
         | 
| 106 | 
            +
                      end
         | 
| 107 | 
            +
                    end
         | 
| 77 108 | 
             
                  end
         | 
| 78 | 
            -
                end
         | 
| 79 | 
            -
              end
         | 
| 80 109 |  | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
                     | 
| 110 | 
            +
                  class ContainerTask < DRbQS::Task::TaskSet::Container
         | 
| 111 | 
            +
                    def initialize(task_ary)
         | 
| 112 | 
            +
                      @data = task_ary
         | 
| 113 | 
            +
                    end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                    def exec
         | 
| 116 | 
            +
                      @data.map do |task|
         | 
| 117 | 
            +
                        DRbQS::Task.call_task_method(task.obj, task.method_name, task.args)
         | 
| 118 | 
            +
                      end
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                    def exec_all_hooks(srv, result)
         | 
| 122 | 
            +
                      result.each_with_index do |res, i|
         | 
| 123 | 
            +
                        @data[i].exec_hook(srv, res)
         | 
| 124 | 
            +
                      end
         | 
| 125 | 
            +
                    end
         | 
| 87 126 | 
             
                  end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 127 | 
            +
             | 
| 128 | 
            +
                  # Class to group a number of objects to process tasks.
         | 
| 129 | 
            +
                  class ContainerWithoutHook < DRbQS::Task::TaskSet::Container
         | 
| 130 | 
            +
                    def initialize(task_ary)
         | 
| 131 | 
            +
                      @data = task_ary.map.with_index do |task, i|
         | 
| 132 | 
            +
                        task.drb_args(i)
         | 
| 133 | 
            +
                      end
         | 
| 134 | 
            +
                    end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                    def exec
         | 
| 137 | 
            +
                      @data.map do |ary|
         | 
| 138 | 
            +
                        DRbQS::Task.execute_task(*ary[1..-1])
         | 
| 92 139 | 
             
                      end
         | 
| 93 140 | 
             
                    end
         | 
| 94 141 | 
             
                  end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  attr_reader :original_note
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  def initialize(task_ary)
         | 
| 146 | 
            +
                    @original_note = task_ary.map do |task|
         | 
| 147 | 
            +
                      task.note
         | 
| 148 | 
            +
                    end.compact!
         | 
| 149 | 
            +
                    if task_ary.all? { |task| !(Proc === task.hook) }
         | 
| 150 | 
            +
                      container = DRbQS::Task::TaskSet::ContainerTask.new(task_ary)
         | 
| 151 | 
            +
                      super(container, :exec, hook: :exec_all_hooks, note: note_string)
         | 
| 152 | 
            +
                    else
         | 
| 153 | 
            +
                      container = DRbQS::Task::TaskSet::ContainerWithoutHook.new(task_ary)
         | 
| 154 | 
            +
                      @original_task = task_ary
         | 
| 155 | 
            +
                      super(container, :exec, note: note_string) do |srv, result|
         | 
| 156 | 
            +
                        result.each_with_index do |res, i|
         | 
| 157 | 
            +
                          @original_task[i].exec_hook(srv, res)
         | 
| 158 | 
            +
                        end
         | 
| 159 | 
            +
                      end
         | 
| 160 | 
            +
                    end
         | 
| 161 | 
            +
                  end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                  def note_string
         | 
| 164 | 
            +
                    str = "TaskSet"
         | 
| 165 | 
            +
                    unless @original_note.empty?
         | 
| 166 | 
            +
                      case @original_note.size
         | 
| 167 | 
            +
                      when 1
         | 
| 168 | 
            +
                        str << ": " << @original_note[0]
         | 
| 169 | 
            +
                      when 2
         | 
| 170 | 
            +
                        str << ": " << @original_note.join(", ")
         | 
| 171 | 
            +
                      else
         | 
| 172 | 
            +
                        str << ": " << @original_note[0] << ' - ' << @original_note[-1]
         | 
| 173 | 
            +
                      end
         | 
| 174 | 
            +
                    end
         | 
| 175 | 
            +
                    str
         | 
| 176 | 
            +
                  end
         | 
| 177 | 
            +
                  private :note_string
         | 
| 95 178 | 
             
                end
         | 
| 96 179 | 
             
              end
         | 
| 97 | 
            -
             | 
| 98 180 | 
             
            end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
            require 'drbqs/task/command_task'
         |