rrdengine.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_RRDENGINE_H
  3. #define NETDATA_RRDENGINE_H
  4. #ifndef _GNU_SOURCE
  5. #define _GNU_SOURCE
  6. #endif
  7. #include <fcntl.h>
  8. #include <lz4.h>
  9. #include <Judy.h>
  10. #include <openssl/sha.h>
  11. #include <openssl/evp.h>
  12. #include "daemon/common.h"
  13. #include "../rrd.h"
  14. #include "rrddiskprotocol.h"
  15. #include "rrdenginelib.h"
  16. #include "datafile.h"
  17. #include "journalfile.h"
  18. #include "metadata_log/metadatalog.h"
  19. #include "rrdengineapi.h"
  20. #include "pagecache.h"
  21. #include "rrdenglocking.h"
  22. #ifdef NETDATA_RRD_INTERNALS
  23. #endif /* NETDATA_RRD_INTERNALS */
  24. /* Forward declarations */
  25. struct rrdengine_instance;
  26. #define MAX_PAGES_PER_EXTENT (64) /* TODO: can go higher only when journal supports bigger than 4KiB transactions */
  27. #define RRDENG_FILE_NUMBER_SCAN_TMPL "%1u-%10u"
  28. #define RRDENG_FILE_NUMBER_PRINT_TMPL "%1.1u-%10.10u"
  29. struct rrdeng_collect_handle {
  30. struct rrdeng_page_descr *descr, *prev_descr;
  31. unsigned long page_correlation_id;
  32. struct rrdengine_instance *ctx;
  33. // set to 1 when this dimension is not page aligned with the other dimensions in the chart
  34. uint8_t unaligned_page;
  35. };
  36. struct rrdeng_query_handle {
  37. struct rrdeng_page_descr *descr;
  38. struct rrdengine_instance *ctx;
  39. struct pg_cache_page_index *page_index;
  40. time_t next_page_time;
  41. time_t now;
  42. unsigned position;
  43. unsigned entries;
  44. storage_number *page;
  45. usec_t page_end_time;
  46. uint32_t page_length;
  47. usec_t dt;
  48. time_t dt_sec;
  49. };
  50. typedef enum {
  51. RRDENGINE_STATUS_UNINITIALIZED = 0,
  52. RRDENGINE_STATUS_INITIALIZING,
  53. RRDENGINE_STATUS_INITIALIZED
  54. } rrdengine_state_t;
  55. enum rrdeng_opcode {
  56. /* can be used to return empty status or flush the command queue */
  57. RRDENG_NOOP = 0,
  58. RRDENG_READ_PAGE,
  59. RRDENG_READ_EXTENT,
  60. RRDENG_COMMIT_PAGE,
  61. RRDENG_FLUSH_PAGES,
  62. RRDENG_SHUTDOWN,
  63. RRDENG_INVALIDATE_OLDEST_MEMORY_PAGE,
  64. RRDENG_QUIESCE,
  65. RRDENG_MAX_OPCODE
  66. };
  67. struct rrdeng_read_page {
  68. struct rrdeng_page_descr *page_cache_descr;
  69. };
  70. struct rrdeng_read_extent {
  71. struct rrdeng_page_descr *page_cache_descr[MAX_PAGES_PER_EXTENT];
  72. int page_count;
  73. };
  74. struct rrdeng_cmd {
  75. enum rrdeng_opcode opcode;
  76. union {
  77. struct rrdeng_read_page read_page;
  78. struct rrdeng_read_extent read_extent;
  79. struct completion *completion;
  80. };
  81. };
  82. #define RRDENG_CMD_Q_MAX_SIZE (2048)
  83. struct rrdeng_cmdqueue {
  84. unsigned head, tail;
  85. struct rrdeng_cmd cmd_array[RRDENG_CMD_Q_MAX_SIZE];
  86. };
  87. struct extent_io_descriptor {
  88. uv_fs_t req;
  89. uv_buf_t iov;
  90. void *buf;
  91. uint64_t pos;
  92. unsigned bytes;
  93. struct completion *completion;
  94. unsigned descr_count;
  95. int release_descr;
  96. struct rrdeng_page_descr *descr_array[MAX_PAGES_PER_EXTENT];
  97. Word_t descr_commit_idx_array[MAX_PAGES_PER_EXTENT];
  98. struct extent_io_descriptor *next; /* multiple requests to be served by the same cached extent */
  99. };
  100. struct generic_io_descriptor {
  101. uv_fs_t req;
  102. uv_buf_t iov;
  103. void *buf;
  104. uint64_t pos;
  105. unsigned bytes;
  106. struct completion *completion;
  107. };
  108. struct extent_cache_element {
  109. struct extent_info *extent; /* The ABA problem is avoided with the help of fileno below */
  110. unsigned fileno;
  111. struct extent_cache_element *prev; /* LRU */
  112. struct extent_cache_element *next; /* LRU */
  113. struct extent_io_descriptor *inflight_io_descr; /* I/O descriptor for in-flight extent */
  114. uint8_t pages[MAX_PAGES_PER_EXTENT * RRDENG_BLOCK_SIZE];
  115. };
  116. #define MAX_CACHED_EXTENTS 16 /* cannot be over 32 to fit in 32-bit architectures */
  117. /* Initialize by setting the structure to zero */
  118. struct extent_cache {
  119. struct extent_cache_element extent_array[MAX_CACHED_EXTENTS];
  120. unsigned allocation_bitmap; /* 1 if the corresponding position in the extent_array is allocated */
  121. unsigned inflight_bitmap; /* 1 if the corresponding position in the extent_array is waiting for I/O */
  122. struct extent_cache_element *replaceQ_head; /* LRU */
  123. struct extent_cache_element *replaceQ_tail; /* MRU */
  124. };
  125. struct rrdengine_worker_config {
  126. struct rrdengine_instance *ctx;
  127. uv_thread_t thread;
  128. uv_loop_t* loop;
  129. uv_async_t async;
  130. /* file deletion thread */
  131. uv_thread_t *now_deleting_files;
  132. unsigned long cleanup_thread_deleting_files; /* set to 0 when now_deleting_files is still running */
  133. /* dirty page deletion thread */
  134. uv_thread_t *now_invalidating_dirty_pages;
  135. /* set to 0 when now_invalidating_dirty_pages is still running */
  136. unsigned long cleanup_thread_invalidating_dirty_pages;
  137. unsigned inflight_dirty_pages;
  138. /* FIFO command queue */
  139. uv_mutex_t cmd_mutex;
  140. uv_cond_t cmd_cond;
  141. volatile unsigned queue_size;
  142. struct rrdeng_cmdqueue cmd_queue;
  143. struct extent_cache xt_cache;
  144. int error;
  145. };
  146. /*
  147. * Debug statistics not used by code logic.
  148. * They only describe operations since DB engine instance load time.
  149. */
  150. struct rrdengine_statistics {
  151. rrdeng_stats_t metric_API_producers;
  152. rrdeng_stats_t metric_API_consumers;
  153. rrdeng_stats_t pg_cache_insertions;
  154. rrdeng_stats_t pg_cache_deletions;
  155. rrdeng_stats_t pg_cache_hits;
  156. rrdeng_stats_t pg_cache_misses;
  157. rrdeng_stats_t pg_cache_backfills;
  158. rrdeng_stats_t pg_cache_evictions;
  159. rrdeng_stats_t before_decompress_bytes;
  160. rrdeng_stats_t after_decompress_bytes;
  161. rrdeng_stats_t before_compress_bytes;
  162. rrdeng_stats_t after_compress_bytes;
  163. rrdeng_stats_t io_write_bytes;
  164. rrdeng_stats_t io_write_requests;
  165. rrdeng_stats_t io_read_bytes;
  166. rrdeng_stats_t io_read_requests;
  167. rrdeng_stats_t io_write_extent_bytes;
  168. rrdeng_stats_t io_write_extents;
  169. rrdeng_stats_t io_read_extent_bytes;
  170. rrdeng_stats_t io_read_extents;
  171. rrdeng_stats_t datafile_creations;
  172. rrdeng_stats_t datafile_deletions;
  173. rrdeng_stats_t journalfile_creations;
  174. rrdeng_stats_t journalfile_deletions;
  175. rrdeng_stats_t page_cache_descriptors;
  176. rrdeng_stats_t io_errors;
  177. rrdeng_stats_t fs_errors;
  178. rrdeng_stats_t pg_cache_over_half_dirty_events;
  179. rrdeng_stats_t flushing_pressure_page_deletions;
  180. };
  181. /* I/O errors global counter */
  182. extern rrdeng_stats_t global_io_errors;
  183. /* File-System errors global counter */
  184. extern rrdeng_stats_t global_fs_errors;
  185. /* number of File-Descriptors that have been reserved by dbengine */
  186. extern rrdeng_stats_t rrdeng_reserved_file_descriptors;
  187. /* inability to flush global counters */
  188. extern rrdeng_stats_t global_pg_cache_over_half_dirty_events;
  189. extern rrdeng_stats_t global_flushing_pressure_page_deletions; /* number of deleted pages */
  190. #define NO_QUIESCE (0) /* initial state when all operations function normally */
  191. #define SET_QUIESCE (1) /* set it before shutting down the instance, quiesce long running operations */
  192. #define QUIESCED (2) /* is set after all threads have finished running */
  193. struct rrdengine_instance {
  194. struct metalog_instance *metalog_ctx;
  195. struct rrdengine_worker_config worker_config;
  196. struct completion rrdengine_completion;
  197. struct page_cache pg_cache;
  198. uint8_t drop_metrics_under_page_cache_pressure; /* boolean */
  199. uint8_t global_compress_alg;
  200. struct transaction_commit_log commit_log;
  201. struct rrdengine_datafile_list datafiles;
  202. RRDHOST *host; /* the legacy host, or NULL for multi-host DB */
  203. char dbfiles_path[FILENAME_MAX + 1];
  204. char machine_guid[GUID_LEN + 1]; /* the unique ID of the corresponding host, or localhost for multihost DB */
  205. uint64_t disk_space;
  206. uint64_t max_disk_space;
  207. unsigned last_fileno; /* newest index of datafile and journalfile */
  208. unsigned long max_cache_pages;
  209. unsigned long cache_pages_low_watermark;
  210. unsigned long metric_API_max_producers;
  211. uint8_t quiesce; /* set to SET_QUIESCE before shutdown of the engine */
  212. struct rrdengine_statistics stats;
  213. };
  214. extern void *dbengine_page_alloc(void);
  215. extern void dbengine_page_free(void *page);
  216. extern int init_rrd_files(struct rrdengine_instance *ctx);
  217. extern void finalize_rrd_files(struct rrdengine_instance *ctx);
  218. extern void rrdeng_test_quota(struct rrdengine_worker_config* wc);
  219. extern void rrdeng_worker(void* arg);
  220. extern void rrdeng_enq_cmd(struct rrdengine_worker_config* wc, struct rrdeng_cmd *cmd);
  221. extern struct rrdeng_cmd rrdeng_deq_cmd(struct rrdengine_worker_config* wc);
  222. #endif /* NETDATA_RRDENGINE_H */