diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2022-05-24 08:20:40 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-24 08:20:40 +0300 |
commit | 080e0aee277ee636d98df536b00e98bae46cdf37 (patch) | |
tree | 00d2546a184533f42c87866f4fd9570ef9530796 /database | |
parent | d34a3d068ba51e35470ca9367e6d09441a0ea593 (diff) |
Faster queries (#12988)
* faster rrdeng_load_metric_next()
* no need to check validity for number - already done at the query side
* solve discrepancy between query create and free
* inline unpack_storage_number
Diffstat (limited to 'database')
-rw-r--r-- | database/engine/rrdengine.h | 2 | ||||
-rwxr-xr-x | database/engine/rrdengineapi.c | 40 |
2 files changed, 21 insertions, 21 deletions
diff --git a/database/engine/rrdengine.h b/database/engine/rrdengine.h index c380c69bc8..c6f89a37ab 100644 --- a/database/engine/rrdengine.h +++ b/database/engine/rrdengine.h @@ -49,10 +49,12 @@ struct rrdeng_query_handle { time_t next_page_time; time_t now; unsigned position; + unsigned entries; storage_number *page; usec_t page_end_time; uint32_t page_length; usec_t dt; + time_t dt_sec; }; typedef enum { diff --git a/database/engine/rrdengineapi.c b/database/engine/rrdengineapi.c index cf7f828bae..76010a7c24 100755 --- a/database/engine/rrdengineapi.c +++ b/database/engine/rrdengineapi.c @@ -554,7 +554,7 @@ void rrdeng_load_metric_init(RRDDIM *rd, struct rrddim_query_handle *rrdimm_hand handle->next_page_time = INVALID_TIME; } -static int rrdeng_load_page_next(struct rrddim_query_handle *rrdimm_handle, unsigned *position_ptr) { +static int rrdeng_load_page_next(struct rrddim_query_handle *rrdimm_handle) { struct rrdeng_query_handle *handle = (struct rrdeng_query_handle *)rrdimm_handle->handle; struct rrdengine_instance *ctx = handle->ctx; @@ -576,13 +576,13 @@ static int rrdeng_load_page_next(struct rrddim_query_handle *rrdimm_handle, unsi handle->next_page_time = (handle->page_end_time / USEC_PER_SEC) + 1; if (unlikely(handle->next_page_time > rrdimm_handle->end_time)) - goto no_more_metrics; + return 1; } usec_t next_page_time = handle->next_page_time * USEC_PER_SEC; descr = pg_cache_lookup_next(ctx, handle->page_index, &handle->page_index->id, next_page_time, rrdimm_handle->end_time * USEC_PER_SEC); if (NULL == descr) - goto no_more_metrics; + return 1; #ifdef NETDATA_INTERNAL_CHECKS rrd_stat_atomic_add(&ctx->stats.metric_API_consumers, 1); @@ -591,7 +591,7 @@ static int rrdeng_load_page_next(struct rrddim_query_handle *rrdimm_handle, unsi handle->descr = descr; pg_cache_atomic_get_pg_info(descr, &page_end_time, &page_length); if (unlikely(INVALID_TIME == descr->start_time || INVALID_TIME == page_end_time)) - goto no_more_metrics; + return 1; if (unlikely(descr->start_time != page_end_time && next_page_time > descr->start_time)) { // we're in the middle of the page somewhere @@ -605,17 +605,16 @@ static int rrdeng_load_page_next(struct rrddim_query_handle *rrdimm_handle, unsi handle->page_end_time = page_end_time; handle->page_length = page_length; handle->page = descr->pg_cache_descr->page; - usec_t entries = page_length / sizeof(storage_number); + usec_t entries = handle->entries = page_length / sizeof(storage_number); if (likely(entries > 1)) handle->dt = (page_end_time - descr->start_time) / (entries - 1); else handle->dt = 0; - *position_ptr = position; - return 0; + handle->dt_sec = handle->dt / USEC_PER_SEC; + handle->position = position; -no_more_metrics: - return 1; + return 0; } /* Returns the metric and sets its timestamp into current_time */ @@ -626,22 +625,25 @@ storage_number rrdeng_load_metric_next(struct rrddim_query_handle *rrdimm_handle return SN_EMPTY_SLOT; struct rrdeng_page_descr *descr = handle->descr; - - storage_number *page = handle->page; unsigned position = handle->position + 1; + time_t now = handle->now + handle->dt_sec; - if (unlikely(!descr || position >= (handle->page_length / sizeof(storage_number)))) { + if (unlikely(!descr || position >= handle->entries)) { // We need to get a new page - if(rrdeng_load_page_next(rrdimm_handle, &position)) - goto no_more_metrics; + if(rrdeng_load_page_next(rrdimm_handle)) { + // next calls will not load any more metrics + handle->next_page_time = INVALID_TIME; + return SN_EMPTY_SLOT; + } descr = handle->descr; - page = handle->page; + position = handle->position; + now = (descr->start_time + position * handle->dt) / USEC_PER_SEC; } - storage_number ret = page[position]; + storage_number ret = handle->page[position]; handle->position = position; - time_t now = handle->now = (descr->start_time + position * handle->dt) / USEC_PER_SEC; + handle->now = now; if (unlikely(now >= rrdimm_handle->end_time)) { // next calls will not load any more metrics @@ -650,10 +652,6 @@ storage_number rrdeng_load_metric_next(struct rrddim_query_handle *rrdimm_handle *current_time = now; return ret; - -no_more_metrics: - handle->next_page_time = INVALID_TIME; - return SN_EMPTY_SLOT; } int rrdeng_load_metric_is_finished(struct rrddim_query_handle *rrdimm_handle) |