Skip to content

Commit f076238

Browse files
committed
ring_buffer: add mutex to prevent race
To prevent following data race. ================== WARNING: ThreadSanitizer: data race (pid=4506) Read of size 8 at 0x7b9400000010 by thread T1: #0 memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:827 (libtsan.so.0+0x6243e) #1 memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:819 (libtsan.so.0+0x6243e) #2 lwrb_read /home/taka/git/fluent-bit/lib/lwrb/lwrb/src/lwrb/lwrb.c:199 (fluent-bit+0x8d3d1) #3 flb_ring_buffer_read /home/taka/git/fluent-bit/src/flb_ring_buffer.c:197 (fluent-bit+0x176143) #4 flb_input_chunk_ring_buffer_collector /home/taka/git/fluent-bit/src/flb_input_chunk.c:1930 (fluent-bit+0x209432) #5 flb_sched_event_handler /home/taka/git/fluent-bit/src/flb_scheduler.c:428 (fluent-bit+0x139c76) #6 flb_engine_start /home/taka/git/fluent-bit/src/flb_engine.c:937 (fluent-bit+0x12615a) #7 flb_lib_worker /home/taka/git/fluent-bit/src/flb_lib.c:629 (fluent-bit+0xa0ced) Previous write of size 8 at 0x7b9400000010 by thread T3: #0 memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:827 (libtsan.so.0+0x6243e) #1 memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:819 (libtsan.so.0+0x6243e) #2 lwrb_write /home/taka/git/fluent-bit/lib/lwrb/lwrb/src/lwrb/lwrb.c:145 (fluent-bit+0x8d13d) #3 flb_ring_buffer_write /home/taka/git/fluent-bit/src/flb_ring_buffer.c:175 (fluent-bit+0x176025) #4 append_to_ring_buffer /home/taka/git/fluent-bit/src/flb_input_chunk.c:1904 (fluent-bit+0x20914f) #5 flb_input_chunk_append_raw /home/taka/git/fluent-bit/src/flb_input_chunk.c:1966 (fluent-bit+0x20954c) #6 input_log_append /home/taka/git/fluent-bit/src/flb_input_log.c:33 (fluent-bit+0x20e8d2) #7 flb_input_log_append /home/taka/git/fluent-bit/src/flb_input_log.c:47 (fluent-bit+0x20e955) #8 ml_stream_buffer_flush /home/taka/git/fluent-bit/plugins/in_tail/tail_file.c:356 (fluent-bit+0x348975) #9 process_content /home/taka/git/fluent-bit/plugins/in_tail/tail_file.c:575 (fluent-bit+0x3494cf) #10 flb_tail_file_chunk /home/taka/git/fluent-bit/plugins/in_tail/tail_file.c:1341 (fluent-bit+0x34d428) #11 in_tail_collect_event /home/taka/git/fluent-bit/plugins/in_tail/tail.c:328 (fluent-bit+0x32bec0) #12 tail_fs_event /home/taka/git/fluent-bit/plugins/in_tail/tail_fs_inotify.c:267 (fluent-bit+0x3329f6) #13 input_collector_fd /home/taka/git/fluent-bit/src/flb_input_thread.c:168 (fluent-bit+0xe0395) #14 engine_handle_event /home/taka/git/fluent-bit/src/flb_input_thread.c:183 (fluent-bit+0xe1111) #15 input_thread /home/taka/git/fluent-bit/src/flb_input_thread.c:384 (fluent-bit+0xe1111) #16 step_callback /home/taka/git/fluent-bit/src/flb_worker.c:43 (fluent-bit+0x157a2e) Location is heap block of size 8193 at 0x7b9400000000 allocated by main thread: #0 calloc ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:672 (libtsan.so.0+0x31edc) #1 flb_calloc /home/taka/git/fluent-bit/include/fluent-bit/flb_mem.h:89 (fluent-bit+0x175969) #2 flb_ring_buffer_create /home/taka/git/fluent-bit/src/flb_ring_buffer.c:67 (fluent-bit+0x175ab2) #3 flb_input_new /home/taka/git/fluent-bit/src/flb_input.c:326 (fluent-bit+0xd3c48) #4 service_configure_plugin /home/taka/git/fluent-bit/src/fluent-bit.c:710 (fluent-bit+0x8540d) #5 service_configure /home/taka/git/fluent-bit/src/fluent-bit.c:878 (fluent-bit+0x8625f) #6 flb_main /home/taka/git/fluent-bit/src/fluent-bit.c:1182 (fluent-bit+0x87038) #7 main /home/taka/git/fluent-bit/src/fluent-bit.c:1257 (fluent-bit+0x8734e) Thread T1 'flb-pipeline' (tid=4508, running) created by main thread at: #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:969 (libtsan.so.0+0x605b8) #1 mk_utils_worker_spawn /home/taka/git/fluent-bit/lib/monkey/mk_core/mk_utils.c:284 (fluent-bit+0xc06aa0) #2 flb_main /home/taka/git/fluent-bit/src/fluent-bit.c:1231 (fluent-bit+0x871f1) #3 main /home/taka/git/fluent-bit/src/fluent-bit.c:1257 (fluent-bit+0x8734e) Thread T3 'flb-in-tail.0-w' (tid=4510, running) created by thread T1 at: #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:969 (libtsan.so.0+0x605b8) #1 mk_utils_worker_spawn /home/taka/git/fluent-bit/lib/monkey/mk_core/mk_utils.c:284 (fluent-bit+0xc06aa0) #2 flb_tp_thread_start /home/taka/git/fluent-bit/src/flb_thread_pool.c:123 (fluent-bit+0x170263) #3 flb_input_thread_instance_init /home/taka/git/fluent-bit/src/flb_input_thread.c:543 (fluent-bit+0xe1cf6) #4 flb_input_instance_init /home/taka/git/fluent-bit/src/flb_input.c:1130 (fluent-bit+0xd73d0) #5 flb_input_init_all /home/taka/git/fluent-bit/src/flb_input.c:1217 (fluent-bit+0xd78a3) #6 flb_engine_start /home/taka/git/fluent-bit/src/flb_engine.c:717 (fluent-bit+0x12532a) #7 flb_lib_worker /home/taka/git/fluent-bit/src/flb_lib.c:629 (fluent-bit+0xa0ced) SUMMARY: ThreadSanitizer: data race /home/taka/git/fluent-bit/lib/lwrb/lwrb/src/lwrb/lwrb.c:199 in lwrb_read ================== Signed-off-by: Takahiro Yamashita <[email protected]>
1 parent 244d73d commit f076238

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

include/fluent-bit/flb_ring_buffer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#define FLB_RING_BUFFER_H
2222

2323
#include <fluent-bit/flb_pipe.h>
24+
#include <fluent-bit/flb_pthread.h>
2425

2526
struct flb_ring_buffer {
2627
void *ctx; /* pointer to backend context */
@@ -30,6 +31,7 @@ struct flb_ring_buffer {
3031
flb_pipefd_t signal_channels[2]; /* flush request signaling channel */
3132
uint64_t data_window; /* 0% - 100% occupancy window flush request */
3233
uint64_t data_size; /* ring buffer size */
34+
pthread_mutex_t pth_mutex; /* mutex */
3335
void *data_buf; /* ring buffer */
3436
};
3537

src/flb_ring_buffer.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <fluent-bit/flb_mem.h>
2828
#include <fluent-bit/flb_log.h>
2929
#include <fluent-bit/flb_pipe.h>
30+
#include <fluent-bit/flb_pthread.h>
3031
#include <fluent-bit/flb_ring_buffer.h>
3132
#include <fluent-bit/flb_engine_macros.h>
3233

@@ -52,6 +53,7 @@ struct flb_ring_buffer *flb_ring_buffer_create(uint64_t size)
5253
return NULL;
5354
}
5455
rb->data_size = size;
56+
pthread_mutex_init(&rb->pth_mutex, NULL);
5557

5658
/* lwrb context */
5759
lwrb = flb_malloc(sizeof(lwrb_t));
@@ -165,15 +167,19 @@ int flb_ring_buffer_write(struct flb_ring_buffer *rb, void *ptr, size_t size)
165167
size_t ret;
166168
size_t av;
167169

170+
pthread_mutex_lock(&rb->pth_mutex);
171+
168172
/* make sure there is enough space available */
169173
av = lwrb_get_free(rb->ctx);
170174
if (av < size) {
175+
pthread_mutex_unlock(&rb->pth_mutex);
171176
return -1;
172177
}
173178

174179
/* write the content */
175180
ret = lwrb_write(rb->ctx, ptr, size);
176181
if (ret == 0) {
182+
pthread_mutex_unlock(&rb->pth_mutex);
177183
return -1;
178184
}
179185

@@ -186,15 +192,16 @@ int flb_ring_buffer_write(struct flb_ring_buffer *rb, void *ptr, size_t size)
186192
flb_pipe_write_all(rb->signal_channels[1], ".", 1);
187193
}
188194
}
189-
195+
pthread_mutex_unlock(&rb->pth_mutex);
190196
return 0;
191197
}
192198

193199
int flb_ring_buffer_read(struct flb_ring_buffer *rb, void *ptr, size_t size)
194200
{
195201
size_t ret;
196-
202+
pthread_mutex_lock(&rb->pth_mutex);
197203
ret = lwrb_read(rb->ctx, ptr, size);
204+
pthread_mutex_unlock(&rb->pth_mutex);
198205
if (ret == 0) {
199206
return -1;
200207
}

0 commit comments

Comments
 (0)