summaryrefslogtreecommitdiffstats
path: root/database/engine/pagecache.c
diff options
context:
space:
mode:
Diffstat (limited to 'database/engine/pagecache.c')
-rw-r--r--database/engine/pagecache.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/database/engine/pagecache.c b/database/engine/pagecache.c
index b4902d78..02d08a16 100644
--- a/database/engine/pagecache.c
+++ b/database/engine/pagecache.c
@@ -99,11 +99,6 @@ inline TIME_RANGE_COMPARE is_page_in_time_range(time_t page_first_time_s, time_t
return PAGE_IS_IN_RANGE;
}
-static int journal_metric_uuid_compare(const void *key, const void *metric)
-{
- return uuid_compare(*(uuid_t *) key, ((struct journal_metric_list *) metric)->uuid);
-}
-
static inline struct page_details *pdc_find_page_for_time(
Pcvoid_t PArray,
time_t wanted_time_s,
@@ -310,7 +305,7 @@ static size_t get_page_list_from_pgc(PGC *cache, METRIC *metric, struct rrdengin
pd->first_time_s = page_start_time_s;
pd->last_time_s = page_end_time_s;
pd->page_length = page_length;
- pd->update_every_s = page_update_every_s;
+ pd->update_every_s = (uint32_t) page_update_every_s;
pd->page = (open_cache_mode) ? NULL : page;
pd->status |= tags;
@@ -581,7 +576,7 @@ static size_t get_page_list_from_journal_v2(struct rrdengine_instance *ctx, METR
.metric_id = metric_id,
.start_time_s = page_first_time_s,
.end_time_s = page_last_time_s,
- .update_every_s = page_update_every_s,
+ .update_every_s = (uint32_t) page_update_every_s,
.data = datafile,
.size = 0,
.custom_data = (uint8_t *) &ei,
@@ -635,7 +630,7 @@ void add_page_details_from_journal_v2(PGC_PAGE *page, void *JudyL_pptr) {
pd->last_time_s = pgc_page_end_time_s(page);
pd->datafile.ptr = datafile;
pd->page_length = ei->page_length;
- pd->update_every_s = pgc_page_update_every_s(page);
+ pd->update_every_s = (uint32_t) pgc_page_update_every_s(page);
pd->metric_id = metric_id;
pd->status |= PDC_PAGE_DISK_PENDING | PDC_PAGE_SOURCE_JOURNAL_V2 | PDC_PAGE_DATAFILE_ACQUIRED;
}
@@ -774,7 +769,10 @@ inline void rrdeng_prep_wait(PDC *pdc) {
}
}
-void rrdeng_prep_query(PDC *pdc) {
+void rrdeng_prep_query(struct page_details_control *pdc, bool worker) {
+ if(worker)
+ worker_is_busy(UV_EVENT_DBENGINE_QUERY);
+
size_t pages_to_load = 0;
pdc->page_list_JudyL = get_page_list(pdc->ctx, pdc->metric,
pdc->start_time_s * USEC_PER_SEC,
@@ -785,10 +783,10 @@ void rrdeng_prep_query(PDC *pdc) {
if (pages_to_load && pdc->page_list_JudyL) {
pdc_acquire(pdc); // we get 1 for the 1st worker in the chain: do_read_page_list_work()
usec_t start_ut = now_monotonic_usec();
-// if(likely(priority == STORAGE_PRIORITY_BEST_EFFORT))
-// dbengine_load_page_list_directly(ctx, handle->pdc);
-// else
- pdc_route_asynchronously(pdc->ctx, pdc);
+ if(likely(pdc->priority == STORAGE_PRIORITY_SYNCHRONOUS))
+ pdc_route_synchronously(pdc->ctx, pdc);
+ else
+ pdc_route_asynchronously(pdc->ctx, pdc);
__atomic_add_fetch(&rrdeng_cache_efficiency_stats.prep_time_to_route, now_monotonic_usec() - start_ut, __ATOMIC_RELAXED);
}
else
@@ -797,6 +795,9 @@ void rrdeng_prep_query(PDC *pdc) {
completion_mark_complete(&pdc->prep_completion);
pdc_release_and_destroy_if_unreferenced(pdc, true, true);
+
+ if(worker)
+ worker_is_idle();
}
/**
@@ -827,7 +828,11 @@ void pg_cache_preload(struct rrdeng_query_handle *handle) {
if(ctx_is_available_for_queries(handle->ctx)) {
handle->pdc->refcount++; // we get 1 for the query thread and 1 for the prep thread
- rrdeng_enq_cmd(handle->ctx, RRDENG_OPCODE_QUERY, handle->pdc, NULL, handle->priority, NULL, NULL);
+
+ if(unlikely(handle->pdc->priority == STORAGE_PRIORITY_SYNCHRONOUS))
+ rrdeng_prep_query(handle->pdc, false);
+ else
+ rrdeng_enq_cmd(handle->ctx, RRDENG_OPCODE_QUERY, handle->pdc, NULL, handle->priority, NULL, NULL);
}
else {
completion_mark_complete(&handle->pdc->prep_completion);
@@ -924,7 +929,8 @@ struct pgc_page *pg_cache_lookup_next(
else {
if (unlikely(page_update_every_s <= 0 || page_update_every_s > 86400)) {
__atomic_add_fetch(&rrdeng_cache_efficiency_stats.pages_invalid_update_every_fixed, 1, __ATOMIC_RELAXED);
- pd->update_every_s = page_update_every_s = pgc_page_fix_update_every(page, last_update_every_s);
+ page_update_every_s = pgc_page_fix_update_every(page, last_update_every_s);
+ pd->update_every_s = (uint32_t) page_update_every_s;
}
size_t entries_by_size = page_entries_by_size(page_length, CTX_POINT_SIZE_BYTES(ctx));
@@ -1009,7 +1015,7 @@ void pgc_open_add_hot_page(Word_t section, Word_t metric_id, time_t start_time_s
.metric_id = metric_id,
.start_time_s = start_time_s,
.end_time_s = end_time_s,
- .update_every_s = update_every_s,
+ .update_every_s = (uint32_t) update_every_s,
.size = 0,
.data = datafile,
.custom_data = (uint8_t *) &ext_io_data,
@@ -1069,6 +1075,8 @@ void pgc_and_mrg_initialize(void)
main_cache_size = target_cache_size - extent_cache_size;
}
+ extent_cache_size += (size_t)(default_rrdeng_extent_cache_mb * 1024ULL * 1024ULL);
+
main_cache = pgc_create(
"main_cache",
main_cache_size,