serialize and persist local config
This commit is contained in:
parent
bfceaae124
commit
07de144000
|
@ -282,6 +282,10 @@ void taosLocalCfgForbiddenToChange(char *name, bool *forbidden);
|
||||||
int8_t taosGranted(int8_t type);
|
int8_t taosGranted(int8_t type);
|
||||||
int32_t taosSetSlowLogScope(char *pScopeStr, int32_t *pScope);
|
int32_t taosSetSlowLogScope(char *pScopeStr, int32_t *pScope);
|
||||||
|
|
||||||
|
int32_t persistLocalConfig(SConfig *pCfg);
|
||||||
|
int32_t localConfigSerialize(SArray *array, char **serialized);
|
||||||
|
int32_t tSerializeSConfigArray(void *buf, int32_t bufLen, SArray *array);
|
||||||
|
int32_t tDeserializeSConfigArray(void *buf, int32_t bufLen, SArray *pReq);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -983,7 +983,6 @@ typedef struct SEpSet {
|
||||||
SEp eps[TSDB_MAX_REPLICA];
|
SEp eps[TSDB_MAX_REPLICA];
|
||||||
} SEpSet;
|
} SEpSet;
|
||||||
|
|
||||||
|
|
||||||
int32_t tEncodeSEpSet(SEncoder* pEncoder, const SEpSet* pEp);
|
int32_t tEncodeSEpSet(SEncoder* pEncoder, const SEpSet* pEp);
|
||||||
int32_t tDecodeSEpSet(SDecoder* pDecoder, SEpSet* pEp);
|
int32_t tDecodeSEpSet(SDecoder* pDecoder, SEpSet* pEp);
|
||||||
int32_t taosEncodeSEpSet(void** buf, const SEpSet* pEp);
|
int32_t taosEncodeSEpSet(void** buf, const SEpSet* pEp);
|
||||||
|
@ -4115,11 +4114,11 @@ typedef struct {
|
||||||
SArray* blockTbName;
|
SArray* blockTbName;
|
||||||
SArray* blockSchema;
|
SArray* blockSchema;
|
||||||
|
|
||||||
union{
|
union {
|
||||||
struct{
|
struct {
|
||||||
int64_t sleepTime;
|
int64_t sleepTime;
|
||||||
};
|
};
|
||||||
struct{
|
struct {
|
||||||
int32_t createTableNum;
|
int32_t createTableNum;
|
||||||
SArray* createTableLen;
|
SArray* createTableLen;
|
||||||
SArray* createTableReq;
|
SArray* createTableReq;
|
||||||
|
@ -4128,7 +4127,7 @@ typedef struct {
|
||||||
|
|
||||||
} SMqDataRsp;
|
} SMqDataRsp;
|
||||||
|
|
||||||
int32_t tEncodeMqDataRsp(SEncoder *pEncoder, const SMqDataRsp *pObj);
|
int32_t tEncodeMqDataRsp(SEncoder* pEncoder, const SMqDataRsp* pObj);
|
||||||
int32_t tDecodeMqDataRsp(SDecoder* pDecoder, SMqDataRsp* pRsp);
|
int32_t tDecodeMqDataRsp(SDecoder* pDecoder, SMqDataRsp* pRsp);
|
||||||
void tDeleteMqDataRsp(SMqDataRsp* pRsp);
|
void tDeleteMqDataRsp(SMqDataRsp* pRsp);
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,10 @@
|
||||||
#define _TD_MND_H_
|
#define _TD_MND_H_
|
||||||
|
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
|
#include "sync.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tmsgcb.h"
|
#include "tmsgcb.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "sync.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -41,6 +41,12 @@ typedef struct {
|
||||||
int64_t lastIndex;
|
int64_t lastIndex;
|
||||||
} SMnodeOpt;
|
} SMnodeOpt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t version;
|
||||||
|
SArray *pArray;
|
||||||
|
TdThreadMutex mutex;
|
||||||
|
} SMnodeConfig;
|
||||||
|
|
||||||
/* ------------------------ SMnode ------------------------ */
|
/* ------------------------ SMnode ------------------------ */
|
||||||
/**
|
/**
|
||||||
* @brief Open a mnode.
|
* @brief Open a mnode.
|
||||||
|
@ -109,7 +115,7 @@ int64_t mndGetRoleTimeMs(SMnode *pMnode);
|
||||||
* @param pMsg The request msg.
|
* @param pMsg The request msg.
|
||||||
* @return int32_t 0 for success, -1 for failure.
|
* @return int32_t 0 for success, -1 for failure.
|
||||||
*/
|
*/
|
||||||
int32_t mndProcessRpcMsg(SRpcMsg *pMsg, SQueueInfo* pQueueInfo);
|
int32_t mndProcessRpcMsg(SRpcMsg *pMsg, SQueueInfo *pQueueInfo);
|
||||||
int32_t mndProcessSyncMsg(SRpcMsg *pMsg);
|
int32_t mndProcessSyncMsg(SRpcMsg *pMsg);
|
||||||
int32_t mndPreProcessQueryMsg(SRpcMsg *pMsg);
|
int32_t mndPreProcessQueryMsg(SRpcMsg *pMsg);
|
||||||
void mndPostProcessQueryMsg(SRpcMsg *pMsg);
|
void mndPostProcessQueryMsg(SRpcMsg *pMsg);
|
||||||
|
|
|
@ -148,7 +148,8 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump);
|
||||||
void cfgDumpCfgS3(SConfig *pCfg, bool tsc, bool dump);
|
void cfgDumpCfgS3(SConfig *pCfg, bool tsc, bool dump);
|
||||||
|
|
||||||
int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char *apolloUrl);
|
int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char *apolloUrl);
|
||||||
|
SArray *cfgGetLocalCfg(SConfig *pCfg);
|
||||||
|
SArray *cfgGetGlobalCfg(SConfig *pCfg);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "cJSON.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
|
@ -27,6 +28,9 @@
|
||||||
#include "cus_name.h"
|
#include "cus_name.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CONFIG_PATH_LEN (TSDB_FILENAME_LEN + 12)
|
||||||
|
#define CONFIG_FILE_LEN (CONFIG_PATH_LEN + 32)
|
||||||
|
|
||||||
// GRANT_CFG_DECLARE;
|
// GRANT_CFG_DECLARE;
|
||||||
|
|
||||||
SConfig *tsCfg = NULL;
|
SConfig *tsCfg = NULL;
|
||||||
|
@ -1927,7 +1931,11 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile
|
||||||
TAOS_CHECK_GOTO(taosSetAllDebugFlag(tsCfg, pItem->i32), &lino, _exit);
|
TAOS_CHECK_GOTO(taosSetAllDebugFlag(tsCfg, pItem->i32), &lino, _exit);
|
||||||
|
|
||||||
cfgDumpCfg(tsCfg, tsc, false);
|
cfgDumpCfg(tsCfg, tsc, false);
|
||||||
|
if (!tsc) {
|
||||||
|
if ((code = persistLocalConfig(tsCfg)) != 0) {
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
TAOS_CHECK_GOTO(taosCheckGlobalCfg(), &lino, _exit);
|
TAOS_CHECK_GOTO(taosCheckGlobalCfg(), &lino, _exit);
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
|
@ -2473,3 +2481,91 @@ int8_t taosGranted(int8_t type) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t persistLocalConfig(SConfig *pCfg) {
|
||||||
|
// TODO: just tmp ,refactor later
|
||||||
|
int32_t code = 0;
|
||||||
|
char *buffer = NULL;
|
||||||
|
TdFilePtr pFile = NULL;
|
||||||
|
char filepath[CONFIG_FILE_LEN] = {0};
|
||||||
|
char filename[CONFIG_FILE_LEN] = {0};
|
||||||
|
snprintf(filepath, sizeof(filepath), "%s%sconfig", tsDataDir, TD_DIRSEP);
|
||||||
|
snprintf(filename, sizeof(filename), "%s%sconfig%slocal.json", tsDataDir, TD_DIRSEP, TD_DIRSEP);
|
||||||
|
|
||||||
|
// TODO(beryl) need to check if the file is existed
|
||||||
|
if (taosMkDir(filepath) != 0) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
uError("failed to create dir:%s since %s", filepath, tstrerror(code));
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
TdFilePtr pConfigFile =
|
||||||
|
taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
|
||||||
|
|
||||||
|
if (pConfigFile == NULL) {
|
||||||
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
uError("failed to open file:%s since %s", filename, tstrerror(code));
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
char *serialized = NULL;
|
||||||
|
code = localConfigSerialize(cfgGetLocalCfg(pCfg), &serialized);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("failed to serialize local config since %s", tstrerror(code));
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
taosWriteFile(pConfigFile, serialized, strlen(serialized));
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t localConfigSerialize(SArray *array, char **serialized) {
|
||||||
|
char buf[30];
|
||||||
|
cJSON *json = cJSON_CreateObject();
|
||||||
|
if (json == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sz = taosArrayGetSize(array);
|
||||||
|
|
||||||
|
cJSON *cField = cJSON_CreateArray();
|
||||||
|
if (array == NULL) {
|
||||||
|
cJSON_Delete(json);
|
||||||
|
TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
// cjson only support int32_t or double
|
||||||
|
// string are used to prohibit the loss of precision
|
||||||
|
for (int i = 0; i < sz; i++) {
|
||||||
|
SConfigItem *item = (SConfigItem *)taosArrayGet(array, i);
|
||||||
|
switch (item->dtype) {
|
||||||
|
{
|
||||||
|
case CFG_DTYPE_NONE:
|
||||||
|
break;
|
||||||
|
case CFG_DTYPE_BOOL:
|
||||||
|
cJSON_AddBoolToObject(cField, item->name, item->bval);
|
||||||
|
break;
|
||||||
|
case CFG_DTYPE_INT32:
|
||||||
|
cJSON_AddNumberToObject(cField, item->name, item->i32);
|
||||||
|
break;
|
||||||
|
case CFG_DTYPE_INT64:
|
||||||
|
(void)sprintf(buf, "%" PRId64, item->i64);
|
||||||
|
cJSON_AddStringToObject(cField, item->name, buf);
|
||||||
|
break;
|
||||||
|
case CFG_DTYPE_FLOAT:
|
||||||
|
case CFG_DTYPE_DOUBLE:
|
||||||
|
(void)sprintf(buf, "%f", item->fval);
|
||||||
|
cJSON_AddStringToObject(cField, item->name, buf);
|
||||||
|
break;
|
||||||
|
case CFG_DTYPE_STRING:
|
||||||
|
case CFG_DTYPE_DIR:
|
||||||
|
case CFG_DTYPE_LOCALE:
|
||||||
|
case CFG_DTYPE_CHARSET:
|
||||||
|
case CFG_DTYPE_TIMEZONE:
|
||||||
|
cJSON_AddStringToObject(cField, item->name, item->str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, "pArray", cField);
|
||||||
|
*serialized = cJSON_Print(json);
|
||||||
|
cJSON_Delete(json);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
|
@ -45,6 +45,19 @@ static int32_t mmRequire(const SMgmtInputOpt *pInput, bool *required) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mmBuildConfigForDeploy(SMnodeMgmt *pMgmt, const SMgmtInputOpt *pInput, SMnodeOpt *pOption) {
|
||||||
|
pOption->deploy = true;
|
||||||
|
pOption->msgCb = pMgmt->msgCb;
|
||||||
|
pOption->dnodeId = pMgmt->pData->dnodeId;
|
||||||
|
pOption->selfIndex = 0;
|
||||||
|
pOption->numOfReplicas = 1;
|
||||||
|
pOption->numOfTotalReplicas = 1;
|
||||||
|
pOption->replicas[0].id = 1;
|
||||||
|
pOption->replicas[0].port = tsServerPort;
|
||||||
|
tstrncpy(pOption->replicas[0].fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
||||||
|
pOption->lastIndex = SYNC_INDEX_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
static void mmBuildOptionForDeploy(SMnodeMgmt *pMgmt, const SMgmtInputOpt *pInput, SMnodeOpt *pOption) {
|
static void mmBuildOptionForDeploy(SMnodeMgmt *pMgmt, const SMgmtInputOpt *pInput, SMnodeOpt *pOption) {
|
||||||
pOption->deploy = true;
|
pOption->deploy = true;
|
||||||
pOption->msgCb = pMgmt->msgCb;
|
pOption->msgCb = pMgmt->msgCb;
|
||||||
|
@ -120,6 +133,7 @@ static int32_t mmOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
|
||||||
dInfo("mnode start to deploy");
|
dInfo("mnode start to deploy");
|
||||||
pMgmt->pData->dnodeId = 1;
|
pMgmt->pData->dnodeId = 1;
|
||||||
mmBuildOptionForDeploy(pMgmt, pInput, &option);
|
mmBuildOptionForDeploy(pMgmt, pInput, &option);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
dInfo("mnode start to open");
|
dInfo("mnode start to open");
|
||||||
mmBuildOptionForOpen(pMgmt, &option);
|
mmBuildOptionForOpen(pMgmt, &option);
|
||||||
|
|
|
@ -1536,3 +1536,6 @@ void cfgDestroyIter(SConfigIter *pIter) {
|
||||||
|
|
||||||
taosMemoryFree(pIter);
|
taosMemoryFree(pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SArray *cfgGetLocalCfg(SConfig *pCfg) { return pCfg->localArray; }
|
||||||
|
SArray *cfgGetGlobalCfg(SConfig *pCfg) { return pCfg->globalArray; }
|
Loading…
Reference in New Issue