Describe the bug
We are developing a static data race detection tool and detected a potential data race on the server.loading flag in redis version 6.0.7
To reproduce
If SIGINT is sent while the main thread is inside of loadDataFromDisk, there is a potential data race on the server.loading flag.
The main thread sets the flag while the signal handler may read the flag in parallel.
==== Found a race between:
line 1996 in rdb.c AND line 4852 in server.c
Shared variable:
at line 72 of server.c
72|struct redisServer server; /* Server global state */
Thread 1:
1994|void startLoading(size_t size, int rdbflags) {
1995| /* Load the DB */
>1996| server.loading = 1;
1997| server.loading_start_time = time(NULL);
1998| server.loading_loaded_bytes = 0;
>>>Stacktrace:
>>>main
>>> loadDataFromDisk [server.c:5272]
>>> loadAppendOnlyFile [server.c:4967]
>>> startLoadingFile [aof.c:740]
>>> startLoading [rdb.c:2020]
Thread 2:
4850| rdbRemoveTempFile(getpid());
4851| exit(1); /* Exit with an error since this was not a clean shutdown. */
>4852| } else if (server.loading) {
4853| serverLogFromHandler(LL_WARNING, "Received shutdown signal during loading, exiting now.");
4854| exit(0);
>>>Stacktrace:
>>>sigaction [server.c:4869]
>>> sigShutdownHandler [server.c:4869]
Expected behavior
Should the read/write to server.loading be made atomic?