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 ||