]> arthur.barton.de Git - netdata.git/commitdiff
unified rrd locks
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sun, 19 Feb 2017 12:43:29 +0000 (14:43 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Tue, 21 Feb 2017 23:00:24 +0000 (01:00 +0200)
src/backends.c
src/health.c
src/rrd.h
src/rrd2json.c
src/rrddim.c
src/rrdhost.c
src/rrdset.c

index a3717bc066f483732f052302b8626417c3c66a4d..2dee4e375b1b47ff5d32b8ee172fb1134e55e29f 100644 (file)
@@ -314,7 +314,7 @@ void *backends_main(void *ptr) {
             for(st = host->rrdset_root; st; st = st->next) {
                 // for each chart
 
-                pthread_rwlock_rdlock(&st->rwlock);
+                rrdset_rdlock(st);
 
                 RRDDIM *rd;
                 for(rd = st->dimensions; rd; rd = rd->next) {
@@ -324,7 +324,7 @@ void *backends_main(void *ptr) {
                         chart_buffered_metrics += backend_request_formatter(b, prefix, host, (host == localhost)?hostname:host->hostname, st, rd, after, before, options);
                 }
 
-                pthread_rwlock_unlock(&st->rwlock);
+                rrdset_unlock(st);
             }
 
             rrdhost_unlock(host);
index ca1f1d18e1e1a1f8922e6cf2a99d3905de7943f4..bd62fbcf8b7fbb8d3ead594422b15df7a61909d4 100644 (file)
@@ -1101,7 +1101,7 @@ void health_reload_host(RRDHOST *host) {
     char *path = health_config_dir();
 
     // free all running alarms
-    rrdhost_rwlock(host);
+    rrdhost_wrlock(host);
     health_free_host_nolock(host);
     rrdhost_unlock(host);
 
@@ -1120,13 +1120,13 @@ void health_reload_host(RRDHOST *host) {
     }
 
     // load the new alarms
-    rrdhost_rwlock(host);
+    rrdhost_wrlock(host);
     health_readdir(host, path);
     rrdhost_unlock(host);
 
     // link the loaded alarms to their charts
     for(st = host->rrdset_root; st ; st = st->next) {
-        rrdhost_rwlock(host);
+        rrdhost_wrlock(host);
 
         rrdsetcalc_link_matching(st);
         rrdcalctemplate_link_matching(st);
index a471b329dd6a640ca5b2ee78f0d0093597bd8f33..ad75c3d6a11fc34f4320832c8a91adedc1846d4b 100644 (file)
--- a/src/rrd.h
+++ b/src/rrd.h
@@ -251,7 +251,7 @@ struct rrdset {
     char *cache_dir;                                // the directory to store dimensions
     char cache_filename[FILENAME_MAX+1];            // the filename to store this set
 
-    pthread_rwlock_t rwlock;
+    pthread_rwlock_t rrdset_rwlock;
 
     unsigned long counter;                          // the number of times we added values to this rrd
     unsigned long counter_done;                     // the number of times we added values to this rrd
@@ -300,6 +300,10 @@ struct rrdset {
 };
 typedef struct rrdset RRDSET;
 
+#define rrdset_rdlock(st) pthread_rwlock_rdlock(&((st)->rrdset_rwlock))
+#define rrdset_wrlock(st) pthread_rwlock_wrlock(&((st)->rrdset_rwlock))
+#define rrdset_unlock(st) pthread_rwlock_unlock(&((st)->rrdset_rwlock))
+
 // ----------------------------------------------------------------------------
 // RRD HOST
 
@@ -319,7 +323,8 @@ struct rrdhost {
     RRD_MEMORY_MODE rrd_memory_mode;                // the memory more for the charts of this host
 
     RRDSET *rrdset_root;                            // the host charts
-    pthread_rwlock_t rrdset_root_rwlock;            // lock for the host charts
+
+    pthread_rwlock_t rrdhost_rwlock;                // lock for this RRDHOST
 
     avl_tree_lock rrdset_root_index;                // the host's charts index (by id)
     avl_tree_lock rrdset_root_index_name;           // the host's charts index (by name)
@@ -352,17 +357,20 @@ struct rrdhost {
     struct rrdhost *next;
 };
 typedef struct rrdhost RRDHOST;
-
 extern RRDHOST *localhost;
 
+#define rrdhost_rdlock(h) pthread_rwlock_rdlock(&((h)->rrdhost_rwlock))
+#define rrdhost_wrlock(h) pthread_rwlock_wrlock(&((h)->rrdhost_rwlock))
+#define rrdhost_unlock(h) pthread_rwlock_unlock(&((h)->rrdhost_rwlock))
+
 extern void rrd_init(char *hostname);
 
 extern RRDHOST *rrdhost_find(const char *guid, uint32_t hash);
 extern RRDHOST *rrdhost_find_or_create(const char *hostname, const char *guid);
 
 #ifdef NETDATA_INTERNAL_CHECKS
-#define rrdhost_check_wrlock(host) rrdhost_check_wrlock_int(host, __FILE__, __FUNCTION__, __LINE__)
 #define rrdhost_check_rdlock(host) rrdhost_check_rdlock_int(host, __FILE__, __FUNCTION__, __LINE__)
+#define rrdhost_check_wrlock(host) rrdhost_check_wrlock_int(host, __FILE__, __FUNCTION__, __LINE__)
 #else
 #define rrdhost_check_rdlock(host) (void)0
 #define rrdhost_check_wrlock(host) (void)0
@@ -371,10 +379,6 @@ extern RRDHOST *rrdhost_find_or_create(const char *hostname, const char *guid);
 extern void rrdhost_check_wrlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line);
 extern void rrdhost_check_rdlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line);
 
-extern void rrdhost_rwlock(RRDHOST *host);
-extern void rrdhost_rdlock(RRDHOST *host);
-extern void rrdhost_unlock(RRDHOST *host);
-
 // ----------------------------------------------------------------------------
 // RRDSET functions
 
index 26163aa0a12f8c7d7807b2fc956d86f4168f2f50..5315ca9603ff8ad49f3cb580bee48ee8927a9c54 100644 (file)
@@ -2,7 +2,7 @@
 
 void rrd_stats_api_v1_chart_with_data(RRDSET *st, BUFFER *wb, size_t *dimensions_count, size_t *memory_used)
 {
-    pthread_rwlock_rdlock(&st->rwlock);
+    rrdset_rdlock(st);
 
     buffer_sprintf(wb,
         "\t\t{\n"
@@ -71,7 +71,7 @@ void rrd_stats_api_v1_chart_with_data(RRDSET *st, BUFFER *wb, size_t *dimensions
         "\n\t\t}"
         );
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
 }
 
 void rrd_stats_api_v1_chart(RRDSET *st, BUFFER *wb) {
@@ -97,7 +97,7 @@ void rrd_stats_api_v1_charts(RRDHOST *host, BUFFER *wb)
         , host->rrd_history_entries
         );
 
-    pthread_rwlock_rdlock(&host->rrdset_root_rwlock);
+    rrdhost_rdlock(host);
     for(st = host->rrdset_root, c = 0; st ; st = st->next) {
         if(rrdset_flag_check(st, RRDSET_FLAG_ENABLED) && st->dimensions) {
             if(c) buffer_strcat(wb, ",");
@@ -114,7 +114,7 @@ void rrd_stats_api_v1_charts(RRDHOST *host, BUFFER *wb)
         if(rc->rrdset)
             alarms++;
     }
-    pthread_rwlock_unlock(&host->rrdset_root_rwlock);
+    rrdhost_unlock(host);
 
     buffer_sprintf(wb, "\n\t}"
                     ",\n\t\"charts_count\": %zu"
@@ -150,7 +150,7 @@ static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable)
 #define PROMETHEUS_ELEMENT_MAX 256
 
 void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb) {
-    pthread_rwlock_rdlock(&host->rrdset_root_rwlock);
+    rrdhost_rdlock(host);
 
     char hostname[PROMETHEUS_ELEMENT_MAX + 1];
     prometheus_name_copy(hostname, config_get("global", "hostname", "localhost"), PROMETHEUS_ELEMENT_MAX);
@@ -163,7 +163,7 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb) {
 
         buffer_strcat(wb, "\n");
         if(rrdset_flag_check(st, RRDSET_FLAG_ENABLED) && st->dimensions) {
-            pthread_rwlock_rdlock(&st->rwlock);
+            rrdset_rdlock(st);
 
             // for each dimension
             RRDDIM *rd;
@@ -196,11 +196,11 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb) {
                 }
             }
 
-            pthread_rwlock_unlock(&st->rwlock);
+            rrdset_unlock(st);
         }
     }
 
-    pthread_rwlock_unlock(&host->rrdset_root_rwlock);
+    rrdhost_unlock(host);
 }
 
 // ----------------------------------------------------------------------------
@@ -224,7 +224,7 @@ static inline size_t shell_name_copy(char *d, const char *s, size_t usable) {
 #define SHELL_ELEMENT_MAX 100
 
 void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
-    pthread_rwlock_rdlock(&host->rrdset_root_rwlock);
+    rrdhost_rdlock(host);
 
     // for each chart
     RRDSET *st;
@@ -235,7 +235,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
 
         buffer_sprintf(wb, "\n# chart: %s (name: %s)\n", st->id, st->name);
         if(rrdset_flag_check(st, RRDSET_FLAG_ENABLED) && st->dimensions) {
-            pthread_rwlock_rdlock(&st->rwlock);
+            rrdset_rdlock(st);
 
             // for each dimension
             RRDDIM *rd;
@@ -259,7 +259,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
 
             total = roundl(total);
             buffer_sprintf(wb, "NETDATA_%s_VISIBLETOTAL=\"%0.0Lf\"      # %s\n", chart, total, st->units);
-            pthread_rwlock_unlock(&st->rwlock);
+            rrdset_unlock(st);
         }
     }
 
@@ -287,7 +287,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
         buffer_sprintf(wb, "NETDATA_ALARM_%s_%s_STATUS=\"%s\"\n", chart, alarm, rrdcalc_status2string(rc->status));
     }
 
-    pthread_rwlock_unlock(&host->rrdset_root_rwlock);
+    rrdhost_unlock(host);
 }
 
 // ----------------------------------------------------------------------------
@@ -296,7 +296,7 @@ unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb)
 {
     time_t now = now_realtime_sec();
 
-    pthread_rwlock_rdlock(&st->rwlock);
+    rrdset_rdlock(st);
 
     buffer_sprintf(wb,
         "\t\t{\n"
@@ -394,7 +394,7 @@ unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb)
         , memory
         );
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
     return memory;
 }
 
@@ -416,7 +416,8 @@ void rrd_stats_all_json(RRDHOST *host, BUFFER *wb)
 
     buffer_strcat(wb, RRD_GRAPH_JSON_HEADER);
 
-    pthread_rwlock_rdlock(&host->rrdset_root_rwlock);
+    rrdhost_rdlock(host);
+
     for(st = host->rrdset_root, c = 0; st ; st = st->next) {
         if(rrdset_flag_check(st, RRDSET_FLAG_ENABLED) && st->dimensions) {
             if(c) buffer_strcat(wb, ",\n");
@@ -424,7 +425,6 @@ void rrd_stats_all_json(RRDHOST *host, BUFFER *wb)
             c++;
         }
     }
-    pthread_rwlock_unlock(&host->rrdset_root_rwlock);
 
     buffer_sprintf(wb, "\n\t],\n"
         "\t\"hostname\": \"%s\",\n"
@@ -437,6 +437,8 @@ void rrd_stats_all_json(RRDHOST *host, BUFFER *wb)
         , host->rrd_history_entries
         , memory
         );
+
+    rrdhost_unlock(host);
 }
 
 
@@ -1344,7 +1346,7 @@ inline static void rrdr_lock_rrdset(RRDR *r) {
         return;
     }
 
-    pthread_rwlock_rdlock(&r->st->rwlock);
+    rrdset_rdlock(r->st);
     r->has_st_lock = 1;
 }
 
@@ -1355,7 +1357,7 @@ inline static void rrdr_unlock_rrdset(RRDR *r) {
     }
 
     if(likely(r->has_st_lock)) {
-        pthread_rwlock_unlock(&r->st->rwlock);
+        rrdset_unlock(r->st);
         r->has_st_lock = 0;
     }
 }
@@ -1992,7 +1994,7 @@ int rrd2format(RRDSET *st, BUFFER *wb, BUFFER *dimensions, uint32_t format, long
 time_t rrd_stats_json(int type, RRDSET *st, BUFFER *wb, long points, long group, int group_method, time_t after, time_t before, int only_non_zero)
 {
     int c;
-    pthread_rwlock_rdlock(&st->rwlock);
+    rrdset_rdlock(st);
 
 
     // -------------------------------------------------------------------------
@@ -2036,7 +2038,7 @@ time_t rrd_stats_json(int type, RRDSET *st, BUFFER *wb, long points, long group,
     RRDDIM *rd;
     for( rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
     if(!dimensions) {
-        pthread_rwlock_unlock(&st->rwlock);
+        rrdset_unlock(st);
         buffer_strcat(wb, "No dimensions yet.");
         return 0;
     }
@@ -2309,6 +2311,6 @@ time_t rrd_stats_json(int type, RRDSET *st, BUFFER *wb, long points, long group,
 
     debug(D_RRD_STATS, "RRD_STATS_JSON: %s total %zu bytes", st->name, wb->len);
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
     return last_timestamp;
 }
index 7049f73cdf08804618a544b425e6cae3248d60c7..046c635bbe6fd12c56f1ed55383f033dee0e5186 100644 (file)
@@ -178,7 +178,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
     rd->rrdset = st;
 
     // append this dimension
-    pthread_rwlock_wrlock(&st->rwlock);
+    rrdset_wrlock(st);
     if(!st->dimensions)
         st->dimensions = rd;
     else {
@@ -193,7 +193,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
         rrddimvar_create(rd, RRDVAR_TYPE_TIME_T, NULL, "_last_collected_t", &rd->last_collected_time.tv_sec, 0);
     }
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
 
     if(unlikely(rrddim_index_add(st, rd) != rd))
         error("RRDDIM: INTERNAL ERROR: attempt to index duplicate dimension '%s' on chart '%s'", rd->id, st->id);
index c9b577078d9d7362053dd63cb8aef4540c20ea61..7c6d6418d8cec76a12b673a7f2238070ac9760ef 100644 (file)
@@ -65,7 +65,7 @@ RRDHOST *rrdhost_create(const char *hostname,
     host->rrd_memory_mode     = memory_mode;
     host->health_enabled      = health_enabled;
 
-    pthread_rwlock_init(&(host->rrdset_root_rwlock), NULL);
+    pthread_rwlock_init(&(host->rrdhost_rwlock), NULL);
 
     rrdhost_init_hostname(host, hostname);
     rrdhost_init_machine_guid(host, guid);
@@ -144,7 +144,7 @@ RRDHOST *rrdhost_create(const char *hostname,
     health_alarm_log_load(host);
     health_alarm_log_open(host);
 
-    rrdhost_rwlock(host);
+    rrdhost_wrlock(host);
     health_readdir(host, health_config_dir());
     rrdhost_unlock(host);
 
@@ -191,45 +191,34 @@ void rrd_init(char *hostname) {
 }
 
 // ----------------------------------------------------------------------------
-// RRDHOST - locks
-
-void rrdhost_rwlock(RRDHOST *host) {
-    debug(D_RRDHOST, "Write lock host '%s'", host->hostname);
-    pthread_rwlock_wrlock(&host->rrdset_root_rwlock);
-}
-
-void rrdhost_rdlock(RRDHOST *host) {
-    debug(D_RRDHOST, "Read lock host '%s'", host->hostname);
-    pthread_rwlock_rdlock(&host->rrdset_root_rwlock);
-}
-
-void rrdhost_unlock(RRDHOST *host) {
-    debug(D_RRDHOST, "Unlock host '%s'", host->hostname);
-    pthread_rwlock_unlock(&host->rrdset_root_rwlock);
-}
+// RRDHOST - lock validations
+// there are only used when NETDATA_INTERNAL_CHECKS is set
 
 void rrdhost_check_rdlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line) {
-    debug(D_RRDHOST, "Read lock host '%s'", host->hostname);
+    debug(D_RRDHOST, "Checking read lock on host '%s'", host->hostname);
 
-    int ret = pthread_rwlock_trywrlock(&host->rrdset_root_rwlock);
+    int ret = pthread_rwlock_trywrlock(&host->rrdhost_rwlock);
     if(ret == 0)
         fatal("RRDHOST '%s' should be read-locked, but it is not, at function %s() at line %lu of file '%s'", host->hostname, function, line, file);
 }
 
 void rrdhost_check_wrlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line) {
-    debug(D_RRDHOST, "Write lock host '%s'", host->hostname);
+    debug(D_RRDHOST, "Checking write lock on host '%s'", host->hostname);
 
-    int ret = pthread_rwlock_tryrdlock(&host->rrdset_root_rwlock);
+    int ret = pthread_rwlock_tryrdlock(&host->rrdhost_rwlock);
     if(ret == 0)
         fatal("RRDHOST '%s' should be write-locked, but it is not, at function %s() at line %lu of file '%s'", host->hostname, function, line, file);
 }
 
+// ----------------------------------------------------------------------------
+// RRDHOST - free
+
 void rrdhost_free(RRDHOST *host) {
     if(!host) return;
 
     info("Freeing all memory for host '%s'...", host->hostname);
 
-    rrdhost_rwlock(host);
+    rrdhost_wrlock(host);
 
     RRDSET *st;
     for(st = host->rrdset_root; st ;) {
@@ -256,6 +245,25 @@ void rrdhost_free(RRDHOST *host) {
     info("Host memory cleanup completed...");
 }
 
+void rrdhost_free_all(void) {
+    RRDHOST *host = localhost;
+
+    // FIXME: lock all hosts
+
+    while(host) {
+        RRDHOST *next = host = host->next;
+        rrdhost_free(host);
+        host = next;
+    }
+
+    localhost = NULL;
+
+    // FIXME: unlock all hosts
+}
+
+// ----------------------------------------------------------------------------
+// RRDHOST - save
+
 void rrdhost_save(RRDHOST *host) {
     if(!host) return;
 
@@ -266,10 +274,10 @@ void rrdhost_save(RRDHOST *host) {
 
     // we get a write lock
     // to ensure only one thread is saving the database
-    rrdhost_rwlock(host);
+    rrdhost_wrlock(host);
 
     for(st = host->rrdset_root; st ; st = st->next) {
-        pthread_rwlock_rdlock(&st->rwlock);
+        rrdset_rdlock(st);
 
         if(st->rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
             debug(D_RRD_STATS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename);
@@ -283,28 +291,12 @@ void rrdhost_save(RRDHOST *host) {
             }
         }
 
-        pthread_rwlock_unlock(&st->rwlock);
+        rrdset_unlock(st);
     }
 
     rrdhost_unlock(host);
 }
 
-void rrdhost_free_all(void) {
-    RRDHOST *host = localhost;
-
-    // FIXME: lock all hosts
-
-    while(host) {
-        RRDHOST *next = host = host->next;
-        rrdhost_free(host);
-        host = next;
-    }
-
-    localhost = NULL;
-
-    // FIXME: unlock all hosts
-}
-
 void rrdhost_save_all(void) {
     info("Saving database...");
 
index fe5158eedb200841fdaaf9dc2eac52543a35f126..aa002dd26d98293b29682a155f201db994e81e66 100644 (file)
@@ -100,7 +100,6 @@ inline RRDSET *rrdset_find_byname(RRDHOST *host, const char *name) {
     return(st);
 }
 
-
 // ----------------------------------------------------------------------------
 // RRDSET - rename charts
 
@@ -142,11 +141,11 @@ void rrdset_set_name(RRDSET *st, const char *name) {
         st->hash_name = simple_hash(st->name);
     }
 
-    pthread_rwlock_wrlock(&st->rwlock);
+    rrdset_wrlock(st);
     RRDDIM *rd;
     for(rd = st->dimensions; rd ;rd = rd->next)
         rrddimvar_rename_all(rd);
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
 
     if(unlikely(rrdset_index_add_name(st->rrdhost, st) != st))
         error("RRDSET: INTERNAL ERROR: attempted to index duplicate chart name '%s'", st->name);
@@ -210,7 +209,7 @@ static inline void timeval_align(struct timeval *tv, int update_every) {
 // RRDSET - free a chart
 
 void rrdset_free(RRDSET *st) {
-    pthread_rwlock_wrlock(&st->rwlock);
+    rrdset_wrlock(st);
 
     while(st->variables)  rrdsetvar_free(st->variables);
     while(st->alarms)     rrdsetcalc_unlink(st->alarms);
@@ -225,7 +224,7 @@ void rrdset_free(RRDSET *st) {
     if(!st->rrdfamily->use_count)
         rrdfamily_free(st->rrdhost, st->rrdfamily);
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
 
     // free directly allocated memory
     freez(st->config_section);
@@ -304,7 +303,7 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
             memset(&st->avlname, 0, sizeof(avl));
             memset(&st->variables_root_index, 0, sizeof(avl_tree_lock));
             memset(&st->dimensions_index, 0, sizeof(avl_tree_lock));
-            memset(&st->rwlock, 0, sizeof(pthread_rwlock_t));
+            memset(&st->rrdset_rwlock, 0, sizeof(pthread_rwlock_t));
 
             st->name = NULL;
             st->type = NULL;
@@ -413,8 +412,8 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
     avl_init_lock(&st->dimensions_index, rrddim_compare);
     avl_init_lock(&st->variables_root_index, rrdvar_compare);
 
-    pthread_rwlock_init(&st->rwlock, NULL);
-    rrdhost_rwlock(host);
+    pthread_rwlock_init(&st->rrdset_rwlock, NULL);
+    rrdhost_wrlock(host);
 
     if(name && *name) rrdset_set_name(st, name);
     else rrdset_set_name(st, id);
@@ -544,7 +543,7 @@ usec_t rrdset_done(RRDSET *st) {
         error("Cannot set pthread cancel state to DISABLE.");
 
     // a read lock is OK here
-    pthread_rwlock_rdlock(&st->rwlock);
+    rrdset_rdlock(st);
 
 /*
     // enable the chart, if it was disabled
@@ -1072,8 +1071,8 @@ usec_t rrdset_done(RRDSET *st) {
             RRDDIM *last;
             // there is dimension to free
             // upgrade our read lock to a write lock
-            pthread_rwlock_unlock(&st->rwlock);
-            pthread_rwlock_wrlock(&st->rwlock);
+            pthread_rwlock_unlock(&st->rrdset_rwlock);
+            pthread_rwlock_wrlock(&st->rrdset_rwlock);
 
             for( rd = st->dimensions, last = NULL ; likely(rd) ; ) {
                 // remove it only it is not updated in rrd_delete_unupdated_dimensions seconds
@@ -1109,7 +1108,7 @@ usec_t rrdset_done(RRDSET *st) {
     }
 */
 
-    pthread_rwlock_unlock(&st->rwlock);
+    rrdset_unlock(st);
 
     if(unlikely(pthread_setcancelstate(pthreadoldcancelstate, NULL) != 0))
         error("Cannot set pthread cancel state to RESTORE (%d).", pthreadoldcancelstate);