Welcome! Log In Create A New Profile

Advanced

[nginx] Fixed "changing binary" when reaper is not init.

November 28, 2017 05:00AM
details: http://hg.nginx.org/nginx/rev/8b84d60ef13d
branches:
changeset: 7162:8b84d60ef13d
user: Ruslan Ermilov <ru@nginx.com>
date: Tue Nov 28 12:00:24 2017 +0300
description:
Fixed "changing binary" when reaper is not init.

On some systems, it's possible that reaper of orphaned processes is
set to something other than "init" process. On such systems, the
changing binary procedure did not work.

The fix is to check if PPID has changed, instead of assuming it's
always 1 for orphaned processes.

diffstat:

src/core/nginx.c | 1 +
src/os/unix/ngx_daemon.c | 1 +
src/os/unix/ngx_process.c | 7 ++++---
src/os/unix/ngx_process.h | 2 ++
src/os/unix/ngx_process_cycle.c | 1 +
src/os/win32/ngx_process.h | 2 ++
src/os/win32/ngx_process_cycle.c | 1 +
7 files changed, 12 insertions(+), 3 deletions(-)

diffs (109 lines):

diff -r 325b3042edd6 -r 8b84d60ef13d src/core/nginx.c
--- a/src/core/nginx.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/core/nginx.c Tue Nov 28 12:00:24 2017 +0300
@@ -228,6 +228,7 @@ main(int argc, char *const *argv)
#endif

ngx_pid = ngx_getpid();
+ ngx_parent = ngx_getppid();

log = ngx_log_init(ngx_prefix);
if (log == NULL) {
diff -r 325b3042edd6 -r 8b84d60ef13d src/os/unix/ngx_daemon.c
--- a/src/os/unix/ngx_daemon.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_daemon.c Tue Nov 28 12:00:24 2017 +0300
@@ -26,6 +26,7 @@ ngx_daemon(ngx_log_t *log)
exit(0);
}

+ ngx_parent = ngx_pid;
ngx_pid = ngx_getpid();

if (setsid() == -1) {
diff -r 325b3042edd6 -r 8b84d60ef13d src/os/unix/ngx_process.c
--- a/src/os/unix/ngx_process.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_process.c Tue Nov 28 12:00:24 2017 +0300
@@ -194,6 +194,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ng
return NGX_INVALID_PID;

case 0:
+ ngx_parent = ngx_pid;
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
@@ -371,12 +372,12 @@ ngx_signal_handler(int signo, siginfo_t
break;

case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
- if (getppid() > 1 || ngx_new_binary > 0) {
+ if (ngx_getppid() == ngx_parent || ngx_new_binary > 0) {

/*
* Ignore the signal in the new binary if its parent is
- * not the init process, i.e. the old binary's process
- * is still running. Or ignore the signal in the old binary's
+ * not changed, i.e. the old binary's process is still
+ * running. Or ignore the signal in the old binary's
* process if the new binary's process is already running.
*/

diff -r 325b3042edd6 -r 8b84d60ef13d src/os/unix/ngx_process.h
--- a/src/os/unix/ngx_process.h Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_process.h Tue Nov 28 12:00:24 2017 +0300
@@ -54,6 +54,7 @@ typedef struct {


#define ngx_getpid getpid
+#define ngx_getppid getppid

#ifndef ngx_log_pid
#define ngx_log_pid ngx_pid
@@ -79,6 +80,7 @@ extern char **ngx_argv;
extern char **ngx_os_argv;

extern ngx_pid_t ngx_pid;
+extern ngx_pid_t ngx_parent;
extern ngx_socket_t ngx_channel;
extern ngx_int_t ngx_process_slot;
extern ngx_int_t ngx_last_process;
diff -r 325b3042edd6 -r 8b84d60ef13d src/os/unix/ngx_process_cycle.c
--- a/src/os/unix/ngx_process_cycle.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/unix/ngx_process_cycle.c Tue Nov 28 12:00:24 2017 +0300
@@ -31,6 +31,7 @@ static void ngx_cache_loader_process_han
ngx_uint_t ngx_process;
ngx_uint_t ngx_worker;
ngx_pid_t ngx_pid;
+ngx_pid_t ngx_parent;

sig_atomic_t ngx_reap;
sig_atomic_t ngx_sigio;
diff -r 325b3042edd6 -r 8b84d60ef13d src/os/win32/ngx_process.h
--- a/src/os/win32/ngx_process.h Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/win32/ngx_process.h Tue Nov 28 12:00:24 2017 +0300
@@ -14,6 +14,7 @@ typedef DWORD ngx_pid_t;


#define ngx_getpid GetCurrentProcessId
+#define ngx_getppid() 0
#define ngx_log_pid ngx_pid


@@ -73,6 +74,7 @@ extern ngx_int_t ngx_last_pro
extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES];

extern ngx_pid_t ngx_pid;
+extern ngx_pid_t ngx_parent;


#endif /* _NGX_PROCESS_H_INCLUDED_ */
diff -r 325b3042edd6 -r 8b84d60ef13d src/os/win32/ngx_process_cycle.c
--- a/src/os/win32/ngx_process_cycle.c Thu Nov 23 16:33:40 2017 +0300
+++ b/src/os/win32/ngx_process_cycle.c Tue Nov 28 12:00:24 2017 +0300
@@ -31,6 +31,7 @@ static ngx_thread_value_t __stdcall ngx_
ngx_uint_t ngx_process;
ngx_uint_t ngx_worker;
ngx_pid_t ngx_pid;
+ngx_pid_t ngx_parent;

ngx_uint_t ngx_inherited;
ngx_pid_t ngx_new_binary;
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Fixed "changing binary" when reaper is not init.

ru@nginx.com 749 November 28, 2017 05:00AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 267
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready