projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
powerdns plugin: Fix memory leak.
[collectd.git]
/
src
/
write_http.c
diff --git
a/src/write_http.c
b/src/write_http.c
index
bac8e98
..
bfb5524
100644
(file)
--- a/
src/write_http.c
+++ b/
src/write_http.c
@@
-61,7
+61,7
@@
struct wh_callback_s
char send_buffer[4096];
size_t send_buffer_free;
size_t send_buffer_fill;
char send_buffer[4096];
size_t send_buffer_free;
size_t send_buffer_fill;
- time_t send_buffer_init_time;
+
cd
time_t send_buffer_init_time;
pthread_mutex_t send_lock;
};
pthread_mutex_t send_lock;
};
@@
-72,7
+72,7
@@
static void wh_reset_buffer (wh_callback_t *cb) /* {{{ */
memset (cb->send_buffer, 0, sizeof (cb->send_buffer));
cb->send_buffer_free = sizeof (cb->send_buffer);
cb->send_buffer_fill = 0;
memset (cb->send_buffer, 0, sizeof (cb->send_buffer));
cb->send_buffer_free = sizeof (cb->send_buffer);
cb->send_buffer_fill = 0;
- cb->send_buffer_init_time =
time (NULL
);
+ cb->send_buffer_init_time =
cdtime (
);
if (cb->format == WH_FORMAT_JSON)
{
if (cb->format == WH_FORMAT_JSON)
{
@@
-88,7
+88,7
@@
static int wh_send_buffer (wh_callback_t *cb) /* {{{ */
curl_easy_setopt (cb->curl, CURLOPT_POSTFIELDS, cb->send_buffer);
status = curl_easy_perform (cb->curl);
curl_easy_setopt (cb->curl, CURLOPT_POSTFIELDS, cb->send_buffer);
status = curl_easy_perform (cb->curl);
- if (status !=
0
)
+ if (status !=
CURLE_OK
)
{
ERROR ("write_http plugin: curl_easy_perform failed with "
"status %i: %s",
{
ERROR ("write_http plugin: curl_easy_perform failed with "
"status %i: %s",
@@
-111,6
+111,7
@@
static int wh_callback_init (wh_callback_t *cb) /* {{{ */
return (-1);
}
return (-1);
}
+ curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
headers = NULL;
curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
headers = NULL;
@@
-146,9
+147,9
@@
static int wh_callback_init (wh_callback_t *cb) /* {{{ */
curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
}
curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
}
- curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, cb->verify_peer);
+ curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER,
(long)
cb->verify_peer);
curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYHOST,
curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYHOST,
- cb->verify_host ? 2
: 0
);
+ cb->verify_host ? 2
L : 0L
);
if (cb->cacert != NULL)
curl_easy_setopt (cb->curl, CURLOPT_CAINFO, cb->cacert);
if (cb->cacert != NULL)
curl_easy_setopt (cb->curl, CURLOPT_CAINFO, cb->cacert);
@@
-157,19
+158,21
@@
static int wh_callback_init (wh_callback_t *cb) /* {{{ */
return (0);
} /* }}} int wh_callback_init */
return (0);
} /* }}} int wh_callback_init */
-static int wh_flush_nolock (
in
t timeout, wh_callback_t *cb) /* {{{ */
+static int wh_flush_nolock (
cdtime_
t timeout, wh_callback_t *cb) /* {{{ */
{
int status;
{
int status;
- DEBUG ("write_http plugin: wh_flush_nolock: timeout = %
i
; "
+ DEBUG ("write_http plugin: wh_flush_nolock: timeout = %
.3f
; "
"send_buffer_fill = %zu;",
"send_buffer_fill = %zu;",
- timeout, cb->send_buffer_fill);
+ CDTIME_T_TO_DOUBLE (timeout),
+ cb->send_buffer_fill);
+ /* timeout == 0 => flush unconditionally */
if (timeout > 0)
{
if (timeout > 0)
{
- time_t now;
+
cd
time_t now;
- now =
time (NULL
);
+ now =
cdtime (
);
if ((cb->send_buffer_init_time + timeout) > now)
return (0);
}
if ((cb->send_buffer_init_time + timeout) > now)
return (0);
}
@@
-178,7
+181,7
@@
static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */
{
if (cb->send_buffer_fill <= 0)
{
{
if (cb->send_buffer_fill <= 0)
{
- cb->send_buffer_init_time =
time (NULL
);
+ cb->send_buffer_init_time =
cdtime (
);
return (0);
}
return (0);
}
@@
-189,7
+192,7
@@
static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */
{
if (cb->send_buffer_fill <= 2)
{
{
if (cb->send_buffer_fill <= 2)
{
- cb->send_buffer_init_time =
time (NULL
);
+ cb->send_buffer_init_time =
cdtime (
);
return (0);
}
return (0);
}
@@
-218,7
+221,7
@@
static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */
return (status);
} /* }}} wh_flush_nolock */
return (status);
} /* }}} wh_flush_nolock */
-static int wh_flush (
in
t timeout, /* {{{ */
+static int wh_flush (
cdtime_
t timeout, /* {{{ */
const char *identifier __attribute__((unused)),
user_data_t *user_data)
{
const char *identifier __attribute__((unused)),
user_data_t *user_data)
{
@@
-258,7
+261,7
@@
static void wh_callback_free (void *data) /* {{{ */
cb = data;
cb = data;
- wh_flush_nolock (/* timeout = */
-1
, cb);
+ wh_flush_nolock (/* timeout = */
0
, cb);
curl_easy_cleanup (cb->curl);
sfree (cb->location);
curl_easy_cleanup (cb->curl);
sfree (cb->location);
@@
-304,8
+307,10
@@
static int wh_write_command (const data_set_t *ds, const value_list_t *vl, /* {{
}
command_len = (size_t) ssnprintf (command, sizeof (command),
}
command_len = (size_t) ssnprintf (command, sizeof (command),
- "PUTVAL %s interval=%i %s\r\n",
- key, vl->interval, values);
+ "PUTVAL %s interval=%.3f %s\r\n",
+ key,
+ CDTIME_T_TO_DOUBLE (vl->interval),
+ values);
if (command_len >= sizeof (command)) {
ERROR ("write_http plugin: Command buffer too small: "
"Need %zu bytes.", command_len + 1);
if (command_len >= sizeof (command)) {
ERROR ("write_http plugin: Command buffer too small: "
"Need %zu bytes.", command_len + 1);
@@
-327,7
+332,7
@@
static int wh_write_command (const data_set_t *ds, const value_list_t *vl, /* {{
if (command_len >= cb->send_buffer_free)
{
if (command_len >= cb->send_buffer_free)
{
- status = wh_flush_nolock (/* timeout = */
-1
, cb);
+ status = wh_flush_nolock (/* timeout = */
0
, cb);
if (status != 0)
{
pthread_mutex_unlock (&cb->send_lock);
if (status != 0)
{
pthread_mutex_unlock (&cb->send_lock);
@@
-379,7
+384,7
@@
static int wh_write_json (const data_set_t *ds, const value_list_t *vl, /* {{{ *
ds, vl, cb->store_rates);
if (status == (-ENOMEM))
{
ds, vl, cb->store_rates);
if (status == (-ENOMEM))
{
- status = wh_flush_nolock (/* timeout = */
-1
, cb);
+ status = wh_flush_nolock (/* timeout = */
0
, cb);
if (status != 0)
{
wh_reset_buffer (cb);
if (status != 0)
{
wh_reset_buffer (cb);
@@
-501,6
+506,7
@@
static int wh_config_url (oconfig_item_t *ci) /* {{{ */
{
wh_callback_t *cb;
user_data_t user_data;
{
wh_callback_t *cb;
user_data_t user_data;
+ char callback_name[DATA_MAX_NAME_LEN];
int i;
cb = malloc (sizeof (*cb));
int i;
cb = malloc (sizeof (*cb));
@@
-551,16
+557,18
@@
static int wh_config_url (oconfig_item_t *ci) /* {{{ */
}
}
}
}
-
DEBUG ("write_http: Registering write callback with URL
%s",
+
ssnprintf (callback_name, sizeof (callback_name), "write_http/
%s",
cb->location);
cb->location);
+ DEBUG ("write_http: Registering write callback '%s' with URL '%s'",
+ callback_name, cb->location);
memset (&user_data, 0, sizeof (user_data));
user_data.data = cb;
user_data.free_func = NULL;
memset (&user_data, 0, sizeof (user_data));
user_data.data = cb;
user_data.free_func = NULL;
- plugin_register_flush (
"write_http"
, wh_flush, &user_data);
+ plugin_register_flush (
callback_name
, wh_flush, &user_data);
user_data.free_func = wh_callback_free;
user_data.free_func = wh_callback_free;
- plugin_register_write (
"write_http"
, wh_write, &user_data);
+ plugin_register_write (
callback_name
, wh_write, &user_data);
return (0);
} /* }}} int wh_config_url */
return (0);
} /* }}} int wh_config_url */
@@
-585,9
+593,18
@@
static int wh_config (oconfig_item_t *ci) /* {{{ */
return (0);
} /* }}} int wh_config */
return (0);
} /* }}} int wh_config */
+static int wh_init (void) /* {{{ */
+{
+ /* Call this while collectd is still single-threaded to avoid
+ * initialization issues in libgcrypt. */
+ curl_global_init (CURL_GLOBAL_SSL);
+ return (0);
+} /* }}} int wh_init */
+
void module_register (void) /* {{{ */
{
plugin_register_complex_config ("write_http", wh_config);
void module_register (void) /* {{{ */
{
plugin_register_complex_config ("write_http", wh_config);
+ plugin_register_init ("write_http", wh_init);
} /* }}} void module_register */
/* vim: set fdm=marker sw=8 ts=8 tw=78 et : */
} /* }}} void module_register */
/* vim: set fdm=marker sw=8 ts=8 tw=78 et : */