Module: Einhorn::WorkerPool

Defined in:
lib/einhorn/worker_pool.rb

Class Method Summary collapse

Class Method Details

.ack_countObject



66
67
68
# File 'lib/einhorn/worker_pool.rb', line 66

def self.ack_count
  acked_unsignaled_modern_workers.length
end

.ack_targetObject



70
71
72
# File 'lib/einhorn/worker_pool.rb', line 70

def self.ack_target
  Einhorn::State.config[:number]
end

.acked_modern_workersObject



33
34
35
# File 'lib/einhorn/worker_pool.rb', line 33

def self.acked_modern_workers
  acked_modern_workers_with_state.map {|pid, _| pid}
end

.acked_modern_workers_with_stateObject



25
26
27
# File 'lib/einhorn/worker_pool.rb', line 25

def self.acked_modern_workers_with_state
  modern_workers_with_state.select {|pid, spec| spec[:acked]}
end

.acked_unsignaled_modern_workersObject



43
44
45
46
47
# File 'lib/einhorn/worker_pool.rb', line 43

def self.acked_unsignaled_modern_workers
  acked_modern_workers_with_state.select do |_, spec|
    spec[:signaled].length == 0
  end.map {|pid, _| pid}
end

.missing_worker_countObject

Use the number of modern workers, rather than unsignaled modern workers. This means if e.g. we do bunch of decs and then incs, any workers which haven’t died yet will count towards our number of workers. Since workers really should be dying shortly after they are USR2’d, that indicates a bad state and we shouldn’t make it worse by spinning up more processes. Once they die, order will be restored.



62
63
64
# File 'lib/einhorn/worker_pool.rb', line 62

def self.missing_worker_count
  ack_target - modern_workers.length
end

.modern_workersObject



29
30
31
# File 'lib/einhorn/worker_pool.rb', line 29

def self.modern_workers
  modern_workers_with_state.map {|pid, _| pid}
end

.modern_workers_with_stateObject



19
20
21
22
23
# File 'lib/einhorn/worker_pool.rb', line 19

def self.modern_workers_with_state
  workers_with_state.select do |pid, spec|
    spec[:version] == Einhorn::State.version
  end
end

.old_workersObject



78
79
80
# File 'lib/einhorn/worker_pool.rb', line 78

def self.old_workers
  unsignaled_workers - modern_workers
end

.unsignaled_countObject



74
75
76
# File 'lib/einhorn/worker_pool.rb', line 74

def self.unsignaled_count
  unsignaled_modern_workers_with_state.length
end

.unsignaled_modern_workers_with_priorityObject



49
50
51
52
53
# File 'lib/einhorn/worker_pool.rb', line 49

def self.unsignaled_modern_workers_with_priority
  unsignaled_modern_workers_with_state.sort_by do |pid, spec|
    spec[:acked] ? 1 : 0
  end.map {|pid, _| pid}
end

.unsignaled_modern_workers_with_stateObject



37
38
39
40
41
# File 'lib/einhorn/worker_pool.rb', line 37

def self.unsignaled_modern_workers_with_state
  modern_workers_with_state.select do |_, spec|
    spec[:signaled].length == 0
  end
end

.unsignaled_workersObject



13
14
15
16
17
# File 'lib/einhorn/worker_pool.rb', line 13

def self.unsignaled_workers
  workers_with_state.select do |pid, spec|
    spec[:signaled].length == 0
  end.map {|pid, _| pid}
end

.workersObject



9
10
11
# File 'lib/einhorn/worker_pool.rb', line 9

def self.workers
  workers_with_state.map {|pid, _| pid}
end

.workers_with_stateObject



3
4
5
6
7
# File 'lib/einhorn/worker_pool.rb', line 3

def self.workers_with_state
  Einhorn::State.children.select do |pid, spec|
    spec[:type] == :worker
  end
end