async-container 0.17.1 → 0.18.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
  SHA256:
3
- metadata.gz: ca8c53ca974eedc0759ad1d030e4ccedc9aa223911a37954c1a60736ca97ec66
4
- data.tar.gz: c1ea63c60f1b3d8890a9bff9bdf2ba07347bec4fb4c589da0cc6517382fa8ae5
3
+ metadata.gz: 7578abcb2db0aaab09b3e61f905b0a39f433521630fbc496b12e9042c25b54e7
4
+ data.tar.gz: ac19ef8379687387ea79a17426b3197a713c6b4b0eb5d9e86f620d931e3fe3f0
5
5
  SHA512:
6
- metadata.gz: 0f5f2433accfc4f8e4f702a420df060eee14594ec03d260ce4f048349650edcd541ee7256010003a71b9164bd2ac152941c069dde5847e7e0db387b5da02a5fe
7
- data.tar.gz: f352c280c2c6a5de77657e32cba0d256daa09bf0e14254a96b2e95983ed598ebdaa1f5e3e9e4d8c0029616caa29d8e83dd3e47b3382cb16a8a91e07d8081db9a
6
+ metadata.gz: 5f335d1a6f5b7100660b458daf3014e62b52fed0f1ab0e67fcd8b914a0a87111027241348812f236af6c35c78e20461c7592270677dc577bc3f45b06c7142fb5
7
+ data.tar.gz: 2309e4cec26af24d6f7af3a067858bade3db001f9ab3d0c300ff151f0489625b736e6388fa4a4c3b9c98b53d7e71d54a2e6a69ff8e9883a17d16ca1021968953
checksums.yaml.gz.sig CHANGED
Binary file
@@ -22,7 +22,7 @@ module Async
22
22
 
23
23
  # Initialize the controller.
24
24
  # @parameter notify [Notify::Client] A client used for process readiness notifications.
25
- def initialize(notify: Notify.open!, container_class: Container)
25
+ def initialize(notify: Notify.open!, container_class: Container, graceful_stop: true)
26
26
  @container = nil
27
27
  @container_class = container_class
28
28
 
@@ -35,6 +35,8 @@ module Async
35
35
  trap(SIGHUP) do
36
36
  self.restart
37
37
  end
38
+
39
+ @graceful_stop = graceful_stop
38
40
  end
39
41
 
40
42
  # The state of the controller.
@@ -96,7 +98,7 @@ module Async
96
98
 
97
99
  # Stop the container if it's running.
98
100
  # @parameter graceful [Boolean] Whether to give the children instances time to shut down or to kill them immediately.
99
- def stop(graceful = true)
101
+ def stop(graceful = @graceful_stop)
100
102
  @container&.stop(graceful)
101
103
  @container = nil
102
104
  end
@@ -130,23 +132,25 @@ module Async
130
132
  if container.failed?
131
133
  @notify&.error!("Container failed to start!")
132
134
 
133
- container.stop
135
+ container.stop(false)
134
136
 
135
137
  raise SetupError, container
136
138
  end
137
139
 
138
- # Make this swap as atomic as possible:
140
+ # The following swap should be atomic:
139
141
  old_container = @container
140
142
  @container = container
143
+ container = nil
144
+
145
+ if old_container
146
+ Console.logger.debug(self, "Stopping old container...")
147
+ old_container&.stop(@graceful_stop)
148
+ end
141
149
 
142
- Console.logger.debug(self, "Stopping old container...")
143
- old_container&.stop
144
150
  @notify&.ready!
145
- rescue
151
+ ensure
146
152
  # If we are leaving this function with an exception, try to kill the container:
147
153
  container&.stop(false)
148
-
149
- raise
150
154
  end
151
155
 
152
156
  # Reload the existing container. Children instances will be reloaded using `SIGHUP`.
@@ -163,7 +167,9 @@ module Async
163
167
 
164
168
  # Wait for all child processes to enter the ready state.
165
169
  Console.logger.debug(self, "Waiting for startup...")
170
+
166
171
  @container.wait_until_ready
172
+
167
173
  Console.logger.debug(self, "Finished startup.")
168
174
 
169
175
  if @container.failed?
@@ -180,14 +186,17 @@ module Async
180
186
  # I thought this was the default... but it doesn't always raise an exception unless you do this explicitly.
181
187
  # We use `Thread.current.raise(...)` so that exceptions are filtered through `Thread.handle_interrupt` correctly.
182
188
  interrupt_action = Signal.trap(:INT) do
189
+ # $stderr.puts "Received INT signal, terminating...", caller
183
190
  ::Thread.current.raise(Interrupt)
184
191
  end
185
192
 
186
193
  terminate_action = Signal.trap(:TERM) do
194
+ # $stderr.puts "Received TERM signal, terminating...", caller
187
195
  ::Thread.current.raise(Terminate)
188
196
  end
189
197
 
190
198
  hangup_action = Signal.trap(:HUP) do
199
+ # $stderr.puts "Received HUP signal, restarting...", caller
191
200
  ::Thread.current.raise(Hangup)
192
201
  end
193
202
 
@@ -209,11 +218,11 @@ module Async
209
218
  end
210
219
  end
211
220
  rescue Interrupt
212
- self.stop(true)
221
+ self.stop
213
222
  rescue Terminate
214
223
  self.stop(false)
215
224
  ensure
216
- self.stop(true)
225
+ self.stop(false)
217
226
 
218
227
  # Restore the interrupt handler:
219
228
  Signal.trap(:INT, interrupt_action)
@@ -20,6 +20,10 @@ module Async
20
20
  @queue = nil
21
21
  end
22
22
 
23
+ def inspect
24
+ "#<#{self.class} running=#{@running.size}>"
25
+ end
26
+
23
27
  # @attribute [Hash(IO, Fiber)] the running tasks, indexed by IO.
24
28
  attr :running
25
29
 
@@ -133,6 +137,7 @@ module Async
133
137
  protected
134
138
 
135
139
  def wait_for_children(duration = nil)
140
+ Console.debug(self, "Waiting for children...", duration: duration)
136
141
  if !@running.empty?
137
142
  # Maybe consider using a proper event loop here:
138
143
  readable, _, _ = ::IO.select(@running.keys, nil, nil, duration)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2022, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'client'
7
7
 
@@ -13,7 +13,7 @@ module Async
13
13
  # Implements a general process readiness protocol with output to the local console.
14
14
  class Console < Client
15
15
  # Open a notification client attached to the current console.
16
- def self.open!(logger = ::Console.logger)
16
+ def self.open!(logger = ::Console)
17
17
  self.new(logger)
18
18
  end
19
19
 
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Container
8
- VERSION = "0.17.1"
8
+ VERSION = "0.18.1"
9
9
  end
10
10
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-container
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.1
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -41,36 +41,22 @@ cert_chain:
41
41
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
42
42
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
43
43
  -----END CERTIFICATE-----
44
- date: 2024-03-22 00:00:00.000000000 Z
44
+ date: 2024-04-24 00:00:00.000000000 Z
45
45
  dependencies:
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: async
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
- - - ">="
50
+ - - "~>"
51
51
  - !ruby/object:Gem::Version
52
- version: '0'
52
+ version: '2.10'
53
53
  type: :runtime
54
54
  prerelease: false
55
55
  version_requirements: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - ">="
57
+ - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '0'
60
- - !ruby/object:Gem::Dependency
61
- name: async-io
62
- requirement: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: '0'
67
- type: :runtime
68
- prerelease: false
69
- version_requirements: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: '0'
59
+ version: '2.10'
74
60
  description:
75
61
  email:
76
62
  executables: []
@@ -103,7 +89,9 @@ files:
103
89
  homepage: https://github.com/socketry/async-container
104
90
  licenses:
105
91
  - MIT
106
- metadata: {}
92
+ metadata:
93
+ documentation_uri: https://socketry.github.io/async-container/
94
+ source_code_uri: https://github.com/socketry/async-container.git
107
95
  post_install_message:
108
96
  rdoc_options: []
109
97
  require_paths:
@@ -112,7 +100,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
100
  requirements:
113
101
  - - ">="
114
102
  - !ruby/object:Gem::Version
115
- version: '3.0'
103
+ version: '3.1'
116
104
  required_rubygems_version: !ruby/object:Gem::Requirement
117
105
  requirements:
118
106
  - - ">="
metadata.gz.sig CHANGED
Binary file