提交 012dbf31 编写于 作者: S Shengliang Guan

enh: read mnode file

上级 66f2cc27
...@@ -17,117 +17,97 @@ ...@@ -17,117 +17,97 @@
#include "mmInt.h" #include "mmInt.h"
#include "tjson.h" #include "tjson.h"
int32_t mmReadFile(const char *path, SMnodeOpt *pOption) { static int32_t mmDecodeOption(SJson *pJson, SMnodeOpt *pOption) {
int32_t code = TSDB_CODE_INVALID_JSON_FORMAT; int32_t code = 0;
int32_t len = 0;
int32_t maxLen = 4096;
char *content = taosMemoryCalloc(1, maxLen + 1);
cJSON *root = NULL;
char file[PATH_MAX] = {0};
TdFilePtr pFile = NULL;
snprintf(file, sizeof(file), "%s%smnode.json", path, TD_DIRSEP); tjsonGetInt32ValueFromDouble(pJson, "deployed", pOption->deploy, code);
pFile = taosOpenFile(file, TD_FILE_READ); if (code < 0) return -1;
if (pFile == NULL) { tjsonGetInt32ValueFromDouble(pJson, "selfIndex", pOption->selfIndex, code);
code = 0; if (code < 0) return 0;
goto _OVER;
}
len = (int32_t)taosReadFile(pFile, content, maxLen); SJson *replicas = tjsonGetObjectItem(pJson, "replicas");
if (len <= 0) { if (replicas == NULL) return 0;
dError("failed to read %s since content is null", file); pOption->numOfReplicas = tjsonGetArraySize(replicas);
goto _OVER;
}
content[len] = 0; for (int32_t i = 0; i < pOption->numOfReplicas; ++i) {
root = cJSON_Parse(content); SJson *replica = tjsonGetArrayItem(replicas, i);
if (root == NULL) { if (replica == NULL) return -1;
dError("failed to read %s since invalid json format", file);
goto _OVER; SReplica *pReplica = pOption->replicas + i;
tjsonGetInt32ValueFromDouble(replica, "id", pReplica->id, code);
if (code < 0) return -1;
code = tjsonGetStringValue(replica, "fqdn", pReplica->fqdn);
if (code < 0) return -1;
tjsonGetUInt16ValueFromDouble(replica, "port", pReplica->port, code);
if (code < 0) return -1;
} }
cJSON *deployed = cJSON_GetObjectItem(root, "deployed"); return 0;
if (!deployed || deployed->type != cJSON_Number) { }
dError("failed to read %s since deployed not found", file);
goto _OVER; int32_t mmReadFile(const char *path, SMnodeOpt *pOption) {
int32_t code = -1;
TdFilePtr pFile = NULL;
char *pData = NULL;
SJson *pJson = NULL;
char file[PATH_MAX] = {0};
snprintf(file, sizeof(file), "%s%smnode.json", path, TD_DIRSEP);
if (taosStatFile(file, NULL, NULL) < 0) {
dInfo("mnode file:%s not exist", file);
return 0;
} }
pOption->deploy = deployed->valueint;
cJSON *selfIndex = cJSON_GetObjectItem(root, "selfIndex"); pFile = taosOpenFile(file, TD_FILE_READ);
if (selfIndex) { if (pFile == NULL) {
if (selfIndex->type != cJSON_Number) { terrno = TAOS_SYSTEM_ERROR(errno);
dError("failed to read %s since selfIndex not found", file); dError("failed to open mnode file:%s since %s", file, terrstr());
goto _OVER; goto _OVER;
} }
pOption->selfIndex = selfIndex->valueint;
}
cJSON *replicas = cJSON_GetObjectItem(root, "replicas"); int64_t size = 0;
if (replicas) { if (taosFStatFile(pFile, &size, NULL) < 0) {
if (replicas->type != cJSON_Array) { terrno = TAOS_SYSTEM_ERROR(errno);
dError("failed to read %s since replicas not found", file); dError("failed to fstat mnode file:%s since %s", file, terrstr());
goto _OVER; goto _OVER;
} }
int32_t numOfReplicas = cJSON_GetArraySize(replicas); pData = taosMemoryMalloc(size + 1);
if (numOfReplicas <= 0) { if (pData == NULL) {
dError("failed to read %s since numOfReplicas:%d invalid", file, numOfReplicas); terrno = TSDB_CODE_OUT_OF_MEMORY;
goto _OVER; goto _OVER;
} }
pOption->numOfReplicas = numOfReplicas;
for (int32_t i = 0; i < numOfReplicas; ++i) {
SReplica *pReplica = pOption->replicas + i;
cJSON *replica = cJSON_GetArrayItem(replicas, i);
if (replica == NULL) break;
cJSON *id = cJSON_GetObjectItem(replica, "id"); if (taosReadFile(pFile, pData, size) != size) {
if (id) { terrno = TAOS_SYSTEM_ERROR(errno);
if (id->type != cJSON_Number) { dError("failed to read mnode file:%s since %s", file, terrstr());
dError("failed to read %s since id not found", file);
goto _OVER; goto _OVER;
} }
if (pReplica) {
pReplica->id = id->valueint;
}
}
cJSON *fqdn = cJSON_GetObjectItem(replica, "fqdn"); pData[size] = '\0';
if (fqdn) {
if (fqdn->type != cJSON_String || fqdn->valuestring == NULL) { pJson = tjsonParse(pData);
dError("failed to read %s since fqdn not found", file); if (pJson == NULL) {
terrno = TSDB_CODE_INVALID_JSON_FORMAT;
goto _OVER; goto _OVER;
} }
if (pReplica) {
tstrncpy(pReplica->fqdn, fqdn->valuestring, TSDB_FQDN_LEN);
}
}
cJSON *port = cJSON_GetObjectItem(replica, "port"); if (mmDecodeOption(pJson, pOption) < 0) {
if (port) { terrno = TSDB_CODE_INVALID_JSON_FORMAT;
if (port->type != cJSON_Number) {
dError("failed to read %s since port not found", file);
goto _OVER; goto _OVER;
} }
if (pReplica) {
pReplica->port = (uint16_t)port->valueint;
}
}
}
}
code = 0; code = 0;
dInfo("succceed to read mnode file %s", file);
_OVER: _OVER:
if (content != NULL) taosMemoryFree(content); if (pData != NULL) taosMemoryFree(pData);
if (root != NULL) cJSON_Delete(root); if (pJson != NULL) cJSON_Delete(pJson);
if (pFile != NULL) taosCloseFile(&pFile); if (pFile != NULL) taosCloseFile(&pFile);
if (code == 0) {
dDebug("succcessed to read file %s, deployed:%d", file, pOption->deploy);
}
terrno = code; if (code != 0) {
dError("failed to read mnode file:%s since %s", file, terrstr());
}
return code; return code;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册