diff options
author | vkalintiris <vasilis@netdata.cloud> | 2024-01-09 13:41:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-09 13:41:40 +0200 |
commit | 2c97b33d7a38e29dc3281b15823b089bc2a4ca03 (patch) | |
tree | a9a4c08503726d7f2076461dfac66aad20f1e5af | |
parent | b371ab62dddf5379cdfef4fec49309f144840d51 (diff) |
Fatal relaxation of unknown page types. (#16682)
Mostly to make the agent downgradable when
dealing with unknown page types.
-rw-r--r-- | database/engine/page.c | 26 | ||||
-rw-r--r-- | database/engine/pdc.c | 21 |
2 files changed, 30 insertions, 17 deletions
diff --git a/database/engine/page.c b/database/engine/page.c index 0920b14be9..be4a02d3bc 100644 --- a/database/engine/page.c +++ b/database/engine/page.c @@ -197,7 +197,10 @@ PGD *pgd_create(uint8_t type, uint32_t slots) break; } default: - fatal("Unknown page type: %uc", type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, type); + aral_freez(pgd_alloc_globals.aral_pgd, pg); + pg = PGD_EMPTY; + break; } return pg; @@ -246,7 +249,10 @@ PGD *pgd_create_from_disk_data(uint8_t type, void *base, uint32_t size) pg->slots = pg->used; break; default: - fatal("Unknown page type: %uc", type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, type); + aral_freez(pgd_alloc_globals.aral_pgd, pg); + pg = PGD_EMPTY; + break; } return pg; @@ -306,7 +312,8 @@ void pgd_free(PGD *pg) break; } default: - fatal("Unknown page type: %uc", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); + break; } aral_freez(pgd_alloc_globals.aral_pgd, pg); @@ -371,7 +378,8 @@ uint32_t pgd_memory_footprint(PGD *pg) break; } default: - fatal("Unknown page type: %uc", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); + break; } return footprint; @@ -419,7 +427,8 @@ uint32_t pgd_disk_footprint(PGD *pg) break; } default: - fatal("Unknown page type: %uc", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); + break; } internal_fatal(pg->states & PGD_STATE_CREATED_FROM_DISK, @@ -456,7 +465,8 @@ void pgd_copy_to_extent(PGD *pg, uint8_t *dst, uint32_t dst_size) break; } default: - fatal("Unknown page type: %uc", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); + break; } pg->states = PGD_STATE_FLUSHED_TO_DISK; @@ -537,7 +547,7 @@ void pgd_append_point(PGD *pg, break; } default: - fatal("DBENGINE: unknown page type id %d", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); break; } } @@ -588,7 +598,7 @@ static void pgdc_seek(PGDC *pgdc, uint32_t position) break; } default: - fatal("DBENGINE: unknown page type id %d", pg->type); + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type); break; } } diff --git a/database/engine/pdc.c b/database/engine/pdc.c index fb9bc4fbcc..1b57a49ba6 100644 --- a/database/engine/pdc.c +++ b/database/engine/pdc.c @@ -631,8 +631,8 @@ void collect_page_flags_to_buffer(BUFFER *wb, RRDENG_COLLECT_PAGE_FLAGS flags) { inline VALIDATED_PAGE_DESCRIPTOR validate_extent_page_descr(const struct rrdeng_extent_page_descr *descr, time_t now_s, uint32_t overwrite_zero_update_every_s, bool have_read_error) { time_t start_time_s = (time_t) (descr->start_time_ut / USEC_PER_SEC); - time_t end_time_s; - size_t entries; + time_t end_time_s = 0; + size_t entries = 0; switch (descr->type) { case PAGE_METRICS: @@ -645,7 +645,8 @@ inline VALIDATED_PAGE_DESCRIPTOR validate_extent_page_descr(const struct rrdeng_ entries = descr->gorilla.entries; break; default: - fatal("Unknown page type: %uc\n", descr->type); + // Nothing to do. Validate page will notify the user. + break; } return validate_page( @@ -674,18 +675,19 @@ VALIDATED_PAGE_DESCRIPTOR validate_page( uint32_t overwrite_zero_update_every_s, // can be zero, if unknown bool have_read_error, const char *msg, - RRDENG_COLLECT_PAGE_FLAGS flags) { - + RRDENG_COLLECT_PAGE_FLAGS flags) +{ VALIDATED_PAGE_DESCRIPTOR vd = { .start_time_s = start_time_s, .end_time_s = end_time_s, .update_every_s = update_every_s, .page_length = page_length, + .point_size = page_type_size[page_type], .type = page_type, .is_valid = true, }; - vd.point_size = page_type_size[vd.type]; + bool known_page_type = true; switch (page_type) { case PAGE_METRICS: case PAGE_TIER: @@ -701,8 +703,8 @@ VALIDATED_PAGE_DESCRIPTOR validate_page( vd.entries = entries; break; default: - // TODO: should set vd.is_valid false instead? - fatal("Unknown page type: %uc", page_type); + known_page_type = false; + break; } // allow to be called without update every (when loading pages from disk) @@ -725,7 +727,8 @@ VALIDATED_PAGE_DESCRIPTOR validate_page( // 512 bytes. max_page_length += ((page_type == PAGE_GORILLA_METRICS) * GORILLA_BUFFER_SIZE); - if( have_read_error || + if (!known_page_type || + have_read_error || vd.page_length == 0 || vd.page_length > max_page_length || vd.start_time_s > vd.end_time_s || |