diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd/src/common/src/db_config.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd/src/common/src/db_config.cpp index b5aed95ea0c27c736f1861d0b867fce12556f801..674dd3610af6e66cdb3ce8df3e15d566f237fc11 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd/src/common/src/db_config.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd/src/common/src/db_config.cpp @@ -87,10 +87,11 @@ bool CheckRedoFlushConfig(const JsonObject &config, uint32_t &redoFlush) return CheckAndGetDBConfig(config, DB_CONFIG_REDO_FLUSH_BY_TRX, checkFunction, redoFlush); } -bool CheckRedoBufSizeConfig(const JsonObject &config, uint32_t &redoBufSize) +bool CheckRedoBufSizeConfig(const JsonObject &config, int32_t pageSize, uint32_t &redoBufSize) { - std::function checkFunction = [](uint32_t val) { - return val >= MIN_REDO_BUFFER_SIZE && val <= MAX_REDO_BUFFER_SIZE; + std::function checkFunction = [pageSize](uint32_t val) { + return val >= MIN_REDO_BUFFER_SIZE && val <= MAX_REDO_BUFFER_SIZE && + val > static_cast(pageSize * 63); // 63: pool size should be 63 times larger then pageSize }; return CheckAndGetDBConfig(config, DB_CONFIG_REDO_PUB_BUFF_SIZE, checkFunction, redoBufSize); } @@ -105,7 +106,7 @@ bool CheckMaxConnNumConfig(const JsonObject &config, int32_t &maxConnNum) bool CheckBufferPoolSizeConfig(const JsonObject &config, int32_t pageSize, uint32_t &redoBufSize) { - std::function checkFunction = [&pageSize](uint32_t val) { + std::function checkFunction = [pageSize](uint32_t val) { return val >= MIN_BUFFER_POOL_SIZE && val <= MAX_BUFFER_POOL_SIZE && val >= static_cast(pageSize * 64); // 64: pool size should be 64 times larger then pageSize }; @@ -171,7 +172,7 @@ DBConfig DBConfig::GetDBConfigFromJsonStr(const std::string &confStr, int &errCo return {}; } - if (!CheckRedoBufSizeConfig(dbConfig, conf.redoPubBufSize_)) { + if (!CheckRedoBufSizeConfig(dbConfig, conf.pageSize_, conf.redoPubBufSize_)) { GLOGE("Check DB config 'redoPubBufSize' failed."); errCode = -E_INVALID_CONFIG_VALUE; return {}; diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_api_test.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_api_test.cpp index ab4c1dfaa7856304b702e1bb01c61ceb2dac898d..3e0c86f7460ad5d8b4f32199dadf0de339ebdc60 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_api_test.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_api_test.cpp @@ -488,6 +488,58 @@ HWTEST_F(DocumentDBApiTest, OpenDBConfigRedoFlushTest002, TestSize.Level0) EXPECT_EQ(status, GRD_INVALID_ARGS); } +/** + * @tc.name: OpenDBConfigBufferPoolTest001 + * @tc.desc: Test open document db with invalid config item bufferPoolSize + * @tc.type: FUNC + * @tc.require: + * @tc.author: lianhuix + */ +HWTEST_F(DocumentDBApiTest, OpenDBConfigBufferPoolTest001, TestSize.Level0) +{ + GRD_DB *db = nullptr; + std::string path = "./document.db"; + + int status = GRD_DBOpen(path.c_str(), R""({"pageSize":64,"bufferPoolSize":4096})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_OK); + EXPECT_EQ(GRD_DBClose(db, 0), GRD_OK); + + status = GRD_DBOpen(path.c_str(), R""({"pageSize":64,"bufferPoolSize":4095})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); + + status = GRD_DBOpen(path.c_str(), R""({"bufferPoolSize":1023})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); + + status = GRD_DBOpen(path.c_str(), R""({"bufferPoolSize":4194304})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); +} + +/** + * @tc.name: OpenDBConfigPubBuffTest001 + * @tc.desc: Test open document db with invalid config item redopubbufsize + * @tc.type: FUNC + * @tc.require: + * @tc.author: lianhuix + */ +HWTEST_F(DocumentDBApiTest, OpenDBConfigPubBuffTest001, TestSize.Level0) +{ + GRD_DB *db = nullptr; + std::string path = "./document.db"; + + int status = GRD_DBOpen(path.c_str(), R""({"pageSize":64,"redopubbufsize":4033})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_OK); + EXPECT_EQ(GRD_DBClose(db, 0), GRD_OK); + + status = GRD_DBOpen(path.c_str(), R""({"pageSize":64,"redopubbufsize":4032})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); + + status = GRD_DBOpen(path.c_str(), R""({"redopubbufsize":255})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); + + status = GRD_DBOpen(path.c_str(), R""({"redopubbufsize":16385})"", GRD_DB_OPEN_CREATE, &db); + EXPECT_EQ(status, GRD_INVALID_ARGS); +} + /** * @tc.name: OpenDBFlagTest001 * @tc.desc: Test open document db with invalid flag