[rrd-developers] r2130 comments : rrd_parsetime, create_set_no_overwrite

kevin brintnall kbrint at rufus.net
Thu Sep 23 16:12:06 CEST 2010


Comrades,

I noticed that r2130 adds a call to rrd_parsetime to rrd_daemon.c.  I think
this is problematic since rrd_parsetime is not thread-safe. It would
probably make more sense to do the calculations in the client and pass the
absolute time_t to the daemon.  That's what we've done with UPDATE.  We
already rely on time synchronization between client+server so I don't see
that as a real issue.

A thread-safe re-write of rrd_parsetime() would also be beneficial, but that
looks awfully hairy.  I suppose we could mutex-lock the existing version
until then....

Also, rrd_create_set_no_overwrite() is not thread-safe..  This is a big
problem for the daemon.  It writes a global (un-guarded) variable.  There
are unavoidable race conditions here.  I think a better approach would be
either:

 - add an argument to rrd_create_r(), passing it through to rrd_create_fn()
 -  create a new API function that takes a boolean for whether create should
clobber an existing file....  then, re-implement rrd_create_r() in terms of
that function (with today's default)...  stil passing the arg through to
rrd_create_fn().

Also, in handle_request_create(), maybe it would make sense to do the
validation (i.e. step and last_up) in rrd_create_r() and rely on the return
value from rrd_create_r() to detect whether there was a failure?  That way,
the validation code stays in the same place.

Also, on rrd_daemon.c lines 1830..1831, it looks like it could be re-written
more nicely as:

- status = buffer_get_field(&buffer, &buffer_size, &tok );
- for(;(tok && !status);status = buffer_get_field(&buffer, &buffer_size,
&tok )) {
+ while ((status = buffer_get_field(&buffer, &buffer_size, &tok) == 0 &&
tok) {

In rrd_last.c, we seem to have lost a call to free(opt_daemon).  Is that
intentional?

In handle_request_last(), it seems we could get the last update time without
a flush by using cache_item_t.last_update_stamp and adjusting down to the
nearest RRD step size?  Then, no flush is required and the existing behavior
is preserved.

Thoughts?

-- 
 kevin brintnall =~ /kbrint at rufus.net/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.oetiker.ch/pipermail/rrd-developers/attachments/20100923/b7a86953/attachment-0001.htm 


More information about the rrd-developers mailing list