Sebastian Harl [Sun, 5 Jun 2016 13:23:41 +0000 (15:23 +0200)]
command parser: Add a vector-based interface.
The new interface expects a parsed list of fields. Parsing of input buffers
is now done centrally in the generic code and the existing parser is a
wrapper around this and the new vector-based parser. The actual command
parsers (PUTVAL for now) receive the parsed list of fields.
As a side-effect, this changes the parser behavior a little:
- "foo=a string with spaces or \\ special characters" is now valid syntax
for specifying options in addition to foo="value with spaces, etc.".
- foo= is now a valid option even without quotes around the empty value.
Sebastian Harl [Sun, 5 Jun 2016 11:59:49 +0000 (13:59 +0200)]
Add a generic interface for parsing the text protocol.
Implement it for PUTVAL for now.
The text protocol is used in multiple places and the parser will avoid code
duplication in client programs which can, instead, use it to generate the
respective requests.
Use the 'cmd_' prefix for public functions related to command handling.
Sebastian Harl [Sat, 24 Sep 2016 10:55:40 +0000 (12:55 +0200)]
RRDCacheD plugin: Try to reconnect upon failed operations.
The RRD client library does not provide means to check the status of a
connection and there's no way to detect that the connection is broken after,
for example, the daemon restarted. To work around that, try to reconnect if
any client operation fails.
A copy of the values was made in plugin_dispatch_values_internal(). This
code predates the "write queue", which means that each value list (and
its values) are copied anyway and vl->values will always point to heap
memory.
1) Added missing option description
2) Replaced strerror with sstrerror
3) Do not return from helper code
4) Use generic collectd Interval implementation
5) Removed "\n" from log messages
src/daemon/utils_time.c: Pass "struct tm *" to format_zone().
This is a partial revert of e2cb258c7b6ce456f4119fd1454c85b479fa3e2d:
strptime() does not look the local timezone up itself but gets the
information from the "struct tm". If that is initialized with {0}, it
will always return the "+0000" time zone.
Pavel Rochnyack [Thu, 11 Aug 2016 10:01:52 +0000 (16:01 +0600)]
perl plugin: Changed pluginname form to allow single perl plugin flush. (Part 2, fixed _plugin_unregister_generic() function to match _plugin_register_generic_userdata().)
Igor Peshansky [Thu, 15 Sep 2016 19:30:15 +0000 (15:30 -0400)]
Address more review comments:
- Repurpose rfc3339()/rfc3339nano() to return time in zulu format.
- Add formatted time examples to function comments.
- Clean up helper functions and add variable iniitalization.
Igor Peshansky [Thu, 15 Sep 2016 15:08:44 +0000 (11:08 -0400)]
Address review comments:
- Repurpose rfc3339/rfc3339nano to use UTC.
- Add rfc3339_local/rfc3339nano_local for local time.
- Factor out common bits; saner helper functions.
- Update comments.
This new implementation truncates fields rather than aborting when there
is more space in the output buffer. Since strjoin() is mostly used to
fill plugin and type instances, which are otherwise usually filled with
sstrncpy(), i.e. also truncate the string rather than erroring out.
The unit test has also been rewritten to test the new functionality.
The new functions have been formatted with clang-format.
hugepages plugin: Refactor the read_hugepage_entry() function.
* Move static variables into the "entry_info" struct.
* Turn flag into an actual flag, rather than a counter.
* Close "fh" as soon as possible.
* Return early if flags != HP_HAVE_ALL.
* Remove dead code (d_name *always* contains a dash).
hugepages plugin: Don't use pathconf(_PC_NAME_MAX).
Since we allocate the buffer on the stack, this doesn't make sense:
Best case, the returned value is the same as the PATH_MAX define. Worst
case, the returned value is larger and we create a stack overflow.
Assume, for example, the config `Key "*/foo"`. This config expects JSON
in the form:
{
"bar": {
"foo": 1337
}
}
If the available JSON is instead:
{
"error_code": 0,
"bar": {
"foo": 1337
}
}
the code will take a look at the zero associated with "error_code" and
determine that a map (with key "foo") is expected instead. Previously
the code would continue, eventually calling `cj_get_type()` which
expects that `key->type` is a valid pointer, resulting in a segmentation
fault.
This patch does three things to ensure that this segmentation fault does
not happen again:
1. `cj_get_type()` checks its argument to make sure it is valid before
dereferencing any pointers.
2. In case a non-map is found when a map is expected, the code will
return instead of limping on.
3. After calling `cj_cb_inc_array_index()`, which may update the key,
make sure that it actually did and that key is valid now.