einhorn 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -249,10 +249,9 @@ EventMachine-LE to support file-descriptor passing. Check out
249
249
 
250
250
  ## Compatibility
251
251
 
252
- Einhorn was developed and tested under Ruby 1.8.7.
252
+ Einhorn runs in Ruby 2.0, 2.1, and 2.2
253
253
 
254
254
  ## About
255
255
 
256
- Einhorn is a project of [Stripe](https://stripe.com), led by [Greg
257
- Brockman](https://twitter.com/thegdb). Feel free to get in touch at
256
+ Einhorn is a project of [Stripe](https://stripe.com), led by [Carl Jackson](https://github.com/zenazn). Feel free to get in touch at
258
257
  info@stripe.com.
data/einhorn.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.name = 'einhorn'
16
16
  gem.require_paths = ['lib']
17
17
 
18
+ gem.add_development_dependency 'rack', '~> 1.6'
18
19
  gem.add_development_dependency 'rake'
19
20
  gem.add_development_dependency 'pry'
20
21
  gem.add_development_dependency 'minitest', '< 5.0'
@@ -99,7 +99,7 @@ module Einhorn
99
99
  def self.signal_all(signal, children=nil, record=true)
100
100
  children ||= Einhorn::WorkerPool.workers
101
101
 
102
- signaled = []
102
+ signaled = {}
103
103
  Einhorn.log_info("Sending #{signal} to #{children.inspect}", :upgrade)
104
104
 
105
105
  children.each do |child|
@@ -119,16 +119,23 @@ module Einhorn
119
119
  Process.kill(signal, child)
120
120
  rescue Errno::ESRCH
121
121
  else
122
- signaled << child
122
+ signaled[child] = spec
123
123
  end
124
124
  end
125
125
 
126
- if Einhorn::State.signal_timeout
126
+ if Einhorn::State.signal_timeout && record
127
127
  Einhorn::Event::Timer.open(Einhorn::State.signal_timeout) do
128
128
  children.each do |child|
129
- next unless spec = Einhorn::State.children[child]
129
+ spec = Einhorn::State.children[child]
130
+ next unless spec # Process is already dead and removed by mourn
131
+ signaled_spec = signaled[child]
132
+ next unless signaled_spec # We got ESRCH when trying to signal
133
+ if spec[:spinup_time] != signaled_spec[:spinup_time]
134
+ Einhorn.log_info("Different spinup time recorded for #{child} after #{Einhorn::State.signal_timeout}s. This probably indicates a PID rollover.", :upgrade)
135
+ next
136
+ end
130
137
 
131
- Einhorn.log_info("Child #{child.inspect} is still active after #{Einhorn::State.signal_timeout}. Sending SIGKILL.")
138
+ Einhorn.log_info("Child #{child.inspect} is still active after #{Einhorn::State.signal_timeout}s. Sending SIGKILL.")
132
139
  begin
133
140
  Process.kill('KILL', child)
134
141
  rescue Errno::ESRCH
@@ -138,7 +145,7 @@ module Einhorn
138
145
  end
139
146
  end
140
147
 
141
- "Successfully sent #{signal}s to #{signaled.length} processes: #{signaled.inspect}"
148
+ "Successfully sent #{signal}s to #{signaled.length} processes: #{signaled.keys}"
142
149
  end
143
150
 
144
151
  def self.increment
@@ -291,14 +298,15 @@ module Einhorn
291
298
  end
292
299
 
293
300
  Einhorn.log_info("===> Launched #{pid} (index: #{index})", :upgrade)
301
+ Einhorn::State.last_spinup = Time.now
294
302
  Einhorn::State.children[pid] = {
295
303
  :type => :worker,
296
304
  :version => Einhorn::State.version,
297
305
  :acked => false,
298
306
  :signaled => Set.new,
299
- :index => index
307
+ :index => index,
308
+ :spinup_time => Einhorn::State.last_spinup,
300
309
  }
301
- Einhorn::State.last_spinup = Time.now
302
310
 
303
311
  # Set up whatever's needed for ACKing
304
312
  ack_mode = Einhorn::State.ack_mode
@@ -364,6 +372,7 @@ module Einhorn
364
372
  end
365
373
 
366
374
  def self.prepare_child_process
375
+ Process.setpgrp
367
376
  Einhorn.renice_self
368
377
  end
369
378
 
@@ -148,17 +148,17 @@ module Einhorn::Command
148
148
  ## Signals
149
149
  def self.install_handlers
150
150
  trap_async("INT") do
151
- Einhorn::Command.signal_all("USR2", Einhorn::WorkerPool.workers)
151
+ Einhorn::Command.signal_all("USR2")
152
152
  Einhorn::Command.stop_respawning
153
153
  end
154
154
  trap_async("TERM") do
155
- Einhorn::Command.signal_all("TERM", Einhorn::WorkerPool.workers)
155
+ Einhorn::Command.signal_all("TERM")
156
156
  Einhorn::Command.stop_respawning
157
157
  end
158
158
  # Note that quit is a bit different, in that it will actually
159
159
  # make Einhorn quit without waiting for children to exit.
160
160
  trap_async("QUIT") do
161
- Einhorn::Command.signal_all("QUIT", Einhorn::WorkerPool.workers)
161
+ Einhorn::Command.signal_all("QUIT")
162
162
  Einhorn::Command.stop_respawning
163
163
  exit(1)
164
164
  end
@@ -169,12 +169,12 @@ module Einhorn::Command
169
169
  end
170
170
  trap_async("CHLD") {}
171
171
  trap_async("USR2") do
172
- Einhorn::Command.signal_all("USR2", Einhorn::WorkerPool.workers)
172
+ Einhorn::Command.signal_all("USR2")
173
173
  Einhorn::Command.stop_respawning
174
174
  end
175
175
  at_exit do
176
176
  if Einhorn::State.kill_children_on_exit && Einhorn::TransientState.whatami == :master
177
- Einhorn::Command.signal_all("USR2", Einhorn::WorkerPool.workers)
177
+ Einhorn::Command.signal_all("USR2")
178
178
  Einhorn::Command.stop_respawning
179
179
  end
180
180
  end
@@ -407,7 +407,7 @@ EOF
407
407
 
408
408
  signal = args[0] || "USR2"
409
409
 
410
- response = Einhorn::Command.signal_all(signal, Einhorn::WorkerPool.workers)
410
+ response = Einhorn::Command.signal_all(signal)
411
411
  Einhorn::Command.stop_respawning
412
412
 
413
413
  "Einhorn is going down! #{response}"
@@ -57,13 +57,13 @@ module Einhorn::Event
57
57
  end
58
58
 
59
59
  def register!
60
- log_info("client connected")
60
+ log_debug("client connected")
61
61
  Einhorn::Event.register_connection(self, @socket.fileno)
62
62
  super
63
63
  end
64
64
 
65
65
  def deregister!
66
- log_info("client disconnected") if Einhorn::TransientState.whatami == :master
66
+ log_debug("client disconnected") if Einhorn::TransientState.whatami == :master
67
67
  Einhorn::Event.deregister_connection(@socket.fileno)
68
68
  super
69
69
  end
@@ -1,3 +1,3 @@
1
1
  module Einhorn
2
- VERSION = '0.7.2'
2
+ VERSION = '0.7.3'
3
3
  end
metadata CHANGED
@@ -1,97 +1,126 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: einhorn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Greg Brockman
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-06-18 00:00:00.000000000 Z
12
+ date: 2016-07-11 00:00:00.000000000 Z
12
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.6'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.6'
13
30
  - !ruby/object:Gem::Dependency
14
31
  name: rake
15
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
16
34
  requirements:
17
- - - ">="
35
+ - - ! '>='
18
36
  - !ruby/object:Gem::Version
19
37
  version: '0'
20
38
  type: :development
21
39
  prerelease: false
22
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
23
42
  requirements:
24
- - - ">="
43
+ - - ! '>='
25
44
  - !ruby/object:Gem::Version
26
45
  version: '0'
27
46
  - !ruby/object:Gem::Dependency
28
47
  name: pry
29
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
30
50
  requirements:
31
- - - ">="
51
+ - - ! '>='
32
52
  - !ruby/object:Gem::Version
33
53
  version: '0'
34
54
  type: :development
35
55
  prerelease: false
36
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
37
58
  requirements:
38
- - - ">="
59
+ - - ! '>='
39
60
  - !ruby/object:Gem::Version
40
61
  version: '0'
41
62
  - !ruby/object:Gem::Dependency
42
63
  name: minitest
43
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
44
66
  requirements:
45
- - - "<"
67
+ - - <
46
68
  - !ruby/object:Gem::Version
47
69
  version: '5.0'
48
70
  type: :development
49
71
  prerelease: false
50
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
51
74
  requirements:
52
- - - "<"
75
+ - - <
53
76
  - !ruby/object:Gem::Version
54
77
  version: '5.0'
55
78
  - !ruby/object:Gem::Dependency
56
79
  name: mocha
57
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
58
82
  requirements:
59
- - - "~>"
83
+ - - ~>
60
84
  - !ruby/object:Gem::Version
61
85
  version: '0.13'
62
86
  type: :development
63
87
  prerelease: false
64
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
65
90
  requirements:
66
- - - "~>"
91
+ - - ~>
67
92
  - !ruby/object:Gem::Version
68
93
  version: '0.13'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: chalk-rake
71
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
72
98
  requirements:
73
- - - ">="
99
+ - - ! '>='
74
100
  - !ruby/object:Gem::Version
75
101
  version: '0'
76
102
  type: :development
77
103
  prerelease: false
78
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
79
106
  requirements:
80
- - - ">="
107
+ - - ! '>='
81
108
  - !ruby/object:Gem::Version
82
109
  version: '0'
83
110
  - !ruby/object:Gem::Dependency
84
111
  name: subprocess
85
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
86
114
  requirements:
87
- - - ">="
115
+ - - ! '>='
88
116
  - !ruby/object:Gem::Version
89
117
  version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
93
122
  requirements:
94
- - - ">="
123
+ - - ! '>='
95
124
  - !ruby/object:Gem::Version
96
125
  version: '0'
97
126
  description: Einhorn makes it easy to run multiple instances of an application server,
@@ -106,8 +135,8 @@ executables:
106
135
  extensions: []
107
136
  extra_rdoc_files: []
108
137
  files:
109
- - ".gitignore"
110
- - ".travis.yml"
138
+ - .gitignore
139
+ - .travis.yml
111
140
  - CONTRIBUTORS
112
141
  - Gemfile
113
142
  - History.txt
@@ -157,27 +186,34 @@ files:
157
186
  homepage: https://github.com/stripe/einhorn
158
187
  licenses:
159
188
  - MIT
160
- metadata: {}
161
189
  post_install_message:
162
190
  rdoc_options: []
163
191
  require_paths:
164
192
  - lib
165
193
  required_ruby_version: !ruby/object:Gem::Requirement
194
+ none: false
166
195
  requirements:
167
- - - ">="
196
+ - - ! '>='
168
197
  - !ruby/object:Gem::Version
169
198
  version: '0'
199
+ segments:
200
+ - 0
201
+ hash: -3456360524100968279
170
202
  required_rubygems_version: !ruby/object:Gem::Requirement
203
+ none: false
171
204
  requirements:
172
- - - ">="
205
+ - - ! '>='
173
206
  - !ruby/object:Gem::Version
174
207
  version: '0'
208
+ segments:
209
+ - 0
210
+ hash: -3456360524100968279
175
211
  requirements: []
176
212
  rubyforge_project:
177
- rubygems_version: 2.2.2
213
+ rubygems_version: 1.8.23
178
214
  signing_key:
179
- specification_version: 4
180
- summary: 'Einhorn: the language-independent shared socket manager'
215
+ specification_version: 3
216
+ summary: ! 'Einhorn: the language-independent shared socket manager'
181
217
  test_files:
182
218
  - test/_lib.rb
183
219
  - test/integration/_lib.rb
@@ -195,4 +231,3 @@ test_files:
195
231
  - test/unit/einhorn/command/interface.rb
196
232
  - test/unit/einhorn/event.rb
197
233
  - test/unit/einhorn/worker_pool.rb
198
- has_rdoc:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 9ad5953d5d76feb2ece4284c0c69db2ab3aa42d6
4
- data.tar.gz: a9e7290ffcf43ba56b5987bb51a3a45a94e18d84
5
- SHA512:
6
- metadata.gz: 9170d915de608cc8b467c474cbafaafbf4d0dbcac6103d446a67f3897a0c119247a213f84858b344a7c8ce2fa251be8e4370880bf35fbe92808831192c6191e1
7
- data.tar.gz: 92d76cdf34932a638be91c330219658570113b07bfeb76fe24291d74d6c374ee6b19939a9c120138ccc958f0af921ac6f99fa833211e7614dfd1df71c164f890