Fix SIGSEGV in dbengine extent flush due to unacquired UUID reference (#21667)
Refactor UUID handling in page descriptor to use UUIDMAP_ID instead of nd_uuid_t (properly acquired and released)
Stelios Fragkakis committed
Feb 11, 2026 at 13:11 UTC
c2df2da48554d168db4dd4ab540847daf3527dea
3 files changed
+4
-3
src/database/engine/pagecache.c
+1
-1
@@ -35,7 +35,7 @@ static void main_cache_flush_dirty_page_callback(PGC *cache __maybe_unused, PGC_
35
time_t end_time_s = entries_array[Index].end_time_s;
36
struct page_descr_with_data *descr = page_descriptor_get();
37
38
- descr->id = mrg_metric_uuid(main_mrg, (METRIC *) entries_array[Index].metric_id);
38
+ descr->uuid_id = mrg_metric_uuidmap_id_dup(main_mrg, (METRIC *) entries_array[Index].metric_id);
39
descr->metric_id = entries_array[Index].metric_id;
40
descr->start_time_ut = start_time_s * USEC_PER_SEC;
41
descr->end_time_ut = end_time_s * USEC_PER_SEC;
src/database/engine/pagecache.h
+1
-1
@@ -18,7 +18,7 @@ struct rrdengine_instance;
18
extern struct rrdeng_cache_efficiency_stats rrdeng_cache_efficiency_stats;
19
20
struct page_descr_with_data {
21
- nd_uuid_t *id;
21
+ UUIDMAP_ID uuid_id;
22
Word_t metric_id;
23
usec_t start_time_ut;
24
usec_t end_time_ut;
src/database/engine/rrdengine.c
+2
-1
@@ -333,6 +333,7 @@ struct page_descr_with_data *page_descriptor_get(void) {
333
}
334
335
static inline void page_descriptor_release(struct page_descr_with_data *descr) {
336
+ uuidmap_free(descr->uuid_id);
337
aral_freez(rrdeng_main.descriptors.ar, descr);
338
}
339
@@ -950,7 +951,7 @@ datafile_extent_build(struct rrdengine_instance *ctx, struct page_descr_with_dat
951
for (i = 0 ; i < count ; ++i) {
952
descr = xt_io_descr->descr_array[i];
953
header->descr[i].type = descr->type;
953
- uuid_copy(*(nd_uuid_t *)header->descr[i].uuid, *descr->id);
954
+ uuid_copy(*(nd_uuid_t *)header->descr[i].uuid, *uuidmap_uuid_ptr(descr->uuid_id));
955
header->descr[i].page_length = descr->page_length;
956
header->descr[i].start_time_ut = descr->start_time_ut;
957