5
#ifdef ENABLE_DBENGINE
6
#include "engine/rrdengineapi.h"
7
#endif
8
-
9
-#define im_collect_ops { \
10
- .init = rrddim_collect_init,\
11
- .store_metric = rrddim_collect_store_metric,\
12
- .finalize = rrddim_collect_finalize\
13
-}
14
-
15
-#define im_query_ops { \
16
- .init = rrddim_query_init, \
17
- .next_metric = rrddim_query_next_metric, \
18
- .is_finished = rrddim_query_is_finished, \
19
- .finalize = rrddim_query_finalize, \
20
- .latest_time = rrddim_query_latest_time, \
21
- .oldest_time = rrddim_query_oldest_time \
22
-}
8
+#include "libnetdata/libnetdata.h"
9
10
static STORAGE_ENGINE engines[] = {
11
{
12
.id = RRD_MEMORY_MODE_NONE,
13
.name = RRD_MEMORY_MODE_NONE_NAME,
14
.api = {
29
- .collect_ops = im_collect_ops,
30
- .query_ops = im_query_ops
31
- }
15
+ .engine_ops = {
16
+ .create = rrddim_storage_engine_instance_new,
17
+ .exit = rrddim_storage_engine_instance_exit,
18
+ .destroy = rrddim_storage_engine_instance_destroy
19
+ },
20
+ .collect_ops = {
21
+ .init = rrddim_collect_init,
22
+ .store_metric = rrddim_collect_store_metric,
23
+ .finalize = rrddim_collect_finalize
24
+ },
25
+ .query_ops = {
26
+ .init = rrddim_query_init,
27
+ .next_metric = rrddim_query_next_metric,
28
+ .is_finished = rrddim_query_is_finished,
29
+ .finalize = rrddim_query_finalize,
30
+ .latest_time = rrddim_query_latest_time,
31
+ .oldest_time = rrddim_query_oldest_time
32
+ }
33
+ },
34
+ .context = NULL
35
},
36
{
37
.id = RRD_MEMORY_MODE_RAM,
38
.name = RRD_MEMORY_MODE_RAM_NAME,
39
.api = {
37
- .collect_ops = im_collect_ops,
38
- .query_ops = im_query_ops
39
- }
40
+ .engine_ops = {
41
+ .create = rrddim_storage_engine_instance_new,
42
+ .exit = rrddim_storage_engine_instance_exit,
43
+ .destroy = rrddim_storage_engine_instance_destroy
44
+ },
45
+ .collect_ops = {
46
+ .init = rrddim_collect_init,
47
+ .store_metric = rrddim_collect_store_metric,
48
+ .finalize = rrddim_collect_finalize
49
+ },
50
+ .query_ops = {
51
+ .init = rrddim_query_init,
52
+ .next_metric = rrddim_query_next_metric,
53
+ .is_finished = rrddim_query_is_finished,
54
+ .finalize = rrddim_query_finalize,
55
+ .latest_time = rrddim_query_latest_time,
56
+ .oldest_time = rrddim_query_oldest_time
57
+ }
58
+ },
59
+ .context = NULL
60
},
61
{
62
.id = RRD_MEMORY_MODE_MAP,
63
.name = RRD_MEMORY_MODE_MAP_NAME,
64
.api = {
45
- .collect_ops = im_collect_ops,
46
- .query_ops = im_query_ops
47
- }
65
+ .engine_ops = {
66
+ .create = rrddim_storage_engine_instance_new,
67
+ .exit = rrddim_storage_engine_instance_exit,
68
+ .destroy = rrddim_storage_engine_instance_destroy
69
+ },
70
+ .collect_ops = {
71
+ .init = rrddim_collect_init,
72
+ .store_metric = rrddim_collect_store_metric,
73
+ .finalize = rrddim_collect_finalize
74
+ },
75
+ .query_ops = {
76
+ .init = rrddim_query_init,
77
+ .next_metric = rrddim_query_next_metric,
78
+ .is_finished = rrddim_query_is_finished,
79
+ .finalize = rrddim_query_finalize,
80
+ .latest_time = rrddim_query_latest_time,
81
+ .oldest_time = rrddim_query_oldest_time
82
+ }
83
+ },
84
+ .context = NULL
85
},
86
{
87
.id = RRD_MEMORY_MODE_SAVE,
88
.name = RRD_MEMORY_MODE_SAVE_NAME,
89
.api = {
53
- .collect_ops = im_collect_ops,
54
- .query_ops = im_query_ops
55
- }
90
+ .engine_ops = {
91
+ .create = rrddim_storage_engine_instance_new,
92
+ .exit = rrddim_storage_engine_instance_exit,
93
+ .destroy = rrddim_storage_engine_instance_destroy
94
+ },
95
+ .collect_ops = {
96
+ .init = rrddim_collect_init,
97
+ .store_metric = rrddim_collect_store_metric,
98
+ .finalize = rrddim_collect_finalize
99
+ },
100
+ .query_ops = {
101
+ .init = rrddim_query_init,
102
+ .next_metric = rrddim_query_next_metric,
103
+ .is_finished = rrddim_query_is_finished,
104
+ .finalize = rrddim_query_finalize,
105
+ .latest_time = rrddim_query_latest_time,
106
+ .oldest_time = rrddim_query_oldest_time
107
+ }
108
+ },
109
+ .context = NULL
110
},
111
{
112
.id = RRD_MEMORY_MODE_ALLOC,
113
.name = RRD_MEMORY_MODE_ALLOC_NAME,
114
.api = {
61
- .collect_ops = im_collect_ops,
62
- .query_ops = im_query_ops
63
- }
115
+ .engine_ops = {
116
+ .create = rrddim_storage_engine_instance_new,
117
+ .exit = rrddim_storage_engine_instance_exit,
118
+ .destroy = rrddim_storage_engine_instance_destroy
119
+ },
120
+ .collect_ops = {
121
+ .init = rrddim_collect_init,
122
+ .store_metric = rrddim_collect_store_metric,
123
+ .finalize = rrddim_collect_finalize
124
+ },
125
+ .query_ops = {
126
+ .init = rrddim_query_init,
127
+ .next_metric = rrddim_query_next_metric,
128
+ .is_finished = rrddim_query_is_finished,
129
+ .finalize = rrddim_query_finalize,
130
+ .latest_time = rrddim_query_latest_time,
131
+ .oldest_time = rrddim_query_oldest_time
132
+ }
133
+ },
134
+ .context = NULL
135
},
136
#ifdef ENABLE_DBENGINE
137
{
138
.id = RRD_MEMORY_MODE_DBENGINE,
139
.name = RRD_MEMORY_MODE_DBENGINE_NAME,
140
.api = {
141
+ .engine_ops = {
142
+ .create = rrdeng_init,
143
+ .exit = rrdeng_prepare_exit,
144
+ .destroy = rrdeng_exit
145
+ },
146
.collect_ops = {
147
.init = rrdeng_store_metric_init,
148
.store_metric = rrdeng_store_metric_next,
156
.latest_time = rrdeng_metric_latest_time,
157
.oldest_time = rrdeng_metric_oldest_time
158
}
83
- }
84
- },
159
+ },
160
+ .context = NULL
161
+ }
162
#endif
86
- { .id = RRD_MEMORY_MODE_NONE, .name = NULL }
163
};
164
165
+const size_t engine_count = sizeof(engines) / sizeof(engines[0]);
166
+
167
STORAGE_ENGINE* storage_engine_find(const char* name)
168
{
91
- for (STORAGE_ENGINE* it = engines; it->name; it++) {
92
- if (strcmp(it->name, name) == 0)
93
- return it;
94
- }
95
- return NULL;
169
+ for (size_t i = 0; i != engine_count; i++)
170
+ if (strcmp(engines[i].name, name) == 0)
171
+ return &engines[i];
172
+
173
+ error("No storage engine found for memory mode %s.", name);
174
+ return storage_engine_get(default_rrd_memory_mode);
175
}
176
177
STORAGE_ENGINE* storage_engine_get(RRD_MEMORY_MODE mmode)
178
{
100
- for (STORAGE_ENGINE* it = engines; it->name; it++) {
101
- if (it->id == mmode)
102
- return it;
103
- }
104
- return NULL;
179
+ for (size_t i = 0; i != engine_count; i++)
180
+ if (engines[i].id == mmode)
181
+ return &engines[i];
182
+ STORAGE_ENGINE* eng = mmode == default_rrd_memory_mode
183
+ ? &engines[0] // default engine not available, use NONE
184
+ : storage_engine_get(default_rrd_memory_mode);
185
+ error("No storage engine for memory mode %u, will use %s (%u) instead.", mmode, eng->name, eng->id);
186
+ return eng;
187
}
188
189
STORAGE_ENGINE* storage_engine_foreach_init()
194
195
STORAGE_ENGINE* storage_engine_foreach_next(STORAGE_ENGINE* it)
196
{
115
- if (!it || !it->name)
116
- return NULL;
117
-
197
it++;
119
- return it->name ? it : NULL;
198
+ return (it >= &engines[engine_count]) ? NULL : it;
199
+}
200
+
201
+STORAGE_ENGINE_INSTANCE* storage_engine_new(STORAGE_ENGINE* eng, RRDHOST *host)
202
+{
203
+ STORAGE_ENGINE_INSTANCE* instance = host->rrdeng_ctx;
204
+ if (!instance && eng) {
205
+ instance = eng->api.engine_ops.create(eng, host);
206
+ if (instance) {
207
+ instance->engine = eng;
208
+ }
209
+ }
210
+ return instance;
211
+}
212
+
213
+void storage_engine_delete(STORAGE_ENGINE_INSTANCE* instance) {
214
+ if (instance) {
215
+ STORAGE_ENGINE* eng = instance->engine;
216
+ if (eng) {
217
+ eng->api.engine_ops.destroy(instance);
218
+ }
219
+ }
220
}