|
@@ -2,12 +2,63 @@
|
|
|
|
|
|
#include "exporting_engine.h"
|
|
|
|
|
|
-static void exporting_main_cleanup(void *ptr) {
|
|
|
+static struct engine *engine = NULL;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Clean up the main exporting thread and all connector workers on Netdata exit
|
|
|
+ *
|
|
|
+ * @param ptr thread data.
|
|
|
+ */
|
|
|
+static void exporting_main_cleanup(void *ptr)
|
|
|
+{
|
|
|
struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
|
|
|
static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
|
|
|
|
|
|
info("cleaning up...");
|
|
|
|
|
|
+ if (!engine) {
|
|
|
+ static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ engine->exit = 1;
|
|
|
+
|
|
|
+ int found = 0;
|
|
|
+ usec_t max = 2 * USEC_PER_SEC, step = 50000;
|
|
|
+
|
|
|
+ for (struct instance *instance = engine->instance_root; instance; instance = instance->next) {
|
|
|
+ if (!instance->exited) {
|
|
|
+ found++;
|
|
|
+ info("stopping worker for instance %s", instance->config.name);
|
|
|
+ uv_cond_signal(&instance->cond_var);
|
|
|
+ } else
|
|
|
+ info("found stopped worker for instance %s", instance->config.name);
|
|
|
+ }
|
|
|
+
|
|
|
+ while (found && max > 0) {
|
|
|
+ max -= step;
|
|
|
+ info("Waiting %d exporting connectors to finish...", found);
|
|
|
+ sleep_usec(step);
|
|
|
+ found = 0;
|
|
|
+
|
|
|
+ for (struct instance *instance = engine->instance_root; instance; instance = instance->next) {
|
|
|
+ if (!instance->exited)
|
|
|
+ found++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (struct instance *instance = engine->instance_root; instance;) {
|
|
|
+ struct instance *current_instance = instance;
|
|
|
+ instance = instance->next;
|
|
|
+ clean_instance(current_instance);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (engine->config.prefix)
|
|
|
+ freez((void *)engine->config.prefix);
|
|
|
+ if (engine->config.hostname)
|
|
|
+ freez((void *)engine->config.hostname);
|
|
|
+ freez(engine);
|
|
|
+
|
|
|
static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
|
|
|
}
|
|
|
|
|
@@ -24,7 +75,7 @@ void *exporting_main(void *ptr)
|
|
|
{
|
|
|
netdata_thread_cleanup_push(exporting_main_cleanup, ptr);
|
|
|
|
|
|
- struct engine *engine = read_exporting_config();
|
|
|
+ engine = read_exporting_config();
|
|
|
if (!engine) {
|
|
|
info("EXPORTING: no exporting connectors configured");
|
|
|
goto cleanup;
|
|
@@ -54,7 +105,7 @@ void *exporting_main(void *ptr)
|
|
|
send_main_rusage(st_main_rusage, rd_main_user, rd_main_system);
|
|
|
|
|
|
#ifdef UNIT_TESTING
|
|
|
- break;
|
|
|
+ return NULL;
|
|
|
#endif
|
|
|
}
|
|
|
|