diff --git a/src/config.cpp b/src/config.cpp index 131911372..6d860ae31 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -293,15 +293,20 @@ void queueLoadModule(sds path, sds *argv, int argc) { listAddNodeTail(g_pserver->loadmodule_queue,loadmod); } -static bool initializeStorageProvider(sds *argv, int argc, const char **err) +sds g_sdsProvider = nullptr; +sds g_sdsArgs = nullptr; + +bool initializeStorageProvider(const char **err) { bool fTest = false; - if (!strcasecmp(argv[0], "flash") && argc == 2) + if (g_sdsProvider == nullptr) + return true; + if (!strcasecmp(g_sdsProvider, "flash") && g_sdsArgs != nullptr) { // Create The Storage Factory (if necessary) - g_pserver->m_pstorageFactory = CreateRocksDBStorageFactory(argv[1], cserver.dbnum); + g_pserver->m_pstorageFactory = CreateRocksDBStorageFactory(g_sdsArgs, cserver.dbnum); } - else if (!strcasecmp(argv[0], "test") && argc == 1) + else if (!strcasecmp(g_sdsProvider, "test") && g_sdsArgs == nullptr) { g_pserver->m_pstorageFactory = new (MALLOC_LOCAL) TestStorageFactory(); fTest = true; @@ -578,8 +583,9 @@ void loadServerConfigFromString(char *config) { } 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; + g_sdsProvider = sdsdup(argv[1]); + if (argc > 2) + g_sdsArgs = sdsdup(argv[2]); } else if (!strcasecmp(argv[0],"enable-pro") && (argc == 1 || argc == 2)) { if (argc == 2) { diff --git a/src/server.cpp b/src/server.cpp index 2c5659a32..f3afde2dd 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -5357,6 +5357,8 @@ static void validateConfiguration() } } +bool initializeStorageProvider(const char **err); + int main(int argc, char **argv) { struct timeval tv; int j; @@ -5530,6 +5532,14 @@ int main(int argc, char **argv) { int background = cserver.daemonize && !cserver.supervised; if (background) daemonize(); + const char *err; + if (!initializeStorageProvider(&err)) + { + serverLog(LL_WARNING, "Failed to initialize storage provider: %s",err); + exit(EXIT_FAILURE); + } + + initServer(); initNetworking(cserver.cthreads > 1 /* fReusePort */);