summaryrefslogtreecommitdiffstats
path: root/database
diff options
context:
space:
mode:
authorIlya Mashchenko <ilya@netdata.cloud>2022-04-28 11:19:15 +0300
committerGitHub <noreply@github.com>2022-04-28 11:19:15 +0300
commit091540d59aaf80c8198c5a7fbd5440353d82d7ff (patch)
tree921ab7bf724f66555bf469952dc2530097ab2c35 /database
parentf1622658a10a69661834d9f3d5c0c685aec2f3fd (diff)
feat(dbengine): make dbengine page cache undumpable and dedupuble (#12765)
* make netdata more awesome * reworked on-madvise and mmap to provide clarity
Diffstat (limited to 'database')
-rw-r--r--database/engine/pagecache.c4
-rw-r--r--database/engine/rrdengine.c14
-rw-r--r--database/engine/rrdengine.h3
-rwxr-xr-xdatabase/engine/rrdengineapi.c4
-rw-r--r--database/rrddim.c11
-rw-r--r--database/rrdset.c11
6 files changed, 29 insertions, 18 deletions
diff --git a/database/engine/pagecache.c b/database/engine/pagecache.c
index 40e24b321c..43734b0dd5 100644
--- a/database/engine/pagecache.c
+++ b/database/engine/pagecache.c
@@ -356,7 +356,7 @@ static void pg_cache_evict_unsafe(struct rrdengine_instance *ctx, struct rrdeng_
{
struct page_cache_descr *pg_cache_descr = descr->pg_cache_descr;
- freez(pg_cache_descr->page);
+ dbengine_page_free(pg_cache_descr->page);
pg_cache_descr->page = NULL;
pg_cache_descr->flags &= ~RRD_PAGE_POPULATED;
pg_cache_release_pages_unsafe(ctx, 1);
@@ -1222,7 +1222,7 @@ void free_page_cache(struct rrdengine_instance *ctx)
/* Check rrdenglocking.c */
pg_cache_descr = descr->pg_cache_descr;
if (pg_cache_descr->flags & RRD_PAGE_POPULATED) {
- freez(pg_cache_descr->page);
+ dbengine_page_free(pg_cache_descr->page);
bytes_freed += RRDENG_BLOCK_SIZE;
}
rrdeng_destroy_pg_cache_descr(ctx, pg_cache_descr);
diff --git a/database/engine/rrdengine.c b/database/engine/rrdengine.c
index f47738aea2..5631a1df3c 100644
--- a/database/engine/rrdengine.c
+++ b/database/engine/rrdengine.c
@@ -11,6 +11,16 @@ rrdeng_stats_t global_flushing_pressure_page_deletions = 0;
static unsigned pages_per_extent = MAX_PAGES_PER_EXTENT;
+void *dbengine_page_alloc() {
+ void *page = netdata_mmap(NULL, RRDENG_BLOCK_SIZE, MAP_PRIVATE, enable_ksm);
+ if(!page) fatal("Cannot allocate dbengine page cache page, with mmap()");
+ return page;
+}
+
+void dbengine_page_free(void *page) {
+ munmap(page, RRDENG_BLOCK_SIZE);
+}
+
static void sanity_check(void)
{
/* Magic numbers must fit in the super-blocks */
@@ -176,7 +186,7 @@ void read_cached_extent_cb(struct rrdengine_worker_config* wc, unsigned idx, str
struct extent_info *extent = xt_io_descr->descr_array[0]->extent;
for (i = 0 ; i < xt_io_descr->descr_count; ++i) {
- page = mallocz(RRDENG_BLOCK_SIZE);
+ page = dbengine_page_alloc();
descr = xt_io_descr->descr_array[i];
for (j = 0, page_offset = 0 ; j < extent->number_of_pages ; ++j) {
/* care, we don't hold the descriptor mutex */
@@ -331,7 +341,7 @@ after_crc_check:
continue; /* Failed to reserve a suitable page */
is_prefetched_page = 1;
}
- page = mallocz(RRDENG_BLOCK_SIZE);
+ page = dbengine_page_alloc();
/* care, we don't hold the descriptor mutex */
if (have_read_error) {
diff --git a/database/engine/rrdengine.h b/database/engine/rrdengine.h
index b0c8e4d02d..7aba98e451 100644
--- a/database/engine/rrdengine.h
+++ b/database/engine/rrdengine.h
@@ -227,6 +227,9 @@ struct rrdengine_instance {
struct rrdengine_statistics stats;
};
+extern void *dbengine_page_alloc(void);
+extern void dbengine_page_free(void *page);
+
extern int init_rrd_files(struct rrdengine_instance *ctx);
extern void finalize_rrd_files(struct rrdengine_instance *ctx);
extern void rrdeng_test_quota(struct rrdengine_worker_config* wc);
diff --git a/database/engine/rrdengineapi.c b/database/engine/rrdengineapi.c
index 6ebee1459f..e94f6e003d 100755
--- a/database/engine/rrdengineapi.c
+++ b/database/engine/rrdengineapi.c
@@ -202,7 +202,7 @@ void rrdeng_store_metric_flush_current_page(RRDDIM *rd)
/* handle->prev_descr = descr;*/
}
} else {
- freez(descr->pg_cache_descr->page);
+ dbengine_page_free(descr->pg_cache_descr->page);
rrdeng_destroy_pg_cache_descr(ctx, descr->pg_cache_descr);
freez(descr);
}
@@ -724,7 +724,7 @@ void *rrdeng_create_page(struct rrdengine_instance *ctx, uuid_t *id, struct rrde
descr = pg_cache_create_descr();
descr->id = id; /* TODO: add page type: metric, log, something? */
- page = mallocz(RRDENG_BLOCK_SIZE); /*TODO: add page size */
+ page = dbengine_page_alloc(); /*TODO: add page size */
rrdeng_page_descr_mutex_lock(ctx, descr);
pg_cache_descr = descr->pg_cache_descr;
pg_cache_descr->page = page;
diff --git a/database/rrddim.c b/database/rrddim.c
index df45363bc7..3c013e1ded 100644
--- a/database/rrddim.c
+++ b/database/rrddim.c
@@ -244,12 +244,11 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte
if(memory_mode == RRD_MEMORY_MODE_SAVE || memory_mode == RRD_MEMORY_MODE_MAP ||
memory_mode == RRD_MEMORY_MODE_RAM) {
- rd = (RRDDIM *)mymmap(
- (memory_mode == RRD_MEMORY_MODE_RAM) ? NULL : fullfilename
- , size
- , ((memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE)
- , 1
- );
+ rd = (RRDDIM *)netdata_mmap(
+ (memory_mode == RRD_MEMORY_MODE_RAM) ? NULL : fullfilename,
+ size,
+ ((memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE),
+ 1);
if(likely(rd)) {
// we have a file mapped for rd
diff --git a/database/rrdset.c b/database/rrdset.c
index 1793d87546..d0764cc281 100644
--- a/database/rrdset.c
+++ b/database/rrdset.c
@@ -744,12 +744,11 @@ RRDSET *rrdset_create_custom(
snprintfz(fullfilename, FILENAME_MAX, "%s/main.db", cache_dir);
if(memory_mode == RRD_MEMORY_MODE_SAVE || memory_mode == RRD_MEMORY_MODE_MAP ||
memory_mode == RRD_MEMORY_MODE_RAM) {
- st = (RRDSET *) mymmap(
- (memory_mode == RRD_MEMORY_MODE_RAM) ? NULL : fullfilename
- , size
- , ((memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE)
- , 0
- );
+ st = (RRDSET *)netdata_mmap(
+ (memory_mode == RRD_MEMORY_MODE_RAM) ? NULL : fullfilename,
+ size,
+ ((memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE),
+ 0);
if(st) {
memset(&st->avl, 0, sizeof(avl_t));