X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ffilter_chain.c;h=903f66f912d60087dd56b35458bb3b7bc58c3114;hb=8b4fed9940e02138b7e273e56863df03d1a39ef7;hp=ed2df61c9c5b16f35a0e6953ab0f9ca5da03fc8b;hpb=50c6b81549e3239034f71f00ff7dde4c6a8767e5;p=collectd.git diff --git a/src/filter_chain.c b/src/filter_chain.c index ed2df61c..903f66f9 100644 --- a/src/filter_chain.c +++ b/src/filter_chain.c @@ -73,6 +73,15 @@ struct fc_chain_s /* {{{ */ fc_chain_t *next; }; /* }}} */ +/* Writer configuration. */ +struct fc_writer_s; +typedef struct fc_writer_s fc_writer_t; /* {{{ */ +struct fc_writer_s +{ + char *plugin; + c_complain_t complaint; +}; /* }}} */ + /* * Global variables */ @@ -92,7 +101,7 @@ static void fc_free_matches (fc_match_t *m) /* {{{ */ (*m->proc.destroy) (&m->user_data); else if (m->user_data != NULL) { - ERROR ("Filter sybsystem: fc_free_matches: There is user data, but no " + ERROR ("Filter subsystem: fc_free_matches: There is user data, but no " "destroy functions has been specified. " "Memory will probably be lost!"); } @@ -112,7 +121,7 @@ static void fc_free_targets (fc_target_t *t) /* {{{ */ (*t->proc.destroy) (&t->user_data); else if (t->user_data != NULL) { - ERROR ("Filter sybsystem: fc_free_targets: There is user data, but no " + ERROR ("Filter subsystem: fc_free_targets: There is user data, but no " "destroy functions has been specified. " "Memory will probably be lost!"); } @@ -378,7 +387,6 @@ static int fc_config_add_rule (fc_chain_t *chain, /* {{{ */ for (i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; - status = 0; if (strcasecmp ("Match", option->key) == 0) status = fc_config_add_match (&rule->matches, option); @@ -462,7 +470,6 @@ static int fc_config_add_chain (const oconfig_item_t *ci) /* {{{ */ for (i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; - status = 0; if (strcasecmp ("Rule", option->key) == 0) status = fc_config_add_rule (chain, option); @@ -609,16 +616,13 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */ { int i; - char **plugin_list; - size_t plugin_list_len; - - plugin_list = NULL; - plugin_list_len = 0; + fc_writer_t *plugin_list = NULL; + size_t plugin_list_len = 0; for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; - char **temp; + fc_writer_t *temp; int j; if (strcasecmp ("Plugin", child->key) != 0) @@ -631,14 +635,17 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */ for (j = 0; j < child->values_num; j++) { + char *plugin; + if (child->values[j].type != OCONFIG_TYPE_STRING) { ERROR ("Filter subsystem: Built-in target `write': " "The `Plugin' option accepts only string arguments."); continue; } + plugin = child->values[j].value.string; - temp = (char **) realloc (plugin_list, (plugin_list_len + 2) + temp = (fc_writer_t *) realloc (plugin_list, (plugin_list_len + 2) * (sizeof (*plugin_list))); if (temp == NULL) { @@ -647,14 +654,15 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */ } plugin_list = temp; - plugin_list[plugin_list_len] = fc_strdup (child->values[j].value.string); - if (plugin_list[plugin_list_len] == NULL) + plugin_list[plugin_list_len].plugin = fc_strdup (plugin); + if (plugin_list[plugin_list_len].plugin == NULL) { ERROR ("fc_bit_write_create: fc_strdup failed."); continue; } + C_COMPLAIN_INIT (&plugin_list[plugin_list_len].complaint); plugin_list_len++; - plugin_list[plugin_list_len] = NULL; + plugin_list[plugin_list_len].plugin = NULL; } /* for (j = 0; j < child->values_num; j++) */ } /* for (i = 0; i < ci->children_num; i++) */ @@ -665,7 +673,7 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */ static int fc_bit_write_destroy (void **user_data) /* {{{ */ { - char **plugin_list; + fc_writer_t *plugin_list; size_t i; if ((user_data == NULL) || (*user_data == NULL)) @@ -673,8 +681,8 @@ static int fc_bit_write_destroy (void **user_data) /* {{{ */ plugin_list = *user_data; - for (i = 0; plugin_list[i] != NULL; i++) - free (plugin_list[i]); + for (i = 0; plugin_list[i].plugin != NULL; i++) + free (plugin_list[i].plugin); free (plugin_list); return (0); @@ -684,23 +692,23 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ value_list_t *vl, notification_meta_t __attribute__((unused)) **meta, void **user_data) { - char **plugin_list; + fc_writer_t *plugin_list; int status; plugin_list = NULL; if (user_data != NULL) plugin_list = *user_data; - if ((plugin_list == NULL) || (plugin_list[0] == NULL)) + if ((plugin_list == NULL) || (plugin_list[0].plugin == NULL)) { - static c_complain_t enoent_complaint = C_COMPLAIN_INIT_STATIC; + static c_complain_t write_complaint = C_COMPLAIN_INIT_STATIC; status = plugin_write (/* plugin = */ NULL, ds, vl); if (status == ENOENT) { /* in most cases this is a permanent error, so use the complain * mechanism rather than spamming the logs */ - c_complain (LOG_INFO, &enoent_complaint, + c_complain (LOG_INFO, &write_complaint, "Filter subsystem: Built-in target `write': Dispatching value to " "all write plugins failed with status %i (ENOENT). " "Most likely this means you didn't load any write plugins.", @@ -708,13 +716,16 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ } else if (status != 0) { - INFO ("Filter subsystem: Built-in target `write': Dispatching value to " + /* often, this is a permanent error (e.g. target system unavailable), + * so use the complain mechanism rather than spamming the logs */ + c_complain (LOG_INFO, &write_complaint, + "Filter subsystem: Built-in target `write': Dispatching value to " "all write plugins failed with status %i.", status); } else { assert (status == 0); - c_release (LOG_INFO, &enoent_complaint, "Filter subsystem: " + c_release (LOG_INFO, &write_complaint, "Filter subsystem: " "Built-in target `write': Some write plugin is back to normal " "operation. `write' succeeded."); } @@ -723,13 +734,21 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ { size_t i; - for (i = 0; plugin_list[i] != NULL; i++) + for (i = 0; plugin_list[i].plugin != NULL; i++) { - status = plugin_write (plugin_list[i], ds, vl); + status = plugin_write (plugin_list[i].plugin, ds, vl); if (status != 0) { - INFO ("Filter subsystem: Built-in target `write': Dispatching value to " - "the `%s' plugin failed with status %i.", plugin_list[i], status); + c_complain (LOG_INFO, &plugin_list[i].complaint, + "Filter subsystem: Built-in target `write': Dispatching value to " + "the `%s' plugin failed with status %i.", + plugin_list[i].plugin, status); + } + else + { + c_release (LOG_INFO, &plugin_list[i].complaint, + "Filter subsystem: Built-in target `write': Plugin `%s' is back " + "to normal operation. `write' succeeded.", plugin_list[i].plugin); } } /* for (i = 0; plugin_list[i] != NULL; i++) */ } @@ -863,17 +882,17 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ { fc_rule_t *rule; fc_target_t *target; - int status; + int status = FC_TARGET_CONTINUE; if (chain == NULL) return (-1); DEBUG ("fc_process_chain (chain = %s);", chain->name); - status = FC_TARGET_CONTINUE; for (rule = chain->rules; rule != NULL; rule = rule->next) { fc_match_t *match; + status = FC_TARGET_CONTINUE; if (rule->name[0] != 0) { @@ -935,8 +954,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ } } - if ((status == FC_TARGET_STOP) - || (status == FC_TARGET_RETURN)) + if ((status == FC_TARGET_STOP) || (status == FC_TARGET_RETURN)) { if (rule->name[0] != 0) { @@ -947,20 +965,10 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ } break; } - else - { - status = FC_TARGET_CONTINUE; - } } /* for (rule) */ - if (status == FC_TARGET_STOP) - return (FC_TARGET_STOP); - else if (status == FC_TARGET_RETURN) - return (FC_TARGET_CONTINUE); - - /* for-loop has been aborted: A target returned `FC_TARGET_STOP' */ - if (rule != NULL) - return (FC_TARGET_CONTINUE); + if ((status == FC_TARGET_STOP) || (status == FC_TARGET_RETURN)) + return (status); DEBUG ("fc_process_chain (%s): Executing the default targets.", chain->name);