From 73a9564d27fffccd6e72b661bc38ae5092066147 Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 9 Dec 2019 21:07:37 -0500 Subject: [PATCH] Make the storage provider configurable, and show it in the info command Former-commit-id: e201ce622ff3c7832d03c6b5759386f0efc23cdf --- src/IStorage.h | 1 + src/config.cpp | 38 ++++++++++++++++++++++++++++++++++ src/server.cpp | 10 ++++----- src/storage/rocksdbfactory.cpp | 6 ++++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/IStorage.h b/src/IStorage.h index ebe94e19b..f3ea50864 100644 --- a/src/IStorage.h +++ b/src/IStorage.h @@ -6,6 +6,7 @@ class IStorageFactory public: virtual ~IStorageFactory() {} virtual class IStorage *create(int db) = 0; + virtual const char *name() const = 0; }; class IStorage diff --git a/src/config.cpp b/src/config.cpp index 2ac46da6d..e68a385b1 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -29,10 +29,13 @@ */ #include "server.h" +#include "storage/rocksdbfactory.h" #include "cluster.h" #include #include +#include + const char *KEYDB_SET_VERSION = KEYDB_REAL_VERSION; @@ -212,6 +215,38 @@ void queueLoadModule(sds path, sds *argv, int argc) { listAddNodeTail(g_pserver->loadmodule_queue,loadmod); } +static bool initializeStorageProvider(sds *argv, int argc, const char **err) +{ + bool fResult = false; + if (!strcasecmp(argv[0], "flash") && argc == 2) + { + // Create The Storage Factory (if necessary) + g_pserver->m_pstorageFactory = CreateRocksDBStorageFactory(argv[1], cserver.dbnum); + fResult = true; + } + + if (fResult) + { + // We need to set max memory to a sane default so keys are actually evicted properly + if (g_pserver->maxmemory == 0) + { + struct sysinfo sys; + if (sysinfo(&sys) == 0) + { + // By default it's half the memory. This gives sufficient room for background saving + g_pserver->maxmemory = sys.totalram / 2; + if (g_pserver->maxmemory_policy == MAXMEMORY_NO_EVICTION) + g_pserver->maxmemory_policy = MAXMEMORY_ALLKEYS_LRU; + } + } + } + else + { + *err = "Unknown storage provider"; + } + return fResult; +} + void loadServerConfigFromString(char *config) { const char *err = NULL; int linenum = 0, totlines, i; @@ -802,6 +837,9 @@ void loadServerConfigFromString(char *config) { g_fTestMode = yesnotoi(argv[1]); } else if (!strcasecmp(argv[0],"rdbfuzz-mode")) { // NOP, handled in main + } else if (!strcasecmp(argv[0],"storage-provider") && argc >= 2) { + if (!initializeStorageProvider(argv+1, argc-1, &err)) + goto loaderr; } else { err = "Bad directive or wrong number of arguments"; goto loaderr; } diff --git a/src/server.cpp b/src/server.cpp index cdb639efa..115ca879f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -61,7 +61,6 @@ #include #include #include "aelocker.h" -#include "storage/rocksdbfactory.h" int g_fTestMode = false; @@ -3016,9 +3015,6 @@ void initServer(void) { signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); - // Create The Storage Factory (if necessary) - g_pserver->m_pstorageFactory = CreateRocksDBStorageFactory("/tmp/rocks.db", cserver.dbnum); - zfree(g_pserver->db); // initServerConfig created a dummy array, free that now g_pserver->db = (redisDb**)zmalloc(sizeof(redisDb*)*cserver.dbnum, MALLOC_LOCAL); @@ -4289,7 +4285,8 @@ sds genRedisInfoString(const char *section) { "mem_aof_buffer:%zu\r\n" "mem_allocator:%s\r\n" "active_defrag_running:%d\r\n" - "lazyfree_pending_objects:%zu\r\n", + "lazyfree_pending_objects:%zu\r\n" + "storage_provider:%s\r\n", zmalloc_used, hmem, g_pserver->cron_malloc_stats.process_rss, @@ -4329,7 +4326,8 @@ sds genRedisInfoString(const char *section) { mh->aof_buffer, ZMALLOC_LIB, g_pserver->active_defrag_running, - lazyfreeGetPendingObjectsCount() + lazyfreeGetPendingObjectsCount(), + g_pserver->m_pstorageFactory ? g_pserver->m_pstorageFactory->name() : "none" ); freeMemoryOverheadData(mh); } diff --git a/src/storage/rocksdbfactory.cpp b/src/storage/rocksdbfactory.cpp index 3774d217d..0507d2acc 100644 --- a/src/storage/rocksdbfactory.cpp +++ b/src/storage/rocksdbfactory.cpp @@ -10,6 +10,7 @@ public: ~RocksDBStorageFactory(); virtual IStorage *create(int db) override; + virtual const char *name() const override; }; IStorageFactory *CreateRocksDBStorageFactory(const char *path, int dbnum) @@ -60,4 +61,9 @@ IStorage *RocksDBStorageFactory::create(int db) ++db; // skip default col family std::shared_ptr spcolfamily(m_vecspcols[db].release()); return new RocksDBStorageProvider(m_spdb, spcolfamily, nullptr); +} + +const char *RocksDBStorageFactory::name() const +{ + return "flash"; } \ No newline at end of file