Class: RRRSpec::Taskset
- Inherits:
-
Object
- Object
- RRRSpec::Taskset
- Defined in:
- lib/rrrspec/redis_models.rb
Instance Attribute Summary collapse
-
#key ⇒ Object
readonly
Returns the value of attribute key.
Class Method Summary collapse
-
.create(rsync_name, setup_command, slave_command, worker_type, taskset_class, max_workers, max_trials, unknown_spec_timeout_sec, least_timeout_sec) ⇒ Object
Public: Create a new taskset.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#add_slave(slave) ⇒ Object
Public: Add a slave.
-
#add_task(task) ⇒ Object
Public: Add a task.
-
#add_worker_log(worker_log) ⇒ Object
Public: Add a worker log.
-
#append_log(string) ⇒ Object
Public: Append a line to the log.
- #cancel ⇒ Object
-
#clear_queue ⇒ Object
Public: Remove all the tasks enqueued to the task_queue.
-
#created_at ⇒ Object
Public: Returns the created_at.
-
#dequeue_task(timeout) ⇒ Object
Public: Dequeue the task from the task_queue.
-
#enqueue_task(task) ⇒ Object
Public: Enqueue the task to the task_queue.
- #exist? ⇒ Boolean
-
#expire(sec) ⇒ Object
Persistence.
-
#failed_count ⇒ Object
Public: Current failed task count.
-
#finish_task(task) ⇒ Object
Public: Finish the task.
-
#finished_at ⇒ Object
Public: Returns the finished_at.
-
#incr_failed_count ⇒ Object
Public: Increment failed_count.
-
#incr_succeeded_count ⇒ Object
Public: Increment succeeded_count.
-
#initialize(taskset_key) ⇒ Taskset
constructor
A new instance of Taskset.
-
#least_timeout_sec ⇒ Object
Public: Timeout sec at least any specs should wait.
-
#log ⇒ Object
Public: Overall logs of the taskset.
-
#max_trials ⇒ Object
Public: The number of trials that should be made.
-
#max_workers ⇒ Object
Public: The number of workers that is used to run the specs.
- #persisted? ⇒ Boolean
-
#queue_empty? ⇒ Boolean
Public: Checks whether the task_queue is empty.
-
#reversed_enqueue_task(task) ⇒ Object
Public: Enqueue the task in the reversed way.
-
#rsync_name ⇒ Object
Public: The path name that is used in rsync.
-
#set_finished_time ⇒ Object
Public: Set finished_at time if it is empty.
-
#setup_command ⇒ Object
Public: The command used in setup.
-
#slave_command ⇒ Object
Public: The command that invokes rrrspec slave.
-
#slaves ⇒ Object
Public: Return an array of slaves.
-
#status ⇒ Object
Public: Current status.
-
#succeeded_count ⇒ Object
Public: Current succeeded task count.
-
#task_size ⇒ Object
Public: Size of all tasks.
-
#tasks ⇒ Object
Public: All the tasks that are contained by the taskset.
-
#tasks_left ⇒ Object
Public: All the tasks that are not migrated into the persistent store.
-
#taskset_class ⇒ Object
Public: A value that identifies the same taskset.
-
#to_h ⇒ Object
Serialize.
- #to_json(options = nil) ⇒ Object
-
#unknown_spec_timeout_sec ⇒ Object
Public: The timeout sec for unknown spec files.
-
#update_status(status) ⇒ Object
Public: Update the status.
-
#worker_logs ⇒ Object
Public: Return an array of worker_logs.
-
#worker_type ⇒ Object
Public: Type of the worker required to run the specs.
Constructor Details
#initialize(taskset_key) ⇒ Taskset
Returns a new instance of Taskset.
176 177 178 |
# File 'lib/rrrspec/redis_models.rb', line 176 def initialize(taskset_key) @key = taskset_key end |
Instance Attribute Details
#key ⇒ Object (readonly)
Returns the value of attribute key.
174 175 176 |
# File 'lib/rrrspec/redis_models.rb', line 174 def key @key end |
Class Method Details
.create(rsync_name, setup_command, slave_command, worker_type, taskset_class, max_workers, max_trials, unknown_spec_timeout_sec, least_timeout_sec) ⇒ Object
Public: Create a new taskset. NOTE: This method will NOT call ActiveTaskset.add.
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/rrrspec/redis_models.rb', line 182 def self.create(rsync_name, setup_command, slave_command, worker_type, taskset_class, max_workers, max_trials, unknown_spec_timeout_sec, least_timeout_sec) now = Time.zone.now # For the reasons unknown, UUIDTools::UUID.timestamp_create changes 'now'. taskset_key = RRRSpec.make_key( 'rrrspec', 'taskset', UUIDTools::UUID.(now.dup) ) RRRSpec.redis.hmset( taskset_key, 'rsync_name', rsync_name, 'setup_command', setup_command, 'slave_command', slave_command, 'worker_type', worker_type, 'max_workers', max_workers, 'max_trials', max_trials, 'taskset_class', taskset_class, 'unknown_spec_timeout_sec', unknown_spec_timeout_sec.to_s, 'least_timeout_sec', least_timeout_sec.to_s, 'created_at', now.to_s, ) return new(taskset_key) end |
Instance Method Details
#==(other) ⇒ Object
206 207 208 |
# File 'lib/rrrspec/redis_models.rb', line 206 def ==(other) @key == other.key end |
#add_slave(slave) ⇒ Object
Public: Add a slave
316 317 318 319 |
# File 'lib/rrrspec/redis_models.rb', line 316 def add_slave(slave) RRRSpec.redis.rpush(RRRSpec.make_key(key, 'slave'), slave.key) end |
#add_task(task) ⇒ Object
Public: Add a task. NOTE: This method does NOT enqueue to the task_queue
333 334 335 336 |
# File 'lib/rrrspec/redis_models.rb', line 333 def add_task(task) RRRSpec.redis.rpush(RRRSpec.make_key(key, 'tasks'), task.key) RRRSpec.redis.rpush(RRRSpec.make_key(key, 'tasks_left'), task.key) end |
#add_worker_log(worker_log) ⇒ Object
Public: Add a worker log
300 301 302 303 |
# File 'lib/rrrspec/redis_models.rb', line 300 def add_worker_log(worker_log) RRRSpec.redis.rpush(RRRSpec.make_key(key, 'worker_log'), worker_log.key) end |
#append_log(string) ⇒ Object
Public: Append a line to the log
459 460 461 |
# File 'lib/rrrspec/redis_models.rb', line 459 def append_log(string) RRRSpec.redis.append(RRRSpec.make_key(key, 'log'), string) end |
#cancel ⇒ Object
218 219 220 |
# File 'lib/rrrspec/redis_models.rb', line 218 def cancel ArbiterQueue.cancel(self) end |
#clear_queue ⇒ Object
Public: Remove all the tasks enqueued to the task_queue.
391 392 393 |
# File 'lib/rrrspec/redis_models.rb', line 391 def clear_queue RRRSpec.redis.del(RRRSpec.make_key(key, 'task_queue')) end |
#created_at ⇒ Object
Public: Returns the created_at
Returns Time
291 292 293 294 |
# File 'lib/rrrspec/redis_models.rb', line 291 def created_at v = RRRSpec.redis.hget(key, 'created_at') v.present? ? Time.zone.parse(v) : nil end |
#dequeue_task(timeout) ⇒ Object
Public: Dequeue the task from the task_queue.
Returns a task or nil if timeouts
380 381 382 383 384 385 386 387 388 |
# File 'lib/rrrspec/redis_models.rb', line 380 def dequeue_task(timeout) if timeout < 0 task_key = RRRSpec.redis.lpop(RRRSpec.make_key(key, 'task_queue')) else _, task_key = RRRSpec.redis.blpop(RRRSpec.make_key(key, 'task_queue'), timeout) end return nil unless task_key Task.new(task_key) end |
#enqueue_task(task) ⇒ Object
Public: Enqueue the task to the task_queue.
368 369 370 |
# File 'lib/rrrspec/redis_models.rb', line 368 def enqueue_task(task) RRRSpec.redis.rpush(RRRSpec.make_key(key, 'task_queue'), task.key) end |
#exist? ⇒ Boolean
210 211 212 |
# File 'lib/rrrspec/redis_models.rb', line 210 def exist? RRRSpec.redis.exists(key) end |
#expire(sec) ⇒ Object
Persistence
491 492 493 494 495 496 497 498 499 500 501 502 |
# File 'lib/rrrspec/redis_models.rb', line 491 def expire(sec) tasks.each { |task| task.expire(sec) } slaves.each { |slave| slave.expire(sec) } worker_logs.each { |worker_log| worker_log.expire(sec) } RRRSpec.redis.expire(key, sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'log'), sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'slave'), sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'worker_log'), sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'task_queue'), sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'tasks'), sec) RRRSpec.redis.expire(RRRSpec.make_key(key, 'tasks_left'), sec) end |
#failed_count ⇒ Object
Public: Current failed task count. A task is counted as failed one if its status is “failed”.
Returns a number
433 434 435 |
# File 'lib/rrrspec/redis_models.rb', line 433 def failed_count RRRSpec.redis.hget(key, 'failed_count').to_i end |
#finish_task(task) ⇒ Object
Public: Finish the task. It is no longer appeared in the ‘tasks_left`.
339 340 341 |
# File 'lib/rrrspec/redis_models.rb', line 339 def finish_task(task) RRRSpec.redis.lrem(RRRSpec.make_key(key, 'tasks_left'), 0, task.key) end |
#finished_at ⇒ Object
Public: Returns the finished_at
443 444 445 446 |
# File 'lib/rrrspec/redis_models.rb', line 443 def finished_at v = RRRSpec.redis.hget(key, 'finished_at') v.present? ? Time.zone.parse(v) : nil end |
#incr_failed_count ⇒ Object
Public: Increment failed_count
438 439 440 |
# File 'lib/rrrspec/redis_models.rb', line 438 def incr_failed_count RRRSpec.redis.hincrby(key, 'failed_count', 1) end |
#incr_succeeded_count ⇒ Object
Public: Increment succeeded_count
425 426 427 |
# File 'lib/rrrspec/redis_models.rb', line 425 def incr_succeeded_count RRRSpec.redis.hincrby(key, 'succeeded_count', 1) end |
#least_timeout_sec ⇒ Object
Public: Timeout sec at least any specs should wait.
Returns number
284 285 286 |
# File 'lib/rrrspec/redis_models.rb', line 284 def least_timeout_sec RRRSpec.redis.hget(key, 'least_timeout_sec').to_i end |
#log ⇒ Object
Public: Overall logs of the taskset
454 455 456 |
# File 'lib/rrrspec/redis_models.rb', line 454 def log RRRSpec.redis.get(RRRSpec.make_key(key, 'log')) || "" end |
#max_trials ⇒ Object
Public: The number of trials that should be made.
Returns number
263 264 265 |
# File 'lib/rrrspec/redis_models.rb', line 263 def max_trials RRRSpec.redis.hget(key, 'max_trials').to_i end |
#max_workers ⇒ Object
Public: The number of workers that is used to run the specs
Returns number
256 257 258 |
# File 'lib/rrrspec/redis_models.rb', line 256 def max_workers RRRSpec.redis.hget(key, 'max_workers').to_i end |
#persisted? ⇒ Boolean
214 215 216 |
# File 'lib/rrrspec/redis_models.rb', line 214 def persisted? RRRSpec.redis.ttl(key) != -1 end |
#queue_empty? ⇒ Boolean
Public: Checks whether the task_queue is empty.
396 397 398 |
# File 'lib/rrrspec/redis_models.rb', line 396 def queue_empty? RRRSpec.redis.llen(RRRSpec.make_key(key, 'task_queue')) == 0 end |
#reversed_enqueue_task(task) ⇒ Object
Public: Enqueue the task in the reversed way.
373 374 375 |
# File 'lib/rrrspec/redis_models.rb', line 373 def reversed_enqueue_task(task) RRRSpec.redis.lpush(RRRSpec.make_key(key, 'task_queue'), task.key) end |
#rsync_name ⇒ Object
Public: The path name that is used in rsync
Returns string
228 229 230 |
# File 'lib/rrrspec/redis_models.rb', line 228 def rsync_name RRRSpec.redis.hget(key, 'rsync_name') end |
#set_finished_time ⇒ Object
Public: Set finished_at time if it is empty
449 450 451 |
# File 'lib/rrrspec/redis_models.rb', line 449 def set_finished_time RRRSpec.redis.hsetnx(key, 'finished_at', Time.zone.now.to_s) end |
#setup_command ⇒ Object
Public: The command used in setup
Returns string
235 236 237 |
# File 'lib/rrrspec/redis_models.rb', line 235 def setup_command RRRSpec.redis.hget(key, 'setup_command') end |
#slave_command ⇒ Object
Public: The command that invokes rrrspec slave
Returns string
242 243 244 |
# File 'lib/rrrspec/redis_models.rb', line 242 def slave_command RRRSpec.redis.hget(key, 'slave_command') end |
#slaves ⇒ Object
Public: Return an array of slaves
322 323 324 325 326 |
# File 'lib/rrrspec/redis_models.rb', line 322 def slaves RRRSpec.redis.lrange(RRRSpec.make_key(key, 'slave'), 0, -1).map do |key| Slave.new(key) end end |
#status ⇒ Object
Public: Current status
Returns either nil, “running”, “succeeded”, “cancelled” or “failed”
406 407 408 |
# File 'lib/rrrspec/redis_models.rb', line 406 def status RRRSpec.redis.hget(key, 'status') end |
#succeeded_count ⇒ Object
Public: Current succeeded task count. A task is counted as succeeded one if its status is “passed” or “pending”.
Returns a number
420 421 422 |
# File 'lib/rrrspec/redis_models.rb', line 420 def succeeded_count RRRSpec.redis.hget(key, 'succeeded_count').to_i end |
#task_size ⇒ Object
Public: Size of all tasks.
353 354 355 |
# File 'lib/rrrspec/redis_models.rb', line 353 def task_size RRRSpec.redis.llen(RRRSpec.make_key(key, 'tasks')).to_i end |
#tasks ⇒ Object
Public: All the tasks that are contained by the taskset.
Returns an array of the task instances
346 347 348 349 350 |
# File 'lib/rrrspec/redis_models.rb', line 346 def tasks RRRSpec.redis.lrange(RRRSpec.make_key(key, 'tasks'), 0, -1).map do |key| Task.new(key) end end |
#tasks_left ⇒ Object
Public: All the tasks that are not migrated into the persistent store. In short, the tasks that are ‘add_task`ed but not `finish_task`ed.
Returns an array of the task instances.
361 362 363 364 365 |
# File 'lib/rrrspec/redis_models.rb', line 361 def tasks_left RRRSpec.redis.lrange(RRRSpec.make_key(key, 'tasks_left'), 0, -1).map do |key| Task.new(key) end end |
#taskset_class ⇒ Object
Public: A value that identifies the same taskset.
Returns string
270 271 272 |
# File 'lib/rrrspec/redis_models.rb', line 270 def taskset_class RRRSpec.redis.hget(key, 'taskset_class') end |
#to_h ⇒ Object
Serialize
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 |
# File 'lib/rrrspec/redis_models.rb', line 466 def to_h h = RRRSpec.redis.hgetall(key) h['key'] = key h['log'] = log h['tasks'] = tasks.map { |task| { 'key' => task.key } } h['slaves'] = slaves.map { |slave| { 'key' => slave.key } } h['worker_logs'] = worker_logs.map { |worker_log| { 'key' => worker_log.key } } RRRSpec.convert_if_present(h, 'max_workers') { |v| v.to_i } RRRSpec.convert_if_present(h, 'max_trials') { |v| v.to_i } RRRSpec.convert_if_present(h, 'unknown_spec_timeout_sec') { |v| v.to_i } RRRSpec.convert_if_present(h, 'least_timeout_sec') { |v| v.to_i } RRRSpec.convert_if_present(h, 'created_at') { |v| Time.zone.parse(v) } RRRSpec.convert_if_present(h, 'finished_at') { |v| Time.zone.parse(v) } h.delete('succeeded_count') h.delete('failed_count') h end |
#to_json(options = nil) ⇒ Object
484 485 486 |
# File 'lib/rrrspec/redis_models.rb', line 484 def to_json(=nil) to_h.to_json() end |
#unknown_spec_timeout_sec ⇒ Object
Public: The timeout sec for unknown spec files.
Returns number
277 278 279 |
# File 'lib/rrrspec/redis_models.rb', line 277 def unknown_spec_timeout_sec RRRSpec.redis.hget(key, 'unknown_spec_timeout_sec').to_i end |
#update_status(status) ⇒ Object
Public: Update the status. It should be one of:
- “running”, “succeeded”, “cancelled”, “failed”
412 413 414 |
# File 'lib/rrrspec/redis_models.rb', line 412 def update_status(status) RRRSpec.redis.hset(key, 'status', status) end |