pitchfork 0.2.0 → 0.3.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.
Potentially problematic release.
This version of pitchfork might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/docs/CONFIGURATION.md +10 -21
- data/docs/DESIGN.md +1 -1
- data/docs/FORK_SAFETY.md +8 -3
- data/docs/REFORKING.md +33 -23
- data/examples/echo.ru +0 -1
- data/examples/pitchfork.conf.rb +3 -41
- data/ext/pitchfork_http/pitchfork_http.c +166 -166
- data/lib/pitchfork/children.rb +15 -5
- data/lib/pitchfork/chunked.rb +123 -0
- data/lib/pitchfork/configurator.rb +7 -7
- data/lib/pitchfork/http_parser.rb +0 -1
- data/lib/pitchfork/http_server.rb +115 -115
- data/lib/pitchfork/message.rb +2 -1
- data/lib/pitchfork/refork_condition.rb +18 -0
- data/lib/pitchfork/version.rb +1 -1
- data/lib/pitchfork/worker.rb +17 -11
- data/lib/pitchfork.rb +51 -17
- metadata +4 -3
data/lib/pitchfork/worker.rb
CHANGED
@@ -7,7 +7,7 @@ module Pitchfork
|
|
7
7
|
# releases of pitchfork. Knowledge of this class is generally not
|
8
8
|
# not needed for most users of pitchfork.
|
9
9
|
#
|
10
|
-
# Some users may want to access it in the
|
10
|
+
# Some users may want to access it in the after_worker_fork/after_mold_fork hooks.
|
11
11
|
# See the Pitchfork::Configurator RDoc for examples.
|
12
12
|
class Worker
|
13
13
|
# :stopdoc:
|
@@ -42,6 +42,10 @@ module Pitchfork
|
|
42
42
|
@exiting
|
43
43
|
end
|
44
44
|
|
45
|
+
def pending?
|
46
|
+
@master.nil?
|
47
|
+
end
|
48
|
+
|
45
49
|
def outdated?
|
46
50
|
CURRENT_GENERATION_DROP[0] > @generation
|
47
51
|
end
|
@@ -50,22 +54,24 @@ module Pitchfork
|
|
50
54
|
message.class.members.each do |member|
|
51
55
|
send("#{member}=", message.public_send(member))
|
52
56
|
end
|
53
|
-
|
54
|
-
case message
|
55
|
-
when Message::WorkerPromoted
|
56
|
-
promoted!
|
57
|
-
end
|
58
57
|
end
|
59
58
|
|
60
59
|
def register_to_master(control_socket)
|
61
60
|
create_socketpair!
|
62
|
-
message = Message::WorkerSpawned.new(@nr,
|
61
|
+
message = Message::WorkerSpawned.new(@nr, @pid, generation, @master)
|
63
62
|
control_socket.sendmsg(message)
|
64
63
|
@master.close
|
65
64
|
end
|
66
65
|
|
67
|
-
def
|
68
|
-
|
66
|
+
def start_promotion(control_socket)
|
67
|
+
create_socketpair!
|
68
|
+
message = Message::MoldSpawned.new(@nr, @pid, generation, @master)
|
69
|
+
control_socket.sendmsg(message)
|
70
|
+
@master.close
|
71
|
+
end
|
72
|
+
|
73
|
+
def finish_promotion(control_socket)
|
74
|
+
message = Message::MoldReady.new(@nr, @pid, generation)
|
69
75
|
control_socket.sendmsg(message)
|
70
76
|
CURRENT_GENERATION_DROP[0] = @generation
|
71
77
|
end
|
@@ -198,7 +204,7 @@ module Pitchfork
|
|
198
204
|
end
|
199
205
|
|
200
206
|
def after_fork_in_child
|
201
|
-
@master
|
207
|
+
@master&.close
|
202
208
|
end
|
203
209
|
|
204
210
|
private
|
@@ -215,7 +221,7 @@ module Pitchfork
|
|
215
221
|
else
|
216
222
|
success = true
|
217
223
|
end
|
218
|
-
rescue Errno::EPIPE
|
224
|
+
rescue Errno::EPIPE, Errno::ECONNRESET
|
219
225
|
# worker will be reaped soon
|
220
226
|
end
|
221
227
|
success
|
data/lib/pitchfork.rb
CHANGED
@@ -57,15 +57,13 @@ module Pitchfork
|
|
57
57
|
Object.const_get(File.basename(ru, '.rb').capitalize)
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
inner_app
|
68
|
-
end
|
60
|
+
Rack::Builder.new do
|
61
|
+
use(Rack::ContentLength)
|
62
|
+
use(Pitchfork::Chunked)
|
63
|
+
use(Rack::Lint) if ENV["RACK_ENV"] == "development"
|
64
|
+
use(Rack::TempfileReaper)
|
65
|
+
run inner_app
|
66
|
+
end.to_app
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
@@ -136,17 +134,53 @@ module Pitchfork
|
|
136
134
|
parent_thread.thread_variables.each do |variable|
|
137
135
|
current_thread.thread_variable_set(variable, parent_thread.thread_variable_get(variable))
|
138
136
|
end
|
139
|
-
|
140
|
-
fork(&block)
|
137
|
+
Process.fork(&block)
|
141
138
|
end.value
|
142
139
|
end
|
140
|
+
|
141
|
+
def self.fork_sibling(&block)
|
142
|
+
if REFORKING_AVAILABLE
|
143
|
+
# We double fork so that the new worker is re-attached back
|
144
|
+
# to the master.
|
145
|
+
# This requires either PR_SET_CHILD_SUBREAPER which is exclusive to Linux 3.4
|
146
|
+
# or the master to be PID 1.
|
147
|
+
if middle_pid = Process.fork # parent
|
148
|
+
# We need to wait(2) so that the middle process doesn't end up a zombie.
|
149
|
+
Process.wait(middle_pid)
|
150
|
+
else # first child
|
151
|
+
clean_fork(&block) # detach into a grand child
|
152
|
+
exit
|
153
|
+
end
|
154
|
+
else
|
155
|
+
clean_fork(&block)
|
156
|
+
end
|
157
|
+
|
158
|
+
nil # it's tricky to return the PID
|
159
|
+
end
|
160
|
+
|
161
|
+
def self.time_now(int = false)
|
162
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC, int ? :second : :float_second)
|
163
|
+
end
|
143
164
|
# :startdoc:
|
144
165
|
end
|
145
166
|
# :enddoc:
|
146
167
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
168
|
+
require 'pitchfork/pitchfork_http'
|
169
|
+
|
170
|
+
Pitchfork::REFORKING_AVAILABLE = Pitchfork::CHILD_SUBREAPER_AVAILABLE || Process.pid == 1
|
171
|
+
|
172
|
+
require_relative "pitchfork/const"
|
173
|
+
require_relative "pitchfork/socket_helper"
|
174
|
+
require_relative "pitchfork/stream_input"
|
175
|
+
require_relative "pitchfork/tee_input"
|
176
|
+
require_relative "pitchfork/mem_info"
|
177
|
+
require_relative "pitchfork/children"
|
178
|
+
require_relative "pitchfork/message"
|
179
|
+
require_relative "pitchfork/chunked"
|
180
|
+
require_relative "pitchfork/http_parser"
|
181
|
+
require_relative "pitchfork/refork_condition"
|
182
|
+
require_relative "pitchfork/configurator"
|
183
|
+
require_relative "pitchfork/tmpio"
|
184
|
+
require_relative "pitchfork/http_response"
|
185
|
+
require_relative "pitchfork/worker"
|
186
|
+
require_relative "pitchfork/http_server"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pitchfork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: raindrops
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- lib/pitchfork.rb
|
95
95
|
- lib/pitchfork/app/old_rails/static.rb
|
96
96
|
- lib/pitchfork/children.rb
|
97
|
+
- lib/pitchfork/chunked.rb
|
97
98
|
- lib/pitchfork/configurator.rb
|
98
99
|
- lib/pitchfork/const.rb
|
99
100
|
- lib/pitchfork/flock.rb
|
@@ -133,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
134
|
- !ruby/object:Gem::Version
|
134
135
|
version: '0'
|
135
136
|
requirements: []
|
136
|
-
rubygems_version: 3.4.
|
137
|
+
rubygems_version: 3.4.10
|
137
138
|
signing_key:
|
138
139
|
specification_version: 4
|
139
140
|
summary: Rack HTTP server for fast clients and Unix
|