| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "mrg-internals.h" |
| 4 | |
| 5 | DEFINE_JUDYL_TYPED(METRIC, METRIC *); |
| 6 | METRIC_JudyLSet acquired_metrics = { 0 }; |
| 7 | size_t acquired_metrics_counter = 0; |
| 8 | size_t acquired_metrics_deleted = 0; |
| 9 | |
| 10 | ALWAYS_INLINE |
| 11 | static void mrg_metric_prepopulate(MRG *mrg, Word_t section, nd_uuid_t *uuid) { |
| 12 | MRG_ENTRY entry = { |
| 13 | .uuid = uuid, |
| 14 | .section = section, |
| 15 | .first_time_s = 0, |
| 16 | .last_time_s = 0, |
| 17 | .latest_update_every_s = 0, |
| 18 | }; |
| 19 | bool added = false; |
| 20 | METRIC *metric = metric_add_and_acquire(mrg, &entry, &added); |
| 21 | if(likely(added)) { |
| 22 | METRIC_SET(&acquired_metrics, acquired_metrics_counter++, metric); |
| 23 | return; |
| 24 | } |
| 25 | mrg_metric_release(mrg, metric); |
| 26 | } |
| 27 | |
| 28 | static void mrg_release_cb(Word_t idx __maybe_unused, METRIC *m, void *data) { |
| 29 | MRG *mrg = data; |
| 30 | if(mrg_metric_release(mrg, m)) |
| 31 | acquired_metrics_deleted++; |
| 32 | } |
| 33 | |
| 34 | void mrg_metric_prepopulate_cleanup(MRG *mrg) { |
| 35 | acquired_metrics_deleted = 0; |
| 36 | METRIC_FREE(&acquired_metrics, mrg_release_cb, mrg); |
| 37 | |
| 38 | if(acquired_metrics_counter || acquired_metrics_deleted) |
| 39 | nd_log(NDLS_DAEMON, NDLP_INFO, "MRG DUMP: Prepopulated %zu metrics, released %zu, deleted %zu", |
| 40 | acquired_metrics_counter, acquired_metrics_counter - acquired_metrics_deleted, acquired_metrics_deleted); |
| 41 | |
| 42 | acquired_metrics_counter = 0; |
| 43 | } |
| 44 | |
| 45 | // Main function to load metrics from the database |
| 46 | bool mrg_load(MRG *mrg) { |
| 47 | size_t processed_metrics = populate_metrics_from_database(mrg, (void (*)(void *, Word_t, nd_uuid_t *))mrg_metric_prepopulate); |
| 48 | return processed_metrics > 0; |
| 49 | } |