[rrd-developers] rrd_fetch seek issue

Daniel.Pocock at barclayscapital.com Daniel.Pocock at barclayscapital.com
Thu Nov 27 17:59:32 CET 2008


> -----Original Message-----
> From: Tobias Oetiker [mailto:tobi at oetiker.ch] 
> Sent: 27 November 2008 10:57
> To: Pocock, Daniel: IT (LDN)
> Cc: rrd-developers at lists.oetiker.ch
> Subject: Re: [rrd-developers] rrd_fetch seek issue
> Hi Daniel,
> (I have not yet looked at the code).
> I just tried to reproduce the problem here and it did not work.
> I guess you are hitting some sort of a corner case ... can 
> you create a little demo script ...

I encountered the problem in my patched version of trunk, so I decided
to explore it with an unpatched version of 1.2.15, as that is an
unpatched version I already have on a box.

My patched code is quite unforgiving - there is an assert() for bad
seeks.  That's how I discovered the problem.

Testing with 1.2.15, there is also a seek beyond the end of the file,
and NaN data is returned by rrd_fetch.

NOW=`date +%s`
START_T=`expr $NOW - 3600`
TS2=`expr $START_T + 10`
TS3=`expr $START_T + 20`

rrdtool create /tmp/test1.rrd \
    --start ${START_T} \
    --step 10 \
    DS:ds0:COUNTER:900:U:U \

$ ls -l /tmp/test1.rrd 
-rw-r--r--  1 daniel daniel 1984 Nov 27 16:28 /tmp/test1.rrd

# notice the file size is 1984 bytes, consistent with 180 rows in the
# put in a couple of updates with old time stamps:

rrdtool update /tmp/test1.rrd ${TS2}:1000
rrdtool update /tmp/test1.rrd ${TS3}:2000

# Notice that last_update is over 1 hour ago
# There can only be data for 30 minutes (180 rows)
$ rrdtool info /tmp/test1.rrd |grep last_upd
last_update = 1227799751
$ date +%s

# Now I inspect the fetch code, notice how the seek is for
# 544 + (569 * 1 * 8) = 5096
# which is beyond the end of the file

$ gdb rrdtool

set args fetch /tmp/test1.rrd AVERAGE -r 10 -s -60s 

Breakpoint 3, rrd_fetch_fn (
    filename=0xfffffe76 <Address 0xfffffe76 out of bounds>,
    start=0xbffb8868, end=0xbffb886c, step=0xbffb8870,
    ds_namv=0xbffb8878, data=0xbffb887c) at rrd_fetch.c:346
346         if (start_offset <= 0)
(gdb) next
338         end_offset = (long)(rra_end_time - *end ) / (long)*step; 
(gdb) next
346         if (start_offset <= 0)
349             rra_pointer =
351         if(fseek(in_file,(rra_base 
(gdb) print rra_base
$1 = 544
(gdb) print rra_pointer
$2 = 569
(gdb) print *ds_cnt
$3 = 1
(gdb) next
372         for (i=start_offset;
(gdb) print ftell(in_file)
$4 = 5096

This e-mail may contain information that is confidential, privileged or otherwise protected from disclosure. If you are not an intended recipient of this e-mail, do not duplicate or redistribute it by any means. Please delete it and any attachments and notify the sender that you have received it in error. Unless specifically indicated, this e-mail is not an offer to buy or sell or a solicitation to buy or sell any securities, investment products or other financial product or service, an official confirmation of any transaction, or an official statement of Barclays. Any views or opinions presented are solely those of the author and do not necessarily represent those of Barclays. This e-mail is subject to terms available at the following link: www.barcap.com/emaildisclaimer. By messaging with Barclays you consent to the foregoing.  Barclays Capital is the investment banking division of Barclays Bank PLC, a company registered in England (number 1026167) with its registered office at 1 Churchill Place, London, E14 5HP.  This email may relate to or be sent from other members of the Barclays Group.

More information about the rrd-developers mailing list