Hi,

I've just stumbled across the following (possible) issue. Unfortunately,
I don't have the time to have a more in-depth look at it, but maybe
Kevin and / or Florian can comment on that:

In handle_request_update(), the following code is used:

  pthread_mutex_lock (&cache_lock);
  ci = g_tree_lookup (cache_tree, file);

  if (ci == NULL) /* {{{ */
  {

/* I.e. the file is not yet available in the cache => we need to create
 * a cache item and insert in into the tree. */

  [...]
  /* don't hold the lock while we setup; stat(2) might block */
  pthread_mutex_unlock(&cache_lock);

  [...] /* Allocate and initialize the cache item. */

  pthread_mutex_lock(&cache_lock);
  g_tree_replace (cache_tree, (void *) ci->file, (void *) ci);

Now, in the mean time, another "UPDATE" command could have been issued
on the same file, which would have created the cache item as well which
would then be replaced by the "new" one when calling g_tree_replace(),
losing the data submitted by the other "UPDATE" command.

g_tree_replace() will take care of properly freeing the "old" cache
entry (using free_cache_item()), however that does not take care of
flushing the file.

I agree that this describes a very unlikely situation but it is
semantically wrong and might result in problems that are very hard to
trace back. Suppose that multiple updates are accumulated into one
"UPDATE" command before being submitted to rrdcached (for whatever
reason). Then all data of some UPDATE might be lost. When thinking about
plans to introduce sub-second resolution some time in the future, this
might become a real problem.

Am I missing something? Any comments?

Cheers,
Sebastian

-- 
Sebastian "tokkee" Harl +++ GnuPG-ID: 0x8501C7FC +++ http://tokkee.org/

Those who would give up Essential Liberty to purchase a little Temporary
Safety, deserve neither Liberty nor Safety.         -- Benjamin Franklin

Attachment: signature.asc
Description: Digital signature

_______________________________________________
rrd-developers mailing list
rrd-developers@lists.oetiker.ch
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers

Reply via email to