capistrano_multiconfig_parallel 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ccbcbb8b3f6f253696e7c0f5c4da3a6c86406e9
4
- data.tar.gz: 42654d0b3a82c272c861d9db8ec1a06ed8cddedd
3
+ metadata.gz: ebf7abf008cd1254ba273dc97467920cbb2be773
4
+ data.tar.gz: 91ed0dd95fafd3fc453ade3d653c575ddab0a13e
5
5
  SHA512:
6
- metadata.gz: c16fa1a27b1f804f35b16384a99a98137a70d1624d3d862c426b0f2ee812e9e8c9da9f7dcd0b49cddc7cd614b859df3f13d9c2e5cd2908e6c1627e99c2e7bd3e
7
- data.tar.gz: 7174e0d08f121447676b29423e990331ac5cd72e169de126d5511552331499c34d60d0e06c97f99769e4cee26c86b97ce7847768d796a07b9799e71a9642710d
6
+ metadata.gz: d3601c465aa36710d7c9b31f018bf314f18e87b2db73cf896ad8a19524f7123930fd79413dc66bc0316af35fe63902d3c08dcae30c868aae6bdde66dfbd7797a
7
+ data.tar.gz: 0c9ccaac1b56a1c344629993bbab0fa417e18c16178fb5c2c75bf7037c964138a6771c744b0a1b15f3c86e12d34a54e55fb351f66e7faa9f8ebf89c9bdb54e54
@@ -9,7 +9,7 @@ module CapistranoMulticonfigParallel
9
9
 
10
10
  cattr_accessor :debug_enabled
11
11
 
12
- attr_accessor :jobs, :job_to_worker, :worker_to_job, :actor_system, :job_to_condition, :mutex, :registration_complete
12
+ attr_accessor :jobs, :job_to_worker, :worker_to_job, :actor_system, :job_to_condition, :mutex, :registration_complete, :workers_terminated
13
13
 
14
14
  attr_reader :worker_supervisor, :workers
15
15
  trap_exit :worker_died
@@ -34,7 +34,7 @@ module CapistranoMulticonfigParallel
34
34
  @worker_to_job = {}
35
35
  @job_to_condition = {}
36
36
 
37
- @worker_supervisor.supervise_as(:terminal_server, CapistranoMulticonfigParallel::TerminalTable, Actor.current)
37
+ @worker_supervisor.supervise_as(:terminal_server, CapistranoMulticonfigParallel::TerminalTable, Actor.current, @job_manager)
38
38
  @worker_supervisor.supervise_as(:web_server, CelluloidPubsub::WebServer, self.class.websocket_config.merge(enable_debug: self.class.debug_websocket?))
39
39
  end
40
40
 
@@ -93,19 +93,24 @@ module CapistranoMulticonfigParallel
93
93
  @registration_complete = true if @job_manager.jobs.size == @job_to_worker.size
94
94
  end
95
95
 
96
+ def all_workers_finished?
97
+ @job_to_worker.all? { |job_id, worker| @jobs[job_id]['worker_action'] == 'finished' }
98
+ end
99
+
96
100
  def process_jobs
101
+ @workers_terminated = Celluloid::Condition.new
97
102
  if syncronized_confirmation?
98
103
  @job_to_worker.pmap do |_job_id, worker|
99
104
  worker.async.start_task
100
105
  end
101
106
  wait_task_confirmations
102
107
  end
103
- condition = @job_to_worker.all? { |_job_id, worker| worker.alive? && worker.worker_state == 'finished' }
104
- until condition == true
108
+ condition = @workers_terminated.wait
109
+ until condition.present?
105
110
  sleep(0.1) # keep current thread alive
106
- end
111
+ end
107
112
  debug("all jobs have completed #{condition}") if self.class.debug_enabled?
108
- @job_manager.condition.signal('completed') if condition
113
+ Celluloid::Actor[:terminal_server].async.notify_time_change( CapistranoMulticonfigParallel::TerminalTable::TOPIC, :type => "output") if Celluloid::Actor[:terminal_server].alive?
109
114
  end
110
115
 
111
116
  def apply_confirmations?
@@ -191,10 +196,10 @@ module CapistranoMulticonfigParallel
191
196
  @jobs.pmap do |job_id, job|
192
197
  worker = get_worker_for_job(job_id)
193
198
  worker.publish_rake_event('approved' => 'yes',
194
- 'action' => 'invoke',
195
- 'job_id' => job['id'],
196
- 'task' => task
197
- )
199
+ 'action' => 'invoke',
200
+ 'job_id' => job['id'],
201
+ 'task' => task
202
+ )
198
203
  end
199
204
  end
200
205
 
@@ -228,6 +233,9 @@ module CapistranoMulticonfigParallel
228
233
  end
229
234
 
230
235
  def process_job(job)
236
+ if job['processed']
237
+ @jobs[job['job_id']]
238
+ else
231
239
  env_options = {}
232
240
  job['env_options'].each do |key, value|
233
241
  env_options[key] = value if value.present? && !filtered_env_keys.include?(key)
@@ -238,8 +246,10 @@ module CapistranoMulticonfigParallel
238
246
  'env_name' => job['env'],
239
247
  'action_name' => job['action'],
240
248
  'env_options' => env_options,
241
- 'task_arguments' => job['task_arguments']
242
- }
249
+ 'task_arguments' => job['task_arguments'],
250
+ 'processed' => true
251
+ }
252
+ end
243
253
  end
244
254
 
245
255
  # lookup status of job by asking actor running it
@@ -265,6 +275,7 @@ module CapistranoMulticonfigParallel
265
275
  def worker_died(worker, reason)
266
276
  debug("worker with mailbox #{worker.mailbox.inspect} died for reason: #{reason}") if self.class.debug_enabled?
267
277
  job = @worker_to_job[worker.mailbox.address]
278
+ return if @jobs[job['job_id']]['worker_action'] == "finished"
268
279
  @worker_to_job.delete(worker.mailbox.address)
269
280
  debug "restarting #{job} on new worker" if self.class.debug_enabled?
270
281
  return if job.blank? || job_failed?(job)
@@ -26,7 +26,7 @@ module CapistranoMulticonfigParallel
26
26
  :rake_tasks, :current_task_number, # tracking tasks
27
27
  :successfull_subscription, :subscription_channel, :publisher_channel, # for subscriptions and publishing events
28
28
  :job_termination_condition, :worker_state
29
-
29
+
30
30
  def work(job, manager)
31
31
  @job = job
32
32
  @worker_state = 'started'
@@ -217,10 +217,12 @@ module CapistranoMulticonfigParallel
217
217
 
218
218
  def finish_worker
219
219
  @manager.mark_completed_remaining_tasks(Actor.current)
220
- @worker_state = 'finished'
221
- @manager.job_to_worker.each do|_job_id, worker|
222
- debug("worker #{worker.job_id}has state #{worker.worker_state}") if worker.alive? && debug_enabled?
223
- end
220
+ @manager.jobs[@job_id]['worker_action'] = 'finished'
221
+ @manager.workers_terminated.signal('completed') if @manager.all_workers_finished?
222
+ end
223
+
224
+ def worker_finshed?
225
+ @manager.jobs[@job_id]['worker_action'] == 'finished'
224
226
  end
225
227
 
226
228
  def notify_finished(exit_status)
@@ -6,6 +6,8 @@ module CapistranoMulticonfigParallel
6
6
 
7
7
  attr_accessor :actor, :pid, :exit_status, :process, :filename, :worker_log
8
8
 
9
+ finalizer :process_finalizer
10
+
9
11
  def work(cmd, options = {})
10
12
  @options = options
11
13
  @actor = @options.fetch(:actor, nil)
@@ -37,14 +39,17 @@ module CapistranoMulticonfigParallel
37
39
  end
38
40
  end
39
41
 
40
- def check_exit_status
41
- return unless @exit_status.present?
42
+ def process_finalizer
42
43
  @timer.cancel
43
44
  EM.stop
45
+ end
46
+
47
+ def check_exit_status
48
+ return unless @exit_status.present?
44
49
  if @options[:dry_run]
45
50
  debug("worker #{@actor.job_id} starts execute deploy") if @actor.debug_enabled?
46
51
  @actor.async.execute_deploy
47
- else
52
+ elsif !@actor.worker_finshed?
48
53
  debug("worker #{@actor.job_id} startsnotify finished") if @actor.debug_enabled?
49
54
  @actor.notify_finished(@exit_status)
50
55
  end
@@ -21,15 +21,15 @@ module CapistranoMulticonfigParallel
21
21
  end
22
22
 
23
23
  def wait_execution(name = task_name, time = 0.1)
24
- info "Before waiting #{name}"
24
+ # info "Before waiting #{name}"
25
25
  Actor.current.wait_for(name, time)
26
- info "After waiting #{name}"
26
+ # info "After waiting #{name}"
27
27
  end
28
28
 
29
29
  def wait_for(name, time)
30
- info "waiting for #{time} seconds on #{name}"
30
+ # info "waiting for #{time} seconds on #{name}"
31
31
  sleep time
32
- info "done waiting on #{name} "
32
+ # info "done waiting on #{name} "
33
33
  end
34
34
 
35
35
  def default_settings
@@ -95,7 +95,7 @@ module CapistranoMulticonfigParallel
95
95
  publish_to_worker(task_data)
96
96
  @successfull_subscription = true
97
97
  end
98
-
98
+
99
99
  def stdin_approval(message)
100
100
  if @job_id.to_i == message['job_id'].to_i && message['approved'] == 'yes'
101
101
  @stdin_result = message
@@ -8,8 +8,9 @@ module CapistranoMulticonfigParallel
8
8
  include Celluloid::Logger
9
9
  TOPIC = 'sshkit_terminal'
10
10
 
11
- def initialize(manager)
11
+ def initialize(manager, job_manager)
12
12
  @manager = manager
13
+ @job_manager = job_manager
13
14
  async.run
14
15
  end
15
16
 
@@ -49,6 +50,7 @@ module CapistranoMulticonfigParallel
49
50
  puts table
50
51
  puts "\n"
51
52
  sleep(1)
53
+ @job_manager.condition.signal('completed') if @manager.all_workers_finished?
52
54
  end
53
55
 
54
56
  def worker_state(worker)
@@ -80,7 +82,7 @@ module CapistranoMulticonfigParallel
80
82
  job = @manager.jobs[job_id]
81
83
  processed_job = @manager.process_job(job)
82
84
  worker = @manager.get_worker_for_job(job_id)
83
-
85
+
84
86
  {
85
87
  'job_id' => job_id,
86
88
  'app_name' => processed_job['app_name'],
@@ -174,7 +174,7 @@ module CapistranoMulticonfigParallel
174
174
  end
175
175
 
176
176
  def wait_jobs_termination
177
- return if @jobs.blank? || CapistranoMulticonfigParallel.execute_in_sequence
177
+ return if CapistranoMulticonfigParallel.execute_in_sequence
178
178
  result = @condition.wait
179
179
  return unless result.present?
180
180
  @manager.terminate
@@ -8,7 +8,7 @@ module CapistranoMulticonfigParallel
8
8
  module VERSION
9
9
  MAJOR = 0
10
10
  MINOR = 8
11
- TINY = 0
11
+ TINY = 1
12
12
  PRE = nil
13
13
 
14
14
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano_multiconfig_parallel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - bogdanRada