From ed77abee5e2e31732ea0c18ea6059e1b0d12ab15 Mon Sep 17 00:00:00 2001 From: benschermel Date: Sun, 12 Jul 2020 18:08:29 -0400 Subject: [PATCH 1/5] update rpm permissions Former-commit-id: 7aec1e5c6463ea77d27833c66e124e8184c4a123 --- pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb-sentinel.conf | 0 pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb.conf | 0 pkg/rpm/keydb_build/keydb_rpm/etc/logrotate.d/keydb | 0 .../etc/systemd/system/keydb-sentinel.service.d/limit.conf | 0 .../keydb_rpm/etc/systemd/system/keydb.service.d/limit.conf | 0 .../keydb_rpm/usr/lib/systemd/system/keydb-sentinel.service | 0 .../keydb_build/keydb_rpm/usr/lib/systemd/system/keydb.service | 0 pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING | 0 .../keydb_rpm/usr/share/licenses/keydb/COPYING-hiredis | 0 .../keydb_rpm/usr/share/licenses/keydb/COPYING-jemalloc | 0 .../keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYRIGHT-lua | 0 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb-sentinel.conf mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb.conf mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/etc/logrotate.d/keydb mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb-sentinel.service.d/limit.conf mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb.service.d/limit.conf mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb-sentinel.service mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb.service mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-hiredis mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-jemalloc mode change 100755 => 100644 pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYRIGHT-lua diff --git a/pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb-sentinel.conf b/pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb-sentinel.conf old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb.conf b/pkg/rpm/keydb_build/keydb_rpm/etc/keydb/keydb.conf old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/etc/logrotate.d/keydb b/pkg/rpm/keydb_build/keydb_rpm/etc/logrotate.d/keydb old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb-sentinel.service.d/limit.conf b/pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb-sentinel.service.d/limit.conf old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb.service.d/limit.conf b/pkg/rpm/keydb_build/keydb_rpm/etc/systemd/system/keydb.service.d/limit.conf old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb-sentinel.service b/pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb-sentinel.service old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb.service b/pkg/rpm/keydb_build/keydb_rpm/usr/lib/systemd/system/keydb.service old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING b/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-hiredis b/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-hiredis old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-jemalloc b/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYING-jemalloc old mode 100755 new mode 100644 diff --git a/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYRIGHT-lua b/pkg/rpm/keydb_build/keydb_rpm/usr/share/licenses/keydb/COPYRIGHT-lua old mode 100755 new mode 100644 From fc119b3e56848e67729c2c9f814e213f624648f1 Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 1 Jul 2020 21:59:00 -0400 Subject: [PATCH 2/5] Remove unnecessary work from critical path (Latency Fixes) Former-commit-id: 096a90deb7afe489875d3186f3f8f43e41fea329 --- src/server.cpp | 22 +++++++++++++++++++--- src/server.h | 3 +++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 92e775e2d..ea8aed59b 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2306,6 +2306,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { g_pserver->rdb_bgsave_scheduled = 0; } +<<<<<<< HEAD if (cserver.storage_memory_model == STORAGE_WRITEBACK && g_pserver->m_pstorageFactory) { run_with_period(g_pserver->storage_flush_period) { flushStorageWeak(); @@ -2316,6 +2317,15 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { g_pserver->db[0]->consolidate_snapshot(); }, true /*HiPri*/); +======= + if (g_pserver->db[0]->FSnapshot()) // BUG only db 0?! + { + g_pserver->asyncworkqueue->AddWorkFunction([]{ + g_pserver->db[0]->consolidate_snapshot(); + }, true /*HiPri*/); + } + +>>>>>>> dd700f1d6... Remove unnecessary work from critical path (Latency Fixes) /* Fire the cron loop modules event. */ RedisModuleCronLoopV1 ei = {REDISMODULE_CRON_LOOP_VERSION,g_pserver->hz}; moduleFireServerEvent(REDISMODULE_EVENT_CRON_LOOP, @@ -2441,7 +2451,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) { static thread_local bool fFirstRun = true; // note: we also copy the DB pointer in case a DB swap is done while the lock is released std::vector vecdb; // note we cache the database pointer in case a dbswap is done while the lock is released - if (cserver.storage_memory_model == STORAGE_WRITETHROUGH) + if (cserver.storage_memory_model == STORAGE_WRITETHROUGH && g_pserver->m_pstorageFactory != nullptr) { if (!fFirstRun) { mstime_t storage_process_latency; @@ -2462,8 +2472,11 @@ void beforeSleep(struct aeEventLoop *eventLoop) { mstime_t commit_latency; latencyStartMonitor(commit_latency); - for (redisDb *db : vecdb) - db->commitChanges(); + if (g_pserver->m_pstorageFactory != nullptr) + { + for (redisDb *db : vecdb) + db->commitChanges(); + } latencyEndMonitor(commit_latency); latencyAddSampleIfNeeded("storage-commit", commit_latency); @@ -4150,6 +4163,7 @@ int processCommand(client *c, int callFlags, AeLocker &locker) { queueMultiCommand(c); addReply(c,shared.queued); } else { +<<<<<<< HEAD #if 0 if (cserver.cthreads >= 2 && !g_fTestMode && g_pserver->m_pstorageFactory == nullptr && listLength(g_pserver->monitors) == 0 && c->cmd->proc == getCommand) { @@ -4157,6 +4171,8 @@ int processCommand(client *c, int callFlags, AeLocker &locker) { return C_OK; } #endif +======= +>>>>>>> dd700f1d6... Remove unnecessary work from critical path (Latency Fixes) locker.arm(c); incrementMvccTstamp(); call(c,callFlags); diff --git a/src/server.h b/src/server.h index 1878bcb44..b96d1bd25 100644 --- a/src/server.h +++ b/src/server.h @@ -1350,6 +1350,8 @@ public: bool removeCachedValue(const char *key); void removeAllCachedValues(); + bool FSnapshot() const { return m_spdbSnapshotHOLDER != nullptr; } + dict_iter find_cached_threadsafe(const char *key) const; protected: @@ -1425,6 +1427,7 @@ public: using redisDbPersistentData::endSnapshotAsync; using redisDbPersistentData::end; using redisDbPersistentData::find_cached_threadsafe; + using redisDbPersistentData::FSnapshot; dict_iter random_cache_threadsafe(bool fPrimaryOnly = false) const; From af10f809b4818b3ceb6bd2efdbfb5706e9dbcb1f Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 1 Jul 2020 21:58:35 -0400 Subject: [PATCH 3/5] unoredered_map is faster, reduce latency with the switch Former-commit-id: f241e435ed0fd2988ada887f02e19884fd82be51 --- src/gc.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gc.h b/src/gc.h index 9717dcbee..d2c4066f7 100644 --- a/src/gc.h +++ b/src/gc.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include template class GarbageCollector @@ -99,6 +100,6 @@ private: fastlock m_lock { "Garbage Collector"}; std::vector m_vecepochs; - std::set m_setepochOutstanding; + std::unordered_set m_setepochOutstanding; uint64_t m_epochNext = 0; }; \ No newline at end of file From ad5ad528418ca1b2c325e2be3e7994efbcc96f9b Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 13 Jul 2020 16:09:03 +0000 Subject: [PATCH 4/5] Build fixes from cherry-pick Former-commit-id: 70efd87cf71bb230e8b53d1c4ed3dd91997b4d23 --- src/server.cpp | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index ea8aed59b..08f8a178e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2306,26 +2306,22 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { g_pserver->rdb_bgsave_scheduled = 0; } -<<<<<<< HEAD if (cserver.storage_memory_model == STORAGE_WRITEBACK && g_pserver->m_pstorageFactory) { run_with_period(g_pserver->storage_flush_period) { flushStorageWeak(); } } - g_pserver->asyncworkqueue->AddWorkFunction([]{ - g_pserver->db[0]->consolidate_snapshot(); - }, true /*HiPri*/); - -======= - if (g_pserver->db[0]->FSnapshot()) // BUG only db 0?! + bool fAnySnapshots = false; + for (int idb = 0; idb < cserver.dbnum && !fAnySnapshots; ++idb) + fAnySnapshots = fAnySnapshots || g_pserver->db[0]->FSnapshot(); + if (fAnySnapshots) { g_pserver->asyncworkqueue->AddWorkFunction([]{ g_pserver->db[0]->consolidate_snapshot(); }, true /*HiPri*/); } - ->>>>>>> dd700f1d6... Remove unnecessary work from critical path (Latency Fixes) + /* Fire the cron loop modules event. */ RedisModuleCronLoopV1 ei = {REDISMODULE_CRON_LOOP_VERSION,g_pserver->hz}; moduleFireServerEvent(REDISMODULE_EVENT_CRON_LOOP, @@ -4163,16 +4159,6 @@ int processCommand(client *c, int callFlags, AeLocker &locker) { queueMultiCommand(c); addReply(c,shared.queued); } else { -<<<<<<< HEAD -#if 0 - if (cserver.cthreads >= 2 && !g_fTestMode && g_pserver->m_pstorageFactory == nullptr && listLength(g_pserver->monitors) == 0 && c->cmd->proc == getCommand) - { - if (getCommandAsync(c)) - return C_OK; - } -#endif -======= ->>>>>>> dd700f1d6... Remove unnecessary work from critical path (Latency Fixes) locker.arm(c); incrementMvccTstamp(); call(c,callFlags); From 503ca68e8c20bb5bd45631e689ff3ac075a5457d Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 13 Jul 2020 18:14:52 +0000 Subject: [PATCH 5/5] Perf fixes on expire lock Former-commit-id: 7f23ac087720317f54a0bc0e0c4774e7b0ef4337 --- src/aof.cpp | 7 +++---- src/db.cpp | 6 +++--- src/rdb.cpp | 13 ++++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/aof.cpp b/src/aof.cpp index 6ed5652b0..d7094e54f 100644 --- a/src/aof.cpp +++ b/src/aof.cpp @@ -1460,9 +1460,9 @@ int rewriteAppendOnlyFileRio(rio *aof) { serverPanic("Unknown object type"); } /* Save the expire time */ - std::unique_lock ul(g_expireLock); - expireEntry *pexpire = db->getExpire(&key); - if (pexpire != nullptr) { + if (o->FExpires()) { + std::unique_lock ul(g_expireLock); + expireEntry *pexpire = db->getExpire(&key); for (auto &subExpire : *pexpire) { if (subExpire.subkey() == nullptr) { @@ -1480,7 +1480,6 @@ int rewriteAppendOnlyFileRio(rio *aof) { if (rioWriteBulkLongLong(aof,subExpire.when()) == 0) return false; // common } } - ul.unlock(); /* Read some diff from the parent process from time to time. */ if (aof->processed_bytes > processed+AOF_READ_DIFF_INTERVAL_BYTES) { diff --git a/src/db.cpp b/src/db.cpp index ab9bb64d4..c892e765f 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -1738,15 +1738,15 @@ void propagateSubkeyExpire(redisDb *db, int type, robj *key, robj *subkey) /* Check if the key is expired. Note, this does not check subexpires */ int keyIsExpired(const redisDbPersistentDataSnapshot *db, robj *key) { + /* Don't expire anything while loading. It will be done later. */ + if (g_pserver->loading) return 0; + std::unique_lock ul(g_expireLock); const expireEntry *pexpire = db->getExpire(key); mstime_t now; if (pexpire == nullptr) return 0; /* No expire for this key */ - /* Don't expire anything while loading. It will be done later. */ - if (g_pserver->loading) return 0; - long long when = -1; for (auto &exp : *pexpire) { diff --git a/src/rdb.cpp b/src/rdb.cpp index 68435d347..2bee255d1 100644 --- a/src/rdb.cpp +++ b/src/rdb.cpp @@ -1150,11 +1150,14 @@ int saveKey(rio *rdb, const redisDbPersistentDataSnapshot *db, int flags, size_t robj key; initStaticStringObject(key,(char*)keystr); - std::unique_lock ul(g_expireLock); - const expireEntry *pexpire = db->getExpire(&key); - serverAssert((o->FExpires() && pexpire != nullptr) || (!o->FExpires() && pexpire == nullptr)); - if (pexpire == nullptr) - ul.unlock(); // no need to hold the lock if we're not saving the expire + std::unique_lock ul(g_expireLock, std::defer_lock); + const expireEntry *pexpire = nullptr; + if (o->FExpires()) + { + ul.lock(); + pexpire = db->getExpire(&key); + serverAssert((o->FExpires() && pexpire != nullptr) || (!o->FExpires() && pexpire == nullptr)); + } if (rdbSaveKeyValuePair(rdb,&key,o,pexpire) == -1) return 0;