[rrd-developers] problems with rrd_update() when updating rrd file

Tomáš Macek maca02 at atlas.cz
Wed Jun 2 07:16:09 CEST 2010


Ooops! That was the problem, thank you! I nonsensely think that rrd_info()  
accepts the same array as rrd_update() - it's bad :-)

I replaced the call rrd_info(i, argv) by rrd_info(i, argv + 1) and it  
works without calling of rrd_clear_error() before each rrd_*() call.  
That's fine and it was my stupid mistake. I've also tried to replace it by  
rrd_info(i, argv[1]), but this leads to gcc warning and SIGSEGV.

Are there any man pages about library API functions? I think about some  
like "man 2 stat" for example. I see none in source dir ./doc, the only  
manual with "rrd_info" is rrdthreads.1. There is also written, that  
"Always call "rrd_error_clear()" before any call to the library" so I've  
tried it in my program and it worked for me.

I also think, that rrd_clear_error() could be called from inside of every  
rrd_*() function or not? And also prototypes in /usr/include/rrd.h could  
be a little bit more verbose, instead of "rrd_info(int, char *)" could be  
"rrd_info(int argc, char *filename)" or something. What do you think about  
it? But that's rather a question on Tobi...

Best regards and thank you for help, Tomas


On Wed, 02 Jun 2010 01:54:07 +0200, kevin brintnall <kbrint at rufus.net>  
wrote:

> Hi Tomas,
>
> I've discovered the problem...  it's not coming from your call to  
> rrd_update
> at all, but rather from your call to rrd_info.  Without your test case it
> would have been very difficult to find.
>
> Prior to r1504, rrd_info only accepted filenames as arguments.  It simply
> checked argc to ensure that it was large enough and then iterated over  
> the
> argv array.  In this case, you are passing  arguments to it (--template)
> that it does not understand.  Thus, the error.  The error message is
> misleading because it uses argv[0], which you are passing as "update"...
> Remove --template,etc and it will work just fine.
>
> The call to rrd_update returns -1 because rrd_test_error() fails due to  
> the
> error message set by rrd_info.  It's prudent to either handle or clear  
> the
> RRD error after each call.
>
> A couple questions for Tobi...
>
> (1) should rrd_update_r() call rrd_clear_error() at the top?  Its return
> call depends on rrd_test_error().  Would it make sense to  
> save/clear/reset
> the error?  Not sure on this.
>
> (2) Should we expose rrd_info_r ?
>
> -kb
>
> On Tue, Jun 1, 2010 at 7:42 AM, Tomáš Macek <maca02 at atlas.cz> wrote:
>
>> Hm, so rrd_clear_error() did the job. I inserted call of  
>> rrd_clear_error()
>> before each rrd_*() calling and program works (see the line with
>> "attention" comment). I've tried to simplify things as possible and here
>> it is, maybe this will help to anyone else to solve his problems... Am I
>> doing everything right now?
>>
>> Tomas
>>
>> -------------------------
>>
>> #include <stdio.h>
>> #include <sys/types.h>
>> #include <unistd.h>
>> #include <stdlib.h>
>> #include <stdarg.h>
>> #include <rrd.h>
>>
>> void rrd_cmd(char *cmdstr) {
>>     char *strptr = NULL, *str = NULL;
>>     char *argv[64];
>>     int error = 0, i = 0;
>>     rrd_info_t *it = NULL;
>>     char rrdcmd[2048] = "";
>>
>>     snprintf(rrdcmd, 2048, "%s", cmdstr);
>>
>>     i = 0;
>>
>>     /* memset update, create *argv[] */
>>     memset(argv, 0, 64 * sizeof(char *));
>>
>>     for (strptr = rrdcmd; strptr != NULL;) {
>>         while ((str = strsep(&strptr, " ")) != NULL && str != '\0') {
>>            argv[i] = str;
>>            i++;
>>         }
>>     }
>>
>>     rrd_clear_error(); /* attention!!! */
>>     it = rrd_info(i, argv);
>>     rrd_info_free(it);
>>     rrd_clear_error();  /* attention!!! */
>>      error = rrd_update(i, argv);
>>      if (error == -1) {
>>         printf("Error: RRD_UPDATE command: %s\n", rrd_get_error());
>>         rrd_clear_error();
>>     }
>> }
>>
>> int update_rrd_cmd(char *rrd_name, char *ds_string, char  
>> *n_value_string,
>> char *buff, int n) {
>>     memset(buff, 0, n);
>>     snprintf(buff, n, "update %s --template %s %s", rrd_name, ds_string,
>> n_value_string);
>>     printf("%s: buff = %s\n", __FUNCTION__, buff);
>>     return 0;
>> }
>>
>> int main(void) {
>>     char buff[2048] = "";
>>     update_rrd_cmd("./testfile.rrd", "ds0:ds1", "N:123:456", buff,  
>> 2048);
>>     rrd_cmd(buff);
>>     return 0;
>> }
>>
>>
>> On Tue, 01 Jun 2010 08:20:18 +0200, Tomáš Macek <maca02 at atlas.cz> wrote:
>>
>> > Hello again,
>> > this problem is present since 1.4.0. I know it, because I've tried  
>> every
>> > version since 1.3.8 (works), through 1.3.9 (works), 1.4.0 - 1.4.3 does
>> > not
>> > work at all with syntax error as described below. Everytime I compiled
>> > and
>> > tried the same source code and linked with the proper library version.
>> > What has changed in the API of rrd_update() in 1.4.0? I really don't
>> > understand what I'm doing wrong. Any hints/help appreciated, looking  
>> at
>> > the CHANGES file did not helped me.
>> >
>> > Tomas
>> >
>> >
>> > On Thu, 20 May 2010 12:28:25 +0200, Tomáš Macek <maca02 at atlas.cz>  
>> wrote:
>> >
>> >> Hi, I have RHEL 5.5 with rrdtool 1.4.3 and I'm using it's API for
>> >> updating
>> >> rrd files. The problem is that when I pass arguments to the  
>> rrd_update()
>> >> function, it always returns error saying "Usage: rrdtool update
>> >> [--daemon
>> >> <addr>] <file>". The same code worked really fine on 1.3.8. I looked  
>> at
>> >> the CHANGELOG file and there was some line saying, that something has
>> >> changed on checking optarg parameters.
>> >>
>> >> This is from gdb just before I pass the array into rrd_update()
>> >> function:
>> >> -----------
>> >> Breakpoint 2, rrd_cmd (rrdcmd=0x634dc0 "update", cmd=1, di_cnt=2) at
>> >> rrd_op.c:215
>> >> 215                 error = rrd_update(i, argv);
>> >> (gdb) p argv
>> >> $26 = {0x634dc0 "update", 0x634dc7 "cac_ap2aeth.rrd",
>> >>    0x634e06 "--template", 0x634e11 "ds0:ds1", 0x634e19
>> >> "N:2325779922:3582706806", 0x0 <repeats 59 times>}
>> >> -----------
>> >>
>> >> and after program goes thourgh rrd_update(), the argv array looks  
>> like
>> >> this:
>> >> -----------
>> >> 216                 if (error == -1) {
>> >> (gdb) p argv
>> >> $28 = {0x634dc0 "update", 0x634e06 "--template", 0x634e11 "ds0:ds1",
>> >>    0x634dc7 "cac_ap2aeth.rrd", 0x634e19 "N:2325779922:3582706806",
>> >>    0x0 <repeats 59 times>}
>> >> -----------
>> >>
>> >> Please, notice the replaced arguments after rrd_update()... I don't
>> >> know,
>> >> what I'm doing wrong, the code under 1.3.8 library worked just fine  
>> and
>> >> according to the man rrdupdate the arguments are fine. Hope I'm not
>> >> missing something stupid, but I was not able to find anything  
>> strange in
>> >> rrd_update() function in the rrd_update.c.
>> >> Let me know, if you need something more from me, thank you
>> >>
>> >> Regards, Tomas
>> >>
>> >> _______________________________________________
>> >> rrd-developers mailing list
>> >> rrd-developers at lists.oetiker.ch
>> >> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>> >
>> > _______________________________________________
>> > rrd-developers mailing list
>> > rrd-developers at lists.oetiker.ch
>> > https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>>
>> _______________________________________________
>> rrd-developers mailing list
>> rrd-developers at lists.oetiker.ch
>> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>>
>
>
>



More information about the rrd-developers mailing list