From d3518fbc89b964232828dd0a2d052d34d3555557 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Tue, 3 Sep 2024 15:24:33 +0800 Subject: [PATCH 01/10] fix:TD-31587:Repeated insert performance degradation --- include/libs/monitorfw/taos_counter.h | 3 ++ source/dnode/mgmt/mgmt_dnode/inc/dmInt.h | 1 + source/dnode/mgmt/mgmt_dnode/src/dmInt.c | 1 + source/dnode/mgmt/mgmt_dnode/src/dmWorker.c | 1 + source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 24 ++++++++++++ source/dnode/mgmt/node_mgmt/inc/dmMgmt.h | 1 + source/dnode/mgmt/node_mgmt/inc/dmNodes.h | 2 + source/dnode/mgmt/node_mgmt/src/dmEnv.c | 1 + source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 18 +++++++++ source/dnode/mgmt/node_util/inc/dmUtil.h | 2 + .../monitorfw/inc/taos_metric_formatter_i.h | 1 + source/libs/monitorfw/src/taos_counter.c | 38 +++++++++++++++++++ .../monitorfw/src/taos_metric_formatter.c | 15 ++++++++ 13 files changed, 108 insertions(+) diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h index 28a9eed41c..1fdb6f7f7a 100644 --- a/include/libs/monitorfw/taos_counter.h +++ b/include/libs/monitorfw/taos_counter.h @@ -99,4 +99,7 @@ int taos_counter_inc(taos_counter_t *self, const char **label_values); */ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_values); +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys,int32_t **vgroup_ids); +int taos_counter_get_keys_size(taos_counter_t *self); +int taos_counter_delete(taos_counter_t *self, char *key); #endif // TAOS_COUNTER_H diff --git a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h index be9ff56674..5a55af24b1 100644 --- a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h +++ b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h @@ -37,6 +37,7 @@ typedef struct SDnodeMgmt { ProcessAlterNodeTypeFp processAlterNodeTypeFp; ProcessDropNodeFp processDropNodeFp; SendMonitorReportFp sendMonitorReportFp; + MonitorCleanExpiredSamplesFp monitorCleanExpiredSamplesFp; SendAuditRecordsFp sendAuditRecordsFp; GetVnodeLoadsFp getVnodeLoadsFp; GetVnodeLoadsFp getVnodeLoadsLiteFp; diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmInt.c b/source/dnode/mgmt/mgmt_dnode/src/dmInt.c index 958b411881..d7170398fb 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmInt.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmInt.c @@ -65,6 +65,7 @@ static int32_t dmOpenMgmt(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) { pMgmt->processAlterNodeTypeFp = pInput->processAlterNodeTypeFp; pMgmt->processDropNodeFp = pInput->processDropNodeFp; pMgmt->sendMonitorReportFp = pInput->sendMonitorReportFp; + pMgmt->monitorCleanExpiredSamplesFp = pInput->monitorCleanExpiredSamplesFp; pMgmt->sendAuditRecordsFp = pInput->sendAuditRecordFp; pMgmt->getVnodeLoadsFp = pInput->getVnodeLoadsFp; pMgmt->getVnodeLoadsLiteFp = pInput->getVnodeLoadsLiteFp; diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c index aeb519596d..4cfadc8f59 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c @@ -168,6 +168,7 @@ static void *dmMonitorThreadFp(void *param) { float interval = (curTime - lastTime) / 1000.0f; if (interval >= tsMonitorInterval) { (*pMgmt->sendMonitorReportFp)(); + (*pMgmt->monitorCleanExpiredSamplesFp)(); lastTime = curTime; trimCount = (trimCount + 1) % TRIM_FREQ; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 4cb6c5c724..685a35d9ff 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -15,6 +15,9 @@ #define _DEFAULT_SOURCE #include "vmInt.h" +#include "taos_monitor.h" + +extern taos_counter_t *tsInsertCounter; void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo, bool isReset) { pInfo->pVloads = taosArrayInit(pMgmt->state.totalVnodes, sizeof(SVnodeLoad)); @@ -117,6 +120,27 @@ void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) { taosArrayDestroy(pVloads); } +int vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { + int list_size = taos_counter_get_keys_size(tsInsertCounter); + if (list_size == 0) return 0; + int32_t *vgroup_ids; + char **keys; + taos_counter_get_vgroup_ids(tsInsertCounter,&keys,&vgroup_ids); + int r = 0; + (void)taosThreadRwlockWrlock(&pMgmt->lock); + for (int i = 0; ihash, &vgroup_id, sizeof(int32_t)); + if (vnode == NULL) { + r = taos_counter_delete(tsInsertCounter, keys[i]); + } + } + (void)taosThreadRwlockUnlock(&pMgmt->lock); + taosMemoryFree(vgroup_ids); + taosMemoryFree(keys); + return r; +} + static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { memcpy(pCfg, &vnodeCfgDefault, sizeof(SVnodeCfg)); diff --git a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h index 9548d0cad9..5196987f28 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h @@ -128,6 +128,7 @@ int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg); // dmMonitor.c void dmSendMonitorReport(); +void dmMonitorCleanExpiredSamples(); void dmSendAuditRecords(); void dmGetVnodeLoads(SMonVloadInfo *pInfo); void dmGetVnodeLoadsLite(SMonVloadInfo *pInfo); diff --git a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h index 7d635c6bdc..c0ef92b537 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h @@ -39,6 +39,8 @@ void vmGetVnodeLoadsLite(void *pMgmt, SMonVloadInfo *pInfo); void mmGetMnodeLoads(void *pMgmt, SMonMloadInfo *pInfo); void qmGetQnodeLoads(void *pMgmt, SQnodeLoad *pInfo); +int vmCleanExpriedSamples(void *pMgmt); + #ifdef __cplusplus } #endif diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c index 0a75847d96..620aed709f 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c +++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c @@ -409,6 +409,7 @@ SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper) { .processAlterNodeTypeFp = dmProcessAlterNodeTypeReq, .processDropNodeFp = dmProcessDropNodeReq, .sendMonitorReportFp = dmSendMonitorReport, + .monitorCleanExpiredSamplesFp = dmMonitorCleanExpiredSamples, .sendAuditRecordFp = auditSendRecordsInBatch, .getVnodeLoadsFp = dmGetVnodeLoads, .getVnodeLoadsLiteFp = dmGetVnodeLoadsLite, diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index d3197282b6..a2658b26cb 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -52,6 +52,16 @@ static void dmGetDmMonitorInfo(SDnode *pDnode) { monSetDmInfo(&dmInfo); } +int dmCleanExpriedSamples(SDnode *pDnode) { + SMgmtWrapper *pWrapper = &pDnode->wrappers[VNODE]; + if (dmMarkWrapper(pWrapper) == 0) { + if (pWrapper->pMgmt != NULL) { + return vmCleanExpriedSamples(pWrapper->pMgmt); + } + } + return 0; +} + static void dmGetDmMonitorInfoBasic(SDnode *pDnode) { SMonDmInfo dmInfo = {0}; dmGetMonitorBasicInfoBasic(pDnode, &dmInfo.basic); @@ -123,6 +133,14 @@ void dmSendMonitorReport() { monGenAndSendReport(); } +void dmMonitorCleanExpiredSamples() { + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; + dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); + + SDnode *pDnode = dmInstance(); + (void)dmCleanExpriedSamples(pDnode); +} + //Todo: put this in seperate file in the future void dmSendAuditRecords() { auditSendRecordsInBatch(); diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index 4ad4ea7c30..a66b8d7b67 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -116,6 +116,7 @@ typedef enum { typedef int32_t (*ProcessCreateNodeFp)(EDndNodeType ntype, SRpcMsg *pMsg); typedef int32_t (*ProcessDropNodeFp)(EDndNodeType ntype, SRpcMsg *pMsg); typedef void (*SendMonitorReportFp)(); +typedef void (*MonitorCleanExpiredSamplesFp)(); typedef void (*SendAuditRecordsFp)(); typedef void (*GetVnodeLoadsFp)(SMonVloadInfo *pInfo); typedef void (*GetMnodeLoadsFp)(SMonMloadInfo *pInfo); @@ -155,6 +156,7 @@ typedef struct { ProcessAlterNodeTypeFp processAlterNodeTypeFp; ProcessDropNodeFp processDropNodeFp; SendMonitorReportFp sendMonitorReportFp; + MonitorCleanExpiredSamplesFp monitorCleanExpiredSamplesFp; SendAuditRecordsFp sendAuditRecordFp; GetVnodeLoadsFp getVnodeLoadsFp; GetVnodeLoadsFp getVnodeLoadsLiteFp; diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h index ab60359f4a..dee25f4c06 100644 --- a/source/libs/monitorfw/inc/taos_metric_formatter_i.h +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -80,4 +80,5 @@ int taos_metric_formatter_clear(taos_metric_formatter_t *self); */ char *taos_metric_formatter_dump(taos_metric_formatter_t *metric_formatter); +int32_t taos_metric_formatter_get_vgroup_id(char *key); #endif // TAOS_METRIC_FORMATTER_I_H diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index ef7d41cf2c..c01322295d 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -27,6 +27,7 @@ #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" #include "taos_metric_t.h" +#include "taos_metric_formatter_i.h" taos_counter_t *taos_counter_new(const char *name, const char *help, size_t label_key_count, const char **label_keys) { return (taos_counter_t *)taos_metric_new(TAOS_COUNTER, name, help, label_key_count, label_keys); @@ -64,3 +65,40 @@ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_va if (sample == NULL) return 1; return taos_metric_sample_add(sample, r_value); } + +int taos_counter_get_keys_size(taos_counter_t *self) { + return self->samples->keys->size; +} + +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys,int32_t **vgroup_ids) { + TAOS_TEST_PARA(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + if (self->samples == NULL) return 1; + taos_linked_list_t *key_list = self->samples->keys; + int r = 0; + *vgroup_ids = (int32_t *)taos_malloc(key_list->size*sizeof(int32_t)); + *keys = (char **)taos_malloc(key_list->size*sizeof(char *)); + int index = 0; + for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL;current_key = current_key->next) { + char *key = (char *)current_key->item; + int32_t vgroup_id = taos_metric_formatter_get_vgroup_id(key); + (*vgroup_ids)[index] = vgroup_id; + (*keys)[index] = key; + index++; + } + return r; +} + +int taos_counter_delete(taos_counter_t *self, char *key) { + TAOS_TEST_PARA(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + return taos_map_delete(self->samples, key); +} \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index a20a8d919c..1d5925f565 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -156,6 +156,21 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *self, const char } return 0; } +int32_t taos_metric_formatter_get_vgroup_id(char *key) { + char *start,*end; + char vgroupid[10]; + start = strstr(key, "vgroup_id=\""); + if (start) { + start += strlen("vgroup_id=\""); + end = strchr(start, '\"'); + if (end) { + strncpy(vgroupid, start, end - start); + vgroupid[end - start] = '\0'; + } + return strtol(vgroupid, NULL, 10); + } + return 0; +} /* int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, char *ts, char *format) { From 81615362c3a93fa802f75ec4716eab1d2f2bbaa0 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Tue, 3 Sep 2024 16:25:40 +0800 Subject: [PATCH 02/10] format --- include/libs/monitorfw/taos_counter.h | 2 +- source/dnode/mgmt/mgmt_dnode/inc/dmInt.h | 40 +++++++++---------- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 18 ++++----- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 12 +++--- source/dnode/mgmt/node_util/inc/dmUtil.h | 30 +++++++------- .../monitorfw/inc/taos_metric_formatter_i.h | 4 +- source/libs/monitorfw/src/taos_counter.c | 22 +++++----- .../monitorfw/src/taos_metric_formatter.c | 24 +++++------ 8 files changed, 74 insertions(+), 78 deletions(-) diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h index 1fdb6f7f7a..816d8ea7b9 100644 --- a/include/libs/monitorfw/taos_counter.h +++ b/include/libs/monitorfw/taos_counter.h @@ -99,7 +99,7 @@ int taos_counter_inc(taos_counter_t *self, const char **label_values); */ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_values); -int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys,int32_t **vgroup_ids); +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids); int taos_counter_get_keys_size(taos_counter_t *self); int taos_counter_delete(taos_counter_t *self, char *key); #endif // TAOS_COUNTER_H diff --git a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h index 5a55af24b1..18b3f66a60 100644 --- a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h +++ b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h @@ -23,27 +23,27 @@ extern "C" { #endif typedef struct SDnodeMgmt { - SDnodeData *pData; - SMsgCb msgCb; - const char *path; - const char *name; - TdThread statusThread; - TdThread notifyThread; - TdThread monitorThread; - TdThread auditThread; - TdThread crashReportThread; - SSingleWorker mgmtWorker; - ProcessCreateNodeFp processCreateNodeFp; - ProcessAlterNodeTypeFp processAlterNodeTypeFp; - ProcessDropNodeFp processDropNodeFp; - SendMonitorReportFp sendMonitorReportFp; + SDnodeData *pData; + SMsgCb msgCb; + const char *path; + const char *name; + TdThread statusThread; + TdThread notifyThread; + TdThread monitorThread; + TdThread auditThread; + TdThread crashReportThread; + SSingleWorker mgmtWorker; + ProcessCreateNodeFp processCreateNodeFp; + ProcessAlterNodeTypeFp processAlterNodeTypeFp; + ProcessDropNodeFp processDropNodeFp; + SendMonitorReportFp sendMonitorReportFp; MonitorCleanExpiredSamplesFp monitorCleanExpiredSamplesFp; - SendAuditRecordsFp sendAuditRecordsFp; - GetVnodeLoadsFp getVnodeLoadsFp; - GetVnodeLoadsFp getVnodeLoadsLiteFp; - GetMnodeLoadsFp getMnodeLoadsFp; - GetQnodeLoadsFp getQnodeLoadsFp; - int32_t statusSeq; + SendAuditRecordsFp sendAuditRecordsFp; + GetVnodeLoadsFp getVnodeLoadsFp; + GetVnodeLoadsFp getVnodeLoadsLiteFp; + GetMnodeLoadsFp getMnodeLoadsFp; + GetQnodeLoadsFp getQnodeLoadsFp; + int32_t statusSeq; } SDnodeMgmt; // dmHandle.c diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 685a35d9ff..8ec51b637b 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -14,8 +14,8 @@ */ #define _DEFAULT_SOURCE -#include "vmInt.h" #include "taos_monitor.h" +#include "vmInt.h" extern taos_counter_t *tsInsertCounter; @@ -124,16 +124,16 @@ int vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { int list_size = taos_counter_get_keys_size(tsInsertCounter); if (list_size == 0) return 0; int32_t *vgroup_ids; - char **keys; - taos_counter_get_vgroup_ids(tsInsertCounter,&keys,&vgroup_ids); + char **keys; + taos_counter_get_vgroup_ids(tsInsertCounter, &keys, &vgroup_ids); int r = 0; (void)taosThreadRwlockWrlock(&pMgmt->lock); - for (int i = 0; ihash, &vgroup_id, sizeof(int32_t)); - if (vnode == NULL) { - r = taos_counter_delete(tsInsertCounter, keys[i]); - } + for (int i = 0; i < list_size; i++) { + int32_t vgroup_id = vgroup_ids[i]; + void *vnode = taosHashGet(pMgmt->hash, &vgroup_id, sizeof(int32_t)); + if (vnode == NULL) { + r = taos_counter_delete(tsInsertCounter, keys[i]); + } } (void)taosThreadRwlockUnlock(&pMgmt->lock); taosMemoryFree(vgroup_ids); diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index a2658b26cb..61cdd5a272 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -14,9 +14,9 @@ */ #define _DEFAULT_SOURCE +#include "audit.h" #include "dmMgmt.h" #include "dmNodes.h" -#include "audit.h" static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->protocol = 1; @@ -33,8 +33,8 @@ static void dmGetMonitorBasicInfoBasic(SDnode *pDnode, SMonBasicInfo *pInfo) { } static void dmGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { - //pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / (86400000.0f); - pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) /1000.0f; + // pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / (86400000.0f); + pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / 1000.0f; pInfo->has_mnode = pDnode->wrappers[MNODE].required; pInfo->has_qnode = pDnode->wrappers[QNODE].required; pInfo->has_snode = pDnode->wrappers[SNODE].required; @@ -141,10 +141,8 @@ void dmMonitorCleanExpiredSamples() { (void)dmCleanExpriedSamples(pDnode); } -//Todo: put this in seperate file in the future -void dmSendAuditRecords() { - auditSendRecordsInBatch(); -} +// Todo: put this in seperate file in the future +void dmSendAuditRecords() { auditSendRecordsInBatch(); } void dmGetVnodeLoads(SMonVloadInfo *pInfo) { SDnode *pDnode = dmInstance(); diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index a66b8d7b67..425f10392f 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -147,22 +147,22 @@ typedef struct { } SDnodeData; typedef struct { - const char *path; - const char *name; - STfs *pTfs; - SDnodeData *pData; - SMsgCb msgCb; - ProcessCreateNodeFp processCreateNodeFp; - ProcessAlterNodeTypeFp processAlterNodeTypeFp; - ProcessDropNodeFp processDropNodeFp; - SendMonitorReportFp sendMonitorReportFp; + const char *path; + const char *name; + STfs *pTfs; + SDnodeData *pData; + SMsgCb msgCb; + ProcessCreateNodeFp processCreateNodeFp; + ProcessAlterNodeTypeFp processAlterNodeTypeFp; + ProcessDropNodeFp processDropNodeFp; + SendMonitorReportFp sendMonitorReportFp; MonitorCleanExpiredSamplesFp monitorCleanExpiredSamplesFp; - SendAuditRecordsFp sendAuditRecordFp; - GetVnodeLoadsFp getVnodeLoadsFp; - GetVnodeLoadsFp getVnodeLoadsLiteFp; - GetMnodeLoadsFp getMnodeLoadsFp; - GetQnodeLoadsFp getQnodeLoadsFp; - StopDnodeFp stopDnodeFp; + SendAuditRecordsFp sendAuditRecordFp; + GetVnodeLoadsFp getVnodeLoadsFp; + GetVnodeLoadsFp getVnodeLoadsLiteFp; + GetMnodeLoadsFp getMnodeLoadsFp; + GetQnodeLoadsFp getQnodeLoadsFp; + StopDnodeFp stopDnodeFp; } SMgmtInputOpt; typedef struct { diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h index dee25f4c06..5c330b50e7 100644 --- a/source/libs/monitorfw/inc/taos_metric_formatter_i.h +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -57,8 +57,8 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *metric_formatter /** * @brief API PRIVATE Loads the formatter with a metric sample */ -int taos_metric_formatter_load_sample(taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, - char *ts, char *format); +int taos_metric_formatter_load_sample(taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, char *ts, + char *format); /** * @brief API PRIVATE Loads a metric in the string exposition format diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index c01322295d..84e29b5f93 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -20,14 +20,14 @@ #include "taos_alloc.h" // Private -#include "taos_test.h" #include "taos_errors.h" #include "taos_log.h" +#include "taos_metric_formatter_i.h" #include "taos_metric_i.h" #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" #include "taos_metric_t.h" -#include "taos_metric_formatter_i.h" +#include "taos_test.h" taos_counter_t *taos_counter_new(const char *name, const char *help, size_t label_key_count, const char **label_keys) { return (taos_counter_t *)taos_metric_new(TAOS_COUNTER, name, help, label_key_count, label_keys); @@ -66,11 +66,9 @@ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_va return taos_metric_sample_add(sample, r_value); } -int taos_counter_get_keys_size(taos_counter_t *self) { - return self->samples->keys->size; -} +int taos_counter_get_keys_size(taos_counter_t *self) { return self->samples->keys->size; } -int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys,int32_t **vgroup_ids) { +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids) { TAOS_TEST_PARA(self != NULL); if (self == NULL) return 1; if (self->type != TAOS_COUNTER) { @@ -79,12 +77,12 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys,int32_t **vgr } if (self->samples == NULL) return 1; taos_linked_list_t *key_list = self->samples->keys; - int r = 0; - *vgroup_ids = (int32_t *)taos_malloc(key_list->size*sizeof(int32_t)); - *keys = (char **)taos_malloc(key_list->size*sizeof(char *)); + int r = 0; + *vgroup_ids = (int32_t *)taos_malloc(key_list->size * sizeof(int32_t)); + *keys = (char **)taos_malloc(key_list->size * sizeof(char *)); int index = 0; - for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL;current_key = current_key->next) { - char *key = (char *)current_key->item; + for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL; current_key = current_key->next) { + char *key = (char *)current_key->item; int32_t vgroup_id = taos_metric_formatter_get_vgroup_id(key); (*vgroup_ids)[index] = vgroup_id; (*keys)[index] = key; @@ -100,5 +98,5 @@ int taos_counter_delete(taos_counter_t *self, char *key) { TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); return 1; } - return taos_map_delete(self->samples, key); + return taos_map_delete(self->samples, key); } \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 1d5925f565..cb1edd30b6 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -157,19 +157,19 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *self, const char return 0; } int32_t taos_metric_formatter_get_vgroup_id(char *key) { - char *start,*end; - char vgroupid[10]; - start = strstr(key, "vgroup_id=\""); - if (start) { - start += strlen("vgroup_id=\""); - end = strchr(start, '\"'); - if (end) { - strncpy(vgroupid, start, end - start); - vgroupid[end - start] = '\0'; - } - return strtol(vgroupid, NULL, 10); + char *start, *end; + char vgroupid[10]; + start = strstr(key, "vgroup_id=\""); + if (start) { + start += strlen("vgroup_id=\""); + end = strchr(start, '\"'); + if (end) { + strncpy(vgroupid, start, end - start); + vgroupid[end - start] = '\0'; } - return 0; + return strtol(vgroupid, NULL, 10); + } + return 0; } /* int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, From 97bcdfb86c27c2f7e536079b8d57f64f0aa8620a Mon Sep 17 00:00:00 2001 From: xiao77 Date: Tue, 3 Sep 2024 20:09:06 +0800 Subject: [PATCH 03/10] resolve comments --- include/libs/monitorfw/taos_counter.h | 2 +- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 20 ++++++++++++++------ source/dnode/mgmt/node_mgmt/inc/dmNodes.h | 2 +- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 13 +++++++------ source/libs/monitorfw/src/taos_counter.c | 11 +++++++---- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h index 816d8ea7b9..910f6e1aed 100644 --- a/include/libs/monitorfw/taos_counter.h +++ b/include/libs/monitorfw/taos_counter.h @@ -99,7 +99,7 @@ int taos_counter_inc(taos_counter_t *self, const char **label_values); */ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_values); -int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids); +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids, int *list_size); int taos_counter_get_keys_size(taos_counter_t *self); int taos_counter_delete(taos_counter_t *self, char *key); #endif // TAOS_COUNTER_H diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 8ec51b637b..cf0f38243e 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -120,25 +120,33 @@ void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) { taosArrayDestroy(pVloads); } -int vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { +void vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { int list_size = taos_counter_get_keys_size(tsInsertCounter); - if (list_size == 0) return 0; + if (list_size == 0) return; int32_t *vgroup_ids; char **keys; - taos_counter_get_vgroup_ids(tsInsertCounter, &keys, &vgroup_ids); - int r = 0; - (void)taosThreadRwlockWrlock(&pMgmt->lock); + int r = 0; + r = taos_counter_get_vgroup_ids(tsInsertCounter, &keys, &vgroup_ids, &list_size); + if (r) { + dError("failed to get vgroup ids"); + return; + } + (void)taosThreadRwlockRdlock(&pMgmt->lock); for (int i = 0; i < list_size; i++) { int32_t vgroup_id = vgroup_ids[i]; void *vnode = taosHashGet(pMgmt->hash, &vgroup_id, sizeof(int32_t)); if (vnode == NULL) { r = taos_counter_delete(tsInsertCounter, keys[i]); + if (r) { + dError("failed to delete key:%s", keys[i]); + return; + } } } (void)taosThreadRwlockUnlock(&pMgmt->lock); taosMemoryFree(vgroup_ids); taosMemoryFree(keys); - return r; + return; } static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { diff --git a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h index c0ef92b537..2561a13b92 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h @@ -39,7 +39,7 @@ void vmGetVnodeLoadsLite(void *pMgmt, SMonVloadInfo *pInfo); void mmGetMnodeLoads(void *pMgmt, SMonMloadInfo *pInfo); void qmGetQnodeLoads(void *pMgmt, SQnodeLoad *pInfo); -int vmCleanExpriedSamples(void *pMgmt); +void vmCleanExpriedSamples(void *pMgmt); #ifdef __cplusplus } diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 61cdd5a272..68a851569c 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -14,9 +14,9 @@ */ #define _DEFAULT_SOURCE -#include "audit.h" #include "dmMgmt.h" #include "dmNodes.h" +#include "audit.h" static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->protocol = 1; @@ -52,14 +52,15 @@ static void dmGetDmMonitorInfo(SDnode *pDnode) { monSetDmInfo(&dmInfo); } -int dmCleanExpriedSamples(SDnode *pDnode) { +void dmCleanExpriedSamples(SDnode *pDnode) { SMgmtWrapper *pWrapper = &pDnode->wrappers[VNODE]; if (dmMarkWrapper(pWrapper) == 0) { if (pWrapper->pMgmt != NULL) { - return vmCleanExpriedSamples(pWrapper->pMgmt); + vmCleanExpriedSamples(pWrapper->pMgmt); } } - return 0; + dmReleaseWrapper(pWrapper); + return; } static void dmGetDmMonitorInfoBasic(SDnode *pDnode) { @@ -134,8 +135,8 @@ void dmSendMonitorReport() { } void dmMonitorCleanExpiredSamples() { - if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; - dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); + if (!tsEnableMonitor) return; + dTrace("clean monitor expired samples"); SDnode *pDnode = dmInstance(); (void)dmCleanExpriedSamples(pDnode); diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index 84e29b5f93..829a05aa4e 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -68,7 +68,7 @@ int taos_counter_add(taos_counter_t *self, double r_value, const char **label_va int taos_counter_get_keys_size(taos_counter_t *self) { return self->samples->keys->size; } -int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids) { +int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vgroup_ids, int *list_size) { TAOS_TEST_PARA(self != NULL); if (self == NULL) return 1; if (self->type != TAOS_COUNTER) { @@ -77,9 +77,12 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg } if (self->samples == NULL) return 1; taos_linked_list_t *key_list = self->samples->keys; - int r = 0; - *vgroup_ids = (int32_t *)taos_malloc(key_list->size * sizeof(int32_t)); - *keys = (char **)taos_malloc(key_list->size * sizeof(char *)); + *list_size = key_list->size; + int r = 0; + *vgroup_ids = (int32_t *)taos_malloc(*list_size * sizeof(int32_t)); + if (vgroup_ids == NULL) return 1; + *keys = (char **)taos_malloc(*list_size * sizeof(char *)); + if (keys == NULL) return 1; int index = 0; for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL; current_key = current_key->next) { char *key = (char *)current_key->item; From 6497290926f7e9ca8d9668be46a212abb81ca415 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Tue, 3 Sep 2024 20:22:26 +0800 Subject: [PATCH 04/10] add rd lock while range keys --- source/libs/monitorfw/src/taos_counter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index 829a05aa4e..be5e1f781f 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -84,6 +84,7 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg *keys = (char **)taos_malloc(*list_size * sizeof(char *)); if (keys == NULL) return 1; int index = 0; + pthread_rwlock_rdlock(self->rwlock); for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL; current_key = current_key->next) { char *key = (char *)current_key->item; int32_t vgroup_id = taos_metric_formatter_get_vgroup_id(key); @@ -91,6 +92,7 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg (*keys)[index] = key; index++; } + pthread_rwlock_unlock(self->rwlock); return r; } From 8a8ba407ba4cf53866103467891b2cfb0a46a2b0 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 11:01:38 +0800 Subject: [PATCH 05/10] fix ci --- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 3 +-- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index cf0f38243e..35b25cb85a 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -138,8 +138,7 @@ void vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { if (vnode == NULL) { r = taos_counter_delete(tsInsertCounter, keys[i]); if (r) { - dError("failed to delete key:%s", keys[i]); - return; + dError("failed to delete monitor sample key:%s", keys[i]); } } } diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 68a851569c..ce0b2b59e0 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -135,7 +135,7 @@ void dmSendMonitorReport() { } void dmMonitorCleanExpiredSamples() { - if (!tsEnableMonitor) return; + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; dTrace("clean monitor expired samples"); SDnode *pDnode = dmInstance(); From e4f8485697731bd514217f38bb04781e8a7865df Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 11:12:50 +0800 Subject: [PATCH 06/10] fix thread mutex unlock and mem free --- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 4 ++-- source/libs/monitorfw/src/taos_counter.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 35b25cb85a..2abf292e73 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -143,8 +143,8 @@ void vmCleanExpriedSamples(SVnodeMgmt *pMgmt) { } } (void)taosThreadRwlockUnlock(&pMgmt->lock); - taosMemoryFree(vgroup_ids); - taosMemoryFree(keys); + if (vgroup_ids) taosMemoryFree(vgroup_ids); + if (keys) taosMemoryFree(keys); return; } diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index be5e1f781f..e60e5a5f3f 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -76,15 +76,21 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg return 1; } if (self->samples == NULL) return 1; + pthread_rwlock_rdlock(self->rwlock); taos_linked_list_t *key_list = self->samples->keys; *list_size = key_list->size; int r = 0; *vgroup_ids = (int32_t *)taos_malloc(*list_size * sizeof(int32_t)); - if (vgroup_ids == NULL) return 1; + if (vgroup_ids == NULL) { + pthread_rwlock_unlock(self->rwlock); + return 1; + } *keys = (char **)taos_malloc(*list_size * sizeof(char *)); - if (keys == NULL) return 1; + if (keys == NULL) { + pthread_rwlock_unlock(self->rwlock); + return 1; + } int index = 0; - pthread_rwlock_rdlock(self->rwlock); for (taos_linked_list_node_t *current_key = key_list->head; current_key != NULL; current_key = current_key->next) { char *key = (char *)current_key->item; int32_t vgroup_id = taos_metric_formatter_get_vgroup_id(key); From ab2477510b479f892ff68611de7e14ff03fc37fa Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 13:38:51 +0800 Subject: [PATCH 07/10] thread lock result --- source/libs/monitorfw/src/taos_counter.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c index e60e5a5f3f..096d19c190 100644 --- a/source/libs/monitorfw/src/taos_counter.c +++ b/source/libs/monitorfw/src/taos_counter.c @@ -76,18 +76,18 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg return 1; } if (self->samples == NULL) return 1; - pthread_rwlock_rdlock(self->rwlock); + (void)pthread_rwlock_rdlock(self->rwlock); taos_linked_list_t *key_list = self->samples->keys; *list_size = key_list->size; int r = 0; *vgroup_ids = (int32_t *)taos_malloc(*list_size * sizeof(int32_t)); if (vgroup_ids == NULL) { - pthread_rwlock_unlock(self->rwlock); + (void)pthread_rwlock_unlock(self->rwlock); return 1; } *keys = (char **)taos_malloc(*list_size * sizeof(char *)); if (keys == NULL) { - pthread_rwlock_unlock(self->rwlock); + (void)pthread_rwlock_unlock(self->rwlock); return 1; } int index = 0; @@ -98,7 +98,7 @@ int taos_counter_get_vgroup_ids(taos_counter_t *self, char ***keys, int32_t **vg (*keys)[index] = key; index++; } - pthread_rwlock_unlock(self->rwlock); + (void)pthread_rwlock_unlock(self->rwlock); return r; } From d5525293f6be68bd508d8903aef2b3d74b945562 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 14:56:41 +0800 Subject: [PATCH 08/10] fix windows make error --- include/libs/monitorfw/taos_counter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h index 910f6e1aed..7797c695ab 100644 --- a/include/libs/monitorfw/taos_counter.h +++ b/include/libs/monitorfw/taos_counter.h @@ -15,8 +15,8 @@ #ifndef TAOS_COUNTER_H #define TAOS_COUNTER_H - #include +#include "os.h" #include "taos_metric.h" From ae530db81889a2e5954df328d3b8c2741ba12774 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 15:28:13 +0800 Subject: [PATCH 09/10] fix windows make error --- include/libs/monitorfw/taos_counter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h index 7797c695ab..a9d196d8ec 100644 --- a/include/libs/monitorfw/taos_counter.h +++ b/include/libs/monitorfw/taos_counter.h @@ -15,8 +15,8 @@ #ifndef TAOS_COUNTER_H #define TAOS_COUNTER_H +#include #include -#include "os.h" #include "taos_metric.h" From 84a54f88f62187567140baf5c9d94437e0a0e5e7 Mon Sep 17 00:00:00 2001 From: xiao77 Date: Thu, 5 Sep 2024 16:09:44 +0800 Subject: [PATCH 10/10] fix windows make error --- source/libs/monitorfw/inc/taos_metric_formatter_i.h | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h index 5c330b50e7..54e683fa91 100644 --- a/source/libs/monitorfw/inc/taos_metric_formatter_i.h +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -16,6 +16,7 @@ #ifndef TAOS_METRIC_FORMATTER_I_H #define TAOS_METRIC_FORMATTER_I_H +#include // Private #include "taos_metric_formatter_t.h"