Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions include/common/tglobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,13 @@ extern int32_t tsAuthReqHBInterval;
extern char tsAuthReqUrl[];
extern bool tsSessionControl;

// cls
extern bool tsClsEnabled;
extern char tsClsUrl[];
extern char tsClsLicenseId[];
extern int32_t tsClsRefreshInterval;
extern int32_t gGrantClsPreRefreshInterval;

int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc);
int32_t taosReadDataFolder(const char *cfgDir, const char **envCmd, const char *envFile, char *apolloUrl,
Expand Down
1 change: 1 addition & 0 deletions include/common/tmsgdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@
TD_DEF_MSG_TYPE(TDMT_MND_KILL_TRIM, "kill-trim", SKillRetentionReq, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_RSMA, "alter-rsma", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_AUTH_HB_TIMER, "auth-hb-tmr", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_CLS_HB_TIMER, "cls-hb-tmr", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_AUTH_CHECK, "auth-check", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_REGISTER_INSTANCE, "register-instance", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_LIST_INSTANCES, "list-instances", NULL, NULL)
Expand Down
2 changes: 2 additions & 0 deletions include/util/tdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,8 @@ typedef enum {
#define TSDB_CLUSTER_VALUE_LEN 1000
#define TSDB_GRANT_LOG_COL_LEN 15600

#define TSDB_GRANT_CLS_RESP_LEN (32*1024)

#define TSDB_ACTIVE_KEY_LEN 109
#define TSDB_CONN_ACTIVE_KEY_LEN 255

Expand Down
90 changes: 90 additions & 0 deletions source/common/src/tglobal.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@

// GRANT_CFG_DECLARE;

#ifdef TD_ENTERPRISE
static bool taosIsClsDerivedRefreshInterval(int32_t interval);
static int32_t taosCheckClsRefreshIntervalValue(int32_t interval, ECfgSrcType stype);
static void taosBackupClsRefreshInterval(int32_t interval);
static int32_t taosSetClsDerivedRefreshInterval(int32_t interval);
static int32_t taosHandleClsEnabledChange(bool enabled);
#endif

SConfig *tsCfg = NULL;
// cluster
char tsFirst[TSDB_EP_LEN] = {0};
Expand Down Expand Up @@ -118,6 +126,11 @@ bool tsAuthReq = 0;
int32_t tsAuthReqInterval = 2592000;
int32_t tsAuthReqHBInterval = 5;
char tsAuthReqUrl[TSDB_FQDN_LEN] = {0};
bool tsClsEnabled = 0;
char tsClsUrl[TSDB_FQDN_LEN] = {0};
char tsClsLicenseId[TSDB_FQDN_LEN] = {0};
int32_t tsClsRefreshInterval = 3600;
int32_t gGrantClsPreRefreshInterval = 3600;
#endif

int32_t tsNumOfQueryThreads = 0;
Expand Down Expand Up @@ -1143,6 +1156,10 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
TAOS_CHECK_RETURN(cfgAddBool(pCfg, "authReq", tsAuthReq, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "authReqInterval", tsAuthReqInterval, 1, 86400 * 30, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddString(pCfg, "authReqUrl", tsAuthReqUrl, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddBool(pCfg, "clsEnabled", tsClsEnabled, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddString(pCfg, "clsUrl", tsClsUrl, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddString(pCfg, "clsLicenseId", tsClsLicenseId, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "clsRefreshInterval", tsClsRefreshInterval, 10, 86400, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM));
#endif
// clang-format on

Expand Down Expand Up @@ -1819,6 +1836,21 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "authReqUrl");
TAOS_CHECK_RETURN(taosCheckCfgStrValueLen(pItem->name, pItem->str, TSDB_FQDN_LEN));
tstrncpy(tsAuthReqUrl, pItem->str, TSDB_FQDN_LEN);

TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "clsRefreshInterval");
TAOS_CHECK_RETURN(taosCheckClsRefreshIntervalValue(pItem->i32, pItem->stype));
tsClsRefreshInterval = pItem->i32;

TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "clsUrl");
TAOS_CHECK_RETURN(taosCheckCfgStrValueLen(pItem->name, pItem->str, TSDB_FQDN_LEN));
tstrncpy(tsClsUrl, pItem->str, TSDB_FQDN_LEN);

TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "clsLicenseId");
TAOS_CHECK_RETURN(taosCheckCfgStrValueLen(pItem->name, pItem->str, TSDB_FQDN_LEN));
tstrncpy(tsClsLicenseId, pItem->str, TSDB_FQDN_LEN);

TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "clsEnabled");
TAOS_CHECK_RETURN(taosHandleClsEnabledChange(pItem->bval));
#endif

TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "retentionSpeedLimitMB");
Expand Down Expand Up @@ -2381,6 +2413,45 @@ static int32_t cfgInitWrapper(SConfig **pCfg) {
TAOS_RETURN(TSDB_CODE_SUCCESS);
}

#ifdef TD_ENTERPRISE
static bool taosIsClsDerivedRefreshInterval(int32_t interval) { return interval == 1 || interval == 2; }

static int32_t taosCheckClsRefreshIntervalValue(int32_t interval, ECfgSrcType stype) {
bool isAlterSource = (stype == CFG_STYPE_ALTER_CLIENT_CMD || stype == CFG_STYPE_ALTER_SERVER_CMD);

if ((interval >= 10 && interval <= 86400) || (!isAlterSource && taosIsClsDerivedRefreshInterval(interval))) {
TAOS_RETURN(TSDB_CODE_SUCCESS);
}

uError("cfg:clsRefreshInterval, value:%d out of range[10, 86400]", interval);
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
}

static void taosBackupClsRefreshInterval(int32_t interval) {
if (!taosIsClsDerivedRefreshInterval(interval)) {
gGrantClsPreRefreshInterval = interval;
}
}

static int32_t taosSetClsDerivedRefreshInterval(int32_t interval) {
tsClsRefreshInterval = interval;
TAOS_RETURN(TSDB_CODE_SUCCESS);
}

static int32_t taosHandleClsEnabledChange(bool enabled) {
bool oldEnabled = tsClsEnabled;

tsClsEnabled = enabled;
if (oldEnabled == enabled) {
TAOS_RETURN(TSDB_CODE_SUCCESS);
}

taosBackupClsRefreshInterval(tsClsRefreshInterval);
TAOS_CHECK_RETURN(taosSetClsDerivedRefreshInterval(enabled ? 2 : 1));
TAOS_RETURN(TSDB_CODE_SUCCESS);
}
#endif

int32_t setAllConfigs(SConfig *pCfg) {
int32_t code = 0;
int32_t lino = -1;
Expand Down Expand Up @@ -2921,6 +2992,25 @@ static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, const char *name) {
tstrncpy(tsAuthReqUrl, pItem->str, TSDB_FQDN_LEN);
goto _exit;
}
if (strcasecmp(name, "clsEnabled") == 0) {
TAOS_CHECK_GOTO(taosHandleClsEnabledChange(pItem->bval), &lino, _exit);
goto _exit;
}
if (strcasecmp(name, "clsUrl") == 0) {
TAOS_CHECK_GOTO(taosCheckCfgStrValueLen(pItem->name, pItem->str, TSDB_FQDN_LEN), &lino, _exit);
tstrncpy(tsClsUrl, pItem->str, TSDB_FQDN_LEN);
goto _exit;
}
if (strcasecmp(name, "clsLicenseId") == 0) {
TAOS_CHECK_GOTO(taosCheckCfgStrValueLen(pItem->name, pItem->str, TSDB_FQDN_LEN), &lino, _exit);
tstrncpy(tsClsLicenseId, pItem->str, TSDB_FQDN_LEN);
goto _exit;
}
if (strcasecmp(name, "clsRefreshInterval") == 0) {
TAOS_CHECK_GOTO(taosCheckClsRefreshIntervalValue(pItem->i32, pItem->stype), &lino, _exit);
tsClsRefreshInterval = pItem->i32;
goto _exit;
}
#endif

if (strcasecmp(name, "minReservedMemorySize") == 0) {
Expand Down
61 changes: 60 additions & 1 deletion source/common/test/commonTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,35 @@
#include "tanalytics.h"
#include "tglobal.h"

#ifdef TD_ENTERPRISE
namespace {
//
class ClsConfigDynamicTest : public ::testing::Test {
protected:
void SetUp() override {
taosCleanupCfg();
tsClsEnabled = false;
tsClsRefreshInterval = 3600;
gGrantClsPreRefreshInterval = 3600;
ASSERT_EQ(cfgInit(&tsCfg), TSDB_CODE_SUCCESS);
ASSERT_EQ(cfgAddBool(tsCfg, "clsEnabled", tsClsEnabled, CFG_SCOPE_SERVER, CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL,
CFG_PRIV_SYSTEM),
TSDB_CODE_SUCCESS);
ASSERT_EQ(cfgAddInt32(tsCfg, "clsRefreshInterval", tsClsRefreshInterval, 1, 86400, CFG_SCOPE_SERVER,
CFG_DYN_SERVER, CFG_CATEGORY_GLOBAL, CFG_PRIV_SYSTEM),
TSDB_CODE_SUCCESS);
}

void TearDown() override { taosCleanupCfg(); }

void applyServerConfig(const char *name, const char *value, ECfgSrcType stype = CFG_STYPE_ALTER_SERVER_CMD) {
SConfig *pCfg = taosGetCfg();
ASSERT_NE(pCfg, nullptr);
ASSERT_EQ(cfgSetItem(pCfg, name, value, stype, true), TSDB_CODE_SUCCESS);
ASSERT_EQ(taosCfgDynamicOptions(pCfg, name, true), TSDB_CODE_SUCCESS);
}
Comment thread
acerDebugman marked this conversation as resolved.
};
} // namespace
#endif

int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
Expand Down Expand Up @@ -238,6 +264,39 @@ TEST(testCase, toInteger_test) {
ASSERT_EQ(ret, -1);
}

#ifdef TD_ENTERPRISE
TEST_F(ClsConfigDynamicTest, clsEnabledTransitionKeepsLastExplicitRefreshInterval) {
ASSERT_EQ(tsClsEnabled, false);
ASSERT_EQ(tsClsRefreshInterval, 3600);

applyServerConfig("clsRefreshInterval", "30");
ASSERT_EQ(tsClsRefreshInterval, 30);

applyServerConfig("clsEnabled", "1");
ASSERT_EQ(tsClsEnabled, true);
ASSERT_EQ(gGrantClsPreRefreshInterval, 30);
ASSERT_EQ(tsClsRefreshInterval, 2);

applyServerConfig("clsEnabled", "0");
ASSERT_EQ(tsClsEnabled, false);
ASSERT_EQ(gGrantClsPreRefreshInterval, 30);
ASSERT_EQ(tsClsRefreshInterval, 1);

applyServerConfig("clsEnabled", "1");
ASSERT_EQ(tsClsEnabled, true);
ASSERT_EQ(gGrantClsPreRefreshInterval, 30);
ASSERT_EQ(tsClsRefreshInterval, 2);

applyServerConfig("clsRefreshInterval", "40");
ASSERT_EQ(tsClsRefreshInterval, 40);

applyServerConfig("clsEnabled", "0");
ASSERT_EQ(tsClsEnabled, false);
ASSERT_EQ(gGrantClsPreRefreshInterval, 40);
ASSERT_EQ(tsClsRefreshInterval, 1);
}
#endif

TEST(testCase, dmRepairDefaultsToNoWalRepair) {
ASSERT_FALSE(dmRepairNeedWalRepair(123));
}
Expand Down
11 changes: 11 additions & 0 deletions source/dnode/mnode/impl/inc/mndDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -1472,6 +1472,17 @@ typedef struct {
SRWLatch lock;
} SGrantLogObj;

typedef struct {
int32_t id;
int32_t clsRespLen;
char* clsResp;
bool isValid;
int32_t extendLen;
char* extend;
int64_t updateTime;
SRWLatch lock;
} SGrantClsObj;

#ifdef __cplusplus
}
#endif
Expand Down
30 changes: 29 additions & 1 deletion source/dnode/mnode/impl/src/mndConfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@
#include "mndSync.h"
#include "mndTrans.h"
#include "mndUser.h"
#include "tutil.h"
#include "tcompare.h"
#include "tunit.h"
#include "tutil.h"

#define CFG_VER_NUMBER 1
#define CFG_RESERVE_SIZE 63
Expand Down Expand Up @@ -63,6 +64,31 @@ int32_t mndSetCreateConfigCommitLogs(STrans *pTrans, SConfigObj *obj);
int32_t mndSetDeleteConfigCommitLogs(STrans *pTrans, SConfigObj *item);
int32_t mndSetCreateConfigPrepareLogs(STrans *pTrans, SConfigObj *obj);

static void mndNormalizeAlterConfigValue(const char *name, char *value, int32_t valueLen) {
#ifdef TD_ENTERPRISE
if (strcasecmp(name, "clsRefreshInterval") != 0) {
return;
}

int32_t interval = 0;
if (taosStrHumanToInt32(value, &interval) != TSDB_CODE_SUCCESS) {
return;
}

if (interval < 10) {
interval = 10;
} else if (interval > 86400) {
interval = 86400;
}
Comment thread
acerDebugman marked this conversation as resolved.

(void)snprintf(value, valueLen, "%d", interval);
#else
(void)name;
(void)value;
(void)valueLen;
#endif
}

int32_t mndInitConfig(SMnode *pMnode) {
int32_t code = 0;
SSdbTable table = {.sdbType = SDB_CFG,
Expand Down Expand Up @@ -833,6 +859,8 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) {
updateWhiteList = 1;
}

mndNormalizeAlterConfigValue(dcfgReq.config, dcfgReq.value, sizeof(dcfgReq.value));

CfgAlterType alterType = (cfgReq.dnodeId == 0 || cfgReq.dnodeId == -1) ? CFG_ALTER_ALL_DNODES : CFG_ALTER_DNODE;
TAOS_CHECK_GOTO(cfgCheckRangeForDynUpdate(taosGetCfg(), dcfgReq.config, dcfgReq.value, true, alterType), &lino,
_err_out);
Expand Down
21 changes: 20 additions & 1 deletion source/dnode/mnode/impl/src/mndMain.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,18 @@ static void mndPullupAuth(SMnode *pMnode) {
}
}

static void mndPullupCls(SMnode *pMnode) {
mTrace("pullup cls msg");
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
if (pReq != NULL) {
SRpcMsg rpcMsg = {.msgType = TDMT_MND_CLS_HB_TIMER, .pCont = pReq, .contLen = contLen, .info.notFreeAhandle = 1, .info.ahandle = 0};
if (tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg) < 0) {
mError("failed to put into write-queue since %s, line:%d", terrstr(), __LINE__);
Comment thread
acerDebugman marked this conversation as resolved.
}
}
}

static void mndIncreaseUpTime(SMnode *pMnode) {
mTrace("increate uptime");
int32_t contLen = 0;
Expand Down Expand Up @@ -409,6 +421,9 @@ static int32_t minCronTime() {
min = TMIN(min, telemInt);
min = TMIN(min, tsGrantHBInterval);
min = TMIN(min, tsUptimeInterval);
#ifdef TD_ENTERPRISE
if (tsClsEnabled) min = TMIN(min, tsClsRefreshInterval);
#endif

return min <= 1 ? 2 : min;
}
Expand Down Expand Up @@ -455,6 +470,9 @@ void mndDoTimerPullupTask(SMnode *pMnode, int64_t sec) {
mndPullupAuth(pMnode);
}
}
if (sec % tsClsRefreshInterval == 0) {
mndPullupCls(pMnode);
Comment thread
acerDebugman marked this conversation as resolved.
Comment thread
acerDebugman marked this conversation as resolved.
}
Comment thread
acerDebugman marked this conversation as resolved.
#endif
if (sec % tsTransPullupInterval == 0) {
mndPullupTrans(pMnode);
Expand Down Expand Up @@ -1101,7 +1119,8 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
pMsg->msgType == TDMT_MND_SSMIGRATE_DB_TIMER || pMsg->msgType == TDMT_MND_ARB_HEARTBEAT_TIMER ||
pMsg->msgType == TDMT_MND_ARB_CHECK_SYNC_TIMER || pMsg->msgType == TDMT_MND_CHECK_STREAM_TIMER ||
pMsg->msgType == TDMT_MND_UPDATE_SSMIGRATE_PROGRESS_TIMER || pMsg->msgType == TDMT_MND_SCAN_TIMER ||
pMsg->msgType == TDMT_MND_QUERY_TRIM_TIMER || pMsg->msgType == TDMT_MND_AUTH_HB_TIMER) {
pMsg->msgType == TDMT_MND_QUERY_TRIM_TIMER || pMsg->msgType == TDMT_MND_AUTH_HB_TIMER ||
pMsg->msgType == TDMT_MND_CLS_HB_TIMER) {
mTrace("timer not process since mnode restored:%d stopped:%d, sync restored:%d role:%s ", pMnode->restored,
pMnode->stopped, state.restored, syncStr(state.state));
TAOS_RETURN(code);
Expand Down
3 changes: 2 additions & 1 deletion source/dnode/mnode/sdb/inc/sdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,8 @@ typedef enum {
SDB_XNODE_JOB = 45,
SDB_XNODE_USER_PASS = 46,
SDB_SECURITY_POLICY = 47,
SDB_MAX = 48
SDB_GRANT_CLS = 48,
SDB_MAX = 49
} ESdbType;

typedef struct SSdbRaw {
Expand Down
2 changes: 1 addition & 1 deletion source/util/src/tconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -1721,4 +1721,4 @@ void cfgDestroyIter(SConfigIter *pIter) {
}

SArray *taosGetLocalCfg(SConfig *pCfg) { return pCfg->localArray; }
SArray *taosGetGlobalCfg(SConfig *pCfg) { return pCfg->globalArray; }
SArray *taosGetGlobalCfg(SConfig *pCfg) { return pCfg->globalArray; }
Loading
Loading