@cryptotaxi247 / netdata-1 / commits / 2c97b33d7

Fatal relaxation of unknown page types. (#16682)

Mostly to make the agent downgradable when dealing with unknown page types.

vkalintiris committed Jan 9, 2024 at 13:41 UTC 2c97b33d7a38e29dc3281b15823b089bc2a4ca03
2 files changed +30 -17
database/engine/page.c
+18 -8
@@ -197,7 +197,10 @@ PGD *pgd_create(uint8_t type, uint32_t slots)
197 break;
198 }
199 default:
200 - fatal("Unknown page type: %uc", type);
200 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, type);
201 + aral_freez(pgd_alloc_globals.aral_pgd, pg);
202 + pg = PGD_EMPTY;
203 + break;
204 }
205
206 return pg;
@@ -246,7 +249,10 @@ PGD *pgd_create_from_disk_data(uint8_t type, void *base, uint32_t size)
249 pg->slots = pg->used;
250 break;
251 default:
249 - fatal("Unknown page type: %uc", type);
252 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, type);
253 + aral_freez(pgd_alloc_globals.aral_pgd, pg);
254 + pg = PGD_EMPTY;
255 + break;
256 }
257
258 return pg;
@@ -306,7 +312,8 @@ void pgd_free(PGD *pg)
312 break;
313 }
314 default:
309 - fatal("Unknown page type: %uc", pg->type);
315 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
316 + break;
317 }
318
319 aral_freez(pgd_alloc_globals.aral_pgd, pg);
@@ -371,7 +378,8 @@ uint32_t pgd_memory_footprint(PGD *pg)
378 break;
379 }
380 default:
374 - fatal("Unknown page type: %uc", pg->type);
381 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
382 + break;
383 }
384
385 return footprint;
@@ -419,7 +427,8 @@ uint32_t pgd_disk_footprint(PGD *pg)
427 break;
428 }
429 default:
422 - fatal("Unknown page type: %uc", pg->type);
430 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
431 + break;
432 }
433
434 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)
465 break;
466 }
467 default:
459 - fatal("Unknown page type: %uc", pg->type);
468 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
469 + break;
470 }
471
472 pg->states = PGD_STATE_FLUSHED_TO_DISK;
@@ -537,7 +547,7 @@ void pgd_append_point(PGD *pg,
547 break;
548 }
549 default:
540 - fatal("DBENGINE: unknown page type id %d", pg->type);
550 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
551 break;
552 }
553 }
@@ -588,7 +598,7 @@ static void pgdc_seek(PGDC *pgdc, uint32_t position)
598 break;
599 }
600 default:
591 - fatal("DBENGINE: unknown page type id %d", pg->type);
601 + netdata_log_error("%s() - Unknown page type: %uc", __FUNCTION__, pg->type);
602 break;
603 }
604 }
database/engine/pdc.c
+12 -9
@@ -631,8 +631,8 @@ void collect_page_flags_to_buffer(BUFFER *wb, RRDENG_COLLECT_PAGE_FLAGS flags) {
631 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) {
632 time_t start_time_s = (time_t) (descr->start_time_ut / USEC_PER_SEC);
633
634 - time_t end_time_s;
635 - size_t entries;
634 + time_t end_time_s = 0;
635 + size_t entries = 0;
636
637 switch (descr->type) {
638 case PAGE_METRICS:
@@ -645,7 +645,8 @@ inline VALIDATED_PAGE_DESCRIPTOR validate_extent_page_descr(const struct rrdeng_
645 entries = descr->gorilla.entries;
646 break;
647 default:
648 - fatal("Unknown page type: %uc\n", descr->type);
648 + // Nothing to do. Validate page will notify the user.
649 + break;
650 }
651
652 return validate_page(
@@ -674,18 +675,19 @@ VALIDATED_PAGE_DESCRIPTOR validate_page(
675 uint32_t overwrite_zero_update_every_s, // can be zero, if unknown
676 bool have_read_error,
677 const char *msg,
677 - RRDENG_COLLECT_PAGE_FLAGS flags) {
678 -
678 + RRDENG_COLLECT_PAGE_FLAGS flags)
679 +{
680 VALIDATED_PAGE_DESCRIPTOR vd = {
681 .start_time_s = start_time_s,
682 .end_time_s = end_time_s,
683 .update_every_s = update_every_s,
684 .page_length = page_length,
685 + .point_size = page_type_size[page_type],
686 .type = page_type,
687 .is_valid = true,
688 };
689
688 - vd.point_size = page_type_size[vd.type];
690 + bool known_page_type = true;
691 switch (page_type) {
692 case PAGE_METRICS:
693 case PAGE_TIER:
@@ -701,8 +703,8 @@ VALIDATED_PAGE_DESCRIPTOR validate_page(
703 vd.entries = entries;
704 break;
705 default:
704 - // TODO: should set vd.is_valid false instead?
705 - fatal("Unknown page type: %uc", page_type);
706 + known_page_type = false;
707 + break;
708 }
709
710 // allow to be called without update every (when loading pages from disk)
@@ -725,7 +727,8 @@ VALIDATED_PAGE_DESCRIPTOR validate_page(
727 // 512 bytes.
728 max_page_length += ((page_type == PAGE_GORILLA_METRICS) * GORILLA_BUFFER_SIZE);
729
728 - if( have_read_error ||
730 + if (!known_page_type ||
731 + have_read_error ||
732 vd.page_length == 0 ||
733 vd.page_length > max_page_length ||
734 vd.start_time_s > vd.end_time_s ||