datafile.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_DATAFILE_H
  3. #define NETDATA_DATAFILE_H
  4. #include "rrdengine.h"
  5. /* Forward declarations */
  6. struct rrdengine_datafile;
  7. struct rrdengine_journalfile;
  8. struct rrdengine_instance;
  9. #define DATAFILE_PREFIX "datafile-"
  10. #define DATAFILE_EXTENSION ".ndf"
  11. #ifndef MAX_DATAFILE_SIZE
  12. #define MAX_DATAFILE_SIZE (512LU * 1024LU * 1024LU)
  13. #endif
  14. #if MIN_DATAFILE_SIZE > MAX_DATAFILE_SIZE
  15. #error MIN_DATAFILE_SIZE > MAX_DATAFILE_SIZE
  16. #endif
  17. #define MIN_DATAFILE_SIZE (4LU * 1024LU * 1024LU)
  18. #define MAX_DATAFILES (65536) /* Supports up to 64TiB for now */
  19. #define TARGET_DATAFILES (50)
  20. typedef enum __attribute__ ((__packed__)) {
  21. DATAFILE_ACQUIRE_OPEN_CACHE = 0,
  22. DATAFILE_ACQUIRE_PAGE_DETAILS,
  23. DATAFILE_ACQUIRE_RETENTION,
  24. // terminator
  25. DATAFILE_ACQUIRE_MAX,
  26. } DATAFILE_ACQUIRE_REASONS;
  27. /* only one event loop is supported for now */
  28. struct rrdengine_datafile {
  29. unsigned tier;
  30. unsigned fileno;
  31. uv_file file;
  32. uint64_t pos;
  33. uv_rwlock_t extent_rwlock;
  34. struct rrdengine_instance *ctx;
  35. struct rrdengine_journalfile *journalfile;
  36. struct rrdengine_datafile *prev;
  37. struct rrdengine_datafile *next;
  38. struct {
  39. SPINLOCK spinlock;
  40. bool populated;
  41. } populate_mrg;
  42. struct {
  43. SPINLOCK spinlock;
  44. size_t running;
  45. size_t flushed_to_open_running;
  46. } writers;
  47. struct {
  48. SPINLOCK spinlock;
  49. unsigned lockers;
  50. unsigned lockers_by_reason[DATAFILE_ACQUIRE_MAX];
  51. bool available;
  52. time_t time_to_evict;
  53. } users;
  54. struct {
  55. SPINLOCK spinlock;
  56. Pvoid_t pending_epdl_by_extent_offset_judyL;
  57. } extent_queries;
  58. };
  59. bool datafile_acquire(struct rrdengine_datafile *df, DATAFILE_ACQUIRE_REASONS reason);
  60. void datafile_release(struct rrdengine_datafile *df, DATAFILE_ACQUIRE_REASONS reason);
  61. bool datafile_acquire_for_deletion(struct rrdengine_datafile *df);
  62. void datafile_list_insert(struct rrdengine_instance *ctx, struct rrdengine_datafile *datafile);
  63. void datafile_list_delete_unsafe(struct rrdengine_instance *ctx, struct rrdengine_datafile *datafile);
  64. void generate_datafilepath(struct rrdengine_datafile *datafile, char *str, size_t maxlen);
  65. int close_data_file(struct rrdengine_datafile *datafile);
  66. int unlink_data_file(struct rrdengine_datafile *datafile);
  67. int destroy_data_file_unsafe(struct rrdengine_datafile *datafile);
  68. int create_data_file(struct rrdengine_datafile *datafile);
  69. int create_new_datafile_pair(struct rrdengine_instance *ctx);
  70. int init_data_files(struct rrdengine_instance *ctx);
  71. void finalize_data_files(struct rrdengine_instance *ctx);
  72. #endif /* NETDATA_DATAFILE_H */