Feb 152007

At Ade’s prompting, I’m getting ready to move FreshPorts onto the dual opteron. It should have moved there some time ago.

To keep track of the system stats, I’m using Cacti. I used the database I created on another server and copied it over to the new box. As part of this, I needed to create the corresponding rrd files that Cacti would use to create the graphs. symon would be monitoring the system, and symux would be grabbing that data and updating the rrd files.

Everything was fine, but rrdtools did not like the incoming data:

symux: rrd_update:illegal attempt to update using time 1171504805 when last update time is 944503401600 (minimum one second step)

Eh? What’s up with that? Inspection of the data file showed something like this:

# rrdtool info cpu0.rrd | head
filename = "cpu0.rrd"
rrd_version = "0003"
step = 5
last_update = 944503401600

Well, that’s pretty far in the future:

# date -r 944503401600
Wed Feb 14 00:00:00 PST 31900

The problem arose on a dual operton running FreeBSD 6.2 with an amd64 kernel. The problem did not occur on an i386 kernel on an amd64 nor on a i386 server.

My discussions on the rrd users list helped me track down the faulty setting. –start=0

This example will demonstrate the problem:

rrdtool create test.rrd --start=0 DS:x:GAUGE:600:U:U RRA:AVERAGE:0:1:5

If you remove the –start=0, the problem goes away. This change allowed me to create the required rrd files and get sysmon, symux, and Cacti humming away happily.

My thanks to Alex van den Bogaerdt for helping to narrow down the cause of the problem. Hopefully we can get it fixed. :)

Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive

  One Response to “rddtools – last_update of year 31900 – 944503401600”

  1. The patch, AFAIK:

    — rrdtool-1.2.19/src/parsetime.c.orig Thu Feb 15 22:15:36 2007
    +++ rrdtool-1.2.19/src/parsetime.c Thu Feb 15 22:16:57 2007
    @@ -850,7 +850,7 @@
    if ( ptv->tm.tm_hour == 30 ){
    ptv->tm.tm_hour = hour_sv;
    – if ( ptv->tm.tm_hour == 30000 ){
    + if ( ptv->tm.tm_year == 30000 ){
    ptv->tm.tm_year = year_sv;