async-container 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - checksums.yaml.gz.sig +0 -0
 - data/lib/async/container/controller.rb +20 -11
 - data/lib/async/container/generic.rb +1 -1
 - data/lib/async/container/group.rb +5 -0
 - data/lib/async/container/notify/console.rb +1 -1
 - data/lib/async/container/version.rb +1 -1
 - data.tar.gz.sig +0 -0
 - metadata +2 -2
 - metadata.gz.sig +0 -0
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 9dc9673efdab7c4237e091e9efe316438d6a514b625dfbc4b9fc68d245a90d87
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 7d48600b8d3396997101c828bea5878a3124f1449e7bbdb5467ce8fd044c6eba
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 0ea4840c799c1a0dbb0c68a22ea498865a34f041e7ed69596abfc0c40634d190f00202c414bac39a4154072e1300982684522da5cf5a0210a7aaedb1174b767f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: dab62559214494aff8c4413bef634bcb0f829e0066710b2069bed339357fab44da97569eb291d32d057763072fff059064c492bea2fc35afec4d51f230def7d5
         
     | 
    
        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 =  
     | 
| 
      
 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 
     | 
    
         
            -
            				#  
     | 
| 
      
 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 
     | 
    
         
            -
            			 
     | 
| 
      
 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 
     | 
| 
      
 221 
     | 
    
         
            +
            				self.stop
         
     | 
| 
       213 
222 
     | 
    
         
             
            			rescue Terminate
         
     | 
| 
       214 
223 
     | 
    
         
             
            				self.stop(false)
         
     | 
| 
       215 
224 
     | 
    
         
             
            			ensure
         
     | 
| 
       216 
     | 
    
         
            -
            				self.stop( 
     | 
| 
      
 225 
     | 
    
         
            +
            				self.stop(false)
         
     | 
| 
       217 
226 
     | 
    
         | 
| 
       218 
227 
     | 
    
         
             
            				# Restore the interrupt handler:
         
     | 
| 
       219 
228 
     | 
    
         
             
            				Signal.trap(:INT, interrupt_action)
         
     | 
| 
         @@ -161,7 +161,7 @@ module Async 
     | 
|
| 
       161 
161 
     | 
    
         
             
            						end
         
     | 
| 
       162 
162 
     | 
    
         | 
| 
       163 
163 
     | 
    
         
             
            						if status.success?
         
     | 
| 
       164 
     | 
    
         
            -
            							Console.logger. 
     | 
| 
      
 164 
     | 
    
         
            +
            							Console.logger.debug(self) {"#{child} exited with #{status}"}
         
     | 
| 
       165 
165 
     | 
    
         
             
            						else
         
     | 
| 
       166 
166 
     | 
    
         
             
            							@statistics.failure!
         
     | 
| 
       167 
167 
     | 
    
         
             
            							Console.logger.error(self) {status}
         
     | 
| 
         @@ -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)
         
     | 
| 
         @@ -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 
     | 
| 
      
 16 
     | 
    
         
            +
            				def self.open!(logger = ::Console)
         
     | 
| 
       17 
17 
     | 
    
         
             
            					self.new(logger)
         
     | 
| 
       18 
18 
     | 
    
         
             
            				end
         
     | 
| 
       19 
19 
     | 
    
         | 
    
        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. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.18.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Samuel Williams
         
     | 
| 
         @@ -41,7 +41,7 @@ cert_chain: 
     | 
|
| 
       41 
41 
     | 
    
         
             
              Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
         
     | 
| 
       42 
42 
     | 
    
         
             
              voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
         
     | 
| 
       43 
43 
     | 
    
         
             
              -----END CERTIFICATE-----
         
     | 
| 
       44 
     | 
    
         
            -
            date: 2024-03- 
     | 
| 
      
 44 
     | 
    
         
            +
            date: 2024-03-27 00:00:00.000000000 Z
         
     | 
| 
       45 
45 
     | 
    
         
             
            dependencies:
         
     | 
| 
       46 
46 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       47 
47 
     | 
    
         
             
              name: async
         
     | 
    
        metadata.gz.sig
    CHANGED
    
    | 
         Binary file 
     |