3
#define NETDATA_RRD_INTERNALS
4
#include "rrd.h"
5
6
+#if RRD_STORAGE_TIERS != 5
7
+#error RRD_STORAGE_TIERS is not 5 - you need to update the grouping iterations per tier
8
+#endif
9
+
10
static void rrdhost_streaming_sender_structures_init(RRDHOST *host);
11
12
bool dbengine_enabled = false; // will become true if and when dbengine is initialized
13
size_t storage_tiers = 3;
14
bool use_direct_io = true;
11
-size_t storage_tiers_grouping_iterations[RRD_STORAGE_TIERS] = { 1, 60, 60, 60, 60 };
12
-RRD_BACKFILL storage_tiers_backfill[RRD_STORAGE_TIERS] = { RRD_BACKFILL_NEW, RRD_BACKFILL_NEW, RRD_BACKFILL_NEW, RRD_BACKFILL_NEW, RRD_BACKFILL_NEW };
13
-
14
-#if RRD_STORAGE_TIERS != 5
15
-#error RRD_STORAGE_TIERS is not 5 - you need to update the grouping iterations per tier
16
-#endif
15
+size_t storage_tiers_grouping_iterations[RRD_STORAGE_TIERS] = {1, 60, 60, 60, 60};
16
+size_t storage_tiers_collection_per_sec[RRD_STORAGE_TIERS] = {1, 60, 3600, 8 * 3600, 24 * 3600};
17
+double storage_tiers_retention_days[RRD_STORAGE_TIERS] = {14, 90, 2 * 365, 2 * 365, 2 * 365};
18
19
size_t get_tier_grouping(size_t tier) {
20
if(unlikely(tier >= storage_tiers)) tier = storage_tiers - 1;
300
(struct rrdengine_instance **)&host->db[0].si,
301
dbenginepath,
302
default_rrdeng_disk_quota_mb,
303
+ 0,
304
0); // may fail here for legacy dbengine initialization
305
306
initialized = (ret == 0);
684
host->rrdpush_replication_step = rrdpush_replication_step;
685
686
ml_host_new(host);
685
-
687
+
688
rrdhost_load_rrdcontext_data(host);
689
nd_log(NDLS_DAEMON, NDLP_DEBUG,
690
"Host %s is not in archived mode anymore",
816
ND_THREAD *thread;
817
char path[FILENAME_MAX + 1];
818
int disk_space_mb;
819
+ size_t retention_seconds;
820
size_t tier;
821
int ret;
822
};
823
824
+typedef struct rrd_alert_prototype {
825
+ struct rrd_alert_match match;
826
+ struct rrd_alert_config config;
827
+
828
+ struct {
829
+ uint32_t uses;
830
+ bool enabled;
831
+ bool is_on_disk;
832
+ SPINLOCK spinlock;
833
+ struct rrd_alert_prototype *prev, *next;
834
+ } _internal;
835
+} RRD_ALERT_PROTOTYPE;
836
+
837
void *dbengine_tier_init(void *ptr) {
838
struct dbengine_initialization *dbi = ptr;
823
- dbi->ret = rrdeng_init(NULL, dbi->path, dbi->disk_space_mb, dbi->tier);
839
+ dbi->ret = rrdeng_init(NULL, dbi->path, dbi->disk_space_mb, dbi->tier, dbi->retention_seconds);
840
return ptr;
841
}
842
+
843
+RRD_BACKFILL get_dbengine_backfill(RRD_BACKFILL backfill)
844
+{
845
+ const char *bf = config_get(
846
+ CONFIG_SECTION_DB,
847
+ "dbengine tier backfill",
848
+ backfill == RRD_BACKFILL_NEW ? "new" :
849
+ backfill == RRD_BACKFILL_FULL ? "full" :
850
+ "none");
851
+
852
+ if (strcmp(bf, "new") == 0)
853
+ backfill = RRD_BACKFILL_NEW;
854
+ else if (strcmp(bf, "full") == 0)
855
+ backfill = RRD_BACKFILL_FULL;
856
+ else if (strcmp(bf, "none") == 0)
857
+ backfill = RRD_BACKFILL_NONE;
858
+ else {
859
+ nd_log(NDLS_DAEMON, NDLP_WARNING, "DBENGINE: unknown backfill value '%s', assuming 'new'", bf);
860
+ config_set(CONFIG_SECTION_DB, "dbengine tier backfill", "new");
861
+ backfill = RRD_BACKFILL_NEW;
862
+ }
863
+ return backfill;
864
+}
865
+
866
#endif
867
868
void dbengine_init(char *hostname) {
869
#ifdef ENABLE_DBENGINE
870
+
871
use_direct_io = config_get_boolean(CONFIG_SECTION_DB, "dbengine use direct io", use_direct_io);
872
873
unsigned read_num = (unsigned)config_get_number(CONFIG_SECTION_DB, "dbengine pages per extent", DEFAULT_PAGES_PER_EXTENT);
883
884
storage_tiers = config_get_number(CONFIG_SECTION_DB, "storage tiers", storage_tiers);
885
if(storage_tiers < 1) {
845
- nd_log(NDLS_DAEMON, NDLP_WARNING,
846
- "At least 1 storage tier is required. Assuming 1.");
886
+ nd_log(NDLS_DAEMON, NDLP_WARNING, "At least 1 storage tier is required. Assuming 1.");
887
888
storage_tiers = 1;
889
config_set_number(CONFIG_SECTION_DB, "storage tiers", storage_tiers);
897
config_set_number(CONFIG_SECTION_DB, "storage tiers", storage_tiers);
898
}
899
860
- bool parallel_initialization = (storage_tiers <= (size_t)get_netdata_cpus()) ? true : false;
861
- parallel_initialization = config_get_boolean(CONFIG_SECTION_DB, "dbengine parallel initialization", parallel_initialization);
900
+ new_dbengine_defaults =
901
+ (!legacy_multihost_db_space &&
902
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 1 update every iterations") &&
903
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 2 update every iterations") &&
904
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 3 update every iterations") &&
905
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 4 update every iterations") &&
906
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 1 disk space MB") &&
907
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 2 disk space MB") &&
908
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 3 disk space MB") &&
909
+ !config_exists(CONFIG_SECTION_DB, "dbengine tier 4 disk space MB"));
910
863
- struct dbengine_initialization tiers_init[RRD_STORAGE_TIERS] = {};
864
-
865
- bool tiers_adjusted = false;
866
- size_t created_tiers = 0;
867
- char dbenginepath[FILENAME_MAX + 1];
911
+ default_backfill = get_dbengine_backfill(RRD_BACKFILL_NEW);
912
char dbengineconfig[200 + 1];
869
- int divisor = 1;
870
- for(size_t tier = 0; tier < storage_tiers ;tier++) {
913
872
- if(tier > 0)
873
- divisor *= 2;
914
+ size_t grouping_iterations = default_rrd_update_every;
915
+ storage_tiers_grouping_iterations[0] = default_rrd_update_every;
916
875
- int disk_space_mb = default_multidb_disk_quota_mb / divisor;
876
- size_t grouping_iterations = storage_tiers_grouping_iterations[tier];
877
- RRD_BACKFILL backfill = storage_tiers_backfill[tier];
917
+ for (size_t tier = 1; tier < storage_tiers; tier++) {
918
+ grouping_iterations = storage_tiers_grouping_iterations[tier];
919
+ snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu update every iterations", tier);
920
+ grouping_iterations = config_get_number(CONFIG_SECTION_DB, dbengineconfig, grouping_iterations);
921
+ if(grouping_iterations < 2) {
922
+ grouping_iterations = 2;
923
+ config_set_number(CONFIG_SECTION_DB, dbengineconfig, grouping_iterations);
924
+ nd_log(NDLS_DAEMON, NDLP_WARNING,
925
+ "DBENGINE on '%s': 'dbegnine tier %zu update every iterations' cannot be less than 2. Assuming 2.",
926
+ hostname, tier);
927
+ }
928
+ storage_tiers_grouping_iterations[tier] = grouping_iterations;
929
+ }
930
879
- if(tier > 0) {
880
- snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu multihost disk space MB", tier);
881
- disk_space_mb = config_get_number(CONFIG_SECTION_DB, dbengineconfig, disk_space_mb);
931
+ default_multidb_disk_quota_mb = (int) config_get_number(CONFIG_SECTION_DB, "dbengine tier 0 disk space MB", RRDENG_DEFAULT_TIER_DISK_SPACE_MB);
932
+ if(default_multidb_disk_quota_mb && default_multidb_disk_quota_mb < RRDENG_MIN_DISK_SPACE_MB) {
933
+ netdata_log_error("Invalid disk space %d for tier 0 given. Defaulting to %d.", default_multidb_disk_quota_mb, RRDENG_MIN_DISK_SPACE_MB);
934
+ default_multidb_disk_quota_mb = RRDENG_MIN_DISK_SPACE_MB;
935
+ config_set_number(CONFIG_SECTION_DB, "dbengine tier 0 disk space MB", default_multidb_disk_quota_mb);
936
+ }
937
883
- snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu update every iterations", tier);
884
- grouping_iterations = config_get_number(CONFIG_SECTION_DB, dbengineconfig, grouping_iterations);
885
- if(grouping_iterations < 2) {
886
- grouping_iterations = 2;
887
- config_set_number(CONFIG_SECTION_DB, dbengineconfig, grouping_iterations);
888
- nd_log(NDLS_DAEMON, NDLP_WARNING,
889
- "DBENGINE on '%s': 'dbegnine tier %zu update every iterations' cannot be less than 2. Assuming 2.",
890
- hostname, tier);
891
- }
938
+ bool parallel_initialization = (storage_tiers <= (size_t)get_netdata_cpus()) ? true : false;
939
893
- snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu backfill", tier);
894
- const char *bf = config_get(CONFIG_SECTION_DB, dbengineconfig, backfill == RRD_BACKFILL_NEW ? "new" : backfill == RRD_BACKFILL_FULL ? "full" : "none");
895
- if(strcmp(bf, "new") == 0) backfill = RRD_BACKFILL_NEW;
896
- else if(strcmp(bf, "full") == 0) backfill = RRD_BACKFILL_FULL;
897
- else if(strcmp(bf, "none") == 0) backfill = RRD_BACKFILL_NONE;
898
- else {
899
- nd_log(NDLS_DAEMON, NDLP_WARNING, "DBENGINE: unknown backfill value '%s', assuming 'new'", bf);
900
- config_set(CONFIG_SECTION_DB, dbengineconfig, "new");
901
- backfill = RRD_BACKFILL_NEW;
902
- }
903
- }
940
+ struct dbengine_initialization tiers_init[RRD_STORAGE_TIERS] = {};
941
905
- storage_tiers_grouping_iterations[tier] = grouping_iterations;
906
- storage_tiers_backfill[tier] = backfill;
942
+ size_t created_tiers = 0;
943
+ char dbenginepath[FILENAME_MAX + 1];
944
908
- if(tier > 0 && get_tier_grouping(tier) > 65535) {
909
- storage_tiers_grouping_iterations[tier] = 1;
910
- nd_log(NDLS_DAEMON, NDLP_WARNING,
911
- "DBENGINE on '%s': dbengine tier %zu gives aggregation of more than 65535 points of tier 0. "
912
- "Disabling tiers %zu and above",
913
- hostname, tier, tier);
914
- storage_tiers = tier;
915
- tiers_adjusted = true;
916
- break;
917
- }
945
+ for (size_t tier = 0; tier < storage_tiers; tier++) {
946
919
- if(tier == 0)
947
+ if (tier == 0)
948
snprintfz(dbenginepath, FILENAME_MAX, "%s/dbengine", netdata_configured_cache_dir);
949
else
950
snprintfz(dbenginepath, FILENAME_MAX, "%s/dbengine-tier%zu", netdata_configured_cache_dir, tier);
952
int ret = mkdir(dbenginepath, 0775);
953
if (ret != 0 && errno != EEXIST) {
954
nd_log(NDLS_DAEMON, NDLP_CRIT, "DBENGINE on '%s': cannot create directory '%s'", hostname, dbenginepath);
927
- break;
955
+ continue;
956
}
957
930
- internal_error(true, "DBENGINE tier %zu grouping iterations is set to %zu", tier, storage_tiers_grouping_iterations[tier]);
958
+ int disk_space_mb = tier ? RRDENG_DEFAULT_TIER_DISK_SPACE_MB : default_multidb_disk_quota_mb;
959
+ snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu disk space MB", tier);
960
+ disk_space_mb = config_get_number(CONFIG_SECTION_DB, dbengineconfig, disk_space_mb);
961
+
962
+ snprintfz(dbengineconfig, sizeof(dbengineconfig) - 1, "dbengine tier %zu retention days", tier);
963
+ storage_tiers_retention_days[tier] = config_get_number(
964
+ CONFIG_SECTION_DB, dbengineconfig, new_dbengine_defaults ? storage_tiers_retention_days[tier] : 0);
965
932
- tiers_init[tier].disk_space_mb = disk_space_mb;
966
+ tiers_init[tier].disk_space_mb = (int) disk_space_mb;
967
tiers_init[tier].tier = tier;
968
+ tiers_init[tier].retention_seconds = (size_t) (86400.0 * storage_tiers_retention_days[tier]);
969
strncpyz(tiers_init[tier].path, dbenginepath, FILENAME_MAX);
970
tiers_init[tier].ret = 0;
971
977
else
978
dbengine_tier_init(&tiers_init[tier]);
979
}
945
- if (tiers_adjusted)
946
- config_set_number(CONFIG_SECTION_DB, "storage tiers", storage_tiers);
980
981
for(size_t tier = 0; tier < storage_tiers ;tier++) {
982
if(parallel_initialization)
1004
for(size_t tier = 0; tier < storage_tiers ;tier++)
1005
rrdeng_readiness_wait(multidb_ctx[tier]);
1006
1007
+ calculate_tier_disk_space_percentage();
1008
+
1009
dbengine_enabled = true;
1010
#else
1011
storage_tiers = config_get_number(CONFIG_SECTION_DB, "storage tiers", 1);