Class: Pione::Agent::EasyTaskWorkerBalancer

Inherits:
TaskWorkerBalancer show all
Defined in:
lib/pione/agent/broker.rb

Overview

EasyBalancer is a balancer by ratios of tuple space and task worker.

Instance Method Summary collapse

Constructor Details

#initialize(broker) ⇒ EasyTaskWorkerBalancer

see Balancer.new



236
237
238
# File 'lib/pione/agent/broker.rb', line 236

def initialize(broker)
  @broker = broker
end

Instance Method Details

#adjust_task_worker(min_server, max_server) ⇒ Object

Adjusts task worker size between tuple space servers.



282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# File 'lib/pione/agent/broker.rb', line 282

def adjust_task_worker(min_server, max_server)
  revision = {min_server => 1, max_server => -1}
  new_ratios = calc_resource_ratios(revision)

  # failed to calculate tuple space ratio
  return unless new_ratios.has_key?(min_server)
  return unless new_ratios.has_key?(max_server)

  # kill a task worker for moving worker from max server to min server
  if new_ratios[min_server] < new_ratios[max_server]
    if @broker.terminate_task_worker_if do |worker|
      worker.tuple_space == max_server && worker.states.any?{|s| s.current?(:take_task)}
    end
      return true
    end
  end

  # failed to adjust task workers
  return false
end

#balanceObject

Balance task worker ratio by creating a new task worker in minimum tuple space or killing a task worker in maximum.



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/pione/agent/broker.rb', line 242

def balance
  ratios = calc_resource_ratios
  min = ratios.values.min
  max = ratios.values.max
  min_server = ratios.key(min)
  max_server = ratios.key(max)

  return false unless min_server
  return false unless max_server

  if @broker.excess_task_workers > 0 and min_server
    return create_task_worker(min_server)
  else
    return adjust_task_worker(min_server, max_server)
  end
end

#calc_resource_ratios(revision = {}) ⇒ Object

Calculate resource ratios of tuple space servers.



260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/pione/agent/broker.rb', line 260

def calc_resource_ratios(revision={})
  ratio = {}
  # make ratio table
  @broker.tuple_space_lock.synchronize do
    @broker.tuple_spaces.each do |tuple_space|
      rev = revision.has_key?(tuple_space) ? revision[tuple_space] : 0
      current = timeout(1){tuple_space.current_task_worker_size} + rev
      resource = tuple_space.task_worker_resource
      # minimum resource is 1
      resource = 1 unless resource > 0
      ratio[tuple_space] = current / resource.to_f
    end
  end
  return ratio
end

#create_task_worker(min_server) ⇒ Object

Creates a new task worker.



277
278
279
# File 'lib/pione/agent/broker.rb', line 277

def create_task_worker(min_server)
  return @broker.create_task_worker(min_server)
end