Change server.daylight_active to an atomic variable (#876)
We are updating this variable in the main thread, and the child threads can printing the logs at the same time. This generating a warning in SANITIZER=thread: ``` WARNING: ThreadSanitizer: data race (pid=74208) Read of size 4 at 0x000102875c10 by thread T3: #0 serverLogRaw <null>:52173615 (valkey-server:x86_64+0x10003c556) #1 _serverLog <null>:52173615 (valkey-server:x86_64+0x10003ca89) #2 bioProcessBackgroundJobs <null>:52173615 (valkey-server:x86_64+0x1001402c9) Previous write of size 4 at 0x000102875c10 by main thread (mutexes: write M0): #0 afterSleep <null>:52173615 (valkey-server:x86_64+0x10004989b) #1 aeProcessEvents <null>:52173615 (valkey-server:x86_64+0x100031e52) #2 main <null>:52173615 (valkey-server:x86_64+0x100064a3c) #3 start <null>:52173615 (dyld:x86_64+0xfffffffffff5c365) #4 start <null>:52173615 (dyld:x86_64+0xfffffffffff5c365) ``` The refresh of daylight_active is not real time, we update it in aftersleep, so we don't need a strong synchronization, so using memory_order_relaxed. But also noted we are doing load/store operations only for daylight_active, which is an aligned 32-bit integer, so using memory_order_relaxed will not provide more consistency than what we have today. So this is just a cleanup that to clear the warning. Signed-off-by: Binbin <binloveplay1314@qq.com>
This commit is contained in:
parent
6cb86fff51
commit
370bdb3e46
@ -131,10 +131,11 @@ void serverLogRaw(int level, const char *msg) {
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
int role_char;
|
int role_char;
|
||||||
pid_t pid = getpid();
|
pid_t pid = getpid();
|
||||||
|
int daylight_active = atomic_load_explicit(&server.daylight_active, memory_order_relaxed);
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
nolocks_localtime(&tm, tv.tv_sec, server.timezone, server.daylight_active);
|
nolocks_localtime(&tm, tv.tv_sec, server.timezone, daylight_active);
|
||||||
off = strftime(buf, sizeof(buf), "%d %b %Y %H:%M:%S.", &tm);
|
off = strftime(buf, sizeof(buf), "%d %b %Y %H:%M:%S.", &tm);
|
||||||
snprintf(buf + off, sizeof(buf) - off, "%03d", (int)tv.tv_usec / 1000);
|
snprintf(buf + off, sizeof(buf) - off, "%03d", (int)tv.tv_usec / 1000);
|
||||||
if (server.sentinel_mode) {
|
if (server.sentinel_mode) {
|
||||||
@ -1091,7 +1092,7 @@ static inline void updateCachedTimeWithUs(int update_daylight_info, const long l
|
|||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t ut = server.unixtime;
|
time_t ut = server.unixtime;
|
||||||
localtime_r(&ut, &tm);
|
localtime_r(&ut, &tm);
|
||||||
server.daylight_active = tm.tm_isdst;
|
atomic_store_explicit(&server.daylight_active, tm.tm_isdst, memory_order_relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2114,7 +2114,7 @@ struct valkeyServer {
|
|||||||
/* time cache */
|
/* time cache */
|
||||||
time_t unixtime; /* Unix time sampled every cron cycle. */
|
time_t unixtime; /* Unix time sampled every cron cycle. */
|
||||||
time_t timezone; /* Cached timezone. As set by tzset(). */
|
time_t timezone; /* Cached timezone. As set by tzset(). */
|
||||||
int daylight_active; /* Currently in daylight saving time. */
|
_Atomic int daylight_active; /* Currently in daylight saving time. */
|
||||||
mstime_t mstime; /* 'unixtime' in milliseconds. */
|
mstime_t mstime; /* 'unixtime' in milliseconds. */
|
||||||
ustime_t ustime; /* 'unixtime' in microseconds. */
|
ustime_t ustime; /* 'unixtime' in microseconds. */
|
||||||
mstime_t cmd_time_snapshot; /* Time snapshot of the root execution nesting. */
|
mstime_t cmd_time_snapshot; /* Time snapshot of the root execution nesting. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user