Re: problems with rrd_update() when updating rrd file
Tobias Oetiker <[email protected]>
| Newsgroups | gmane.comp.db.rrdtool.devel |
|---|---|
| Message-ID | <[email protected]> |
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 <[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 > -- Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland http://it.oetiker.ch [email protected] ++41 62 775 9902 / sb: -9900 _______________________________________________ rrd-developers mailing list [email protected] https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers