class SISFC::VM

Attributes

dc_id[R]

setup readable/accessible attributes

size[R]

setup readable/accessible attributes

vmid[R]

setup readable/accessible attributes

Public Class Methods

new(vmid, dc_id, size, service_time_distribution, opts={}) click to toggle source
# File lib/sisfc/vm.rb, line 22
def initialize(vmid, dc_id, size, service_time_distribution, opts={})
  @vmid             = vmid
  @dcid             = dc_id
  @size             = size
  @service_times_rv = ERV::RandomVariable.new(service_time_distribution[@size])

  # initialize request queue and related tracking information
  @busy          = false
  @request_queue = []

  @trace = opts[:trace] ? true : false
  @notes = opts[:notes]

  # @request_queue_info          = []
  # @request_currently_servicing = nil
end

Public Instance Methods

new_request(sim, r, time) click to toggle source
# File lib/sisfc/vm.rb, line 39
def new_request(sim, r, time)
  # put request w/ metadata at the end of the queue
  @request_queue << RequestInfo.new(r, @service_times_rv.next, time)

  if @trace
    @request_queue.each_cons(2) do |x,y|
      if y[2] < x[2]
        raise "Inconsistent ordering in request_queue!!!!"
      end
    end
  end

  # update queue size tracking information
  # @request_queue_info << { size: @request_queue.size, time: time }
  if @trace and @request_queue.size % 100 == 0
    logger.info "VM #{@vmid} with #{@notes} has #{@request_queue.size} requests in queue at time #{time} and is " +
       (@busy ? "busy" : "not busy")
  end

  try_servicing_new_request(sim, time) unless @busy
end
request_finished(sim, time) click to toggle source
# File lib/sisfc/vm.rb, line 61
def request_finished(sim, time)
  @busy = false
  try_servicing_new_request(sim, time)
end

Private Instance Methods

try_servicing_new_request(sim, time) click to toggle source

def resume(time)

raise "VM is already working!" unless @suspended

end

# File lib/sisfc/vm.rb, line 78
def try_servicing_new_request(sim, time)
  raise "Busy VM (vmid: #{@vmid})!" if @busy

  unless @request_queue.empty?

    # pick request and metadata from the incoming request queue
    ri = @request_queue.shift

    if @trace
      logger.info "VM #{@vmid} with #{@notes} fulfilling a new request at time #{time} for #{ri.service_time} seconds"
    end

    req = ri.request

    # update the request's queuing information
    req.update_queuing_time(time - ri.arrival_time)

    # update the request's working information
    req.step_completed(ri.service_time)

    # schedule completion of workflow step
    sim.new_event(Event::ET_WORKFLOW_STEP_COMPLETED, req, time + ri.service_time, self)
  end
end