TDengine/source/dnode/mnode/impl/src/mndCompact.c

1036 lines
34 KiB
C
Raw Normal View History

2023-11-23 04:43:28 +00:00
/*
* 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/>.
*/
2024-06-19 08:01:55 +00:00
#include "audit.h"
#include "mndCompact.h"
2023-11-23 04:43:28 +00:00
#include "mndCompactDetail.h"
2024-06-19 08:01:55 +00:00
#include "mndDb.h"
2023-11-23 10:16:18 +00:00
#include "mndDnode.h"
2023-11-23 11:26:14 +00:00
#include "mndPrivilege.h"
2024-06-19 08:01:55 +00:00
#include "mndShow.h"
2023-12-14 11:22:07 +00:00
#include "mndTrans.h"
2024-06-19 08:01:55 +00:00
#include "mndVgroup.h"
#include "tmisce.h"
#include "tmsgcb.h"
2023-11-23 04:43:28 +00:00
#define MND_COMPACT_VER_NUMBER 1
2024-06-19 08:01:55 +00:00
#define MND_COMPACT_ID_LEN 11
2023-11-23 04:43:28 +00:00
static int32_t mndProcessCompactTimer(SRpcMsg *pReq);
int32_t mndInitCompact(SMnode *pMnode) {
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_COMPACT, mndRetrieveCompact);
mndSetMsgHandle(pMnode, TDMT_MND_KILL_COMPACT, mndProcessKillCompactReq);
mndSetMsgHandle(pMnode, TDMT_VND_QUERY_COMPACT_PROGRESS_RSP, mndProcessQueryCompactRsp);
mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_TIMER, mndProcessCompactTimer);
2023-12-14 11:22:07 +00:00
mndSetMsgHandle(pMnode, TDMT_VND_KILL_COMPACT_RSP, mndTransProcessRsp);
2023-11-23 04:43:28 +00:00
SSdbTable table = {
.sdbType = SDB_COMPACT,
.keyType = SDB_KEY_INT32,
.encodeFp = (SdbEncodeFp)mndCompactActionEncode,
.decodeFp = (SdbDecodeFp)mndCompactActionDecode,
.insertFp = (SdbInsertFp)mndCompactActionInsert,
.updateFp = (SdbUpdateFp)mndCompactActionUpdate,
.deleteFp = (SdbDeleteFp)mndCompactActionDelete,
};
return sdbSetTable(pMnode->pSdb, table);
}
2024-06-19 08:01:55 +00:00
void mndCleanupCompact(SMnode *pMnode) { mDebug("mnd compact cleanup"); }
2023-11-23 04:43:28 +00:00
2024-06-19 08:01:55 +00:00
void tFreeCompactObj(SCompactObj *pCompact) {}
2023-11-23 04:43:28 +00:00
int32_t tSerializeSCompactObj(void *buf, int32_t bufLen, const SCompactObj *pObj) {
SEncoder encoder = {0};
int32_t code = 0;
int32_t lino;
int32_t tlen;
2023-11-23 04:43:28 +00:00
tEncoderInit(&encoder, buf, bufLen);
TAOS_CHECK_EXIT(tStartEncode(&encoder));
TAOS_CHECK_EXIT(tEncodeI32(&encoder, pObj->compactId));
TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pObj->dbname));
TAOS_CHECK_EXIT(tEncodeI64(&encoder, pObj->startTime));
2025-09-26 09:32:32 +00:00
TAOS_CHECK_EXIT(tEncodeU32v(&encoder, pObj->flags));
TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->dbUid));
2023-11-23 04:43:28 +00:00
tEndEncode(&encoder);
_exit:
if (code) {
tlen = code;
} else {
tlen = encoder.pos;
}
2023-11-23 04:43:28 +00:00
tEncoderClear(&encoder);
return tlen;
}
int32_t tDeserializeSCompactObj(void *buf, int32_t bufLen, SCompactObj *pObj) {
int32_t code = 0;
int32_t lino;
2023-11-23 04:43:28 +00:00
SDecoder decoder = {0};
tDecoderInit(&decoder, buf, bufLen);
TAOS_CHECK_EXIT(tStartDecode(&decoder));
TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pObj->compactId));
TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pObj->dbname));
TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pObj->startTime));
2023-11-23 04:43:28 +00:00
2025-09-26 09:32:32 +00:00
if (!tDecodeIsEnd(&decoder)) {
TAOS_CHECK_EXIT(tDecodeU32v(&decoder, &pObj->flags));
} else {
pObj->flags = 0;
}
if (!tDecodeIsEnd(&decoder)) {
TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->dbUid));
} else {
pObj->dbUid = 0;
}
2025-09-26 09:32:32 +00:00
2023-11-23 04:43:28 +00:00
tEndDecode(&decoder);
_exit:
2023-11-23 04:43:28 +00:00
tDecoderClear(&decoder);
return code;
2023-11-23 04:43:28 +00:00
}
SSdbRaw *mndCompactActionEncode(SCompactObj *pCompact) {
2024-07-22 08:33:42 +00:00
int32_t code = 0;
int32_t lino = 0;
2023-11-23 04:43:28 +00:00
terrno = TSDB_CODE_SUCCESS;
2024-06-19 08:01:55 +00:00
void *buf = NULL;
2023-11-23 04:43:28 +00:00
SSdbRaw *pRaw = NULL;
int32_t tlen = tSerializeSCompactObj(NULL, 0, pCompact);
if (tlen < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
2024-06-19 08:01:55 +00:00
int32_t size = sizeof(int32_t) + tlen;
2023-11-23 04:43:28 +00:00
pRaw = sdbAllocRaw(SDB_COMPACT, MND_COMPACT_VER_NUMBER, size);
if (pRaw == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
buf = taosMemoryMalloc(tlen);
if (buf == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
tlen = tSerializeSCompactObj(buf, tlen, pCompact);
if (tlen < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
int32_t dataPos = 0;
SDB_SET_INT32(pRaw, dataPos, tlen, OVER);
SDB_SET_BINARY(pRaw, dataPos, buf, tlen, OVER);
SDB_SET_DATALEN(pRaw, dataPos, OVER);
OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
mError("compact:%" PRId32 ", failed to encode to raw:%p since %s", pCompact->compactId, pRaw, terrstr());
sdbFreeRaw(pRaw);
return NULL;
}
mTrace("compact:%" PRId32 ", encode to raw:%p, row:%p", pCompact->compactId, pRaw, pCompact);
return pRaw;
}
SSdbRow *mndCompactActionDecode(SSdbRaw *pRaw) {
2024-07-22 08:33:42 +00:00
int32_t code = 0;
int32_t lino = 0;
2024-06-19 08:01:55 +00:00
SSdbRow *pRow = NULL;
SCompactObj *pCompact = NULL;
void *buf = NULL;
2023-11-23 04:43:28 +00:00
terrno = TSDB_CODE_SUCCESS;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
goto OVER;
}
if (sver != MND_COMPACT_VER_NUMBER) {
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
2023-11-23 11:53:14 +00:00
mError("compact read invalid ver, data ver: %d, curr ver: %d", sver, MND_COMPACT_VER_NUMBER);
2023-11-23 04:43:28 +00:00
goto OVER;
}
pRow = sdbAllocRow(sizeof(SCompactObj));
if (pRow == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
pCompact = sdbGetRowObj(pRow);
if (pCompact == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
int32_t tlen;
int32_t dataPos = 0;
SDB_GET_INT32(pRaw, dataPos, &tlen, OVER);
buf = taosMemoryMalloc(tlen + 1);
if (buf == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto OVER;
}
SDB_GET_BINARY(pRaw, dataPos, buf, tlen, OVER);
2024-07-17 11:41:15 +00:00
if ((terrno = tDeserializeSCompactObj(buf, tlen, pCompact)) < 0) {
2023-11-23 04:43:28 +00:00
goto OVER;
}
OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
mError("compact:%" PRId32 ", failed to decode from raw:%p since %s", pCompact->compactId, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
mTrace("compact:%" PRId32 ", decode from raw:%p, row:%p", pCompact->compactId, pRaw, pCompact);
return pRow;
}
int32_t mndCompactActionInsert(SSdb *pSdb, SCompactObj *pCompact) {
mTrace("compact:%" PRId32 ", perform insert action", pCompact->compactId);
return 0;
}
int32_t mndCompactActionDelete(SSdb *pSdb, SCompactObj *pCompact) {
feat[ts-6107]: shared storage (#31552) * add API to use s3 as shared storage * support using local file system as shared storage * upload file to shared storage * support read, compact and drop * finish basic mnode & vnode msg processing * follower sync migration state * implement mnode transaction, and improve log * send migration progress msg to dnode to avoid deadlock * implement following migration * remove mcount * avoid redo migration on startup * avoid follower deadlock when leader is down * trigger migrate by timer, avoid compact after migration * comment out the usage of 'tcs' functions in stream * change config item prefix from s3 to ss * change db option prefix from s3 to ss * rename s3 data struct, function, file to ss * rename s3 macro to ss * update s3 sql to ss * rename remaining s3 items to ss * check ss configruation, improve s3 retry * grant object storage -> shared storage, check ssEnabled * fix memory leaks * update build options * omit sensitive information when dump config * fix backward compatibility issue * fix issues found in ci-checks * fix some failed test cases * avoid follower timeout and improve log * fix: follower timeout because migration status not updated * refuse migration if there's an in progress one * fix ss test case * remove garbage files and other minor improvement * fix failed test cases * update unit test * fix failed test case * fix failed test case * update document * update document and fix failed test cases * fix minor issues in code, test and document * check new commit after migration task is scheduled * fix several issus 1. migrate information cannot be dropped sometimes because progress response was put into read queue. 2. memory leak in rare cases 3. data corruption in rare cases 4. failed test case * add shared storage upgrade tool * fix compile error
2025-07-14 08:33:53 +00:00
mTrace("compact:%" PRId32 ", perform delete action", pCompact->compactId);
2023-11-23 04:43:28 +00:00
tFreeCompactObj(pCompact);
return 0;
}
int32_t mndCompactActionUpdate(SSdb *pSdb, SCompactObj *pOldCompact, SCompactObj *pNewCompact) {
2024-06-19 08:01:55 +00:00
mTrace("compact:%" PRId32 ", perform update action, old row:%p new row:%p", pOldCompact->compactId, pOldCompact,
pNewCompact);
2023-11-23 04:43:28 +00:00
return 0;
}
2023-11-23 11:53:14 +00:00
SCompactObj *mndAcquireCompact(SMnode *pMnode, int64_t compactId) {
2024-06-19 08:01:55 +00:00
SSdb *pSdb = pMnode->pSdb;
SCompactObj *pCompact = sdbAcquire(pSdb, SDB_COMPACT, &compactId);
2023-11-23 11:53:14 +00:00
if (pCompact == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
terrno = TSDB_CODE_SUCCESS;
}
return pCompact;
}
void mndReleaseCompact(SMnode *pMnode, SCompactObj *pCompact) {
SSdb *pSdb = pMnode->pSdb;
sdbRelease(pSdb, pCompact);
2024-08-02 04:46:30 +00:00
pCompact = NULL;
}
static int32_t mndCompactGetDbInfo(SMnode *pMnode, int32_t compactId, char *dbname, int32_t len, int64_t *dbUid) {
2024-08-02 04:46:30 +00:00
int32_t code = 0;
SCompactObj *pCompact = mndAcquireCompact(pMnode, compactId);
if (pCompact == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
2024-12-05 08:35:45 +00:00
tstrncpy(dbname, pCompact->dbname, len);
if (dbUid) *dbUid = pCompact->dbUid;
2024-08-02 04:46:30 +00:00
mndReleaseCompact(pMnode, pCompact);
TAOS_RETURN(code);
2023-11-23 11:53:14 +00:00
}
2023-11-23 04:43:28 +00:00
2024-06-19 08:01:55 +00:00
// compact db
int32_t mndAddCompactToTran(SMnode *pMnode, STrans *pTrans, SCompactObj *pCompact, SDbObj *pDb, SCompactDbRsp *rsp) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
2023-11-23 11:53:14 +00:00
pCompact->compactId = tGenIdPI32();
2023-11-23 04:43:28 +00:00
tstrncpy(pCompact->dbname, pDb->name, sizeof(pCompact->dbname));
pCompact->dbUid = pDb->uid;
2023-11-23 04:43:28 +00:00
pCompact->startTime = taosGetTimestampMs();
SSdbRaw *pVgRaw = mndCompactActionEncode(pCompact);
2024-07-17 11:41:15 +00:00
if (pVgRaw == NULL) {
code = TSDB_CODE_SDB_OBJ_NOT_THERE;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
if ((code = mndTransAppendPrepareLog(pTrans, pVgRaw)) != 0) {
2023-11-23 04:43:28 +00:00
sdbFreeRaw(pVgRaw);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-09-05 11:39:49 +00:00
if ((code = sdbSetRawStatus(pVgRaw, SDB_STATUS_READY)) != 0) {
sdbFreeRaw(pVgRaw);
TAOS_RETURN(code);
}
2023-11-23 04:43:28 +00:00
rsp->compactId = pCompact->compactId;
return 0;
}
2024-06-19 08:01:55 +00:00
// retrieve compact
int32_t mndRetrieveCompact(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
int32_t numOfRows = 0;
SCompactObj *pCompact = NULL;
char *sep = NULL;
SDbObj *pDb = NULL;
2024-09-19 11:18:09 +00:00
int32_t code = 0;
int32_t lino = 0;
2024-06-19 08:01:55 +00:00
2023-11-23 04:43:28 +00:00
if (strlen(pShow->db) > 0) {
sep = strchr(pShow->db, '.');
2024-06-19 08:01:55 +00:00
if (sep &&
((0 == strcmp(sep + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(sep + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
2023-11-23 04:43:28 +00:00
sep++;
} else {
pDb = mndAcquireDb(pMnode, pShow->db);
if (pDb == NULL) return terrno;
}
}
while (numOfRows < rows) {
pShow->pIter = sdbFetch(pSdb, SDB_COMPACT, pShow->pIter, (void **)&pCompact);
if (pShow->pIter == NULL) break;
SColumnInfoData *pColInfo;
SName n;
int32_t cols = 0;
char tmpBuf[TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE] = {0};
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-19 11:18:09 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompact->compactId, false), pCompact, &lino,
_OVER);
2023-11-23 04:43:28 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
if (pDb != NULL || !IS_SYS_DBNAME(pCompact->dbname)) {
SName name = {0};
2024-09-19 11:18:09 +00:00
TAOS_CHECK_GOTO(tNameFromString(&name, pCompact->dbname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
2024-07-25 08:19:01 +00:00
(void)tNameGetDbName(&name, varDataVal(tmpBuf));
2023-11-23 04:43:28 +00:00
} else {
2024-12-05 08:35:45 +00:00
tstrncpy(varDataVal(tmpBuf), pCompact->dbname, TSDB_SHOW_SQL_LEN);
2023-11-23 04:43:28 +00:00
}
varDataSetLen(tmpBuf, strlen(varDataVal(tmpBuf)));
2024-09-19 11:18:09 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)tmpBuf, false), pCompact, &lino, _OVER);
2023-11-23 04:43:28 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-19 11:18:09 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pCompact->startTime, false), pCompact, &lino,
_OVER);
2023-11-23 04:43:28 +00:00
numOfRows++;
sdbRelease(pSdb, pCompact);
}
2024-09-19 11:18:09 +00:00
_OVER:
if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code));
2023-11-23 04:43:28 +00:00
pShow->numOfRows += numOfRows;
mndReleaseDb(pMnode, pDb);
return numOfRows;
}
2024-06-19 08:01:55 +00:00
// kill compact
static void *mndBuildKillCompactReq(SMnode *pMnode, SVgObj *pVgroup, int32_t *pContLen, int32_t compactId,
int32_t dnodeid) {
2023-11-23 04:43:28 +00:00
SVKillCompactReq req = {0};
req.compactId = compactId;
req.vgId = pVgroup->vgId;
2023-11-23 11:53:14 +00:00
req.dnodeId = dnodeid;
2024-12-20 03:33:26 +00:00
terrno = 0;
2023-11-23 04:43:28 +00:00
mInfo("vgId:%d, build compact vnode config req", pVgroup->vgId);
int32_t contLen = tSerializeSVKillCompactReq(NULL, 0, &req);
if (contLen < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
contLen += sizeof(SMsgHead);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
SMsgHead *pHead = pReq;
pHead->contLen = htonl(contLen);
pHead->vgId = htonl(pVgroup->vgId);
2024-12-20 03:33:26 +00:00
mTrace("vgId:%d, build compact vnode config req, contLen:%d", pVgroup->vgId, contLen);
int32_t ret = 0;
if ((ret = tSerializeSVKillCompactReq((char *)pReq + sizeof(SMsgHead), contLen, &req)) < 0) {
terrno = ret;
2025-09-26 09:32:32 +00:00
taosMemoryFreeClear(pReq);
2024-09-05 11:39:49 +00:00
return NULL;
}
2023-11-23 04:43:28 +00:00
*pContLen = contLen;
return pReq;
}
2024-06-19 08:01:55 +00:00
static int32_t mndAddKillCompactAction(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, int32_t compactId,
int32_t dnodeid) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
2023-11-23 04:43:28 +00:00
STransAction action = {0};
2023-11-23 10:16:18 +00:00
SDnodeObj *pDnode = mndAcquireDnode(pMnode, dnodeid);
2024-07-17 11:41:15 +00:00
if (pDnode == NULL) {
code = TSDB_CODE_SDB_OBJ_NOT_THERE;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
2023-11-23 10:16:18 +00:00
action.epSet = mndGetDnodeEpset(pDnode);
mndReleaseDnode(pMnode, pDnode);
2023-11-23 04:43:28 +00:00
int32_t contLen = 0;
2023-11-23 11:53:14 +00:00
void *pReq = mndBuildKillCompactReq(pMnode, pVgroup, &contLen, compactId, dnodeid);
2024-07-17 11:41:15 +00:00
if (pReq == NULL) {
code = TSDB_CODE_SDB_OBJ_NOT_THERE;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
2023-11-23 04:43:28 +00:00
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_VND_KILL_COMPACT;
2024-12-20 03:33:26 +00:00
mTrace("trans:%d, kill compact msg len:%d", pTrans->id, contLen);
2024-07-17 11:41:15 +00:00
if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
2023-11-23 04:43:28 +00:00
taosMemoryFree(pReq);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
return 0;
}
static int32_t mndKillCompact(SMnode *pMnode, SRpcMsg *pReq, SCompactObj *pCompact) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
2024-02-29 02:43:15 +00:00
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB, pReq, "kill-compact");
2023-11-23 04:43:28 +00:00
if (pTrans == NULL) {
2024-06-19 08:01:55 +00:00
mError("compact:%" PRId32 ", failed to drop since %s", pCompact->compactId, terrstr());
2024-07-17 11:41:15 +00:00
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
mInfo("trans:%d, used to kill compact:%" PRId32, pTrans->id, pCompact->compactId);
2024-02-29 02:43:15 +00:00
mndTransSetDbName(pTrans, pCompact->dbname, NULL);
2023-11-23 04:43:28 +00:00
SSdbRaw *pCommitRaw = mndCompactActionEncode(pCompact);
2024-07-17 11:41:15 +00:00
if (pCommitRaw == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
mndTransDrop(pTrans);
TAOS_RETURN(code);
}
if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2023-11-23 04:43:28 +00:00
mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-09-05 11:39:49 +00:00
if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY)) != 0) {
mndTransDrop(pTrans);
TAOS_RETURN(code);
}
2024-02-29 02:43:15 +00:00
void *pIter = NULL;
2023-11-23 04:43:28 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
if (pDetail->compactId == pCompact->compactId) {
SVgObj *pVgroup = mndAcquireVgroup(pMnode, pDetail->vgId);
2024-06-19 08:01:55 +00:00
if (pVgroup == NULL) {
2023-11-23 04:43:28 +00:00
mError("trans:%d, failed to append redo action since %s", pTrans->id, terrstr());
2024-07-17 11:41:15 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
2023-11-23 04:43:28 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-07-17 11:41:15 +00:00
if ((code = mndAddKillCompactAction(pMnode, pTrans, pVgroup, pCompact->compactId, pDetail->dnodeId)) != 0) {
2023-11-23 04:43:28 +00:00
mError("trans:%d, failed to append redo action since %s", pTrans->id, terrstr());
2024-07-17 11:41:15 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
2023-11-23 04:43:28 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
mndReleaseVgroup(pMnode, pVgroup);
2023-12-15 00:59:56 +00:00
/*
2023-11-23 04:43:28 +00:00
SSdbRaw *pCommitRaw = mndCompactDetailActionEncode(pDetail);
if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
return -1;
}
2024-09-19 11:18:09 +00:00
sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED);
2023-12-15 00:59:56 +00:00
*/
2023-11-23 04:43:28 +00:00
}
sdbRelease(pMnode->pSdb, pDetail);
}
2024-07-17 11:41:15 +00:00
if ((code = mndTransPrepare(pMnode, pTrans)) != 0) {
2023-11-23 04:43:28 +00:00
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
mndTransDrop(pTrans);
return 0;
}
2024-06-19 08:01:55 +00:00
int32_t mndProcessKillCompactReq(SRpcMsg *pReq) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
int32_t lino = 0;
2023-11-23 04:43:28 +00:00
SKillCompactReq killCompactReq = {0};
2024-07-17 11:41:15 +00:00
if ((code = tDeserializeSKillCompactReq(pReq->pCont, pReq->contLen, &killCompactReq)) != 0) {
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
mInfo("start to kill compact:%" PRId32, killCompactReq.compactId);
2024-06-19 08:01:55 +00:00
SMnode *pMnode = pReq->info.node;
SCompactObj *pCompact = mndAcquireCompact(pMnode, killCompactReq.compactId);
if (pCompact == NULL) {
2024-07-17 11:41:15 +00:00
code = TSDB_CODE_MND_INVALID_COMPACT_ID;
2023-11-23 11:26:14 +00:00
tFreeSKillCompactReq(&killCompactReq);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 11:26:14 +00:00
}
2023-11-23 04:43:28 +00:00
2024-07-17 11:41:15 +00:00
TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_COMPACT_DB), &lino, _OVER);
2023-11-23 04:43:28 +00:00
2024-07-17 11:41:15 +00:00
TAOS_CHECK_GOTO(mndKillCompact(pMnode, pReq, pCompact), &lino, _OVER);
2023-11-23 04:43:28 +00:00
code = TSDB_CODE_ACTION_IN_PROGRESS;
2024-12-05 08:54:10 +00:00
char obj[TSDB_INT32_ID_LEN] = {0};
int32_t nBytes = snprintf(obj, sizeof(obj), "%d", pCompact->compactId);
if ((uint32_t)nBytes < sizeof(obj)) {
auditRecord(pReq, pMnode->clusterId, "killCompact", pCompact->dbname, obj, killCompactReq.sql,
killCompactReq.sqlLen);
} else {
mError("compact:%" PRId32 " failed to audit since %s", pCompact->compactId, tstrerror(TSDB_CODE_OUT_OF_RANGE));
}
2023-11-23 04:43:28 +00:00
_OVER:
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
mError("failed to kill compact %" PRId32 " since %s", killCompactReq.compactId, terrstr());
}
2023-11-23 11:53:14 +00:00
2023-11-23 11:26:14 +00:00
tFreeSKillCompactReq(&killCompactReq);
2024-08-02 04:46:30 +00:00
mndReleaseCompact(pMnode, pCompact);
2023-11-23 04:43:28 +00:00
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-06-19 08:01:55 +00:00
// update progress
static int32_t mndUpdateCompactProgress(SMnode *pMnode, SRpcMsg *pReq, int32_t compactId,
SQueryCompactProgressRsp *rsp) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
2024-06-19 08:01:55 +00:00
void *pIter = NULL;
2023-11-23 11:53:14 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
if (pDetail->compactId == compactId && pDetail->vgId == rsp->vgId && pDetail->dnodeId == rsp->dnodeId) {
pDetail->newNumberFileset = rsp->numberFileset;
pDetail->newFinished = rsp->finished;
2024-11-13 08:17:16 +00:00
pDetail->progress = rsp->progress;
pDetail->remainingTime = rsp->remainingTime;
2023-12-08 10:17:04 +00:00
2024-07-17 11:41:15 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
2023-12-08 10:17:04 +00:00
sdbRelease(pMnode->pSdb, pDetail);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 11:53:14 +00:00
}
sdbRelease(pMnode->pSdb, pDetail);
}
2024-02-29 06:54:24 +00:00
return TSDB_CODE_MND_COMPACT_DETAIL_NOT_EXIST;
2023-11-23 11:53:14 +00:00
}
2024-06-19 08:01:55 +00:00
int32_t mndProcessQueryCompactRsp(SRpcMsg *pReq) {
int32_t code = 0;
2024-07-17 11:41:15 +00:00
SQueryCompactProgressRsp req = {0};
2024-08-02 02:11:59 +00:00
if (pReq->code != 0) {
2024-08-02 02:51:29 +00:00
mError("received wrong compact response, req code is %s", tstrerror(pReq->code));
2024-08-02 02:11:59 +00:00
TAOS_RETURN(pReq->code);
}
2024-02-29 06:54:24 +00:00
code = tDeserializeSQueryCompactProgressRsp(pReq->pCont, pReq->contLen, &req);
if (code != 0) {
2024-06-19 08:01:55 +00:00
mError("failed to deserialize vnode-query-compact-progress-rsp, ret:%d, pCont:%p, len:%d", code, pReq->pCont,
pReq->contLen);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-06-19 08:01:55 +00:00
mDebug("compact:%d, receive query response, vgId:%d, dnodeId:%d, numberFileset:%d, finished:%d", req.compactId,
req.vgId, req.dnodeId, req.numberFileset, req.finished);
2023-11-23 04:43:28 +00:00
2024-06-19 08:01:55 +00:00
SMnode *pMnode = pReq->info.node;
2023-11-23 04:43:28 +00:00
2024-02-29 06:54:24 +00:00
code = mndUpdateCompactProgress(pMnode, pReq, req.compactId, &req);
2024-06-19 08:01:55 +00:00
if (code != 0) {
mError("compact:%d, failed to update progress, vgId:%d, dnodeId:%d, numberFileset:%d, finished:%d", req.compactId,
req.vgId, req.dnodeId, req.numberFileset, req.finished);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-12-08 10:17:04 +00:00
}
2023-11-23 04:43:28 +00:00
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 04:43:28 +00:00
}
2024-06-19 08:01:55 +00:00
// timer
void mndCompactSendProgressReq(SMnode *pMnode, SCompactObj *pCompact) {
void *pIter = NULL;
2023-11-23 04:43:28 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
if (pDetail->compactId == pCompact->compactId) {
SEpSet epSet = {0};
2024-06-19 08:01:55 +00:00
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pDetail->dnodeId);
if (pDnode == NULL) break;
2024-07-17 11:41:15 +00:00
if (addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port) != 0) {
sdbRelease(pMnode->pSdb, pDetail);
continue;
}
2023-11-23 10:16:18 +00:00
mndReleaseDnode(pMnode, pDnode);
2023-11-23 04:43:28 +00:00
SQueryCompactProgressReq req;
req.compactId = pDetail->compactId;
req.vgId = pDetail->vgId;
req.dnodeId = pDetail->dnodeId;
int32_t contLen = tSerializeSQueryCompactProgressReq(NULL, 0, &req);
if (contLen < 0) {
2024-06-21 10:25:35 +00:00
sdbRelease(pMnode->pSdb, pDetail);
2023-11-23 04:43:28 +00:00
continue;
}
contLen += sizeof(SMsgHead);
SMsgHead *pHead = rpcMallocCont(contLen);
if (pHead == NULL) {
sdbRelease(pMnode->pSdb, pDetail);
continue;
2024-06-19 08:01:55 +00:00
}
2023-11-23 04:43:28 +00:00
pHead->contLen = htonl(contLen);
pHead->vgId = htonl(pDetail->vgId);
if (tSerializeSQueryCompactProgressReq((char *)pHead + sizeof(SMsgHead), contLen - sizeof(SMsgHead), &req) <= 0) {
2024-09-05 11:39:49 +00:00
sdbRelease(pMnode->pSdb, pDetail);
continue;
}
2023-11-23 04:43:28 +00:00
2024-06-19 08:01:55 +00:00
SRpcMsg rpcMsg = {.msgType = TDMT_VND_QUERY_COMPACT_PROGRESS, .contLen = contLen};
2023-12-12 05:34:41 +00:00
rpcMsg.pCont = pHead;
2023-11-23 04:43:28 +00:00
char detail[1024] = {0};
2024-10-10 02:35:48 +00:00
int32_t len = tsnprintf(detail, sizeof(detail), "msgType:%s numOfEps:%d inUse:%d",
2024-12-05 08:35:45 +00:00
TMSG_INFO(TDMT_VND_QUERY_COMPACT_PROGRESS), epSet.numOfEps, epSet.inUse);
2023-11-23 04:43:28 +00:00
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
2024-10-10 02:35:48 +00:00
len += tsnprintf(detail + len, sizeof(detail) - len, " ep:%d-%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
2023-11-23 04:43:28 +00:00
}
2023-11-23 08:02:37 +00:00
mDebug("compact:%d, send update progress msg to %s", pDetail->compactId, detail);
2024-07-25 08:19:01 +00:00
if (tmsgSendReq(&epSet, &rpcMsg) < 0) {
sdbRelease(pMnode->pSdb, pDetail);
continue;
}
2023-11-23 04:43:28 +00:00
}
sdbRelease(pMnode->pSdb, pDetail);
}
}
2023-11-23 07:36:33 +00:00
static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
bool needSave = false;
void *pIter = NULL;
2023-11-23 07:36:33 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
2023-12-17 11:03:25 +00:00
if (pDetail->compactId == compactId) {
2024-06-19 08:01:55 +00:00
mDebug(
"compact:%d, check save progress, vgId:%d, dnodeId:%d, numberFileset:%d, finished:%d, "
"newNumberFileset:%d, newFinished:%d",
pDetail->compactId, pDetail->vgId, pDetail->dnodeId, pDetail->numberFileset, pDetail->finished,
pDetail->newNumberFileset, pDetail->newFinished);
// these 2 number will jump back after dnode restart, so < is not used here
if (pDetail->numberFileset != pDetail->newNumberFileset || pDetail->finished != pDetail->newFinished)
2023-11-23 07:36:33 +00:00
needSave = true;
}
sdbRelease(pMnode->pSdb, pDetail);
}
2023-12-17 08:47:51 +00:00
char dbname[TSDB_TABLE_FNAME_LEN] = {0};
int64_t dbUid = 0;
TAOS_CHECK_RETURN(mndCompactGetDbInfo(pMnode, compactId, dbname, TSDB_TABLE_FNAME_LEN, &dbUid));
2024-06-18 09:36:19 +00:00
if (!mndDbIsExist(pMnode, dbname, dbUid)) {
2024-06-18 09:36:19 +00:00
needSave = true;
2024-08-02 04:46:30 +00:00
mWarn("compact:%" PRId32 ", no db exist, set needSave:%s", compactId, dbname);
2024-06-18 09:36:19 +00:00
}
2024-06-19 08:01:55 +00:00
if (!needSave) {
mDebug("compact:%" PRId32 ", no need to save", compactId);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
2024-02-29 02:43:15 +00:00
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB, NULL, "update-compact-progress");
2023-11-23 07:36:33 +00:00
if (pTrans == NULL) {
2024-06-19 08:01:55 +00:00
mError("trans:%" PRId32 ", failed to create since %s", pTrans->id, terrstr());
2024-07-17 11:41:15 +00:00
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
2023-12-17 11:03:25 +00:00
mInfo("compact:%d, trans:%d, used to update compact progress.", compactId, pTrans->id);
2024-06-19 08:01:55 +00:00
2024-08-02 04:46:30 +00:00
mndTransSetDbName(pTrans, dbname, NULL);
2024-02-29 02:43:15 +00:00
2023-11-23 07:36:33 +00:00
pIter = NULL;
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
if (pDetail->compactId == compactId) {
2024-06-19 08:01:55 +00:00
mInfo(
"compact:%d, trans:%d, check compact progress, vgId:%d, dnodeId:%d, numberFileset:%d, finished:%d, "
"newNumberFileset:%d, newFinished:%d",
pDetail->compactId, pTrans->id, pDetail->vgId, pDetail->dnodeId, pDetail->numberFileset, pDetail->finished,
pDetail->newNumberFileset, pDetail->newFinished);
2023-11-23 07:36:33 +00:00
pDetail->numberFileset = pDetail->newNumberFileset;
pDetail->finished = pDetail->newFinished;
2024-06-19 08:01:55 +00:00
2023-11-23 07:36:33 +00:00
SSdbRaw *pCommitRaw = mndCompactDetailActionEncode(pDetail);
2024-07-17 11:41:15 +00:00
if (pCommitRaw == NULL) {
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
mndTransDrop(pTrans);
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2023-12-17 11:03:25 +00:00
mError("compact:%d, trans:%d, failed to append commit log since %s", pDetail->compactId, pTrans->id, terrstr());
2024-07-17 11:41:15 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
2023-11-23 07:36:33 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
2024-09-05 11:39:49 +00:00
if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY)) != 0) {
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
mndTransDrop(pTrans);
TAOS_RETURN(code);
}
2023-11-23 07:36:33 +00:00
}
sdbRelease(pMnode->pSdb, pDetail);
}
2023-12-17 11:03:25 +00:00
bool allFinished = true;
2024-06-18 09:36:19 +00:00
pIter = NULL;
2023-12-17 11:03:25 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
2024-06-19 08:01:55 +00:00
if (pDetail->compactId == compactId) {
mInfo("compact:%d, trans:%d, check compact finished, vgId:%d, dnodeId:%d, numberFileset:%d, finished:%d",
pDetail->compactId, pTrans->id, pDetail->vgId, pDetail->dnodeId, pDetail->numberFileset, pDetail->finished);
2023-12-17 11:03:25 +00:00
2024-06-19 08:01:55 +00:00
if (pDetail->numberFileset == -1 && pDetail->finished == -1) {
2023-12-17 11:03:25 +00:00
allFinished = false;
2024-07-18 06:14:14 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
2023-12-17 11:03:25 +00:00
sdbRelease(pMnode->pSdb, pDetail);
break;
}
2024-06-19 08:01:55 +00:00
if (pDetail->numberFileset != -1 && pDetail->finished != -1 && pDetail->numberFileset != pDetail->finished) {
2023-12-17 11:03:25 +00:00
allFinished = false;
2024-07-18 06:14:14 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
2023-12-17 11:03:25 +00:00
sdbRelease(pMnode->pSdb, pDetail);
break;
}
}
sdbRelease(pMnode->pSdb, pDetail);
}
if (!mndDbIsExist(pMnode, dbname, dbUid)) {
2024-06-18 09:36:19 +00:00
allFinished = true;
2024-08-02 04:46:30 +00:00
mWarn("compact:%" PRId32 ", no db exist, set all finished:%s", compactId, dbname);
2024-06-18 09:36:19 +00:00
}
2024-06-19 08:01:55 +00:00
if (allFinished) {
2024-08-02 04:46:30 +00:00
mInfo("compact:%d, all finished", compactId);
2024-06-18 09:36:19 +00:00
pIter = NULL;
2023-11-23 07:36:33 +00:00
while (1) {
SCompactDetailObj *pDetail = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail);
if (pIter == NULL) break;
2024-08-02 04:46:30 +00:00
if (pDetail->compactId == compactId) {
2023-11-23 07:36:33 +00:00
SSdbRaw *pCommitRaw = mndCompactDetailActionEncode(pDetail);
2024-07-17 11:41:15 +00:00
if (pCommitRaw == NULL) {
mndTransDrop(pTrans);
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2024-06-19 08:01:55 +00:00
mError("compact:%d, trans:%d, failed to append commit log since %s", pDetail->compactId, pTrans->id,
terrstr());
2024-07-17 11:41:15 +00:00
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
2023-11-23 07:36:33 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
2024-09-05 11:39:49 +00:00
if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED)) != 0) {
sdbCancelFetch(pMnode->pSdb, pIter);
sdbRelease(pMnode->pSdb, pDetail);
mndTransDrop(pTrans);
TAOS_RETURN(code);
}
2024-06-18 09:36:19 +00:00
mInfo("compact:%d, add drop compactdetail action", pDetail->compactDetailId);
2023-11-23 07:36:33 +00:00
}
sdbRelease(pMnode->pSdb, pDetail);
}
2024-08-02 04:46:30 +00:00
SCompactObj *pCompact = mndAcquireCompact(pMnode, compactId);
if (pCompact == NULL) {
mndTransDrop(pTrans);
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
2023-11-23 07:36:33 +00:00
SSdbRaw *pCommitRaw = mndCompactActionEncode(pCompact);
2024-08-02 04:46:30 +00:00
mndReleaseCompact(pMnode, pCompact);
2024-07-17 11:41:15 +00:00
if (pCommitRaw == NULL) {
mndTransDrop(pTrans);
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
TAOS_RETURN(code);
}
if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
2023-12-17 11:03:25 +00:00
mError("compact:%d, trans:%d, failed to append commit log since %s", compactId, pTrans->id, terrstr());
2023-11-23 07:36:33 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
2024-09-05 11:39:49 +00:00
if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED)) != 0) {
mError("compact:%d, trans:%d, failed to append commit log since %s", compactId, pTrans->id, terrstr());
mndTransDrop(pTrans);
TAOS_RETURN(code);
}
2024-06-18 09:36:19 +00:00
mInfo("compact:%d, add drop compact action", pCompact->compactId);
2023-11-23 07:36:33 +00:00
}
2024-07-17 11:41:15 +00:00
if ((code = mndTransPrepare(pMnode, pTrans)) != 0) {
2023-12-17 11:03:25 +00:00
mError("compact:%d, trans:%d, failed to prepare since %s", compactId, pTrans->id, terrstr());
2023-11-23 07:36:33 +00:00
mndTransDrop(pTrans);
2024-07-17 11:41:15 +00:00
TAOS_RETURN(code);
2023-11-23 07:36:33 +00:00
}
mndTransDrop(pTrans);
return 0;
}
2024-11-26 11:46:48 +00:00
static void mndCompactPullup(SMnode *pMnode) {
2024-07-17 11:41:15 +00:00
int32_t code = 0;
2023-11-23 04:43:28 +00:00
SSdb *pSdb = pMnode->pSdb;
SArray *pArray = taosArrayInit(sdbGetSize(pSdb, SDB_COMPACT), sizeof(int32_t));
if (pArray == NULL) return;
void *pIter = NULL;
while (1) {
SCompactObj *pCompact = NULL;
pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT, pIter, (void **)&pCompact);
if (pIter == NULL) break;
if (taosArrayPush(pArray, &pCompact->compactId) == NULL) {
mError("failed to push compact id:%d into array, but continue pull up", pCompact->compactId);
}
2023-11-23 04:43:28 +00:00
sdbRelease(pSdb, pCompact);
}
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
2023-12-17 11:03:25 +00:00
mInfo("begin to pull up");
2024-06-19 08:01:55 +00:00
int32_t *pCompactId = taosArrayGet(pArray, i);
SCompactObj *pCompact = mndAcquireCompact(pMnode, *pCompactId);
2023-11-23 04:43:28 +00:00
if (pCompact != NULL) {
2023-12-17 11:03:25 +00:00
mInfo("compact:%d, begin to pull up", pCompact->compactId);
2023-12-14 03:24:53 +00:00
mndCompactSendProgressReq(pMnode, pCompact);
2024-07-17 11:41:15 +00:00
if ((code = mndSaveCompactProgress(pMnode, pCompact->compactId)) != 0) {
mError("compact:%d, failed to save compact progress since %s", pCompact->compactId, tstrerror(code));
}
2024-08-02 04:46:30 +00:00
mndReleaseCompact(pMnode, pCompact);
2023-11-23 04:43:28 +00:00
}
}
taosArrayDestroy(pArray);
}
2024-12-16 02:49:58 +00:00
#ifdef TD_ENTERPRISE
2024-12-04 12:09:04 +00:00
static int32_t mndCompactDispatchAudit(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, STimeWindow *tw) {
if (!tsEnableAudit || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) {
return 0;
}
SName name = {0};
int32_t sqlLen = 0;
char sql[256] = {0};
char skeyStr[40] = {0};
char ekeyStr[40] = {0};
char *pDbName = pDb->name;
if (tNameFromString(&name, pDb->name, T_NAME_ACCT | T_NAME_DB) == 0) {
pDbName = name.dbname;
}
if (taosFormatUtcTime(skeyStr, sizeof(skeyStr), tw->skey, pDb->cfg.precision) == 0 &&
taosFormatUtcTime(ekeyStr, sizeof(ekeyStr), tw->ekey, pDb->cfg.precision) == 0) {
sqlLen = tsnprintf(sql, sizeof(sql), "compact db %s start with '%s' end with '%s'", pDbName, skeyStr, ekeyStr);
} else {
sqlLen = tsnprintf(sql, sizeof(sql), "compact db %s start with %" PRIi64 " end with %" PRIi64, pDbName, tw->skey,
tw->ekey);
}
2024-12-05 09:15:23 +00:00
auditRecord(NULL, pMnode->clusterId, "autoCompactDB", name.dbname, "", sql, sqlLen);
2024-12-04 12:09:04 +00:00
return 0;
}
2025-02-25 08:48:43 +00:00
extern int32_t mndCompactDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, STimeWindow tw, SArray *vgroupIds,
2025-09-26 09:32:32 +00:00
bool metaOnly, ETsdbOpType type, ETriggerType triggerType);
2024-12-04 09:50:17 +00:00
static int32_t mndCompactDispatch(SRpcMsg *pReq) {
2024-12-04 12:09:04 +00:00
int32_t code = 0;
2024-11-26 11:46:48 +00:00
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
2024-12-05 02:33:51 +00:00
int64_t curMs = taosGetTimestampMs();
int64_t curMin = curMs / 60000LL;
2024-11-26 11:46:48 +00:00
2024-12-04 12:09:04 +00:00
void *pIter = NULL;
2024-12-04 09:50:17 +00:00
SDbObj *pDb = NULL;
2024-12-04 12:09:04 +00:00
while ((pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb))) {
if (pDb->cfg.compactInterval <= 0) {
mDebug("db:%p,%s, compact interval is %dm, skip", pDb, pDb->name, pDb->cfg.compactInterval);
sdbRelease(pSdb, pDb);
continue;
}
2025-07-12 07:39:29 +00:00
if (pDb->cfg.isMount) {
sdbRelease(pSdb, pDb);
continue;
}
2024-12-05 09:50:10 +00:00
// daysToKeep2 would be altered
2024-12-05 05:06:53 +00:00
if (pDb->cfg.compactEndTime && (pDb->cfg.compactEndTime <= -pDb->cfg.daysToKeep2)) {
mWarn("db:%p,%s, compact end time:%dm <= -keep2:%dm , skip", pDb, pDb->name, pDb->cfg.compactEndTime,
-pDb->cfg.daysToKeep2);
sdbRelease(pSdb, pDb);
continue;
}
int64_t compactStartTime = pDb->cfg.compactStartTime ? pDb->cfg.compactStartTime : -pDb->cfg.daysToKeep2;
int64_t compactEndTime = pDb->cfg.compactEndTime ? pDb->cfg.compactEndTime : -pDb->cfg.daysPerFile;
if (compactStartTime >= compactEndTime) {
mDebug("db:%p,%s, compact start time:%" PRIi64 "m >= end time:%" PRIi64 "m, skip", pDb, pDb->name,
compactStartTime, compactEndTime);
2024-11-26 11:46:48 +00:00
sdbRelease(pSdb, pDb);
continue;
}
int64_t remainder = ((curMin - (int64_t)pDb->cfg.compactTimeOffset * 60LL) % pDb->cfg.compactInterval);
2024-12-05 02:33:51 +00:00
if (remainder != 0) {
mDebug("db:%p,%s, current time:%" PRIi64 "m is not divisible by compact interval:%dm, offset:%" PRIi8
"h, remainder:%" PRIi64 "m, skip",
pDb, pDb->name, curMin, pDb->cfg.compactInterval, pDb->cfg.compactTimeOffset, remainder);
2024-12-04 12:09:04 +00:00
sdbRelease(pSdb, pDb);
continue;
}
2024-12-05 02:33:51 +00:00
if ((pDb->compactStartTime / 60000LL) == curMin) {
mDebug("db:%p:%s, compact has already been dispatched at %" PRIi64 "m(%" PRIi64 "ms), skip", pDb, pDb->name,
curMin, pDb->compactStartTime);
2024-12-04 12:09:04 +00:00
sdbRelease(pSdb, pDb);
continue;
}
STimeWindow tw = {
.skey = convertTimePrecision(curMs + compactStartTime * 60000LL, TSDB_TIME_PRECISION_MILLI, pDb->cfg.precision),
.ekey = convertTimePrecision(curMs + compactEndTime * 60000LL, TSDB_TIME_PRECISION_MILLI, pDb->cfg.precision)};
2024-12-04 12:09:04 +00:00
2025-09-26 09:32:32 +00:00
if ((code = mndCompactDb(pMnode, NULL, pDb, tw, NULL, false, TSDB_OPTR_NORMAL, TSDB_TRIGGER_AUTO)) == 0) {
mInfo("db:%p,%s, succeed to dispatch compact with range:[%" PRIi64 ",%" PRIi64 "], interval:%dm, start:%" PRIi64
"m, end:%" PRIi64 "m, offset:%" PRIi8 "h",
pDb, pDb->name, tw.skey, tw.ekey, pDb->cfg.compactInterval, compactStartTime, compactEndTime,
pDb->cfg.compactTimeOffset);
2024-12-04 12:09:04 +00:00
} else {
mWarn("db:%p,%s, failed to dispatch compact with range:[%" PRIi64 ",%" PRIi64 "], interval:%dm, start:%" PRIi64
"m, end:%" PRIi64 "m, offset:%" PRIi8 "h, since %s",
pDb, pDb->name, tw.skey, tw.ekey, pDb->cfg.compactInterval, compactStartTime, compactEndTime,
pDb->cfg.compactTimeOffset, tstrerror(code));
2024-12-04 12:09:04 +00:00
}
TAOS_UNUSED(mndCompactDispatchAudit(pMnode, pReq, pDb, &tw));
2024-11-26 11:46:48 +00:00
sdbRelease(pSdb, pDb);
}
2024-12-04 12:09:04 +00:00
return 0;
2024-11-26 11:46:48 +00:00
}
2024-12-16 02:49:58 +00:00
#endif
2024-11-26 11:46:48 +00:00
2023-11-23 04:43:28 +00:00
static int32_t mndProcessCompactTimer(SRpcMsg *pReq) {
2024-12-05 02:33:51 +00:00
#ifdef TD_ENTERPRISE
2023-11-23 04:43:28 +00:00
mTrace("start to process compact timer");
mndCompactPullup(pReq->info.node);
2024-12-04 09:50:17 +00:00
TAOS_UNUSED(mndCompactDispatch(pReq));
2024-12-05 02:33:51 +00:00
#endif
2023-11-23 04:43:28 +00:00
return 0;
}