summaryrefslogtreecommitdiffstats
path: root/database
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2022-05-24 08:20:40 +0300
committerGitHub <noreply@github.com>2022-05-24 08:20:40 +0300
commit080e0aee277ee636d98df536b00e98bae46cdf37 (patch)
tree00d2546a184533f42c87866f4fd9570ef9530796 /database
parentd34a3d068ba51e35470ca9367e6d09441a0ea593 (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.h2
-rwxr-xr-xdatabase/engine/rrdengineapi.c40
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)