From 13755d946d034eb7395a818db7ace2c9cb60b4cb Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 10 Oct 2011 19:51:26 +0200 Subject: [PATCH] server: improve pidfile and log handling Signed-off-by: Jens Axboe --- log.c | 20 ++++++++++++++++++-- log.h | 1 + server.c | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- server.h | 2 +- 4 files changed, 65 insertions(+), 12 deletions(-) diff --git a/log.c b/log.c index a16baafc..af974f85 100644 --- a/log.c +++ b/log.c @@ -21,6 +21,16 @@ int log_valist(const char *str, va_list args) return len; } +int log_local_buf(const char *buf, size_t len) +{ + if (log_syslog) + syslog(LOG_INFO, "%s", buf); + else + len = fwrite(buf, len, 1, f_out); + + return len; +} + int log_local(const char *format, ...) { char buffer[1024]; @@ -51,7 +61,10 @@ int log_info(const char *format, ...) if (is_backend) return fio_server_text_output(buffer, len); - else + else if (log_syslog) { + syslog(LOG_INFO, "%s", buffer); + return len; + } else return fwrite(buffer, len, 1, f_out); } @@ -67,7 +80,10 @@ int log_err(const char *format, ...) if (is_backend) return fio_server_text_output(buffer, len); - else { + else if (log_syslog) { + syslog(LOG_INFO, "%s", buffer); + return len; + } else { if (f_err != stderr) { int fio_unused ret; diff --git a/log.h b/log.h index a69846ef..fdf3d7b1 100644 --- a/log.h +++ b/log.h @@ -11,5 +11,6 @@ extern int log_err(const char *format, ...); extern int log_info(const char *format, ...); extern int log_local(const char *format, ...); extern int log_valist(const char *str, va_list); +extern int log_local_buf(const char *buf, size_t); #endif diff --git a/server.c b/server.c index 2de65ad2..4f9c0231 100644 --- a/server.c +++ b/server.c @@ -525,12 +525,12 @@ out: return exitval; } -int fio_server_text_output(const char *buf, unsigned int len) +int fio_server_text_output(const char *buf, size_t len) { if (server_fd != -1) return fio_net_send_cmd(server_fd, FIO_NET_CMD_TEXT, buf, len, 0); - return fwrite(buf, len, 1, f_err); + return log_local_buf(buf, len); } static void convert_io_stat(struct io_stat *dst, struct io_stat *src) @@ -924,17 +924,46 @@ static void server_signal_handler(void) sigaction(SIGTERM, &act, NULL); } -static void write_pid(pid_t pid, const char *pidfile) +static int check_existing_pidfile(const char *pidfile) +{ + struct stat sb; + char buf[16]; + pid_t pid; + FILE *f; + + if (stat(pidfile, &sb)) + return 0; + + f = fopen(pidfile, "r"); + if (!f) + return 0; + + if (fread(buf, sb.st_size, 1, f) < 0) { + fclose(f); + return 1; + } + fclose(f); + + pid = atoi(buf); + if (kill(pid, SIGCONT) < 0) + return 0; + + return 1; +} + +static int write_pid(pid_t pid, const char *pidfile) { FILE *fpid; fpid = fopen(pidfile, "w"); if (!fpid) { log_err("fio: failed opening pid file %s\n", pidfile); - return; + return 1; } fprintf(fpid, "%u\n", (unsigned int) pid); + fclose(fpid); + return 0; } /* @@ -950,24 +979,31 @@ int fio_start_server(char *pidfile) if (!pidfile) return fio_server(); - openlog("fio", LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_USER); + if (check_existing_pidfile(pidfile)) { + log_err("fio: pidfile %s exists and server appears alive\n", + pidfile); + return -1; + } + pid = fork(); if (pid < 0) { - syslog(LOG_ERR, "failed server fork"); + log_err("fio: failed server fork: %s", strerror(errno)); free(pidfile); return -1; } else if (pid) { - write_pid(pid, pidfile); - exit(0); + int ret = write_pid(pid, pidfile); + + exit(ret); } setsid(); + openlog("fio", LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_USER); + log_syslog = 1; close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); f_out = NULL; f_err = NULL; - log_syslog = 1; ret = fio_server(); diff --git a/server.h b/server.h index 72e4cc88..ea888af4 100644 --- a/server.h +++ b/server.h @@ -76,7 +76,7 @@ struct cmd_line_pdu { }; extern int fio_start_server(char *); -extern int fio_server_text_output(const char *, unsigned int len); +extern int fio_server_text_output(const char *, size_t); extern int fio_server_log(const char *format, ...); extern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t); extern int fio_net_send_simple_cmd(int sk, uint16_t opcode, uint64_t tag); -- 2.25.1