From 233d5c822ab04da98221b9ff762e8557ace026aa Mon Sep 17 00:00:00 2001 From: Pavel Rochnyack Date: Wed, 5 Oct 2016 00:54:34 +0600 Subject: [PATCH 1/1] memcached: Added Address option --- src/collectd.conf.in | 3 +- src/collectd.conf.pod | 17 ++++++-- src/memcached.c | 107 +++++++++++++++++++++++++++++++------------------- 3 files changed, 82 insertions(+), 45 deletions(-) diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 04950674..2dde3a16 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -705,7 +705,8 @@ # # -# Host "127.0.0.1" +# #Host "memcache.example.com" +# Address "127.0.0.1" # Port "11211" # # diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 00cd781a..f867e61b 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -3341,11 +3341,12 @@ interpreted. For a description of match blocks, please see L<"Plugin tail">. The B connects to a memcached server and queries statistics about cache utilization, memory and bandwidth used. -L +L - Host "memcache.example.com" + #Host "memcache.example.com" + Address "127.0.0.1" Port 11211 @@ -3358,7 +3359,15 @@ following options are allowed: =item B I -Hostname to connect to. Defaults to B<127.0.0.1>. +Sets the B field of dispatched values. Defaults to the global hostname +setting. +For backwards compatibility, values are also dispatched with the global hostname +when B is set to "127.0.0.1" or "localhost" and B
is not set. + +=item B
I
+ +Hostname or IP to connect to. For backwards compatibility, it defaults to B +value or to B<127.0.0.1> if it does not set. =item B I @@ -3367,7 +3376,7 @@ TCP-Port to connect to. Defaults to B<11211>. =item B I Connect to I using the UNIX domain socket at I. If this -setting is given, the B and B settings are ignored. +setting is given, the B
and B settings are ignored. =back diff --git a/src/memcached.c b/src/memcached.c index bd83b46e..46c8df40 100644 --- a/src/memcached.c +++ b/src/memcached.c @@ -44,9 +44,10 @@ struct memcached_s { char *name; - char *socket; char *host; - char *port; + char *socket; + char *connhost; + char *connport; }; typedef struct memcached_s memcached_t; @@ -59,9 +60,10 @@ static void memcached_free (void *arg) return; sfree (st->name); - sfree (st->socket); sfree (st->host); - sfree (st->port); + sfree (st->socket); + sfree (st->connhost); + sfree (st->connport); sfree (st); } @@ -98,29 +100,23 @@ static int memcached_connect_unix (memcached_t *st) static int memcached_connect_inet (memcached_t *st) { - const char *host; - const char *port; - struct addrinfo *ai_list; int status; int fd = -1; - host = (st->host != NULL) ? st->host : MEMCACHED_DEF_HOST; - port = (st->port != NULL) ? st->port : MEMCACHED_DEF_PORT; - struct addrinfo ai_hints = { .ai_family = AF_UNSPEC, .ai_flags = AI_ADDRCONFIG, .ai_socktype = SOCK_STREAM }; - status = getaddrinfo (host, port, &ai_hints, &ai_list); + status = getaddrinfo (st->connhost, st->connport, &ai_hints, &ai_list); if (status != 0) { char errbuf[1024]; ERROR ("memcached plugin: memcached_connect_inet: " "getaddrinfo(%s,%s) failed: %s", - host, port, + st->connhost, st->connport, (status == EAI_SYSTEM) ? sstrerror (errno, errbuf, sizeof (errbuf)) : gai_strerror (status)); @@ -239,22 +235,10 @@ static int memcached_query_daemon (char *buffer, size_t buffer_size, memcached_t static void memcached_init_vl (value_list_t *vl, memcached_t const *st) { - char const *host = st->host; - - /* Keep default hostname, if: - * - Legacy mode is used. - * - "Socket" option is given (doc: "Host option is ignored"). - * - "Host" option is not provided. - * - "Host" option is set to "localhost" or "127.0.0.1". */ - if ((strcmp (st->name, "__legacy__") != 0) - && (st->socket == NULL) - && (st->host != NULL) - && (strcmp ("127.0.0.1", st->host) != 0) - && (strcmp ("localhost", st->host) != 0)) - sstrncpy (vl->host, host, sizeof (vl->host)); - sstrncpy (vl->plugin, "memcached", sizeof (vl->plugin)); - if (strcmp (st->name, "__legacy__") != 0) + if (st->host != NULL) + sstrncpy (vl->host, st->host, sizeof (vl->host)); + if (st->name != NULL) sstrncpy (vl->plugin_instance, st->name, sizeof (vl->plugin_instance)); } @@ -544,8 +528,48 @@ static int memcached_add_read_callback (memcached_t *st) char callback_name[3*DATA_MAX_NAME_LEN]; int status; - assert (st->name != NULL); - ssnprintf (callback_name, sizeof (callback_name), "memcached/%s", st->name); + ssnprintf (callback_name, sizeof (callback_name), "memcached/%s", + (st->name != NULL) ? st->name : "__legacy__"); + + /* If no
used then: + * - connect to destination, specified by , if it presents. + * - Keep default hostname, if any: + * - Legacy mode is used (no configuration options at all); + * - "Host" option is not provided; + * - "Host" option is set to "localhost" or "127.0.0.1". + * + * If
used then host may be set to "localhost" + * or "127.0.0.1" explicitly. + */ + if (st->connhost == NULL) + { + if (st->host) + { + st->connhost = strdup(st->host); + if (st->connhost == NULL) + return (ENOMEM); + + if ((strcmp ("127.0.0.1", st->host) == 0) + || (strcmp ("localhost", st->host) == 0)) + sfree(st->host); + } + else + { + st->connhost = strdup(MEMCACHED_DEF_HOST); + if (st->connhost == NULL) + return (ENOMEM); + } + } + + if (st->connport == NULL) + { + st->connport = strdup(MEMCACHED_DEF_PORT); + if (st->connport == NULL) + return (ENOMEM); + } + + assert (st->connhost != NULL); + assert (st->connport != NULL); status = plugin_register_complex_read (/* group = */ "memcached", /* name = */ callback_name, @@ -563,6 +587,7 @@ static int memcached_add_read_callback (memcached_t *st) * * * Host foo.zomg.com + * Address 1.2.3.4 * Port "1234" * * @@ -579,24 +604,23 @@ static int config_add_instance(oconfig_item_t *ci) if (st == NULL) { ERROR ("memcached plugin: calloc failed."); - return (-1); + return (ENOMEM); } st->name = NULL; - st->socket = NULL; st->host = NULL; - st->port = NULL; + st->socket = NULL; + st->connhost = NULL; + st->connport = NULL; - if (strcasecmp (ci->key, "Plugin") == 0) /* default instance */ - st->name = sstrdup ("__legacy__"); - else /* block */ + if (strcasecmp (ci->key, "Instance") == 0) status = cf_util_get_string (ci, &st->name); + if (status != 0) { sfree (st); return (status); } - assert (st->name != NULL); for (int i = 0; i < ci->children_num; i++) { @@ -606,8 +630,10 @@ static int config_add_instance(oconfig_item_t *ci) status = cf_util_get_string (child, &st->socket); else if (strcasecmp ("Host", child->key) == 0) status = cf_util_get_string (child, &st->host); + else if (strcasecmp ("Address", child->key) == 0) + status = cf_util_get_string (child, &st->connhost); else if (strcasecmp ("Port", child->key) == 0) - status = cf_util_get_service (child, &st->port); + status = cf_util_get_service (child, &st->connport); else { WARNING ("memcached plugin: Option `%s' not allowed here.", @@ -674,10 +700,11 @@ static int memcached_init (void) st = calloc (1, sizeof (*st)); if (st == NULL) return (ENOMEM); - st->name = sstrdup ("__legacy__"); - st->socket = NULL; + st->name = NULL; st->host = NULL; - st->port = NULL; + st->socket = NULL; + st->connhost = NULL; + st->connport = NULL; status = memcached_add_read_callback (st); if (status == 0) -- 2.11.0