Skip to content

Commit 3d328f8

Browse files
committed
Harden dev cleanup review fixes
1 parent 53c62ee commit 3d328f8

4 files changed

Lines changed: 54 additions & 4 deletions

File tree

react_on_rails/lib/react_on_rails/dev/file_manager.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ def process_running?(pid)
8484
def socket_active?(socket_path)
8585
return false unless File.exist?(socket_path)
8686

87-
socket = Socket.new(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
87+
socket = nil
8888
begin
89+
socket = Socket.new(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
8990
socket.connect_nonblock(Socket.sockaddr_un(socket_path))
9091
true
9192
rescue IO::WaitWritable
@@ -99,10 +100,10 @@ def socket_active?(socket_path)
99100
socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).int.zero?
100101
rescue Errno::EISCONN
101102
true
102-
rescue SystemCallError, IOError
103+
rescue ArgumentError, SystemCallError, IOError
103104
false
104105
ensure
105-
socket.close
106+
socket&.close
106107
end
107108
end
108109

react_on_rails/lib/react_on_rails/dev/server_manager.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,26 @@ def kill_processes
6868
# #base_port_hash so no "Base port detected" banner prints during a kill.
6969
def killable_ports
7070
base = PortSelector.base_port_hash
71-
return pro_renderer_active? ? [3000, 3001, 3800] : [3000, 3001] unless base
71+
return default_killable_ports unless base
7272

7373
ports = [base[:rails], base[:webpack]]
7474
ports << base[:renderer] if pro_renderer_active?
7575
ports
7676
end
7777

78+
def default_killable_ports
79+
ports = [3000, 3001]
80+
ports << configured_renderer_port_for_kill if pro_renderer_active?
81+
ports
82+
end
83+
84+
def configured_renderer_port_for_kill
85+
raw_port = ENV.fetch("RENDERER_PORT", nil)
86+
return raw_port.strip.to_i if valid_port_string?(raw_port)
87+
88+
3800
89+
end
90+
7891
def development_processes
7992
{
8093
"rails" => "Rails server",

react_on_rails/spec/react_on_rails/dev/file_manager_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ def write_server_pid(contents)
3636
server&.close
3737
end
3838

39+
it "removes an overmind socket file whose path is too long for a UNIX socket address" do
40+
FileUtils.mkdir_p("tmp/sockets")
41+
socket_file = "tmp/sockets/overmind-#{'a' * 100}.sock"
42+
File.write(socket_file, "copied socket")
43+
44+
expect(described_class.cleanup_stale_files).to be true
45+
expect(File).not_to exist(socket_file)
46+
end
47+
48+
it "removes an overmind socket file when socket allocation fails" do
49+
FileUtils.mkdir_p("tmp/sockets")
50+
File.write("tmp/sockets/overmind.sock", "copied socket")
51+
allow(Socket).to receive(:new).and_raise(Errno::EMFILE)
52+
53+
expect(described_class.cleanup_stale_files).to be true
54+
expect(File).not_to exist("tmp/sockets/overmind.sock")
55+
end
56+
3957
it "leaves non-overmind sockets in tmp/sockets/ alone even when inactive" do
4058
FileUtils.mkdir_p("tmp/sockets")
4159
File.write("tmp/sockets/puma.sock", "stale puma socket")

react_on_rails/spec/react_on_rails/dev/server_manager_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,24 @@ def mock_port_selector_defaults
11961196

11971197
described_class.kill_processes
11981198
end
1199+
1200+
it "targets the configured renderer port when Pro renderer support is active without a base port" do
1201+
ENV["RENDERER_PORT"] = "3900"
1202+
allow(ReactOnRails::Dev::PortSelector).to receive(:base_port_hash).and_return(nil)
1203+
allow(described_class).to receive(:pro_renderer_active?).and_return(true)
1204+
# No pattern-based processes so kill_port_processes runs.
1205+
allow(Open3).to receive(:capture2).with("pgrep", any_args).and_return(["", nil])
1206+
1207+
allow(Open3).to receive(:capture2).with("lsof", "-ti", ":3000", err: File::NULL).and_return(["", nil])
1208+
allow(Open3).to receive(:capture2).with("lsof", "-ti", ":3001", err: File::NULL).and_return(["", nil])
1209+
expect(Open3).not_to receive(:capture2).with("lsof", "-ti", ":3800", err: File::NULL)
1210+
allow(Open3).to receive(:capture2).with("lsof", "-ti", ":3900", err: File::NULL).and_return(["3901", nil])
1211+
1212+
allow(Process).to receive(:pid).and_return(9999)
1213+
expect(Process).to receive(:kill).with("TERM", 3901)
1214+
1215+
described_class.kill_processes
1216+
end
11991217
end
12001218

12011219
describe ".find_port_pids" do

0 commit comments

Comments
 (0)