projects
/
rrdtool.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Handle race condition for "UPDATE" with new files. Problem found by Sebastian Harl...
[rrdtool.git]
/
src
/
rrd_daemon.c
diff --git
a/src/rrd_daemon.c
b/src/rrd_daemon.c
index
17ec97e
..
8b1fc9e
100644
(file)
--- a/
src/rrd_daemon.c
+++ b/
src/rrd_daemon.c
@@
-1314,6
+1314,7
@@
static int handle_request_update (HANDLER_PROTO) /* {{{ */
if (ci == NULL) /* {{{ */
{
struct stat statbuf;
if (ci == NULL) /* {{{ */
{
struct stat statbuf;
+ cache_item_t *tmp;
/* don't hold the lock while we setup; stat(2) might block */
pthread_mutex_unlock(&cache_lock);
/* don't hold the lock while we setup; stat(2) might block */
pthread_mutex_unlock(&cache_lock);
@@
-1361,7
+1362,16
@@
static int handle_request_update (HANDLER_PROTO) /* {{{ */
pthread_cond_init(&ci->flushed, NULL);
pthread_mutex_lock(&cache_lock);
pthread_cond_init(&ci->flushed, NULL);
pthread_mutex_lock(&cache_lock);
- g_tree_replace (cache_tree, (void *) ci->file, (void *) ci);
+
+ /* another UPDATE might have added this entry in the meantime */
+ tmp = g_tree_lookup (cache_tree, file);
+ if (tmp == NULL)
+ g_tree_replace (cache_tree, (void *) ci->file, (void *) ci);
+ else
+ {
+ free_cache_item (ci);
+ ci = tmp;
+ }
} /* }}} */
assert (ci != NULL);
} /* }}} */
assert (ci != NULL);