einhorn 0.5.1 → 0.5.2
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.
- data/lib/einhorn/command/interface.rb +1 -1
- data/lib/einhorn/command.rb +16 -4
- data/lib/einhorn/compat.rb +48 -0
- data/lib/einhorn/event/command_server.rb +1 -1
- data/lib/einhorn/event.rb +4 -7
- data/lib/einhorn/version.rb +1 -1
- data/lib/einhorn.rb +1 -0
- metadata +4 -8
data/lib/einhorn/command.rb
CHANGED
@@ -181,7 +181,8 @@ module Einhorn
|
|
181
181
|
$stdout.flush
|
182
182
|
|
183
183
|
# Spawn a child to pass the state through the pipe
|
184
|
-
read, write =
|
184
|
+
read, write = Einhorn::Compat.pipe
|
185
|
+
|
185
186
|
fork do
|
186
187
|
Einhorn::TransientState.whatami = :state_passer
|
187
188
|
Einhorn::State.generation += 1
|
@@ -190,7 +191,12 @@ module Einhorn
|
|
190
191
|
}
|
191
192
|
read.close
|
192
193
|
|
193
|
-
|
194
|
+
begin
|
195
|
+
write.write(YAML.dump(dumpable_state))
|
196
|
+
rescue Errno::EPIPE => e
|
197
|
+
e.message << " (state worker could not write state, which likely means the parent process has died)"
|
198
|
+
raise e
|
199
|
+
end
|
194
200
|
write.close
|
195
201
|
|
196
202
|
exit(0)
|
@@ -202,7 +208,11 @@ module Einhorn
|
|
202
208
|
ENV.update(Einhorn::TransientState.environ)
|
203
209
|
|
204
210
|
begin
|
205
|
-
|
211
|
+
Einhorn::Compat.exec(
|
212
|
+
Einhorn::TransientState.script_name,
|
213
|
+
['--with-state-fd', read.fileno.to_s, '--'] + Einhorn::State.cmd,
|
214
|
+
:close_others => false
|
215
|
+
)
|
206
216
|
rescue SystemCallError => e
|
207
217
|
Einhorn.log_error("Could not reload! Attempting to continue. Error was: #{e}")
|
208
218
|
Einhorn::State.reloading_for_preload_upgrade = false
|
@@ -235,10 +245,12 @@ module Einhorn
|
|
235
245
|
# have to track and manually close FDs for other cases, we
|
236
246
|
# may as well just reuse close_all rather than also set
|
237
247
|
# cloexec on everything.
|
248
|
+
#
|
249
|
+
# Note that Ruby 1.9's close_others option is useful here.
|
238
250
|
Einhorn::Event.close_all_for_worker
|
239
251
|
|
240
252
|
prepare_child_environment
|
241
|
-
exec
|
253
|
+
Einhorn::Compat.exec(cmd[0], cmd[1..-1], :close_others => true)
|
242
254
|
end
|
243
255
|
end
|
244
256
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Einhorn
|
2
|
+
module Compat
|
3
|
+
# In Ruby 2.1.0 (and possibly earlier), IO.pipe sets cloexec on
|
4
|
+
# the descriptors.
|
5
|
+
def self.pipe
|
6
|
+
readable, writeable = IO.pipe
|
7
|
+
cloexec!(readable, false)
|
8
|
+
cloexec!(writeable, false)
|
9
|
+
[readable, writeable]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.cloexec!(fd, enable)
|
13
|
+
original = fd.fcntl(Fcntl::F_GETFD)
|
14
|
+
if enable
|
15
|
+
new = original | Fcntl::FD_CLOEXEC
|
16
|
+
else
|
17
|
+
new = original & (-Fcntl::FD_CLOEXEC-1)
|
18
|
+
end
|
19
|
+
fd.fcntl(Fcntl::F_SETFD, new)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.cloexec?(fd)
|
23
|
+
fd.fcntl(Fcntl::F_GETFD) & Fcntl::FD_CLOEXEC
|
24
|
+
end
|
25
|
+
|
26
|
+
# Opts are ignored in Ruby 1.8
|
27
|
+
def self.exec(script, args, opts={})
|
28
|
+
cmd = [script, script]
|
29
|
+
begin
|
30
|
+
Kernel.exec(cmd, *(args + [opts]))
|
31
|
+
rescue TypeError
|
32
|
+
Kernel.exec(cmd, *args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.unixserver_new(path)
|
37
|
+
server = UNIXServer.new(path)
|
38
|
+
cloexec!(server, false)
|
39
|
+
server
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.accept_nonblock(server)
|
43
|
+
sock = server.accept_nonblock
|
44
|
+
cloexec!(sock, false)
|
45
|
+
sock
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/einhorn/event.rb
CHANGED
@@ -10,17 +10,14 @@ module Einhorn
|
|
10
10
|
@@connections = {}
|
11
11
|
@@timers = {}
|
12
12
|
|
13
|
-
def self.cloexec!(fd)
|
14
|
-
fd.fcntl(Fcntl::F_SETFD, fd.fcntl(Fcntl::F_GETFD) | Fcntl::FD_CLOEXEC)
|
15
|
-
end
|
16
|
-
|
17
13
|
def self.init
|
18
|
-
readable, writeable =
|
14
|
+
readable, writeable = Einhorn::Compat.pipe
|
15
|
+
|
19
16
|
@@loopbreak_reader = LoopBreaker.open(readable)
|
20
17
|
@@loopbreak_writer = writeable
|
21
18
|
|
22
|
-
cloexec!(readable)
|
23
|
-
cloexec!(writeable)
|
19
|
+
Einhorn::Compat.cloexec!(readable, true)
|
20
|
+
Einhorn::Compat.cloexec!(writeable, true)
|
24
21
|
end
|
25
22
|
|
26
23
|
def self.close_all
|
data/lib/einhorn/version.rb
CHANGED
data/lib/einhorn.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: einhorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-12-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- lib/einhorn/client.rb
|
156
156
|
- lib/einhorn/command.rb
|
157
157
|
- lib/einhorn/command/interface.rb
|
158
|
+
- lib/einhorn/compat.rb
|
158
159
|
- lib/einhorn/event.rb
|
159
160
|
- lib/einhorn/event/abstract_text_descriptor.rb
|
160
161
|
- lib/einhorn/event/ack_timer.rb
|
@@ -195,18 +196,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
196
|
- - ! '>='
|
196
197
|
- !ruby/object:Gem::Version
|
197
198
|
version: '0'
|
198
|
-
segments:
|
199
|
-
- 0
|
200
|
-
hash: -4058700174817085581
|
201
199
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
200
|
none: false
|
203
201
|
requirements:
|
204
202
|
- - ! '>='
|
205
203
|
- !ruby/object:Gem::Version
|
206
204
|
version: '0'
|
207
|
-
segments:
|
208
|
-
- 0
|
209
|
-
hash: -4058700174817085581
|
210
205
|
requirements: []
|
211
206
|
rubyforge_project:
|
212
207
|
rubygems_version: 1.8.23
|
@@ -221,3 +216,4 @@ test_files:
|
|
221
216
|
- test/unit/einhorn/command/interface.rb
|
222
217
|
- test/unit/einhorn/event.rb
|
223
218
|
- test/unit/einhorn/worker_pool.rb
|
219
|
+
has_rdoc:
|