]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
Avoid deadlocks. 3554/head
authorPaweł Jasiak <pawel@jasiak.xyz>
Mon, 31 Aug 2020 21:42:01 +0000 (23:42 +0200)
committerPaweł Jasiak <pawel@jasiak.xyz>
Mon, 31 Aug 2020 21:42:01 +0000 (23:42 +0200)
src/daemon/distribution.c
src/daemon/distribution_test.c

index 3f3c92634d3fd6e56feb95849e8cea9befccc98c..2bc8a22f5a1c7f70c4f9a5b497f5c7a11583c2a1 100644 (file)
@@ -247,8 +247,10 @@ double distribution_percentile(distribution_t *dist, double percent) {
     return NAN;
   }
   pthread_mutex_lock(&dist->mutex);
-  if (dist->tree[0].bucket_counter == 0)
+  if (dist->tree[0].bucket_counter == 0) {
+    pthread_mutex_unlock(&dist->mutex);
     return NAN;
+  }
   uint64_t counter = ceil(dist->tree[0].bucket_counter * percent / 100.0);
   double percentile =
       tree_get_counter(dist, 0, 0, dist->num_buckets - 1, counter);
@@ -261,6 +263,7 @@ double distribution_average(distribution_t *dist) {
     return NAN;
   pthread_mutex_lock(&dist->mutex);
   if (dist->tree[0].bucket_counter == 0) {
+    pthread_mutex_unlock(&dist->mutex);
     return NAN;
   }
   double average = dist->total_sum / dist->tree[0].bucket_counter;
@@ -381,4 +384,4 @@ int distribution_sub(distribution_t *d1, distribution_t *d2) {
   pthread_mutex_unlock(&d1->mutex);
 
   return 0;
-}
\ No newline at end of file
+}
index 3f3dd9e9232faf7d159607deee3fe4acbf728b29..d0a27358ddd14570dd7e91883bde722a2e0661d1 100644 (file)
@@ -388,6 +388,9 @@ DEF_TEST(average) {
     for (size_t j = 0; j < cases[i].num_gauges; j++) {
       distribution_update(cases[i].dist, cases[i].update_gauges[j]);
     }
+    EXPECT_EQ_DOUBLE(cases[i].want_average,
+                     distribution_average(cases[i].dist));
+    /* Check it second time for deadlocks. */
     EXPECT_EQ_DOUBLE(cases[i].want_average,
                      distribution_average(cases[i].dist));
     distribution_destroy(cases[i].dist);
@@ -445,6 +448,9 @@ DEF_TEST(percentile) {
     for (size_t j = 0; j < cases[i].num_gauges; j++) {
       distribution_update(cases[i].dist, cases[i].update_gauges[j]);
     }
+    EXPECT_EQ_DOUBLE(cases[i].want_percentile,
+                     distribution_percentile(cases[i].dist, cases[i].percent));
+    /* Check it second time for deadlocks. */
     EXPECT_EQ_DOUBLE(cases[i].want_percentile,
                      distribution_percentile(cases[i].dist, cases[i].percent));
     if (cases[i].want_err != 0)