Guard tdigest with locks

This commit is contained in:
Andrey Borodin 2020-07-05 00:01:08 +05:00
parent e9bed0c0cf
commit b5f4cda371
2 changed files with 11 additions and 3 deletions

View File

@ -131,11 +131,12 @@ od_route_pool_stat(od_route_pool_t *pool,
od_stat_t avg;
od_stat_init(&avg);
if (route->stats.enable_quantiles) {
uint8_t current_tdigest = route->stats.current_tdigest;
next_tdigest =
(route->stats.current_tdigest + 1) % QUANTILES_WINDOW;
(current_tdigest + 1) % QUANTILES_WINDOW;
td_reset(
route->stats.transaction_hgram[route->stats.current_tdigest]);
td_reset(route->stats.query_hgram[route->stats.current_tdigest]);
route->stats.transaction_hgram[current_tdigest]);
td_reset(route->stats.query_hgram[current_tdigest]);
route->stats.current_tdigest = next_tdigest;
}

View File

@ -5,6 +5,7 @@
#include <assert.h>
#include "tdigest.h"
#include "sleep_lock.h"
typedef struct node
{
@ -28,6 +29,8 @@ struct td_histogram
double merged_count;
double unmerged_count;
mm_sleeplock_t lock;
node_t nodes[0];
};
@ -136,11 +139,13 @@ td_merge(td_histogram_t *into, td_histogram_t *from)
void
td_reset(td_histogram_t *h)
{
mm_sleeplock_lock(&h->lock);
bzero((void *)(&h->nodes[0]), sizeof(node_t) * h->cap);
h->merged_nodes = 0;
h->merged_count = 0;
h->unmerged_nodes = 0;
h->unmerged_count = 0;
mm_sleeplock_unlock(&h->lock);
}
void
@ -300,6 +305,7 @@ td_trimmed_mean(td_histogram_t *h, double lo, double hi)
void
td_add(td_histogram_t *h, double mean, double count)
{
mm_sleeplock_lock(&h->lock);
if (should_merge(h)) {
merge(h);
}
@ -309,6 +315,7 @@ td_add(td_histogram_t *h, double mean, double count)
};
h->unmerged_nodes++;
h->unmerged_count += count;
mm_sleeplock_unlock(&h->lock);
}
static int