Skip to content

Commit cd1f25e

Browse files
daverigbytrondn
authored andcommitted
Fix race accessing settings.verbosity
As reported by ThreadSanitizer: WARNING: ThreadSanitizer: data race (pid=34992) Read of size 4 at 0x7f98b38b5bf4 by main thread: #0 run_event_loop /home/daver/repos/couchbase/server/memcached/daemon/connections.cc:170 (memcached+0x0000000c7049) #1 event_handler /home/daver/repos/couchbase/server/memcached/daemon/memcached.cc:6912 (memcached+0x0000000d7b34) #2 event_persist_closure /home/couchbase/jenkins/workspace/cbdeps-build/label/ubuntu14.04/release/sherlock/deps/packages/build/libevent/libevent-prefix/src/libevent/event.c:1319 (libevent_core-2.0.so.5+0x00000000b6c7) #3 __libc_start_main /build/buildd/eglibc-2.19/csu/libc-start.c:287 (libc.so.6+0x000000021ec4) Previous write of size 4 at 0x7f98b38b5bf4 by thread T19 (mutexes: write M45860): #0 verbosity_executor(conn*, void*) /home/daver/repos/couchbase/server/memcached/daemon/memcached.cc:3600 (memcached+0x0000000df219) #1 process_bin_packet(conn*) /home/daver/repos/couchbase/server/memcached/daemon/memcached.cc:5053 (memcached+0x0000000d2100) #2 run_event_loop /home/daver/repos/couchbase/server/memcached/daemon/connections.cc:174 (memcached+0x0000000c70c3) #3 event_handler /home/daver/repos/couchbase/server/memcached/daemon/memcached.cc:6912 (memcached+0x0000000d7b34) #4 event_persist_closure /home/couchbase/jenkins/workspace/cbdeps-build/label/ubuntu14.04/release/sherlock/deps/packages/build/libevent/libevent-prefix/src/libevent/event.c:1319 (libevent_core-2.0.so.5+0x00000000b6c7) #5 platform_thread_wrap /home/daver/repos/couchbase/server/platform/src/cb_pthreads.c:23 (libplatform.so.0.1.0+0x000000003730) Change-Id: I2ae83312a532c67b2e3915e0c604e4e60558a8a7 Reviewed-on: http://review.couchbase.org/52487 Tested-by: buildbot <[email protected]> Reviewed-by: Trond Norbye <[email protected]>
1 parent c3a3d93 commit cd1f25e

File tree

4 files changed

+15
-17
lines changed

4 files changed

+15
-17
lines changed

daemon/breakpad.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,13 @@
2525
# else
2626
# error Unsupported platform for breakpad, cannot compile.
2727
# endif
28+
#include "settings.h"
2829

2930
#include "memcached/extension_loggers.h"
3031
#include <platform/backtrace.h>
3132

3233
#include <stdlib.h>
3334

34-
extern "C" {
35-
extern struct settings settings;
36-
}
37-
3835
using namespace google_breakpad;
3936

4037
ExceptionHandler* handler;

daemon/config_parse.cc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ static bool get_absolute_file(const char *file, const char **value,
9292
}
9393

9494

95+
/** Given a JSON element {i} with the name {key}, attempt to convert
96+
* it's value to an integer and store the result in {value}. Returns
97+
* true on success; else returns false and sets {error_msg} to point
98+
* to message describing the any error.
99+
*/
95100
static bool get_int_value(cJSON *i, const char *key, int* value,
96101
char **error_msg) {
97102
switch (i->type) {
@@ -370,7 +375,9 @@ static bool get_max_packet_size(cJSON *o, struct settings *settings,
370375

371376
static bool get_verbosity(cJSON *o, struct settings *settings,
372377
char **error_msg) {
373-
if (get_int_value(o, o->string, &settings->verbose, error_msg)) {
378+
int verbosity;
379+
if (get_int_value(o, o->string, &verbosity, error_msg)) {
380+
settings->verbose.store(verbosity);
374381
settings->has.verbose = true;
375382
return true;
376383
} else {
@@ -1331,11 +1338,11 @@ static void dyna_reconfig_verbosity(const struct settings *new_settings) {
13311338
if (new_settings->has.verbose &&
13321339
new_settings->verbose != settings.verbose) {
13331340
int old_verbose = settings.verbose;
1334-
settings.verbose = new_settings->verbose;
1341+
settings.verbose.store(new_settings->verbose);
13351342
perform_callbacks(ON_LOG_LEVEL, NULL, NULL);
13361343
settings.extensions.logger->log(EXTENSION_LOG_NOTICE, NULL,
13371344
"Changed verbosity from %d to %d", old_verbose,
1338-
settings.verbose);
1345+
settings.verbose.load());
13391346
}
13401347
}
13411348

daemon/memcached.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5657,7 +5657,7 @@ static void process_stat_settings(ADD_STAT add_stats, void *c) {
56575657
}
56585658
}
56595659

5660-
APPEND_STAT("verbosity", "%d", settings.verbose);
5660+
APPEND_STAT("verbosity", "%d", settings.verbose.load());
56615661
APPEND_STAT("num_threads", "%d", settings.num_threads);
56625662
APPEND_STAT("reqs_per_event_high_priority", "%d",
56635663
settings.reqs_per_event_high_priority);
@@ -7713,7 +7713,7 @@ static EXTENSION_LOGGER_DESCRIPTOR* get_logger(void)
77137713
static EXTENSION_LOG_LEVEL get_log_level(void)
77147714
{
77157715
EXTENSION_LOG_LEVEL ret;
7716-
switch (settings.verbose) {
7716+
switch (settings.verbose.load()) {
77177717
case 0: ret = EXTENSION_LOG_NOTICE; break;
77187718
case 1: ret = EXTENSION_LOG_INFO; break;
77197719
case 2: ret = EXTENSION_LOG_DEBUG; break;

daemon/settings.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919

2020
#include <memcached/engine.h>
2121

22-
#ifdef __cplusplus
23-
extern "C" {
24-
#endif
22+
#include <atomic>
2523

2624
/**
2725
* An enumeration with constants for the various protocols supported
@@ -94,7 +92,7 @@ struct settings {
9492
const char *rbac_file; /* The file containing RBAC information */
9593
bool rbac_privilege_debug; /* see manpage */
9694
bool require_sasl; /* require SASL auth */
97-
int verbose; /* level of versosity to log at. */
95+
std::atomic<int> verbose; /* level of versosity to log at. */
9896
int bio_drain_buffer_sz; /* size of the SSL bio buffers */
9997
bool datatype; /* is datatype support enabled? */
10098
const char *root; /* The root directory of the installation */
@@ -169,7 +167,3 @@ struct settings {
169167
};
170168

171169
extern struct settings settings;
172-
173-
#ifdef __cplusplus
174-
} // extern "C"
175-
#endif

0 commit comments

Comments
 (0)