1] Process using uwsgi:
uwsgi services doesn't support for graceful shutting down [1].
It requires some changes in unit files [2] including adding below
graceful shutdown hook and changing KillSignal:
--hook-master-start "unix_signal:15 gracefully_kill_them_all
All the steps and changes required are specified in etherpad [1].
2] Non uwsgi services needs below changes:
In [service] section:
a. Add KillMode = process
b. Add TimeoutStopSec = infinity
NOTE:
Creating unit file for services other than uwsgi is handled by the
'write_user_unit_file' function [3]. This function is common for all
the services so this patch adds the above mentioned parameters for
services using ServiceLauncher also though they don't require.
Added a new stackrc variable WORKER_TIMEOUT which is required to add
graceful shutdown support to uwsgi services. It will be set as a value
to 'worker-reload-mercy' [4] in uwsgi file of service. The default
value set to this variable is 90.
[1] https://etherpad.openstack.org/p/uwsgi-issues
[2] https://www.freedesktop.org/software/systemd/man/systemd.kill.html
[3] https://github.com/openstack-dev/devstack/blob/2967ca3dfd0d64970dfa5dfa7ac2330ee7aa90ed/functions-common#L1439-L1461
[4] http://uwsgi-docs.readthedocs.io/en/latest/Options.html#worker-reload-mercy
Co-Authored-By: Dinesh Bhor <dinesh.bhor@nttdata.com>
Change-Id: Ia95291325ce4858b47102dd49504250183f339ab
| ... | ... |
@@ -1451,6 +1451,8 @@ function write_user_unit_file {
|
| 1451 | 1451 |
iniset -sudo $unitfile "Unit" "Description" "Devstack $service" |
| 1452 | 1452 |
iniset -sudo $unitfile "Service" "User" "$user" |
| 1453 | 1453 |
iniset -sudo $unitfile "Service" "ExecStart" "$command" |
| 1454 |
+ iniset -sudo $unitfile "Service" "KillMode" "process" |
|
| 1455 |
+ iniset -sudo $unitfile "Service" "TimeoutStopSec" "infinity" |
|
| 1454 | 1456 |
if [[ -n "$group" ]]; then |
| 1455 | 1457 |
iniset -sudo $unitfile "Service" "Group" "$group" |
| 1456 | 1458 |
fi |
| ... | ... |
@@ -1473,7 +1475,7 @@ function write_uwsgi_user_unit_file {
|
| 1473 | 1473 |
iniset -sudo $unitfile "Service" "User" "$user" |
| 1474 | 1474 |
iniset -sudo $unitfile "Service" "ExecStart" "$command" |
| 1475 | 1475 |
iniset -sudo $unitfile "Service" "Type" "notify" |
| 1476 |
- iniset -sudo $unitfile "Service" "KillSignal" "SIGQUIT" |
|
| 1476 |
+ iniset -sudo $unitfile "Service" "KillMode" "process" |
|
| 1477 | 1477 |
iniset -sudo $unitfile "Service" "Restart" "always" |
| 1478 | 1478 |
iniset -sudo $unitfile "Service" "NotifyAccess" "all" |
| 1479 | 1479 |
iniset -sudo $unitfile "Service" "RestartForceExitStatus" "100" |
| ... | ... |
@@ -260,10 +260,15 @@ function write_uwsgi_config {
|
| 260 | 260 |
# Set die-on-term & exit-on-reload so that uwsgi shuts down |
| 261 | 261 |
iniset "$file" uwsgi die-on-term true |
| 262 | 262 |
iniset "$file" uwsgi exit-on-reload true |
| 263 |
+ # Set worker-reload-mercy so that worker will not exit till the time |
|
| 264 |
+ # configured after graceful shutdown |
|
| 265 |
+ iniset "$file" uwsgi worker-reload-mercy $WORKER_TIMEOUT |
|
| 263 | 266 |
iniset "$file" uwsgi enable-threads true |
| 264 | 267 |
iniset "$file" uwsgi plugins python |
| 265 | 268 |
# uwsgi recommends this to prevent thundering herd on accept. |
| 266 | 269 |
iniset "$file" uwsgi thunder-lock true |
| 270 |
+ # Set hook to trigger graceful shutdown on SIGTERM |
|
| 271 |
+ iniset "$file" uwsgi hook-master-start "unix_signal:15 gracefully_kill_them_all" |
|
| 267 | 272 |
# Override the default size for headers from the 4k default. |
| 268 | 273 |
iniset "$file" uwsgi buffer-size 65535 |
| 269 | 274 |
# Make sure the client doesn't try to re-use the connection. |
| ... | ... |
@@ -316,6 +321,11 @@ function write_local_uwsgi_http_config {
|
| 316 | 316 |
iniset "$file" uwsgi plugins python |
| 317 | 317 |
# uwsgi recommends this to prevent thundering herd on accept. |
| 318 | 318 |
iniset "$file" uwsgi thunder-lock true |
| 319 |
+ # Set hook to trigger graceful shutdown on SIGTERM |
|
| 320 |
+ iniset "$file" uwsgi hook-master-start "unix_signal:15 gracefully_kill_them_all" |
|
| 321 |
+ # Set worker-reload-mercy so that worker will not exit till the time |
|
| 322 |
+ # configured after graceful shutdown |
|
| 323 |
+ iniset "$file" uwsgi worker-reload-mercy $WORKER_TIMEOUT |
|
| 319 | 324 |
# Override the default size for headers from the 4k default. |
| 320 | 325 |
iniset "$file" uwsgi buffer-size 65535 |
| 321 | 326 |
# Make sure the client doesn't try to re-use the connection. |
| ... | ... |
@@ -778,6 +778,9 @@ SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
|
| 778 | 778 |
# Service graceful shutdown timeout |
| 779 | 779 |
SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT=${SERVICE_GRACEFUL_SHUTDOWN_TIMEOUT:-5}
|
| 780 | 780 |
|
| 781 |
+# Service graceful shutdown timeout |
|
| 782 |
+WORKER_TIMEOUT=${WORKER_TIMEOUT:-90}
|
|
| 783 |
+ |
|
| 781 | 784 |
# Support alternative yum -- in future Fedora 'dnf' will become the |
| 782 | 785 |
# only supported installer, but for now 'yum' and 'dnf' are both |
| 783 | 786 |
# available in parallel with compatible CLIs. Allow manual switching |