From cd4c04042992817062edd31df5ae4152a645504b Mon Sep 17 00:00:00 2001 From: wsa Date: Wed, 10 Dec 2025 12:26:19 +0800 Subject: [PATCH] Fix: dynamic configuration of RocksDB CF parameters now applies to all column families --- .github/workflows/Tendis-CI.yml | 5 + src/tendisplus/commands/command_test.cpp | 117 +++++++++++++++++- .../storage/rocks/rocks_kvstore.cpp | 8 +- src/tendisplus/storage/rocks/rocks_kvstore.h | 3 +- 4 files changed, 126 insertions(+), 7 deletions(-) diff --git a/.github/workflows/Tendis-CI.yml b/.github/workflows/Tendis-CI.yml index 3f60ec08..bba4225e 100644 --- a/.github/workflows/Tendis-CI.yml +++ b/.github/workflows/Tendis-CI.yml @@ -222,6 +222,11 @@ jobs: env: TEST_DIR: build/bin steps: + - name: Clean up pre-installed tools + run: | + df -h + sudo rm -rf /usr/local/lib/android + df -h - uses: actions/checkout@v3 with: fetch-depth: 2 diff --git a/src/tendisplus/commands/command_test.cpp b/src/tendisplus/commands/command_test.cpp index f28f31f5..7302e804 100644 --- a/src/tendisplus/commands/command_test.cpp +++ b/src/tendisplus/commands/command_test.cpp @@ -902,7 +902,7 @@ void testLatencyMonitor(std::shared_ptr svr) { EXPECT_TRUE(expect.ok()); found = std::regex_search(expect.value(), matches, pattern); if (found) { - assert(matches.size() > 2); + assert(matches.size() >= 2); std::string res = matches[1]; assert(res.size() > 10); auto v = res.substr(res.size() - 10, res.size()); @@ -915,7 +915,7 @@ void testLatencyMonitor(std::shared_ptr svr) { EXPECT_TRUE(expect.ok()); found = std::regex_search(expect.value(), matches, pattern); if (found) { - assert(matches.size() > 2); + assert(matches.size() >= 2); std::string res = matches[1]; assert(res.size() > 10); auto v = res.substr(res.size() - 10, res.size()); @@ -930,7 +930,7 @@ void testLatencyMonitor(std::shared_ptr svr) { EXPECT_TRUE(expect.ok()); found = std::regex_search(expect.value(), matches, pattern); if (found) { - assert(matches.size() > 2); + assert(matches.size() >= 2); std::string res = matches[1]; assert(res.size() > 10); auto v = res.substr(res.size() - 10, res.size()); @@ -2918,6 +2918,117 @@ TEST(Command, rocksdbOptionsCommand) { #endif } +void testRocksCFOptionConfig(std::shared_ptr svr, + int df_status, + int bl_status) { + asio::io_context ioContext; + asio::ip::tcp::socket socket(ioContext); + NetSession sess(svr, std::move(socket), 1, false, nullptr, nullptr); + for (uint32_t i = 0; i < svr->getKVStoreCount(); i++) { + auto exptDb = svr->getSegmentMgr()->getDb(&sess, 0, mgl::LockMode::LOCK_IS); + EXPECT_TRUE(exptDb.ok()); + + auto store = exptDb.value().store; + EXPECT_EQ(store->getCFOption(ColumnFamilyNumber::ColumnFamily_Default, + "rocks.enable_blob_files"), + df_status); + EXPECT_EQ(store->getCFOption(ColumnFamilyNumber::ColumnFamily_Binlog, + "rocks.enable_blob_files"), + bl_status); + } +} + +void testCFConfigSetAndGet(std::shared_ptr master) { + auto ctx = std::make_shared(); + auto session = makeSession(master, ctx); + { + session->setArgs({"config", "set", "rocks.enable_blob_files", "1"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 1, 1); + } + + { + session->setArgs({"config", "set", "rocks.enable_blob_files", "0"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 0, 0); + } + + { + session->setArgs( + {"config", "set", "rocks.defaultcf.enable_blob_files", "1"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 1, 0); + } + + { + session->setArgs( + {"config", "set", "rocks.defaultcf.enable_blob_files", "0"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 0, 0); + } + { + session->setArgs( + {"config", "set", "rocks.binlogcf.enable_blob_files", "1"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 0, 1); + } + + { + session->setArgs( + {"config", "set", "rocks.binlogcf.enable_blob_files", "0"}); + auto expect = Command::runSessionCmd(session.get()); + EXPECT_EQ(expect.ok(), true); + testRocksCFOptionConfig(master, 0, 0); + } +} +TEST(Command, rocksdbCfOptionsCommand) { + const auto guard = MakeGuard([]() { destroyEnv(); }); + EXPECT_TRUE(setupEnv()); + { + std::map configMap = { + {"rocks.enable_blob_files", "1"}}; + auto cfg = makeServerParam(8814, 0, "", true, configMap); + getGlobalServer() = makeServerEntry(cfg); + testRocksCFOptionConfig(getGlobalServer(), 1, 1); + testCFConfigSetAndGet(getGlobalServer()); +#ifndef _WIN32 + getGlobalServer()->stop(); + EXPECT_EQ(getGlobalServer().use_count(), 1); +#endif + } + + { + std::map configMap = { + {"rocks.defaultcf.enable_blob_files", "1"}}; + auto cfg = makeServerParam(8815, 0, "", true, configMap); + getGlobalServer() = makeServerEntry(cfg); + testRocksCFOptionConfig(getGlobalServer(), 1, 0); + testCFConfigSetAndGet(getGlobalServer()); +#ifndef _WIN32 + getGlobalServer()->stop(); + EXPECT_EQ(getGlobalServer().use_count(), 1); +#endif + } + + { + std::map configMap = { + {"rocks.binlogcf.enable_blob_files", "1"}}; + auto cfg = makeServerParam(8816, 0, "", true, configMap); + getGlobalServer() = makeServerEntry(cfg); + testRocksCFOptionConfig(getGlobalServer(), 0, 1); + testCFConfigSetAndGet(getGlobalServer()); +#ifndef _WIN32 + getGlobalServer()->stop(); + EXPECT_EQ(getGlobalServer().use_count(), 1); +#endif + } +} + void testSort(bool clusterEnabled) { const auto guard = MakeGuard([] { destroyEnv(); }); diff --git a/src/tendisplus/storage/rocks/rocks_kvstore.cpp b/src/tendisplus/storage/rocks/rocks_kvstore.cpp index 6294b6e4..e2a3ef40 100644 --- a/src/tendisplus/storage/rocks/rocks_kvstore.cpp +++ b/src/tendisplus/storage/rocks/rocks_kvstore.cpp @@ -1442,12 +1442,12 @@ rocksdb::Options RocksKVStore::options(const std::string cf) { } rocksdb::Options RocksKVStore::defaultColumnOptions() { - return options(); + return options(kDefaultCF); } // Binlog Column different from default rocksdb::Options RocksKVStore::binlogColumnOptions() { - auto columOpts = options("binlogcf"); + auto columOpts = options(kBinlogCF); for (int i = 0; i < ROCKSDB_NUM_LEVELS; ++i) { columOpts.compression_per_level[i] = rocksGetCompressType(_cfg->rocksCompressType); @@ -3302,8 +3302,10 @@ Status RocksKVStore::setOptionDynamic(const std::string& option, auto cf = ColumnFamilyNumber::ColumnFamily_All; if (isCfOption) { if (specialCf == "") { + cf = ColumnFamilyNumber::ColumnFamily_All; + } else if (specialCf == kDefaultCF) { cf = ColumnFamilyNumber::ColumnFamily_Default; - } else if (specialCf == "binlogcf") { + } else if (specialCf == kBinlogCF) { cf = ColumnFamilyNumber::ColumnFamily_Binlog; } else { return {ErrorCodes::ERR_INTERNAL, diff --git a/src/tendisplus/storage/rocks/rocks_kvstore.h b/src/tendisplus/storage/rocks/rocks_kvstore.h index 365f7f6e..6f862ec9 100644 --- a/src/tendisplus/storage/rocks/rocks_kvstore.h +++ b/src/tendisplus/storage/rocks/rocks_kvstore.h @@ -27,7 +27,8 @@ #include "tendisplus/storage/kvstore.h" namespace tendisplus { - +static constexpr const char* kDefaultCF = "defaultcf"; +static constexpr const char* kBinlogCF = "binlogcf"; class RocksKVStore; class RocksdbEnv; class BackgroundErrorListener;