diff --git a/include/os/os.h b/include/os/os.h index e71c76bdb3..08b68f36d4 100644 --- a/include/os/os.h +++ b/include/os/os.h @@ -124,7 +124,8 @@ extern "C" { #include "taoserror.h" #include "tlog.h" -extern int32_t tsRandErrChance; +extern int32_t tsRandErrChance; +extern int64_t tsRandErrDivisor; extern threadlocal bool tsEnableRandErr; #ifdef __cplusplus diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index cd0ca95d3b..31a8c704ca 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -734,6 +734,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "compactPullupInterval", tsCompactPullupInterval, 1, 10000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "mqRebalanceInterval", tsMqRebalanceInterval, 1, 10000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "randErrorChance", tsRandErrChance, 0, 10000, CFG_SCOPE_BOTH, CFG_DYN_NONE)); + TAOS_CHECK_RETURN(cfgAddInt64(pCfg, "randErrorDivisor", tsRandErrDivisor, 1, INT64_MAX, CFG_SCOPE_BOTH, CFG_DYN_SERVER)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "ttlUnit", tsTtlUnit, 1, 86400 * 365, CFG_SCOPE_SERVER, CFG_DYN_NONE)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "ttlPushInterval", tsTtlPushIntervalSec, 1, 100000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER)); @@ -1427,6 +1428,9 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "randErrorChance"); tsRandErrChance = pItem->i32; + TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "randErrorDivisor"); + tsRandErrDivisor = pItem->i64; + TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "ttlUnit"); tsTtlUnit = pItem->i32; @@ -1881,6 +1885,7 @@ static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, const char *name) { {"mndSdbWriteDelta", &tsMndSdbWriteDelta}, {"minDiskFreeSize", &tsMinDiskFreeSize}, + {"randErrorDivisor", &tsRandErrDivisor}, {"cacheLazyLoadThreshold", &tsCacheLazyLoadThreshold}, {"checkpointInterval", &tsStreamCheckpointInterval}, diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index 625dcc1f45..b8160a14b7 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -65,14 +65,14 @@ typedef struct TdFile { #define FILE_WITH_LOCK 1 #ifdef BUILD_WITH_RAND_ERR -#define STUB_RAND_IO_ERR(ret) \ - if (tsEnableRandErr) { \ - uint32_t r = taosRand() % 10001; \ - if ((r + 1) <= tsRandErrChance) { \ - errno = EIO; \ - terrno = TAOS_SYSTEM_ERROR(errno); \ - return (ret); \ - } \ +#define STUB_RAND_IO_ERR(ret) \ + if (tsEnableRandErr) { \ + uint32_t r = taosRand() % tsRandErrDivisor; \ + if ((r + 1) <= tsRandErrChance) { \ + errno = EIO; \ + terrno = TAOS_SYSTEM_ERROR(errno); \ + return (ret); \ + } \ } #else #define STUB_RAND_IO_ERR(ret) diff --git a/source/os/src/osMemory.c b/source/os/src/osMemory.c index 6d29fdeccd..297b17b957 100644 --- a/source/os/src/osMemory.c +++ b/source/os/src/osMemory.c @@ -21,10 +21,10 @@ #endif #include "os.h" -int32_t tsRandErrChance = 1; +int32_t tsRandErrChance = 1; +int64_t tsRandErrDivisor = 10001; threadlocal bool tsEnableRandErr = 0; - #if defined(USE_TD_MEMORY) || defined(USE_ADDR2LINE) #define TD_MEMORY_SYMBOL ('T' << 24 | 'A' << 16 | 'O' << 8 | 'S') @@ -273,7 +273,7 @@ void *taosMemoryMalloc(int64_t size) { #ifdef BUILD_WITH_RAND_ERR if (tsEnableRandErr) { - uint32_t r = taosRand() % 10001; + uint32_t r = taosRand() % tsRandErrDivisor; if ((r + 1) <= tsRandErrChance) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; @@ -303,7 +303,7 @@ void *taosMemoryCalloc(int64_t num, int64_t size) { #else #ifdef BUILD_WITH_RAND_ERR if (tsEnableRandErr) { - uint32_t r = taosRand() % 10001; + uint32_t r = taosRand() % tsRandErrDivisor; if ((r + 1) <= tsRandErrChance) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; @@ -343,7 +343,7 @@ void *taosMemoryRealloc(void *ptr, int64_t size) { #else #ifdef BUILD_WITH_RAND_ERR if (tsEnableRandErr) { - uint32_t r = taosRand() % 10001; + uint32_t r = taosRand() % tsRandErrDivisor; if ((r + 1) <= tsRandErrChance) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; @@ -378,7 +378,7 @@ char *taosStrdup(const char *ptr) { #else #ifdef BUILD_WITH_RAND_ERR if (tsEnableRandErr) { - uint32_t r = taosRand() % 10001; + uint32_t r = taosRand() % tsRandErrDivisor; if ((r + 1) <= tsRandErrChance) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; @@ -444,7 +444,7 @@ void *taosMemoryMallocAlign(uint32_t alignment, int64_t size) { #if defined(LINUX) #ifdef BUILD_WITH_RAND_ERR if (tsEnableRandErr) { - uint32_t r = taosRand() % 10001; + uint32_t r = taosRand() % tsRandErrDivisor; if ((r + 1) <= tsRandErrChance) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL;