diff --git a/src/IStorage.h b/src/IStorage.h index e060d849f..196ae8cef 100644 --- a/src/IStorage.h +++ b/src/IStorage.h @@ -9,6 +9,7 @@ public: virtual ~IStorageFactory() {} virtual class IStorage *create(int db, key_load_iterator itr, void *privdata) = 0; + virtual class IStorage *createMetadataDb() = 0; virtual const char *name() const = 0; virtual size_t totalDiskspaceUsed() const = 0; virtual bool FSlow() const = 0; diff --git a/src/server.cpp b/src/server.cpp index 0dcae55b0..64bfeb86e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3984,6 +3984,10 @@ void initServer(void) { slowlogInit(); latencyMonitorInit(); + if (g_pserver->m_pstorageFactory) { + g_pserver->metadataDb = g_pserver->m_pstorageFactory->createMetadataDb(); + } + /* We have to initialize storage providers after the cluster has been initialized */ for (int idb = 0; idb < cserver.dbnum; ++idb) { diff --git a/src/server.h b/src/server.h index 656560868..6b00b27a3 100644 --- a/src/server.h +++ b/src/server.h @@ -2170,6 +2170,7 @@ struct redisServer { mode_t umask; /* The umask value of the process on startup */ std::atomic hz; /* serverCron() calls frequency in hertz */ int in_fork_child; /* indication that this is a fork child */ + IStorage *metadataDb = nullptr; redisDb **db = nullptr; dict *commands; /* Command table */ dict *orig_commands; /* Command table before command renaming. */ diff --git a/src/storage/rocksdbfactor_internal.h b/src/storage/rocksdbfactor_internal.h index beb71d87e..8a7df2cf5 100644 --- a/src/storage/rocksdbfactor_internal.h +++ b/src/storage/rocksdbfactor_internal.h @@ -14,6 +14,7 @@ public: ~RocksDBStorageFactory(); virtual IStorage *create(int db, key_load_iterator iter, void *privdata) override; + virtual IStorage *createMetadataDb() override; virtual const char *name() const override; virtual size_t totalDiskspaceUsed() const override; diff --git a/src/storage/rocksdbfactory.cpp b/src/storage/rocksdbfactory.cpp index 7beda21f0..7fd41b349 100644 --- a/src/storage/rocksdbfactory.cpp +++ b/src/storage/rocksdbfactory.cpp @@ -32,6 +32,7 @@ IStorageFactory *CreateRocksDBStorageFactory(const char *path, int dbnum, const RocksDBStorageFactory::RocksDBStorageFactory(const char *dbfile, int dbnum, const char *rgchConfig, size_t cchConfig) : m_path(dbfile) { + dbnum++; // create an extra db for metadata // Get the count of column families in the actual database std::vector vecT; auto status = rocksdb::DB::ListColumnFamilies(rocksdb::Options(), dbfile, &vecT); @@ -134,6 +135,11 @@ std::string RocksDBStorageFactory::getTempFolder() return path; } +IStorage *RocksDBStorageFactory::createMetadataDb() +{ + return this->create(-1, nullptr, nullptr); +} + IStorage *RocksDBStorageFactory::create(int db, key_load_iterator iter, void *privdata) { ++db; // skip default col family diff --git a/src/storage/teststorageprovider.cpp b/src/storage/teststorageprovider.cpp index 188a339f3..3739c403d 100644 --- a/src/storage/teststorageprovider.cpp +++ b/src/storage/teststorageprovider.cpp @@ -6,6 +6,11 @@ IStorage *TestStorageFactory::create(int, key_load_iterator, void *) return new (MALLOC_LOCAL) TestStorageProvider(); } +IStorage *TestStorageFactory::createMetadataDb() +{ + return new (MALLOC_LOCAL) TestStorageProvider(); +} + const char *TestStorageFactory::name() const { return "TEST Storage Provider"; diff --git a/src/storage/teststorageprovider.h b/src/storage/teststorageprovider.h index d5e956c7e..2b2b1a38d 100644 --- a/src/storage/teststorageprovider.h +++ b/src/storage/teststorageprovider.h @@ -5,6 +5,7 @@ class TestStorageFactory : public IStorageFactory { virtual class IStorage *create(int db, key_load_iterator itr, void *privdata) override; + virtual class IStorage *createMetadataDb() override; virtual const char *name() const override; virtual size_t totalDiskspaceUsed() const override { return 0; } virtual bool FSlow() const { return false; }