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