-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
test_worker_gem_independence.rb
154 lines (128 loc) · 6.02 KB
/
test_worker_gem_independence.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
require_relative "helper"
require_relative "helpers/integration"
class TestWorkerGemIndependence < TestIntegration
def setup
skip_unless :fork
super
end
def teardown
return if skipped?
FileUtils.rm current_release_symlink, force: true
super
end
def test_changing_nio4r_version_during_phased_restart
change_gem_version_during_phased_restart old_app_dir: 'worker_gem_independence_test/old_nio4r',
old_version: '2.3.0',
new_app_dir: 'worker_gem_independence_test/new_nio4r',
new_version: '2.3.1'
end
def test_changing_json_version_during_phased_restart
change_gem_version_during_phased_restart old_app_dir: 'worker_gem_independence_test/old_json',
old_version: '2.3.1',
new_app_dir: 'worker_gem_independence_test/new_json',
new_version: '2.3.0'
end
def test_changing_json_version_during_phased_restart_after_querying_stats_from_status_server
@control_tcp_port = UniquePort.call
server_opts = "--control-url tcp://#{HOST}:#{@control_tcp_port} --control-token #{TOKEN}"
before_restart = ->() do
cli_pumactl "stats"
end
change_gem_version_during_phased_restart server_opts: server_opts,
before_restart: before_restart,
old_app_dir: 'worker_gem_independence_test/old_json',
old_version: '2.3.1',
new_app_dir: 'worker_gem_independence_test/new_json',
new_version: '2.3.0'
end
def test_changing_json_version_during_phased_restart_after_querying_gc_stats_from_status_server
@control_tcp_port = UniquePort.call
server_opts = "--control-url tcp://#{HOST}:#{@control_tcp_port} --control-token #{TOKEN}"
before_restart = ->() do
cli_pumactl "gc-stats"
end
change_gem_version_during_phased_restart server_opts: server_opts,
before_restart: before_restart,
old_app_dir: 'worker_gem_independence_test/old_json',
old_version: '2.3.1',
new_app_dir: 'worker_gem_independence_test/new_json',
new_version: '2.3.0'
end
def test_changing_json_version_during_phased_restart_after_querying_thread_backtraces_from_status_server
@control_tcp_port = UniquePort.call
server_opts = "--control-url tcp://#{HOST}:#{@control_tcp_port} --control-token #{TOKEN}"
before_restart = ->() do
cli_pumactl "thread-backtraces"
end
change_gem_version_during_phased_restart server_opts: server_opts,
before_restart: before_restart,
old_app_dir: 'worker_gem_independence_test/old_json',
old_version: '2.3.1',
new_app_dir: 'worker_gem_independence_test/new_json',
new_version: '2.3.0'
end
def test_changing_json_version_during_phased_restart_after_accessing_puma_stats_directly
change_gem_version_during_phased_restart old_app_dir: 'worker_gem_independence_test/old_json_with_puma_stats_after_fork',
old_version: '2.3.1',
new_app_dir: 'worker_gem_independence_test/new_json_with_puma_stats_after_fork',
new_version: '2.3.0'
end
private
def change_gem_version_during_phased_restart(old_app_dir:,
new_app_dir:,
old_version:,
new_version:,
server_opts: '',
before_restart: nil)
skip_unless_signal_exist? :USR1
set_release_symlink File.expand_path(old_app_dir, __dir__)
Dir.chdir(current_release_symlink) do
with_unbundled_env do
silent_and_checked_system_command("bundle config --local path vendor/bundle")
silent_and_checked_system_command("bundle install")
cli_server "--prune-bundler -w 1 #{server_opts}"
end
end
connection = connect
initial_reply = read_body(connection)
assert_equal old_version, initial_reply
before_restart&.call
set_release_symlink File.expand_path(new_app_dir, __dir__)
Dir.chdir(current_release_symlink) do
with_unbundled_env do
silent_and_checked_system_command("bundle config --local path vendor/bundle")
silent_and_checked_system_command("bundle install")
end
end
verify_process_tag(@server.pid, File.basename(old_app_dir))
start_phased_restart
connection = connect
new_reply = read_body(connection)
verify_process_tag(@server.pid, File.basename(new_app_dir))
assert_equal new_version, new_reply
end
def current_release_symlink
File.expand_path "worker_gem_independence_test/current", __dir__
end
def set_release_symlink(target_dir)
FileUtils.rm current_release_symlink, force: true
FileUtils.symlink target_dir, current_release_symlink, force: true
end
def start_phased_restart
Process.kill :USR1, @pid
true while @server.gets !~ /booted in [.0-9]+s, phase: 1/
end
def with_unbundled_env
bundler_ver = Gem::Version.new(Bundler::VERSION)
if bundler_ver < Gem::Version.new('2.1.0')
Bundler.with_clean_env { yield }
else
Bundler.with_unbundled_env { yield }
end
end
def verify_process_tag(pid, tag)
cmd = "ps aux | grep #{pid}"
io = IO.popen cmd, 'r'
assert io.read.include? tag
end
end