svelte-on-rails 23.1.0 → 23.1.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.
- checksums.yaml +4 -4
- data/lib/svelte_on_rails/cache.rb +1 -1
- data/lib/svelte_on_rails/ssr_client.rb +184 -71
- data/lib/tasks/ssr_client_tasks.rake +1 -3
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e1ab30669578fe29fb245c12c41a0b3b25d14771ee678ea57b369fd0fdd3c9bd
|
|
4
|
+
data.tar.gz: 13abe226046b6277b1c25f088fd0ed1997e4e57d5ae3f758575b55561c5f9372
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1f0276d33017984819175f07c6203858a98ce736039988cbed471be00f537e5b9827428776c2df29f5594a028cad5e5399c24c0b50e6493cb81e00cf2dd7f657
|
|
7
|
+
data.tar.gz: 32a6d6da4edbfb741946453ebc4d2cef3de16d0bea30a4749ab394bf0eae647c53eae64d8acd4f649fdb9ffc789e4fc0c2ab85526b382892fc7bc9c75d0d8015
|
|
@@ -6,12 +6,15 @@ module SvelteOnRails
|
|
|
6
6
|
|
|
7
7
|
include Singleton
|
|
8
8
|
|
|
9
|
+
STARTUP_GENERATION_TTL = 30
|
|
10
|
+
|
|
9
11
|
attr_reader :logfile_path,
|
|
10
12
|
:logfile_max_lines,
|
|
11
13
|
:socket_path,
|
|
12
14
|
:ssr_server_bin_path,
|
|
13
15
|
:node_bin,
|
|
14
|
-
:initialized_by
|
|
16
|
+
:initialized_by,
|
|
17
|
+
:startup_id
|
|
15
18
|
|
|
16
19
|
def self.instance(caller: nil)
|
|
17
20
|
|
|
@@ -23,38 +26,38 @@ module SvelteOnRails
|
|
|
23
26
|
|
|
24
27
|
@initialized_by = caller
|
|
25
28
|
|
|
26
|
-
if startup_leader?
|
|
27
|
-
File.open(SvelteOnRails::Lib::Utils.ssr_server_logfile, 'w') do |f|
|
|
28
|
-
f.sync = true
|
|
29
|
-
f.puts("[#{Time.now.utc.iso8601(3)} ppid:#{Process.ppid} pid:#{Process.pid}] >>> Logfile deleted on initializing SsrClient, called by #{caller} <<<")
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
29
|
@socket_namespace = [
|
|
34
30
|
"svelte",
|
|
35
31
|
Rails.application.class.module_parent_name[0..15],
|
|
36
32
|
Rails.env
|
|
37
33
|
].join("-")
|
|
34
|
+
|
|
35
|
+
@startup_leader = startup_leader?
|
|
38
36
|
@socket_path = socket_path_fresh
|
|
39
37
|
|
|
38
|
+
if @startup_leader
|
|
39
|
+
File.open(SvelteOnRails::Lib::Utils.ssr_server_logfile, 'w') do |f|
|
|
40
|
+
f.sync = true
|
|
41
|
+
f.puts("[#{Time.now.utc.iso8601(3)} startup_id:#{@startup_id} ppid:#{Process.ppid} pid:#{Process.pid}] >>> Logfile deleted on initializing SsrClient, called by #{caller} <<<")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
40
45
|
@logfile_path = Rails.root.join("log/svelte-ssr-server-#{Rails.env}.log")
|
|
41
46
|
@logfile_max_lines = build_logfile_max_lines
|
|
42
47
|
@ssr_server = SvelteOnRails::Configuration.instance.configs[:ssr_server]
|
|
43
48
|
@ssr_server_bin_path = SvelteOnRails::Configuration.instance.ssr_server_bin_path
|
|
44
49
|
@started = Time.now
|
|
45
50
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
SvelteOnRails::SsrClientControlChannel.install_control_listener if startup_leader?
|
|
51
|
+
SvelteOnRails::SsrClientControlChannel.install_control_listener if @startup_leader
|
|
49
52
|
|
|
50
53
|
if @ssr_server
|
|
51
54
|
|
|
52
|
-
start_node_server! if startup_leader
|
|
55
|
+
start_node_server! if @startup_leader
|
|
53
56
|
|
|
54
57
|
at_exit do
|
|
55
|
-
shutdown(caller: 'at_exit')
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
shutdown(caller: 'at_exit') if @startup_leader
|
|
59
|
+
@startup_flock&.flock(File::LOCK_UN)
|
|
60
|
+
@startup_flock&.close
|
|
58
61
|
end
|
|
59
62
|
else
|
|
60
63
|
SvelteOnRails::Lib::Utils.ssr_server_log("SSR Server NOT used => @ssr_server #{@ssr_server}")
|
|
@@ -131,7 +134,7 @@ module SvelteOnRails
|
|
|
131
134
|
:render_failed,
|
|
132
135
|
"Render #{component[:file_basename]}.svelte",
|
|
133
136
|
[
|
|
134
|
-
raw_response['logs']
|
|
137
|
+
format_node_error_logs(raw_response['logs']),
|
|
135
138
|
"View:\n#{view_path_proc.call}\nComponent:\n#{Rails.root.join(component[:path]).to_s}#{imps}",
|
|
136
139
|
]
|
|
137
140
|
)
|
|
@@ -161,6 +164,7 @@ module SvelteOnRails
|
|
|
161
164
|
unless File.exist?(socket_path)
|
|
162
165
|
return false
|
|
163
166
|
end
|
|
167
|
+
|
|
164
168
|
response = ''
|
|
165
169
|
begin
|
|
166
170
|
sock = UNIXSocket.new(socket_path)
|
|
@@ -171,6 +175,7 @@ module SvelteOnRails
|
|
|
171
175
|
rescue => e
|
|
172
176
|
puts "[SOR] Ping Failed: #{e.message}"
|
|
173
177
|
end
|
|
178
|
+
|
|
174
179
|
if response.match?(/^HTTP\/\d\.\d 200/)
|
|
175
180
|
r = parse_body_json(response)
|
|
176
181
|
unless r['version'].split('.').first.to_i >= 14
|
|
@@ -181,11 +186,17 @@ module SvelteOnRails
|
|
|
181
186
|
end
|
|
182
187
|
|
|
183
188
|
def start_node_server!(
|
|
184
|
-
started_by = "rails-boot-#{Rails.env}-#{
|
|
189
|
+
started_by = "rails-boot-#{Rails.env}-#{@startup_id}",
|
|
185
190
|
restart_after_failure: false
|
|
186
191
|
)
|
|
187
192
|
|
|
188
|
-
|
|
193
|
+
if ping?
|
|
194
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
195
|
+
"SOR start_node_server skipped because SSR server is already running for startup_id #{@startup_id}",
|
|
196
|
+
ssr_logfile_only: !restart_after_failure
|
|
197
|
+
)
|
|
198
|
+
return
|
|
199
|
+
end
|
|
189
200
|
|
|
190
201
|
SvelteOnRails::Lib::Utils.ssr_server_log("SOR start_node_server! called", ssr_logfile_only: !restart_after_failure)
|
|
191
202
|
|
|
@@ -203,6 +214,7 @@ module SvelteOnRails
|
|
|
203
214
|
status: status
|
|
204
215
|
}
|
|
205
216
|
end
|
|
217
|
+
|
|
206
218
|
SvelteOnRails::Lib::Utils.ssr_server_log("Node Version: #{Configuration.instance.node_version_test}, package version: #{Configuration.instance.npm_package_version_test}")
|
|
207
219
|
SvelteOnRails::Lib::Utils.ssr_server_log("Start running Svelte-SSR-Server... (#{started_by})")
|
|
208
220
|
|
|
@@ -227,30 +239,50 @@ module SvelteOnRails
|
|
|
227
239
|
SvelteOnRails::Lib::Utils.ssr_server_log("Server responded successfully")
|
|
228
240
|
|
|
229
241
|
cleanup_leftover_processes
|
|
230
|
-
|
|
231
|
-
cleanup_flock_file_later
|
|
232
242
|
end
|
|
233
243
|
|
|
234
244
|
def restart_my_server(tag = nil)
|
|
245
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("[ERROR] try to restart the node instances...")
|
|
246
|
+
FileUtils.mkdir_p(File.dirname(restart_flock_file))
|
|
247
|
+
restart_flock_existed = File.exist?(restart_flock_file)
|
|
248
|
+
|
|
249
|
+
File.open(restart_flock_file, File::RDWR | File::CREAT, 0o644) do |flock|
|
|
250
|
+
unless flock.flock(File::LOCK_EX | File::LOCK_NB)
|
|
251
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
252
|
+
"[ERROR] SSR restart already in progress by another worker"
|
|
253
|
+
)
|
|
254
|
+
return
|
|
255
|
+
end
|
|
235
256
|
|
|
236
|
-
|
|
237
|
-
if File.exist?(marker) && File.mtime(marker) > 10.seconds.ago
|
|
238
|
-
SvelteOnRails::Lib::Utils.ssr_server_log("[ERROR] Prevented Server Restart because server was restarted too recently: #{marker}")
|
|
239
|
-
return
|
|
240
|
-
end
|
|
257
|
+
return if ping?
|
|
241
258
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
259
|
+
if restart_flock_existed
|
|
260
|
+
last_restart_at = File.mtime(restart_flock_file)
|
|
261
|
+
if last_restart_at > 10.seconds.ago
|
|
262
|
+
seconds_since_restart = Time.now - last_restart_at
|
|
263
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
264
|
+
"[ERROR] Prevented Server Restart because server was restarted too recently: #{seconds_since_restart.round(2)}s ago"
|
|
265
|
+
)
|
|
266
|
+
return
|
|
267
|
+
end
|
|
268
|
+
end
|
|
245
269
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
270
|
+
flock.seek(0, IO::SEEK_END)
|
|
271
|
+
flock.puts(Time.now.utc.iso8601)
|
|
272
|
+
flock.flush
|
|
273
|
+
count = File.readlines(restart_flock_file).count
|
|
249
274
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
275
|
+
# RESTART
|
|
276
|
+
|
|
277
|
+
msg = "Restarting SSR server (#{tag})"
|
|
278
|
+
Rails.logger.error(msg)
|
|
279
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("[ERROR] #{msg}")
|
|
280
|
+
|
|
281
|
+
shutdown(caller: 'restart')
|
|
282
|
+
begin
|
|
283
|
+
start_node_server!("#{tag.gsub(' ', '-') + '-' if tag}#{count}", restart_after_failure: true)
|
|
284
|
+
rescue
|
|
285
|
+
end
|
|
254
286
|
end
|
|
255
287
|
end
|
|
256
288
|
|
|
@@ -259,7 +291,7 @@ module SvelteOnRails
|
|
|
259
291
|
"ps aux | grep svelte"
|
|
260
292
|
)
|
|
261
293
|
stdout.split("\n").each do |line|
|
|
262
|
-
if line.include?("#{@socket_namespace}-#{
|
|
294
|
+
if line.include?("#{@socket_namespace}-#{@startup_id}.sock")
|
|
263
295
|
return line.match(/[0-9]+/).to_s.to_i
|
|
264
296
|
end
|
|
265
297
|
end
|
|
@@ -282,8 +314,7 @@ module SvelteOnRails
|
|
|
282
314
|
end
|
|
283
315
|
|
|
284
316
|
def shutdown(caller: '')
|
|
285
|
-
|
|
286
|
-
SvelteOnRails::Lib::Utils.ssr_server_log("Shutting down SSR client, ppid: #{Process.ppid} (#{caller})")
|
|
317
|
+
SvelteOnRails::Lib::Utils.ssr_server_log("Shutting down SSR client, startup_id: #{@startup_id}, ppid: #{Process.ppid} (#{caller})")
|
|
287
318
|
terminate_node_processes(own_processes, label: "own")
|
|
288
319
|
{
|
|
289
320
|
success: true
|
|
@@ -296,23 +327,24 @@ module SvelteOnRails
|
|
|
296
327
|
|
|
297
328
|
# NODE PROCESS MANAGEMENT
|
|
298
329
|
|
|
299
|
-
SsrProcess = Struct.new(:pid, :
|
|
330
|
+
SsrProcess = Struct.new(:pid, :startup_id, :socket_path, keyword_init: true)
|
|
300
331
|
|
|
301
332
|
def own_processes
|
|
302
|
-
scan_processes.select { |p| p.
|
|
333
|
+
scan_processes.select { |p| p.startup_id == @startup_id }
|
|
303
334
|
end
|
|
304
335
|
|
|
305
336
|
def leftover_processes
|
|
306
|
-
scan_processes.reject { |p| p.
|
|
337
|
+
scan_processes.reject { |p| p.startup_id == @startup_id }
|
|
307
338
|
end
|
|
308
339
|
|
|
309
340
|
def leftover_sockets
|
|
310
|
-
scan_sockets.reject { |s| s[:
|
|
341
|
+
scan_sockets.reject { |s| s[:startup_id] == @startup_id }
|
|
311
342
|
end
|
|
312
343
|
|
|
313
344
|
def cleanup_leftover_processes
|
|
314
345
|
terminate_node_processes(leftover_processes, label: "leftover")
|
|
315
346
|
delete_sockets(leftover_sockets.map { |s| s[:path] }, label: "leftover")
|
|
347
|
+
delete_old_startup_flock_files
|
|
316
348
|
end
|
|
317
349
|
|
|
318
350
|
# END node process management
|
|
@@ -322,49 +354,103 @@ module SvelteOnRails
|
|
|
322
354
|
def startup_leader?
|
|
323
355
|
return @startup_leader unless @startup_leader.nil?
|
|
324
356
|
|
|
325
|
-
FileUtils.mkdir_p(
|
|
357
|
+
FileUtils.mkdir_p(startup_lock_dir)
|
|
358
|
+
|
|
359
|
+
if (recent_file = latest_recent_startup_flock_file)
|
|
360
|
+
@startup_id = startup_id_from_flock_file(recent_file)
|
|
361
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
362
|
+
"Startup generation reused: startup_id=#{@startup_id}, pid=#{Process.pid}, ppid=#{Process.ppid}",
|
|
363
|
+
ssr_logfile_only: true
|
|
364
|
+
)
|
|
365
|
+
return @startup_leader = false
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
@startup_id = build_startup_id
|
|
369
|
+
path = startup_flock_file(@startup_id)
|
|
326
370
|
|
|
327
|
-
|
|
371
|
+
begin
|
|
372
|
+
@startup_flock = File.open(path, File::WRONLY | File::CREAT | File::EXCL, 0o644)
|
|
373
|
+
@startup_flock.flock(File::LOCK_EX | File::LOCK_NB)
|
|
374
|
+
write_startup_flock_info(@startup_flock)
|
|
328
375
|
|
|
329
|
-
if flock.flock(File::LOCK_EX | File::LOCK_NB)
|
|
330
376
|
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
331
|
-
"Startup leader process elected: pid=#{Process.pid}, ppid=#{Process.ppid}",
|
|
377
|
+
"Startup leader process elected: startup_id=#{@startup_id}, pid=#{Process.pid}, ppid=#{Process.ppid}",
|
|
332
378
|
ssr_logfile_only: true
|
|
333
379
|
)
|
|
380
|
+
|
|
334
381
|
@startup_leader = true
|
|
335
|
-
|
|
336
|
-
|
|
382
|
+
rescue Errno::EEXIST
|
|
383
|
+
@startup_flock&.close
|
|
384
|
+
@startup_flock = nil
|
|
385
|
+
|
|
386
|
+
recent_file = latest_recent_startup_flock_file || latest_startup_flock_file
|
|
387
|
+
@startup_id = startup_id_from_flock_file(recent_file)
|
|
337
388
|
|
|
338
389
|
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
339
|
-
"Startup
|
|
390
|
+
"Startup generation already created by another worker: startup_id=#{@startup_id}, pid=#{Process.pid}, ppid=#{Process.ppid}",
|
|
340
391
|
ssr_logfile_only: true
|
|
341
392
|
)
|
|
393
|
+
|
|
342
394
|
@startup_leader = false
|
|
343
395
|
end
|
|
344
396
|
|
|
345
397
|
@startup_leader
|
|
346
398
|
end
|
|
347
399
|
|
|
400
|
+
def startup_lock_dir
|
|
401
|
+
Rails.root.join('tmp', 'sockets')
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def startup_flock_glob
|
|
405
|
+
startup_lock_dir.join("sor-startup-leader-*.flock")
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def startup_flock_file(startup_id)
|
|
409
|
+
startup_lock_dir.join("sor-startup-leader-#{startup_id}.flock")
|
|
410
|
+
end
|
|
411
|
+
|
|
348
412
|
def flock_file
|
|
349
|
-
|
|
413
|
+
startup_flock_file(@startup_id)
|
|
350
414
|
end
|
|
351
415
|
|
|
352
|
-
def
|
|
353
|
-
|
|
416
|
+
def restart_flock_file
|
|
417
|
+
Rails.root.join('tmp', 'sockets', "sor-restart-#{@startup_id}.flock")
|
|
418
|
+
end
|
|
354
419
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
420
|
+
def build_startup_id
|
|
421
|
+
bucket = Time.now.to_i / STARTUP_GENERATION_TTL * STARTUP_GENERATION_TTL
|
|
422
|
+
"#{bucket}-#{Process.pid}"
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
def startup_id_from_flock_file(path)
|
|
426
|
+
basename = File.basename(path.to_s)
|
|
427
|
+
basename.delete_prefix("sor-startup-leader-").delete_suffix(".flock")
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def latest_startup_flock_file
|
|
431
|
+
Dir.glob(startup_flock_glob.to_s).max_by { |path| File.mtime(path) }
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def latest_recent_startup_flock_file
|
|
435
|
+
latest = latest_startup_flock_file
|
|
436
|
+
return unless latest
|
|
437
|
+
|
|
438
|
+
age = Time.now - File.mtime(latest)
|
|
439
|
+
latest if age <= STARTUP_GENERATION_TTL
|
|
364
440
|
end
|
|
365
441
|
|
|
366
|
-
def
|
|
367
|
-
|
|
442
|
+
def write_startup_flock_info(flock)
|
|
443
|
+
flock.rewind
|
|
444
|
+
flock.truncate(0)
|
|
445
|
+
flock.puts({
|
|
446
|
+
startup_id: @startup_id,
|
|
447
|
+
pid: Process.pid,
|
|
448
|
+
ppid: Process.ppid,
|
|
449
|
+
rails_root: Rails.root.to_s,
|
|
450
|
+
socket_path: socket_path_fresh.to_s,
|
|
451
|
+
created_at: Time.now.utc.iso8601(3)
|
|
452
|
+
}.to_json)
|
|
453
|
+
flock.flush
|
|
368
454
|
end
|
|
369
455
|
|
|
370
456
|
def default_ssr_url
|
|
@@ -405,6 +491,7 @@ module SvelteOnRails
|
|
|
405
491
|
|
|
406
492
|
def shorten_logfile
|
|
407
493
|
return unless File.exist?(logfile_path)
|
|
494
|
+
|
|
408
495
|
Thread.new do
|
|
409
496
|
lines = File.readlines(logfile_path, chomp: true)
|
|
410
497
|
unless lines.size <= logfile_max_lines
|
|
@@ -434,8 +521,7 @@ module SvelteOnRails
|
|
|
434
521
|
end
|
|
435
522
|
|
|
436
523
|
def socket_path_fresh
|
|
437
|
-
|
|
438
|
-
app_sock = Rails.root.join("tmp/sockets/#{@socket_namespace}-#{ppid}.sock")
|
|
524
|
+
app_sock = Rails.root.join("tmp/sockets/#{@socket_namespace}-#{@startup_id}.sock")
|
|
439
525
|
if app_sock.to_s.length <= 103
|
|
440
526
|
FileUtils.mkdir_p(File.dirname(app_sock))
|
|
441
527
|
return app_sock
|
|
@@ -443,11 +529,23 @@ module SvelteOnRails
|
|
|
443
529
|
|
|
444
530
|
# Fallback: socket paths > 103 chars are unreliable on macOS/BSD
|
|
445
531
|
FileUtils.rm_f(app_sock) if File.exist?(app_sock)
|
|
446
|
-
fallback = Pathname.new("/tmp/#{@socket_namespace}-#{
|
|
532
|
+
fallback = Pathname.new("/tmp/#{@socket_namespace}-#{@startup_id}.sock")
|
|
447
533
|
SvelteOnRails::Lib::Utils.ssr_server_log("sockets longer than 103 chars are risky, fallback to: #{fallback}")
|
|
448
534
|
fallback
|
|
449
535
|
end
|
|
450
536
|
|
|
537
|
+
def format_node_error_logs(logs)
|
|
538
|
+
errors = logs.select { |l| l['level'].downcase.include?('error') }
|
|
539
|
+
l = errors.present? ? errors : logs
|
|
540
|
+
l.map do |lg|
|
|
541
|
+
if lg['level'].present? && lg['msg'].present?
|
|
542
|
+
"#{lg['level'].upcase}: #{lg['msg']}"
|
|
543
|
+
else
|
|
544
|
+
lg.to_s
|
|
545
|
+
end
|
|
546
|
+
end.compact.join("\n")
|
|
547
|
+
end
|
|
548
|
+
|
|
451
549
|
# NODE PROCESS MANAGEMENT
|
|
452
550
|
|
|
453
551
|
def terminate_node_processes(processes, label:)
|
|
@@ -455,7 +553,7 @@ module SvelteOnRails
|
|
|
455
553
|
|
|
456
554
|
processes.group_by(&:socket_path).values.flat_map { |g| g.sort_by(&:pid) }.each do |p|
|
|
457
555
|
Process.kill("SIGINT", p.pid) rescue Errno::ESRCH || Errno::EPERM
|
|
458
|
-
SvelteOnRails::Lib::Utils.ssr_server_log(" Killed #{label} unix-pid: #{p.pid},
|
|
556
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(" Killed #{label} unix-pid: #{p.pid}, startup_id: #{p.startup_id}, socket-path: #{p.socket_path}", ssr_logfile_only: true)
|
|
459
557
|
end
|
|
460
558
|
|
|
461
559
|
SvelteOnRails::Lib::Utils.ssr_server_log("Killed #{processes.length} #{label} process#{'es' if processes.length != 1}")
|
|
@@ -473,23 +571,36 @@ module SvelteOnRails
|
|
|
473
571
|
SvelteOnRails::Lib::Utils.ssr_server_log("Deleted #{socket_paths.size} #{label} socket#{'s' if socket_paths.size != 1}")
|
|
474
572
|
end
|
|
475
573
|
|
|
574
|
+
def delete_old_startup_flock_files
|
|
575
|
+
Dir.glob(startup_flock_glob.to_s).each do |path|
|
|
576
|
+
next if startup_id_from_flock_file(path) == @startup_id
|
|
577
|
+
|
|
578
|
+
FileUtils.rm_f(path) if File.exist?(path)
|
|
579
|
+
rescue => e
|
|
580
|
+
SvelteOnRails::Lib::Utils.ssr_server_log(
|
|
581
|
+
"Could not remove old startup flock file #{path}: #{e.class}: #{e.message}",
|
|
582
|
+
ssr_logfile_only: true
|
|
583
|
+
)
|
|
584
|
+
end
|
|
585
|
+
end
|
|
586
|
+
|
|
476
587
|
def scan_processes
|
|
477
588
|
stdout, = Open3.capture3("ps aux | grep svelte | grep -v grep")
|
|
478
|
-
regex = %r{(/\S*#{Regexp.escape(@socket_namespace)}-(
|
|
589
|
+
regex = %r{(/\S*#{Regexp.escape(@socket_namespace)}-([0-9]+-[0-9]+)\.sock)\b}
|
|
479
590
|
|
|
480
591
|
stdout.each_line.filter_map do |line|
|
|
481
592
|
m = line.match(regex) or next
|
|
482
593
|
pid = Integer(line.split(/\s+/, 12)[1], exception: false) or next
|
|
483
|
-
SsrProcess.new(pid: pid,
|
|
594
|
+
SsrProcess.new(pid: pid, startup_id: m[2], socket_path: m[1])
|
|
484
595
|
end
|
|
485
596
|
end
|
|
486
597
|
|
|
487
598
|
def scan_sockets
|
|
488
599
|
dirs = [Rails.root.join("tmp/sockets").to_s, "/tmp"]
|
|
489
|
-
regex = /#{Regexp.escape(@socket_namespace)}-(
|
|
600
|
+
regex = /#{Regexp.escape(@socket_namespace)}-([0-9]+-[0-9]+)\.sock\z/
|
|
490
601
|
|
|
491
602
|
dirs.flat_map { |d| Dir.glob(File.join(d, "#{@socket_namespace}-*.sock")) }
|
|
492
|
-
.filter_map { |path| (m = path.match(regex)) && { path: path,
|
|
603
|
+
.filter_map { |path| (m = path.match(regex)) && { path: path, startup_id: m[1] } }
|
|
493
604
|
end
|
|
494
605
|
|
|
495
606
|
# END node process management
|
|
@@ -514,6 +625,7 @@ module SvelteOnRails
|
|
|
514
625
|
# enable communication by rake task for admin purposes
|
|
515
626
|
def self.install_control_listener
|
|
516
627
|
return if @installed
|
|
628
|
+
|
|
517
629
|
@installed = true
|
|
518
630
|
|
|
519
631
|
path = socket_path.to_s
|
|
@@ -536,6 +648,7 @@ module SvelteOnRails
|
|
|
536
648
|
env: Rails.env,
|
|
537
649
|
uptime: client_instance.uptime,
|
|
538
650
|
request: request,
|
|
651
|
+
startup_id: client_instance.startup_id,
|
|
539
652
|
socket_path: client_instance.socket_path,
|
|
540
653
|
initialized_by: client_instance.initialized_by,
|
|
541
654
|
ping: client_instance.ping?,
|
|
@@ -13,8 +13,6 @@ namespace :svelte_on_rails do
|
|
|
13
13
|
configs = SvelteOnRails::Configuration.instance
|
|
14
14
|
socket_path = client_status[:socket_path]
|
|
15
15
|
|
|
16
|
-
puts client_status.to_s
|
|
17
|
-
|
|
18
16
|
puts
|
|
19
17
|
puts '=' * @line_width
|
|
20
18
|
puts
|
|
@@ -72,7 +70,7 @@ namespace :svelte_on_rails do
|
|
|
72
70
|
ps_stdout, ps_stderr, ps_status = Open3.capture3(ps_cmd)
|
|
73
71
|
total_kb = ps_stdout.each_line.sum { |line| line.to_i }
|
|
74
72
|
|
|
75
|
-
puts " #{human_bytes(total_kb*1024)} for #{pids.size} node #{'
|
|
73
|
+
puts " #{human_bytes(total_kb*1024)} for #{pids.size} node #{'process'.pluralize(pids.size)}"
|
|
76
74
|
|
|
77
75
|
redis_entries = SvelteOnRails::Cache.redis_entries(silent: true)
|
|
78
76
|
total_bytes = redis_entries.sum { |e| e[:bytes] }
|