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); }