summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7d8948f)
raw | patch | inline | side by side (parent: 7d8948f)
author | Francesco Romani <fromani@redhat.com> | |
Mon, 12 Dec 2016 11:03:43 +0000 (12:03 +0100) | ||
committer | Francesco Romani <fromani@redhat.com> | |
Mon, 12 Dec 2016 11:40:58 +0000 (12:40 +0100) |
If we use more than one reader instance, we can spot errors like
this in the system logs:
Dec 12 09:59:24 $HOST collectd[19338]: reading number of
domains: invalid connection pointer in virConnectNumOfDomains
Dec 12 09:59:24 benji.rokugan.lan collectd[19338]: read-function of
plugin `virt-2' failed. Will suspend it for 20.000 seconds.
This causes unnecessary delay in the sampling of libvirt.
The reason for this is just one instance (always #0) takes care
of establishing the libvirt connection.
But this could be done safely in the plugin init callback: according
to doc, this function is called at least once before all the read
instances.
Signed-off-by: Francesco Romani <fromani@redhat.com>
this in the system logs:
Dec 12 09:59:24 $HOST collectd[19338]: reading number of
domains: invalid connection pointer in virConnectNumOfDomains
Dec 12 09:59:24 benji.rokugan.lan collectd[19338]: read-function of
plugin `virt-2' failed. Will suspend it for 20.000 seconds.
This causes unnecessary delay in the sampling of libvirt.
The reason for this is just one instance (always #0) takes care
of establishing the libvirt connection.
But this could be done safely in the plugin init callback: according
to doc, this function is called at least once before all the read
instances.
Signed-off-by: Francesco Romani <fromani@redhat.com>
src/virt.c | patch | blob | history |
diff --git a/src/virt.c b/src/virt.c
index d3012d92069abf580861fce7119a7a064d35e6dc..242d0d33a4df04c3ab18645a843fccd2b670645b 100644 (file)
--- a/src/virt.c
+++ b/src/virt.c
return -1;
}
+static int lv_connect(void) {
+ if (conn == NULL) {
+ /* `conn_string == NULL' is acceptable. */
+ conn = virConnectOpenReadOnly(conn_string);
+ if (conn == NULL) {
+ c_complain(LOG_ERR, &conn_complain,
+ PLUGIN_NAME " plugin: Unable to connect: "
+ "virConnectOpenReadOnly failed.");
+ return -1;
+ }
+ }
+ c_release(LOG_NOTICE, &conn_complain,
+ PLUGIN_NAME " plugin: Connection established.");
+ return 0;
+}
+
static int lv_read(user_data_t *ud) {
time_t t;
struct lv_read_instance *inst = NULL;
inst = ud->data;
state = &inst->read_state;
- if (inst->id == 0 && conn == NULL) {
- /* `conn_string == NULL' is acceptable. */
- conn = virConnectOpenReadOnly(conn_string);
- if (conn == NULL) {
- c_complain(LOG_ERR, &conn_complain,
- PLUGIN_NAME " plugin: Unable to connect: "
- "virConnectOpenReadOnly failed.");
+ if (inst->id == 0) {
+ if (lv_connect() < 0)
return -1;
- }
}
- c_release(LOG_NOTICE, &conn_complain,
- PLUGIN_NAME " plugin: Connection established.");
time(&t);
if (virInitialize() != 0)
return -1;
+ lv_connect();
+
DEBUG(PLUGIN_NAME " plugin: starting %i instances", nr_instances);
for (int i = 0; i < nr_instances; ++i)