From cec7f98f340c7f8d8714db6b7ded8b66ec0396ae Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:07:35 +0000 Subject: [PATCH 1/8] Use correct make flags Former-commit-id: 682990eeb31046b8c1f41012b3039cfad71b8bea --- .github/workflows/ci.yml | 6 +- .github/workflows/daily.yml | 308 ------------------------------------ 2 files changed, 3 insertions(+), 311 deletions(-) delete mode 100644 .github/workflows/daily.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d0f8388f..bce8f20b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: run: | sudo apt-get update sudo apt-get -y install uuid-dev libcurl4-openssl-dev - make REDIS_CFLAGS='-Werror' BUILD_TLS=yes -j2 + make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' BUILD_TLS=yes -j2 - name: gen-cert run: ./utils/gen-test-certs.sh - name: test-tls @@ -44,7 +44,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: make - run: make REDIS_CFLAGS='-Werror' -j2 + run: make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' -j2 build-libc-malloc: runs-on: ubuntu-latest @@ -54,5 +54,5 @@ jobs: run: | sudo apt-get update sudo apt-get -y install uuid-dev libcurl4-openssl-dev - make REDIS_CFLAGS='-Werror' MALLOC=libc -j2 + make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' MALLOC=libc -j2 diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml deleted file mode 100644 index ee9ac1bbf..000000000 --- a/.github/workflows/daily.yml +++ /dev/null @@ -1,308 +0,0 @@ -name: Daily - -on: - pull_request: - branches: - # any PR to a release branch. - - '[0-9].[0-9]' - schedule: - - cron: '0 0 * * *' - -jobs: - - test-ubuntu-jemalloc: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make REDIS_CFLAGS='-Werror -DREDIS_TEST' - - name: test - run: | - sudo apt-get install tcl8.6 - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - name: unittest - run: ./src/redis-server test all - - test-ubuntu-libc-malloc: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make MALLOC=libc - - name: test - run: | - sudo apt-get install tcl8.6 - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - test-ubuntu-no-malloc-usable-size: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make MALLOC=libc CFLAGS=-DNO_MALLOC_USABLE_SIZE - - name: test - run: | - sudo apt-get install tcl8.6 - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - test-ubuntu-32bit: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: | - sudo apt-get update && sudo apt-get install libc6-dev-i386 - make 32bit REDIS_CFLAGS='-Werror -DREDIS_TEST' - - name: test - run: | - sudo apt-get install tcl8.6 - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: | - make -C tests/modules 32bit # the script below doesn't have an argument, we must build manually ahead of time - ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - name: unittest - run: ./src/redis-server test all - - test-ubuntu-tls: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: | - make BUILD_TLS=yes - - name: test - run: | - sudo apt-get install tcl8.6 tcl-tls - ./utils/gen-test-certs.sh - ./runtest --accurate --verbose --tls --dump-logs - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: | - ./runtest-moduleapi --verbose --tls - ./runtest-moduleapi --verbose - - name: sentinel tests - run: | - ./runtest-sentinel --tls - ./runtest-sentinel - - name: cluster tests - run: | - ./runtest-cluster --tls - ./runtest-cluster - - test-ubuntu-io-threads: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: | - make - - name: test - run: | - sudo apt-get install tcl8.6 tcl-tls - ./runtest --config io-threads 4 --config io-threads-do-reads yes --accurate --verbose --tags network --dump-logs - - name: cluster tests - run: | - ./runtest-cluster --config io-threads 4 --config io-threads-do-reads yes - - test-valgrind: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make valgrind REDIS_CFLAGS='-Werror -DREDIS_TEST' - - name: test - run: | - sudo apt-get update - sudo apt-get install tcl8.6 valgrind -y - ./runtest --valgrind --verbose --clients 1 --dump-logs - - name: module api test - run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 - - name: unittest - run: | - valgrind --track-origins=yes --suppressions=./src/valgrind.sup --show-reachable=no --show-possibly-lost=no --leak-check=full --log-file=err.txt ./src/redis-server test all - if grep -q 0x err.txt; then cat err.txt; exit 1; fi - - test-valgrind-no-malloc-usable-size: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE" - - name: test - run: | - sudo apt-get update - sudo apt-get install tcl8.6 valgrind -y - ./runtest --valgrind --verbose --clients 1 --dump-logs - - name: module api test - run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 - - test-centos7-jemalloc: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - container: centos:7 - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: | - yum -y install gcc make - make - - name: test - run: | - yum -y install which tcl - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - test-centos7-tls: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - container: centos:7 - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: | - yum -y install centos-release-scl epel-release - yum -y install devtoolset-7 openssl-devel openssl - scl enable devtoolset-7 "make BUILD_TLS=yes" - - name: test - run: | - yum -y install tcl tcltls - ./utils/gen-test-certs.sh - ./runtest --accurate --verbose --tls --dump-logs - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: | - ./runtest-moduleapi --verbose --tls - ./runtest-moduleapi --verbose - - name: sentinel tests - run: | - ./runtest-sentinel --tls - ./runtest-sentinel - - name: cluster tests - run: | - ./runtest-cluster --tls - ./runtest-cluster - - test-macos-latest: - runs-on: macos-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: make - run: make - - name: test - run: | - ./runtest --accurate --verbose --no-latency --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - test-freebsd: - runs-on: macos-latest - if: github.repository == 'redis/redis' - timeout-minutes: 14400 - steps: - - uses: actions/checkout@v2 - - name: test - uses: vmactions/freebsd-vm@v0.1.2 - with: - usesh: true - sync: rsync - prepare: pkg install -y bash gmake lang/tcl86 - run: > - gmake && - ./runtest --accurate --verbose --no-latency --dump-logs && - MAKE=gmake ./runtest-moduleapi --verbose && - ./runtest-sentinel && - ./runtest-cluster - - test-alpine-jemalloc: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - container: alpine:latest - steps: - - uses: actions/checkout@v2 - - name: make - run: | - apk add build-base - make REDIS_CFLAGS='-Werror' - - name: test - run: | - apk add tcl procps - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster - - test-alpine-libc-malloc: - runs-on: ubuntu-latest - if: github.repository == 'redis/redis' - container: alpine:latest - steps: - - uses: actions/checkout@v2 - - name: make - run: | - apk add build-base - make REDIS_CFLAGS='-Werror' USE_JEMALLOC=no CFLAGS=-DUSE_MALLOC_USABLE_SIZE - - name: test - run: | - apk add tcl procps - ./runtest --accurate --verbose --dump-logs - - name: module api test - run: ./runtest-moduleapi --verbose - - name: sentinel tests - run: ./runtest-sentinel - - name: cluster tests - run: ./runtest-cluster From 589e95e0c8cced91247b7a3df069a779893544af Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:07:46 +0000 Subject: [PATCH 2/8] Don't have dangling expires Former-commit-id: 83c8977033d79b6ec69e677dff19f68df53535be --- src/lazyfree.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/lazyfree.cpp b/src/lazyfree.cpp index a8f84c0cb..9e997ab57 100644 --- a/src/lazyfree.cpp +++ b/src/lazyfree.cpp @@ -152,6 +152,13 @@ int dbAsyncDelete(redisDb *db, robj *key) { if (de) { robj *val = (robj*)dictGetVal(de); + if (val->FExpires()) + { + /* Deleting an entry from the expires dict will not free the sds of + * the key, because it is shared with the main dictionary. */ + removeExpireCore(db,key,de); + } + /* Tells the module that the key has been unlinked from the database. */ moduleNotifyKeyUnlink(key,val); From 1d0378e0dc3a56c4c76130538a39565b74001217 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:08:14 +0000 Subject: [PATCH 3/8] Make processClients reentrant Former-commit-id: e39bdb58ec28d80c5ed2cf15ef6bc7b884e14d4b --- src/networking.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/networking.cpp b/src/networking.cpp index bc76ce662..45d43f063 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -2573,7 +2573,9 @@ void processClients() { serverAssert(GlobalLocksAcquired()); - for (client *c : serverTL->vecclientsProcess) { + while (!serverTL->vecclientsProcess.empty()) { + client *c = serverTL->vecclientsProcess.front(); + serverTL->vecclientsProcess.erase(serverTL->vecclientsProcess.begin()); /* There is more data in the client input buffer, continue parsing it * in case to check if there is a full command to execute. */ std::unique_lock ul(c->lock); From bf77b1a03a8337367c701bb808ccd0f34a107aee Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:08:43 +0000 Subject: [PATCH 4/8] ProcessingEventsWhileBlocked is relevant only to the current thread Former-commit-id: b400be68b7a45e73ea851c11dfee3fdcbacb4794 --- src/networking.cpp | 2 +- src/server.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/networking.cpp b/src/networking.cpp index 45d43f063..7710dd64b 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -40,7 +40,7 @@ #include "aelocker.h" static void setProtocolError(const char *errstr, client *c); -std::atomic ProcessingEventsWhileBlocked {0}; /* See processEventsWhileBlocked(). */ +__thread int ProcessingEventsWhileBlocked = 0; /* See processEventsWhileBlocked(). */ /* Return the size consumed from the allocator, for the specified SDS string, * including internal fragmentation. This function is used in order to compute diff --git a/src/server.cpp b/src/server.cpp index a4ba338eb..a57b449e8 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2471,7 +2471,7 @@ void whileBlockedCron() { latencyAddSampleIfNeeded("while-blocked-cron",latency); } -extern std::atomic ProcessingEventsWhileBlocked; +extern __thread int ProcessingEventsWhileBlocked; /* This function gets called every time Redis is entering the * main loop of the event driven library, that is, before to sleep From f6067d16648e33ac1fb6f7c811394afbb4f9c13b Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:08:52 +0000 Subject: [PATCH 5/8] Remove dup'd code from merge Former-commit-id: 807f0201845a698514f1ce9382338bc74ba57e5e --- src/server.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index a57b449e8..053c9ff1b 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2341,12 +2341,6 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { * the operation even if completely idle. */ if (g_pserver->tracking_clients) trackingLimitUsedSlots(); - /* Resize tracking keys table if needed. This is also done at every - * command execution, but we want to be sure that if the last command - * executed changes the value via CONFIG SET, the server will perform - * the operation even if completely idle. */ - if (g_pserver->tracking_clients) trackingLimitUsedSlots(); - /* Start a scheduled BGSAVE if the corresponding flag is set. This is * useful when we are forced to postpone a BGSAVE because an AOF * rewrite is in progress. @@ -2928,10 +2922,6 @@ void initServerConfig(void) { for (j = 0; j < CONFIG_OOM_COUNT; j++) g_pserver->oom_score_adj_values[j] = configOOMScoreAdjValuesDefaults[j]; - /* Linux OOM Score config */ - for (j = 0; j < CONFIG_OOM_COUNT; j++) - g_pserver->oom_score_adj_values[j] = configOOMScoreAdjValuesDefaults[j]; - /* Double constants initialization */ R_Zero = 0.0; R_PosInf = 1.0/R_Zero; From 4e70e85ab84f54989ccb673ebe03ab7d040e7532 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 01:19:12 +0000 Subject: [PATCH 6/8] Fix failover command test failures Former-commit-id: d3c37c7159a92319759a33851669862a82cf1b28 --- src/networking.cpp | 8 ++++---- src/server.cpp | 9 +++++---- src/server.h | 2 +- tests/integration/failover.tcl | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/networking.cpp b/src/networking.cpp index 7710dd64b..b775e2435 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -3742,8 +3742,8 @@ void flushSlavesOutputBuffers(void) { * In such a case, the duration is set to the maximum and new end time and the * type is set to the more restrictive type of pause. */ void pauseClients(mstime_t end, pause_type type) { - if (type > serverTL->client_pause_type) { - serverTL->client_pause_type = type; + if (type > g_pserver->client_pause_type) { + g_pserver->client_pause_type = type; } if (end > g_pserver->client_pause_end_time) { @@ -3766,7 +3766,7 @@ void unpauseClients(void) { listIter li; client *c; - serverTL->client_pause_type = CLIENT_PAUSE_OFF; + g_pserver->client_pause_type = CLIENT_PAUSE_OFF; /* Unblock all of the clients so they are reprocessed. */ listRewind(g_pserver->paused_clients,&li); @@ -3779,7 +3779,7 @@ void unpauseClients(void) { /* Returns true if clients are paused and false otherwise. */ int areClientsPaused(void) { - return serverTL->client_pause_type != CLIENT_PAUSE_OFF; + return g_pserver->client_pause_type != CLIENT_PAUSE_OFF; } /* Checks if the current client pause has elapsed and unpause clients diff --git a/src/server.cpp b/src/server.cpp index 053c9ff1b..5b481667d 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2576,7 +2576,8 @@ void beforeSleep(struct aeEventLoop *eventLoop) { /* We may have recieved updates from clients about their current offset. NOTE: * this can't be done where the ACK is recieved since failover will disconnect * our clients. */ - updateFailoverStatus(); + if (iel == IDX_EVENT_LOOP_MAIN) + updateFailoverStatus(); /* Send the invalidation messages to clients participating to the * client side caching protocol in broadcasting (BCAST) mode. */ @@ -3426,7 +3427,6 @@ static void initServerThread(struct redisServerThreadVars *pvar, int fMain) pvar->cclients = 0; pvar->in_eval = 0; pvar->in_exec = 0; - pvar->client_pause_type = CLIENT_PAUSE_OFF; pvar->el = aeCreateEventLoop(g_pserver->maxclients+CONFIG_FDSET_INCR); aeSetBeforeSleepProc(pvar->el, beforeSleep, AE_SLEEP_THREADSAFE); aeSetAfterSleepProc(pvar->el, afterSleep, AE_SLEEP_THREADSAFE); @@ -3518,6 +3518,7 @@ void initServer(void) { g_pserver->blocked_last_cron = 0; g_pserver->replication_allowed = 1; g_pserver->blocking_op_nesting = 0; + g_pserver->client_pause_type = CLIENT_PAUSE_OFF; if ((g_pserver->tls_port || g_pserver->tls_replication || g_pserver->tls_cluster) @@ -4529,8 +4530,8 @@ int processCommand(client *c, int callFlags) { /* If the server is paused, block the client until * the pause has ended. Replicas are never paused. */ if (!(c->flags & CLIENT_SLAVE) && - ((serverTL->client_pause_type == CLIENT_PAUSE_ALL) || - (serverTL->client_pause_type == CLIENT_PAUSE_WRITE && is_may_replicate_command))) + ((g_pserver->client_pause_type == CLIENT_PAUSE_ALL) || + (g_pserver->client_pause_type == CLIENT_PAUSE_WRITE && is_may_replicate_command))) { c->bpop.timeout = 0; blockClient(c,BLOCKED_PAUSE); diff --git a/src/server.h b/src/server.h index 23588ffa5..b5e9c0d02 100644 --- a/src/server.h +++ b/src/server.h @@ -1480,7 +1480,6 @@ struct redisServerThreadVars { aeEventLoop *el; socketFds ipfd; /* TCP socket file descriptors */ socketFds tlsfd; /* TLS socket file descriptors */ - pause_type client_pause_type; /* True if clients are currently paused */ int in_eval; /* Are we inside EVAL? */ int in_exec; /* Are we inside EXEC? */ std::vector clients_pending_write; /* There is to write or install handler. */ @@ -1620,6 +1619,7 @@ struct redisServer { int propagate_in_transaction; /* Make sure we don't propagate nested MULTI/EXEC */ char *ignore_warnings; /* Config: warnings that should be ignored. */ int client_pause_in_transaction; /* Was a client pause executed during this Exec? */ + pause_type client_pause_type; /* True if clients are currently paused */ /* Modules */ ::dict *moduleapi; /* Exported core APIs dictionary for modules. */ ::dict *sharedapi; /* Like moduleapi but containing the APIs that diff --git a/tests/integration/failover.tcl b/tests/integration/failover.tcl index c6818700d..5d8aaf706 100644 --- a/tests/integration/failover.tcl +++ b/tests/integration/failover.tcl @@ -279,6 +279,7 @@ start_server {} { assert_match *slave* [$node_2 role] # We will cycle all of our replicas here and force a psync. + after 100 assert_equal [expr [s 0 sync_partial_ok] - $initial_psyncs] 2 assert_equal [expr [s 0 sync_full] - $initial_syncs] 0 From ef5bf1fdd7c71ddafed32e10d658843f31756901 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 29 May 2021 02:22:20 +0000 Subject: [PATCH 7/8] Prevent partial sync in test that requires only full syncs Former-commit-id: 1b9fea066914d7f23d6bec220f26b8c0112d7f8b --- tests/integration/replication.tcl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/integration/replication.tcl b/tests/integration/replication.tcl index 3609ae483..4e4b39a6a 100644 --- a/tests/integration/replication.tcl +++ b/tests/integration/replication.tcl @@ -530,8 +530,7 @@ test {diskless loading short read} { $master multi $master client kill type replica $master set asdf asdf - # the side effect of resizing the backlog is that it is flushed (16k is the min size) - $master config set repl-backlog-size [expr {16384 + $i}] + $master debug truncate-repl-backlog $master exec } # wait for loading to stop (fail) From 1b29ba5873314e4c9de1bf285a7984cc22054c59 Mon Sep 17 00:00:00 2001 From: John Sully Date: Fri, 28 May 2021 22:40:03 -0400 Subject: [PATCH 8/8] Mac build break fixes Former-commit-id: 083b54472c65239b03c8a17f6b1ae6447d273e9a --- src/config.h | 5 ++++- src/fastlock.cpp | 4 ++++ src/fastlock.h | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/config.h b/src/config.h index addb9c3f4..0475ee7d5 100644 --- a/src/config.h +++ b/src/config.h @@ -256,7 +256,10 @@ void setproctitle(const char *fmt, ...); #define redis_set_thread_title(name) rename_thread(find_thread(0), name) #else #if (defined __APPLE__ && defined(MAC_OS_X_VERSION_10_7)) -extern "C" int pthread_setname_np(const char *name); +#ifdef __cplusplus +extern "C" +#endif +int pthread_setname_np(const char *name); #include #define redis_set_thread_title(name) pthread_setname_np(name) #else diff --git a/src/fastlock.cpp b/src/fastlock.cpp index 789c07caa..c61f95aac 100644 --- a/src/fastlock.cpp +++ b/src/fastlock.cpp @@ -304,6 +304,10 @@ uint64_t fastlock_getlongwaitcount() extern "C" void fastlock_sleep(fastlock *lock, pid_t pid, unsigned wake, unsigned myticket) { + UNUSED(lock); + UNUSED(pid); + UNUSED(wake); + UNUSED(myticket); #ifdef __linux__ g_dlock.registerwait(lock, pid); unsigned mask = (1U << (myticket % 32)); diff --git a/src/fastlock.h b/src/fastlock.h index ede6d4e16..72da9583b 100644 --- a/src/fastlock.h +++ b/src/fastlock.h @@ -93,4 +93,5 @@ struct fastlock #ifdef __cplusplus static_assert(offsetof(struct fastlock, m_ticket) == 64, "ensure padding is correct"); -#endif \ No newline at end of file +#endif +