Class: RRRSpec::Taskset

Inherits:
Object
  • Object
show all
Defined in:
lib/rrrspec/redis_models.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#keyObject (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.timestamp_create(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

#cancelObject



218
219
220
# File 'lib/rrrspec/redis_models.rb', line 218

def cancel
  ArbiterQueue.cancel(self)
end

#clear_queueObject

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_atObject

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

Returns:

  • (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_countObject

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_atObject

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_countObject

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_countObject

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_secObject

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

#logObject

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_trialsObject

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_workersObject

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

Returns:

  • (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.

Returns:

  • (Boolean)


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_nameObject

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_timeObject

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_commandObject

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_commandObject

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

#slavesObject

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

#statusObject

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_countObject

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_sizeObject

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

#tasksObject

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_leftObject

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_classObject

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_hObject

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(options=nil)
  to_h.to_json(options)
end

#unknown_spec_timeout_secObject

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

#worker_logsObject

Public: Return an array of worker_logs



306
307
308
309
310
# File 'lib/rrrspec/redis_models.rb', line 306

def worker_logs
  RRRSpec.redis.lrange(RRRSpec.make_key(key, 'worker_log'), 0, -1).map do |key|
    WorkerLog.new(key)
  end
end

#worker_typeObject

Public: Type of the worker required to run the specs

Returns string



249
250
251
# File 'lib/rrrspec/redis_models.rb', line 249

def worker_type
  RRRSpec.redis.hget(key, 'worker_type')
end