class Flor::TransientExecutor

Public Class Methods

new(conf={}) click to toggle source
Calls superclass method Flor::Executor::new
# File lib/flor/core/texecutor.rb, line 84
def initialize(conf={})

  conf = Flor::Conf.prepare(conf, {})

  super(
    TransientUnit.new(conf),
    [], # no hooks
    [], # no traps
    {
      'exid' => Flor.generate_exid('eval', 'u0'),
      'nodes' => {}, 'counters' => {}, 'start' => Flor.tstamp
    })

  @unit.archive = {} if conf['archive']
end

Public Instance Methods

archive() click to toggle source
# File lib/flor/core/texecutor.rb, line 101
def archive; @unit.archive[exid]; end
clone() click to toggle source

Used in specs when testing multiple message arrival order on a “suite” of transient executors

# File lib/flor/core/texecutor.rb, line 163
def clone

  c = TransientExecutor.allocate

  c.instance_variable_set(:@unit, @unit)
  c.instance_variable_set(:@traps, []) # not useful for a TransientEx clone
  c.instance_variable_set(:@execution, Flor.dup(@execution))

  c
end
journal() click to toggle source
# File lib/flor/core/texecutor.rb, line 100
def journal; @unit.journal; end
launch(tree, opts={}) click to toggle source
# File lib/flor/core/texecutor.rb, line 103
def launch(tree, opts={})

  @unit.opts = opts
  @unit.archive ||= {} if opts[:archive]

  @unit.logger.log_src(tree, opts)

  messages = [ Flor.make_launch_msg(@execution['exid'], tree, opts) ]

  @unit.logger.log_tree(messages.first['tree'], '0', opts)

  walk(messages, opts)
end
step(message) click to toggle source
# File lib/flor/core/texecutor.rb, line 155
def step(message)

  process(message)
end
walk(messages, opts={}) click to toggle source
# File lib/flor/core/texecutor.rb, line 117
def walk(messages, opts={})

  loop do

    message = messages.shift
    return nil unless message

    if message['point'] == 'terminated' && messages.any?
      #
      # try to handle 'terminated' last
      #
      messages << message
      message = messages.shift
    end

    msgs = process(message)

    messages.concat(msgs)

    return messages \
      if message_match?(message, opts[:until_after])
    return messages \
      if message_match?(messages, opts[:until])
        #
        # Walk is suspended if options :until_after or :until
        # are satisfied.
        # Returns the remaining messages.

    return message \
      if message['point'] == 'terminated'
    return message \
      if message['point'] == 'failed' && message['on_error'] == nil
        #
        # Walk exits when execution terminates or fails (without on_error).
        # Returns the last message
  end
end

Protected Instance Methods

message_match?(msg_s, ountil) click to toggle source

TODO eventually merge with Waiter.parse_serie

# File lib/flor/core/texecutor.rb, line 178
def message_match?(msg_s, ountil)

  return false unless ountil

  ms = msg_s; ms = [ ms ] if ms.is_a?(Hash)

  nid, point = ountil.split(' ')

  ms.find { |m| m['nid'] == nid && m['point'] == point }
end