From 8c0c00aae594b6094b94286bf854da9cac3df3f5 Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 22 Apr 2020 00:47:49 -0400 Subject: [PATCH] RDB load performance, eliminate useless reads Former-commit-id: 68e5d1850dbba89a87710968d314cb8c0d3cb562 --- src/db.cpp | 13 ++++++++----- src/server.cpp | 1 + src/server.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 65ab93900..b909bf310 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -210,13 +210,14 @@ robj *lookupKeyWriteOrReply(client *c, robj *key, robj *reply) { return o; } -bool dbAddCore(redisDb *db, robj *key, robj *val) { +bool dbAddCore(redisDb *db, robj *key, robj *val, bool fAssumeNew = false) { serverAssert(!val->FExpires()); sds copy = sdsdupshared(szFromObj(key)); - bool fInserted = db->insert(copy, val); if (g_pserver->fActiveReplica) val->mvcc_tstamp = key->mvcc_tstamp = getMvccTstamp(); + bool fInserted = db->insert(copy, val, fAssumeNew); + if (fInserted) { if (val->type == OBJ_LIST || @@ -307,7 +308,7 @@ int dbMerge(redisDb *db, robj *key, robj *val, int fReplace) } else { - return (dbAddCore(db, key, val) == true); + return (dbAddCore(db, key, val, true) == true); } } @@ -2175,10 +2176,12 @@ void redisDb::initialize(int id) this->setStorageProvider(g_pserver->m_pstorageFactory->create(id)); } -bool redisDbPersistentData::insert(char *key, robj *o) +bool redisDbPersistentData::insert(char *key, robj *o, bool fAssumeNew) { - ensure(key); + if (!fAssumeNew) + ensure(key); int res = dictAdd(m_pdict, key, o); + serverAssert(FImplies(fAssumeNew, res == DICT_OK)); if (res == DICT_OK) { if (m_pdbSnapshot != nullptr && m_pdbSnapshot->find_cached_threadsafe(key) != nullptr) diff --git a/src/server.cpp b/src/server.cpp index 81b60a119..1f465927c 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -5282,6 +5282,7 @@ void loadDataFromDisk(void) { serverLog(LL_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000); } else if (g_pserver->rdb_filename != NULL || g_pserver->rdb_s3bucketpath != NULL) { rdbSaveInfo rsi = RDB_SAVE_INFO_INIT; + rsi.fForceSetKey = false; if (rdbLoad(&rsi,RDBFLAGS_NONE) == C_OK) { serverLog(LL_NOTICE,"DB loaded from disk: %.3f seconds", (float)(ustime()-start)/1000000); diff --git a/src/server.h b/src/server.h index c35f3e91a..0c7d0f63b 100644 --- a/src/server.h +++ b/src/server.h @@ -1276,7 +1276,7 @@ public: void getStats(char *buf, size_t bufsize) { dictGetStats(buf, bufsize, m_pdict); } void getExpireStats(char *buf, size_t bufsize) { m_setexpire->getstats(buf, bufsize); } - bool insert(char *k, robj *o); + bool insert(char *k, robj *o, bool fAssumeNew = false); void tryResize(); int incrementallyRehash(); void updateValue(dict_iter itr, robj *val);