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

Tobias Oetiker tobi at oetiker.ch
Wed Jun 2 07:31:39 CEST 2010


Hi Tomas,

Tomas Macek wrote:

> 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...

note it is rrd_info_t *rrd_info( int, char **);

the api documentation is in librrd.pod if you have additions to
this file, it would be great ...

cheers
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
> >>
> >
> >
> >
>
> _______________________________________________
> rrd-developers mailing list
> rrd-developers at lists.oetiker.ch
> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>

-- 
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland
http://it.oetiker.ch tobi at oetiker.ch ++41 62 775 9902 / sb: -9900


More information about the rrd-developers mailing list