Browse Source

Fatal relaxation of unknown page types. (#16682)

Mostly to make the agent downgradable when
dealing with unknown page types.
vkalintiris 1 year ago
parent
commit
2c97b33d7a
2 changed files with 30 additions and 17 deletions
  1. 18 8
      database/engine/page.c
  2. 12 9
      database/engine/pdc.c

+ 18 - 8
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;
     }
 }

+ 12 - 9
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                         ||