Re: problems with rrd_update() when updating rrd file

Tomáš Macek <[email protected]>
Newsgroups gmane.comp.db.rrdtool.devel
Message-ID <[email protected]>
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 <[email protected]>  
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 <[email protected]> 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 <[email protected]> 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 <[email protected]>  
>> 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
>> >> [email protected]
>> >> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>> >
>> > _______________________________________________
>> > rrd-developers mailing list
>> > [email protected]
>> > https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>>
>> _______________________________________________
>> rrd-developers mailing list
>> [email protected]
>> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>>
>
>
>

_______________________________________________
rrd-developers mailing list
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.