[TD-10430] add dnode cfg for dnode module
This commit is contained in:
parent
7a78d7223d
commit
9c29039ae7
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_DNODE_CFG_H_
|
||||||
|
#define _TD_DNODE_CFG_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "dnodeInt.h"
|
||||||
|
|
||||||
|
typedef struct DnCfg {
|
||||||
|
Dnode * dnode;
|
||||||
|
int32_t dnodeId;
|
||||||
|
int32_t dropped;
|
||||||
|
char clusterId[TSDB_CLUSTER_ID_LEN];
|
||||||
|
char file[PATH_MAX + 20];
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
} DnCfg;
|
||||||
|
|
||||||
|
int32_t dnodeInitCfg(Dnode *dnode, DnCfg **cfg);
|
||||||
|
void dnodeCleanupCfg(Dnode *dnode, DnCfg **cfg);
|
||||||
|
void dnodeUpdateCfg(DnCfg *cfg, SDnodeCfg *data);
|
||||||
|
int32_t dnodeGetDnodeId(DnCfg *cfg);
|
||||||
|
void dnodeGetClusterId(DnCfg *cfg, char *clusterId);
|
||||||
|
void dnodeGetCfg(DnCfg *cfg, int32_t *dnodeId, char *clusterId);
|
||||||
|
void dnodeSetDropped(DnCfg *cfg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_DNODE_CFG_H_*/
|
|
@ -0,0 +1,178 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "cJSON.h"
|
||||||
|
#include "dnodeCfg.h"
|
||||||
|
|
||||||
|
static int32_t dnodeReadCfg(DnCfg *cfg) {
|
||||||
|
int32_t len = 0;
|
||||||
|
int32_t maxLen = 200;
|
||||||
|
char * content = calloc(1, maxLen + 1);
|
||||||
|
cJSON * root = NULL;
|
||||||
|
FILE * fp = NULL;
|
||||||
|
|
||||||
|
fp = fopen(cfg->file, "r");
|
||||||
|
if (!fp) {
|
||||||
|
dDebug("file %s not exist", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = (int32_t)fread(content, 1, maxLen, fp);
|
||||||
|
if (len <= 0) {
|
||||||
|
dError("failed to read %s since content is null", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
content[len] = 0;
|
||||||
|
root = cJSON_Parse(content);
|
||||||
|
if (root == NULL) {
|
||||||
|
dError("failed to read %s since invalid json format", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON *dnodeId = cJSON_GetObjectItem(root, "dnodeId");
|
||||||
|
if (!dnodeId || dnodeId->type != cJSON_Number) {
|
||||||
|
dError("failed to read %s since dnodeId not found", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
cfg->dnodeId = (int32_t)dnodeId->valueint;
|
||||||
|
|
||||||
|
cJSON *dropped = cJSON_GetObjectItem(root, "dropped");
|
||||||
|
if (!dropped || dropped->type != cJSON_Number) {
|
||||||
|
dError("failed to read %s since dropped not found", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
cfg->dropped = (int32_t)dropped->valueint;
|
||||||
|
|
||||||
|
cJSON *clusterId = cJSON_GetObjectItem(root, "clusterId");
|
||||||
|
if (!clusterId || clusterId->type != cJSON_String) {
|
||||||
|
dError("failed to read %s since clusterId not found", cfg->file);
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
tstrncpy(cfg->clusterId, clusterId->valuestring, TSDB_CLUSTER_ID_LEN);
|
||||||
|
|
||||||
|
dInfo("successed to read %s", cfg->file);
|
||||||
|
|
||||||
|
PARSE_CFG_OVER:
|
||||||
|
if (content != NULL) free(content);
|
||||||
|
if (root != NULL) cJSON_Delete(root);
|
||||||
|
if (fp != NULL) fclose(fp);
|
||||||
|
terrno = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dnodeWriteCfg(DnCfg *cfg) {
|
||||||
|
FILE *fp = fopen(cfg->file, "w");
|
||||||
|
if (!fp) {
|
||||||
|
dError("failed to write %s since %s", cfg->file, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t len = 0;
|
||||||
|
int32_t maxLen = 200;
|
||||||
|
char * content = calloc(1, maxLen + 1);
|
||||||
|
|
||||||
|
len += snprintf(content + len, maxLen - len, "{\n");
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"dnodeId\": %d,\n", cfg->dnodeId);
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"dropped\": %d,\n", cfg->dropped);
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"clusterId\": \"%s\"\n", cfg->clusterId);
|
||||||
|
len += snprintf(content + len, maxLen - len, "}\n");
|
||||||
|
|
||||||
|
fwrite(content, 1, len, fp);
|
||||||
|
taosFsync(fileno(fp));
|
||||||
|
fclose(fp);
|
||||||
|
free(content);
|
||||||
|
terrno = 0;
|
||||||
|
|
||||||
|
dInfo("successed to write %s", cfg->file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dnodeInitCfg(Dnode *dnode, DnCfg **out) {
|
||||||
|
DnCfg* cfg = calloc(1, sizeof(DnCfg));
|
||||||
|
if (cfg == NULL) return -1;
|
||||||
|
|
||||||
|
cfg->dnode = dnode;
|
||||||
|
cfg->dnodeId = 0;
|
||||||
|
cfg->dropped = 0;
|
||||||
|
cfg->clusterId[0] = 0;
|
||||||
|
snprintf(cfg->file, sizeof(cfg->file), "%s/dnodeCfg.json", tsDnodeDir);
|
||||||
|
pthread_mutex_init(&cfg->mutex, NULL);
|
||||||
|
*out = cfg;
|
||||||
|
|
||||||
|
int32_t ret = dnodeReadCfg(cfg);
|
||||||
|
if (ret == 0) {
|
||||||
|
dInfo("dnode cfg is initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->dropped) {
|
||||||
|
dInfo("dnode is dropped and start to exit");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeCleanupCfg(Dnode *dnode, DnCfg **out) {
|
||||||
|
DnCfg* cfg = *out;
|
||||||
|
*out = NULL;
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&cfg->mutex);
|
||||||
|
free(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeUpdateCfg(DnCfg *cfg, SDnodeCfg *data) {
|
||||||
|
if (cfg == NULL || cfg->dnodeId == 0) return;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&cfg->mutex);
|
||||||
|
|
||||||
|
cfg->dnodeId = data->dnodeId;
|
||||||
|
tstrncpy(cfg->clusterId, data->clusterId, TSDB_CLUSTER_ID_LEN);
|
||||||
|
dInfo("dnodeId is set to %d, clusterId is set to %s", cfg->dnodeId, cfg->clusterId);
|
||||||
|
|
||||||
|
dnodeWriteCfg(cfg);
|
||||||
|
pthread_mutex_unlock(&cfg->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeSetDropped(DnCfg *cfg) {
|
||||||
|
pthread_mutex_lock(&cfg->mutex);
|
||||||
|
cfg->dropped = 1;
|
||||||
|
dnodeWriteCfg(cfg);
|
||||||
|
pthread_mutex_unlock(&cfg->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dnodeGetDnodeId(DnCfg *cfg) {
|
||||||
|
int32_t dnodeId = 0;
|
||||||
|
pthread_mutex_lock(&cfg->mutex);
|
||||||
|
dnodeId = cfg->dnodeId;
|
||||||
|
pthread_mutex_unlock(&cfg->mutex);
|
||||||
|
return dnodeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeGetClusterId(DnCfg *cfg, char *clusterId) {
|
||||||
|
pthread_mutex_lock(&cfg->mutex);
|
||||||
|
tstrncpy(clusterId, cfg->clusterId, TSDB_CLUSTER_ID_LEN);
|
||||||
|
pthread_mutex_unlock(&cfg->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeGetCfg(DnCfg *cfg, int32_t *dnodeId, char *clusterId) {
|
||||||
|
pthread_mutex_lock(&cfg->mutex);
|
||||||
|
*dnodeId = cfg->dnodeId;
|
||||||
|
tstrncpy(clusterId, cfg->clusterId, TSDB_CLUSTER_ID_LEN);
|
||||||
|
pthread_mutex_unlock(&cfg->mutex);
|
||||||
|
}
|
Loading…
Reference in New Issue