@cryptotaxi247 / netdata-1 / commits / 43c4d1eda

Add check for spurious wakeups (#9751)

Vladimir Kobal committed Aug 17, 2020 at 10:31 UTC 43c4d1edaaefd38c5597d6a83a17cdc219ff395e
7 files changed +17 -4
exporting/aws_kinesis/aws_kinesis.c
+4 -1
@@ -103,7 +103,10 @@ void aws_kinesis_connector_worker(void *instance_p)
103 struct stats *stats = &instance->stats;
104
105 uv_mutex_lock(&instance->mutex);
106 - uv_cond_wait(&instance->cond_var, &instance->mutex);
106 + while (!instance->data_is_ready)
107 + uv_cond_wait(&instance->cond_var, &instance->mutex);
108 + instance->data_is_ready = 0;
109 +
110 if (unlikely(instance->engine->exit)) {
111 uv_mutex_unlock(&instance->mutex);
112 break;
exporting/exporting_engine.c
+1
@@ -67,6 +67,7 @@ static void exporting_main_cleanup(void *ptr)
67 found++;
68 info("stopping worker for instance %s", instance->config.name);
69 uv_mutex_unlock(&instance->mutex);
70 + instance->data_is_ready = 1;
71 uv_cond_signal(&instance->cond_var);
72 } else
73 info("found stopped worker for instance %s", instance->config.name);
exporting/exporting_engine.h
+1
@@ -165,6 +165,7 @@ struct instance {
165 uv_thread_t thread;
166 uv_mutex_t mutex;
167 uv_cond_t cond_var;
168 + int data_is_ready;
169
170 int (*start_batch_formatting)(struct instance *instance);
171 int (*start_host_formatting)(struct instance *instance, RRDHOST *host);
exporting/mongodb/mongodb.c
+3 -1
@@ -284,7 +284,9 @@ void mongodb_connector_worker(void *instance_p)
284 struct stats *stats = &instance->stats;
285
286 uv_mutex_lock(&instance->mutex);
287 - uv_cond_wait(&instance->cond_var, &instance->mutex);
287 + while (!instance->data_is_ready)
288 + uv_cond_wait(&instance->cond_var, &instance->mutex);
289 + instance->data_is_ready = 0;
290
291 if (unlikely(instance->engine->exit)) {
292 uv_mutex_unlock(&instance->mutex);
exporting/process_data.c
+1
@@ -294,6 +294,7 @@ void end_batch_formatting(struct engine *engine)
294 continue;
295 }
296 uv_mutex_unlock(&instance->mutex);
297 + instance->data_is_ready = 1;
298 uv_cond_signal(&instance->cond_var);
299
300 instance->scheduled = 0;
exporting/pubsub/pubsub.c
+4 -1
@@ -103,7 +103,10 @@ void pubsub_connector_worker(void *instance_p)
103 char error_message[ERROR_LINE_MAX + 1] = "";
104
105 uv_mutex_lock(&instance->mutex);
106 - uv_cond_wait(&instance->cond_var, &instance->mutex);
106 + while (!instance->data_is_ready)
107 + uv_cond_wait(&instance->cond_var, &instance->mutex);
108 + instance->data_is_ready = 0;
109 +
110
111 if (unlikely(instance->engine->exit)) {
112 uv_mutex_unlock(&instance->mutex);
exporting/send_data.c
+3 -1
@@ -340,7 +340,9 @@ void simple_connector_worker(void *instance_p)
340 // if we are connected, send our buffer to the data collecting server
341
342 uv_mutex_lock(&instance->mutex);
343 - uv_cond_wait(&instance->cond_var, &instance->mutex);
343 + while (!instance->data_is_ready)
344 + uv_cond_wait(&instance->cond_var, &instance->mutex);
345 + instance->data_is_ready = 0;
346
347 if (unlikely(instance->engine->exit)) {
348 uv_mutex_unlock(&instance->mutex);