| 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 |