master
h 158 lines 4.24 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_EVENT_LOOP_H
4 #define NETDATA_EVENT_LOOP_H
5
6 enum event_loop_job {
7 UV_EVENT_JOB_NONE = 0,
8
9 // generic
10 UV_EVENT_WORKER_INIT,
11
12 // query related
13 UV_EVENT_DBENGINE_QUERY,
14 UV_EVENT_DBENGINE_EXTENT_CACHE_LOOKUP,
15 UV_EVENT_DBENGINE_EXTENT_MMAP,
16 UV_EVENT_DBENGINE_EXTENT_DECOMPRESSION,
17 UV_EVENT_DBENGINE_EXTENT_PAGE_LOOKUP,
18 UV_EVENT_DBENGINE_EXTENT_PAGE_POPULATION,
19 UV_EVENT_DBENGINE_EXTENT_PAGE_ALLOCATION,
20 // Metrics calculation
21 UV_EVENT_WEIGHTS_CALCULATION,
22
23 // flushing related
24 UV_EVENT_DBENGINE_FLUSH_MAIN_CACHE,
25 UV_EVENT_DBENGINE_EXTENT_WRITE,
26 UV_EVENT_DBENGINE_FLUSHED_TO_OPEN,
27
28 // datafile full
29 UV_EVENT_DBENGINE_JOURNAL_INDEX,
30
31 // db rotation related
32 UV_EVENT_DBENGINE_DATAFILE_DELETE_WAIT,
33 UV_EVENT_DBENGINE_DATAFILE_DELETE,
34 UV_EVENT_DBENGINE_FIND_ROTATED_METRICS, // find the metrics that are rotated
35 UV_EVENT_DBENGINE_FIND_REMAINING_RETENTION, // find their remaining retention
36 UV_EVENT_DBENGINE_POPULATE_MRG, // update mrg
37
38 // other dbengine events
39 UV_EVENT_DBENGINE_EVICT_MAIN_CACHE,
40 UV_EVENT_DBENGINE_EVICT_OPEN_CACHE,
41 UV_EVENT_DBENGINE_EVICT_EXTENT_CACHE,
42 UV_EVENT_DBENGINE_BUFFERS_CLEANUP,
43 UV_EVENT_DBENGINE_FLUSH_DIRTY,
44 UV_EVENT_DBENGINE_QUIESCE,
45 UV_EVENT_DBENGINE_MRG_LOAD,
46 UV_EVENT_DBENGINE_SHUTDOWN,
47
48 // metadata
49 UV_EVENT_HOST_CONTEXT_LOAD,
50 UV_EVENT_METADATA_STORE,
51 UV_EVENT_METADATA_CLEANUP,
52 UV_EVENT_METADATA_ML_LOAD,
53 UV_EVENT_CTX_CLEANUP_SCHEDULE,
54 UV_EVENT_CTX_CLEANUP,
55 UV_EVENT_STORE_HOST,
56 UV_EVENT_STORE_CHART,
57 UV_EVENT_STORE_DIMENSION,
58 UV_EVENT_STORE_ALERT_TRANSITIONS,
59 UV_EVENT_STORE_SQL_STATEMENTS,
60 UV_EVENT_HEALTH_LOG_CLEANUP,
61 UV_EVENT_CHART_LABEL_CLEANUP,
62 UV_EVENT_UUID_DELETION,
63 UV_EVENT_DIMENSION_CLEANUP,
64 UV_EVENT_CHART_CLEANUP,
65
66 // aclk_sync
67 UV_EVENT_ACLK_NODE_INFO,
68 UV_EVENT_ACLK_ALERT_PUSH,
69 UV_EVENT_ACLK_QUERY_EXECUTE,
70
71 //
72 UV_EVENT_CTX_STOP_STREAMING,
73 UV_EVENT_CTX_CHECKPOINT,
74 UV_EVENT_ALARM_PROVIDE_CFG,
75 UV_EVENT_ALARM_SNAPSHOT,
76 UV_EVENT_REGISTER_NODE,
77 UV_EVENT_UPDATE_NODE_COLLECTORS,
78 UV_EVENT_UPDATE_NODE_INFO,
79 UV_EVENT_CTX_SEND_SNAPSHOT,
80 UV_EVENT_CTX_SEND_SNAPSHOT_UPD,
81 UV_EVENT_NODE_STATE_UPDATE,
82 UV_EVENT_SEND_NODE_INSTANCES,
83 UV_EVENT_ALERT_START_STREAMING,
84 UV_EVENT_ALERT_CHECKPOINT,
85 UV_EVENT_CREATE_NODE_INSTANCE,
86 UV_EVENT_UNREGISTER_NODE,
87
88 // maintenance
89 UV_EVENT_CLEANUP_OBSOLETE_CHARTS,
90 UV_EVENT_ARCHIVE_CHART_DIMENSIONS,
91 UV_EVENT_ARCHIVE_DIMENSION,
92 UV_EVENT_CLEANUP_ORPHAN_HOSTS,
93 UV_EVENT_CLEANUP_OBSOLETE_CHARTS_ON_HOSTS,
94 UV_EVENT_FREE_HOST,
95 UV_EVENT_FREE_CHART,
96 UV_EVENT_FREE_DIMENSION,
97
98 // netdatacli
99 UV_EVENT_SCHEDULE_CMD,
100 };
101
102 #define MAX_ACTIVE_WORKERS (256)
103
104 typedef struct worker_data {
105 uv_work_t request;
106 void *config;
107 void *pending_alert_list;
108 void *pending_ctx_cleanup_list;
109 void *pending_uuid_deletion;
110 void *pending_sql_statement;
111 union {
112 void *payload;
113 void *work_buffer;
114 };
115 bool allocated;
116 } worker_data_t;
117
118 typedef struct {
119 worker_data_t workers[MAX_ACTIVE_WORKERS]; // Preallocated worker data pool
120 int free_stack[MAX_ACTIVE_WORKERS]; // Stack of available worker data indices
121 int top; // Stack pointer
122 } WorkerPool;
123
124 typedef struct {
125 uint8_t opcode;
126 uint8_t padding[sizeof(void *) - sizeof(uint8_t)]; // Padding to align the union
127 union {
128 void *param[2];
129 char data[sizeof(void *) * 2];
130 };
131 } cmd_data_t;
132
133 typedef struct {
134 cmd_data_t *buffer;
135 int size;
136 int head;
137 int tail;
138 int count;
139
140 netdata_mutex_t lock;
141 netdata_cond_t not_full;
142 } CmdPool;
143
144
145 void register_libuv_worker_jobs();
146 void libuv_close_callback(uv_handle_t *handle, void *data __maybe_unused);
147
148 void init_worker_pool(WorkerPool *pool);
149 worker_data_t *get_worker(WorkerPool *pool);
150 void return_worker(WorkerPool *pool, worker_data_t *worker);
151
152 void init_cmd_pool(CmdPool *pool, int size);
153 bool push_cmd(CmdPool *pool, const cmd_data_t *cmd, bool wait_on_full);
154 bool pop_cmd(CmdPool *pool, cmd_data_t *out_cmd);
155 void release_cmd_pool(CmdPool *pool);
156 int test_cmd_pool_fifo();
157
158 #endif //NETDATA_EVENT_LOOP_H