X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_daemon.c;h=0ea5bf767f0e45fd88a28a1bdb19020e97dccb48;hp=a2001359e158bb1e92852d53369163f2fc571f41;hb=HEAD;hpb=c265653b4507e0af5333c9ce51cd4d7420266436 diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c index a200135..0ea5bf7 100644 --- a/src/rrd_daemon.c +++ b/src/rrd_daemon.c @@ -63,13 +63,6 @@ * Now for some includes.. */ /* {{{ */ -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H) -#include "../win32/config.h" -#else -#ifdef HAVE_CONFIG_H -#include "../rrd_config.h" -#endif -#endif #include "rrd_tool.h" #include "rrd_client.h" @@ -188,7 +181,7 @@ struct cache_item_s size_t values_num; /* number of valid pointers */ size_t values_alloc; /* number of allocated pointers */ time_t last_flush_time; - time_t last_update_stamp; + double last_update_stamp; #define CI_FLAGS_IN_TREE (1<<0) #define CI_FLAGS_IN_QUEUE (1<<1) int flags; @@ -219,9 +212,7 @@ typedef struct { size_t files_num; } journal_set; -/* max length of socket command or response */ -#define CMD_MAX 4096 -#define RBUF_SIZE (CMD_MAX*2) +#define RBUF_SIZE (RRD_CMD_MAX*2) /* * Variables @@ -304,7 +295,9 @@ static int handle_request_help (HANDLER_PROTO); static void sig_common (const char *sig) /* {{{ */ { RRDD_LOG(LOG_NOTICE, "caught SIG%s", sig); - state = FLUSHING; + if (state == RUNNING) { + state = FLUSHING; + } pthread_cond_broadcast(&flush_cond); pthread_cond_broadcast(&queue_cond); } /* }}} void sig_common */ @@ -543,7 +536,7 @@ static int add_to_wbuf(listen_socket_t *sock, char *str, size_t len) /* {{{ */ static int add_response_info(listen_socket_t *sock, char *fmt, ...) /* {{{ */ { va_list argp; - char buffer[CMD_MAX]; + char buffer[RRD_CMD_MAX]; int len; if (JOURNAL_REPLAY(sock)) return 0; @@ -588,7 +581,7 @@ static int send_response (listen_socket_t *sock, response_code rc, char *fmt, ...) /* {{{ */ { va_list argp; - char buffer[CMD_MAX]; + char buffer[RRD_CMD_MAX]; int lines; ssize_t wrote; int rclen, len; @@ -606,7 +599,7 @@ static int send_response (listen_socket_t *sock, response_code rc, else lines = -1; - rclen = sprintf(buffer, "%d ", lines); + rclen = snprintf(buffer, sizeof buffer, "%d ", lines); va_start(argp, fmt); #ifdef HAVE_VSNPRINTF len = vsnprintf(buffer+rclen, sizeof(buffer)-rclen, fmt, argp); @@ -1327,13 +1320,13 @@ static int handle_request_update (HANDLER_PROTO) /* {{{ */ char *file, file_tmp[PATH_MAX]; int values_num = 0; int status; - char orig_buf[CMD_MAX]; + char orig_buf[RRD_CMD_MAX]; cache_item_t *ci; /* save it for the journal later */ if (!JOURNAL_REPLAY(sock)) - strncpy(orig_buf, buffer, buffer_size); + strncpy(orig_buf, buffer, min(RRD_CMD_MAX,buffer_size)); status = buffer_get_field (&buffer, &buffer_size, &file); if (status != 0) @@ -1424,7 +1417,7 @@ static int handle_request_update (HANDLER_PROTO) /* {{{ */ while (buffer_size > 0) { char *value; - time_t stamp; + double stamp; char *eostamp; status = buffer_get_field (&buffer, &buffer_size, &value); @@ -1434,8 +1427,9 @@ static int handle_request_update (HANDLER_PROTO) /* {{{ */ break; } - /* make sure update time is always moving forward */ - stamp = strtol(value, &eostamp, 10); + /* make sure update time is always moving forward. We use double here since + update does support subsecond precision for timestamps ... */ + stamp = strtod(value, &eostamp); if (eostamp == value || eostamp == NULL || *eostamp != ':') { pthread_mutex_unlock(&cache_lock); @@ -1446,8 +1440,8 @@ static int handle_request_update (HANDLER_PROTO) /* {{{ */ { pthread_mutex_unlock(&cache_lock); return send_response(sock, RESP_ERR, - "illegal attempt to update using time %ld when last" - " update time is %ld (minimum one second step)\n", + "illegal attempt to update using time %lf when last" + " update time is %lf (minimum one second step)\n", stamp, ci->last_update_stamp); } else @@ -2204,7 +2198,7 @@ static int handle_request_help (HANDLER_PROTO) /* {{{ */ if (help && (help->syntax || help->help)) { - char tmp[CMD_MAX]; + char tmp[RRD_CMD_MAX]; snprintf(tmp, sizeof(tmp)-1, "Help for %s\n", help->cmd); resp_txt = tmp; @@ -2439,7 +2433,7 @@ static int journal_replay (const char *file) /* {{{ */ int entry_cnt = 0; int fail_cnt = 0; uint64_t line = 0; - char entry[CMD_MAX]; + char entry[RRD_CMD_MAX]; time_t now; if (file == NULL) return 0; @@ -2655,7 +2649,7 @@ static void *connection_thread_main (void *args) /* {{{ */ getting overwritten by another thread. */ struct request_info req; - request_init(&req, RQ_DAEMON, "rrdcache\0", RQ_FILE, fd, NULL ); + request_init(&req, RQ_DAEMON, "rrdcached\0", RQ_FILE, fd, NULL ); fromhost(&req); if(!hosts_access(&req)) { RRDD_LOG(LOG_INFO, "refused connection from %s", eval_client(&req)); @@ -2981,6 +2975,91 @@ static int open_listen_socket (const listen_socket_t *sock) /* {{{ */ return (open_listen_socket_network(sock)); } /* }}} int open_listen_socket */ +#ifndef SD_LISTEN_FDS_START +# define SD_LISTEN_FDS_START 3 +#endif +/* + * returns number of descriptors passed from systemd + */ +static int open_listen_sockets_systemd(void) /* {{{ */ +{ + listen_socket_t *temp; + struct sockaddr_un sa; + socklen_t l; + int sd_fd; + const char *env; + unsigned long n; + + /* check if it for us */ + env = getenv("LISTEN_PID"); + if (!env) + return 0; + + n = strtoul(env, NULL, 10); + if (!n || n == ULONG_MAX || (pid_t)n != getpid()) + return 0; + + /* get the number of passed descriptors */ + env = getenv("LISTEN_FDS"); + if (!env) + return 0; + + n = strtoul(env, NULL, 10); + if (!n || n == ULONG_MAX) + return 0; + + temp = (listen_socket_t *) rrd_realloc (listen_fds, + sizeof (listen_fds[0]) * (listen_fds_num + n)); + if (temp == NULL) + { + fprintf (stderr, "rrdcached: open_listen_socket_systemd: realloc failed.\n"); + return 0; + } + listen_fds = temp; + + for (unsigned int i = 0; i < n; i++) + { + sd_fd = SD_LISTEN_FDS_START + i; + + l = sizeof(sa); + memset(&sa, 0, l); + if (getsockname(sd_fd, &sa, &l) < 0) + { + fprintf(stderr, "open_listen_sockets_systemd: problem getting fd %d: %s\n", sd_fd, rrd_strerror (errno)); + return i; + } + + listen_fds[listen_fds_num].fd = sd_fd; + listen_fds[listen_fds_num].family = sa.sun_family; + listen_fds_num++; + } + + return n; +} /* }}} open_listen_sockets_systemd */ + +static void open_listen_sockets_traditional(void) /* {{{ */ +{ + if (config_listen_address_list_len > 0) + { + for (size_t i = 0; i < config_listen_address_list_len; i++) + open_listen_socket (config_listen_address_list[i]); + + rrd_free_ptrs((void ***) &config_listen_address_list, + &config_listen_address_list_len); + } + else + { + strncpy(default_socket.addr, RRDCACHED_DEFAULT_ADDRESS, + sizeof(default_socket.addr) - 1); + default_socket.addr[sizeof(default_socket.addr) - 1] = '\0'; + + if (default_socket.permissions == 0) + socket_permission_set_all (&default_socket); + + open_listen_socket (&default_socket); + } +} /* }}} open_list_sockets_traditional */ + static int close_listen_sockets (void) /* {{{ */ { size_t i; @@ -3126,26 +3205,11 @@ static int daemonize (void) /* {{{ */ if (pid_fd < 0) return pid_fd; - /* open all the listen sockets */ - if (config_listen_address_list_len > 0) - { - for (size_t i = 0; i < config_listen_address_list_len; i++) - open_listen_socket (config_listen_address_list[i]); + /* gather sockets passed from systemd; + * if none, open all the listen sockets from config or default */ - rrd_free_ptrs((void ***) &config_listen_address_list, - &config_listen_address_list_len); - } - else - { - strncpy(default_socket.addr, RRDCACHED_DEFAULT_ADDRESS, - sizeof(default_socket.addr) - 1); - default_socket.addr[sizeof(default_socket.addr) - 1] = '\0'; - - if (default_socket.permissions == 0) - socket_permission_set_all (&default_socket); - - open_listen_socket (&default_socket); - } + if (!(open_listen_sockets_systemd() > 0)) + open_listen_sockets_traditional(); if (listen_fds_num < 1) {