Merge pull request #28451 from taosdata/fix/3.0/TD-32519
fix drop table with tsma crash
This commit is contained in:
commit
a0cf6c8fb7
|
@ -4076,7 +4076,7 @@ typedef struct SMDropTbDbInfo {
|
|||
|
||||
typedef struct SMDropTbTsmaInfo {
|
||||
char tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
|
||||
char tsmaResTbNamePrefix[TSDB_TABLE_NAME_LEN];
|
||||
char tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
|
||||
int32_t suid;
|
||||
SMDropTbDbInfo dbInfo; // reference to DbInfo in pDbMap
|
||||
} SMDropTbTsmaInfo;
|
||||
|
@ -4207,6 +4207,7 @@ static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx
|
|||
SMnode *pMnode = pRsp->info.node;
|
||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
|
||||
mndTransSetChangeless(pTrans);
|
||||
mndTransSetSerial(pTrans);
|
||||
if (pTrans == NULL) {
|
||||
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
|
||||
if (terrno != 0) code = terrno;
|
||||
|
@ -4294,6 +4295,18 @@ static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupI
|
|||
return 0;
|
||||
}
|
||||
|
||||
int vgInfoCmp(const void* lp, const void* rp) {
|
||||
SVgroupInfo* pLeft = (SVgroupInfo*)lp;
|
||||
SVgroupInfo* pRight = (SVgroupInfo*)rp;
|
||||
if (pLeft->hashBegin < pRight->hashBegin) {
|
||||
return -1;
|
||||
} else if (pLeft->hashBegin > pRight->hashBegin) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropTbTsmaInfo *pInfo) {
|
||||
int32_t code = 0;
|
||||
SDbObj *pDb = mndAcquireDb(pMnode, dbname);
|
||||
|
@ -4308,6 +4321,7 @@ static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropT
|
|||
goto _end;
|
||||
}
|
||||
mndBuildDBVgroupInfo(pDb, pMnode, pInfo->dbInfo.dbVgInfos);
|
||||
taosArraySort(pInfo->dbInfo.dbVgInfos, vgInfoCmp);
|
||||
|
||||
pInfo->dbInfo.hashPrefix = pDb->cfg.hashPrefix;
|
||||
pInfo->dbInfo.hashSuffix = pDb->cfg.hashSuffix;
|
||||
|
@ -4380,9 +4394,8 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith
|
|||
if (pInfos) {
|
||||
SMDropTbTsmaInfo info = {0};
|
||||
int32_t len = sprintf(buf, "%s", pSma->name);
|
||||
len = taosCreateMD5Hash(buf, len);
|
||||
sprintf(info.tsmaResTbDbFName, "%s", pSma->db);
|
||||
snprintf(info.tsmaResTbNamePrefix, TSDB_TABLE_NAME_LEN, "%s", buf);
|
||||
snprintf(info.tsmaResTbNamePrefix, TSDB_TABLE_FNAME_LEN, "%s", buf);
|
||||
SMDropTbDbInfo *pDbInfo = taosHashGet(pCtx->pDbMap, pSma->db, TSDB_DB_FNAME_LEN);
|
||||
info.suid = pSma->dstTbUid;
|
||||
if (!pDbInfo) {
|
||||
|
@ -4417,14 +4430,17 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith
|
|||
|
||||
SMDropTbTsmaInfos *pInfos = taosHashGet(pCtx->pTsmaMap, &pTb->suid, sizeof(pTb->suid));
|
||||
SArray *pVgInfos = NULL;
|
||||
char buf[TSDB_TABLE_FNAME_LEN];
|
||||
char buf[TSDB_TABLE_FNAME_LEN + TSDB_TABLE_NAME_LEN + 1];
|
||||
char resTbFullName[TSDB_TABLE_FNAME_LEN + 1] = {0};
|
||||
for (int32_t j = 0; j < pInfos->pTsmaInfos->size; ++j) {
|
||||
SMDropTbTsmaInfo *pInfo = taosArrayGet(pInfos->pTsmaInfos, j);
|
||||
int32_t len = sprintf(buf, "%s.%s_%s", pInfo->tsmaResTbDbFName, pInfo->tsmaResTbNamePrefix, pTb->name);
|
||||
uint32_t hashVal =
|
||||
taosGetTbHashVal(buf, len, pInfo->dbInfo.hashMethod, pInfo->dbInfo.hashPrefix, pInfo->dbInfo.hashSuffix);
|
||||
int32_t len = sprintf(buf, "%s_%s", pInfo->tsmaResTbNamePrefix, pTb->name);
|
||||
len = taosCreateMD5Hash(buf, len);
|
||||
len = snprintf(resTbFullName, TSDB_TABLE_FNAME_LEN + 1, "%s.%s", pInfo->tsmaResTbDbFName, buf);
|
||||
uint32_t hashVal = taosGetTbHashVal(resTbFullName, len, pInfo->dbInfo.hashMethod, pInfo->dbInfo.hashPrefix,
|
||||
pInfo->dbInfo.hashSuffix);
|
||||
const SVgroupInfo *pVgInfo = taosArraySearch(pInfo->dbInfo.dbVgInfos, &hashVal, vgHashValCmp, TD_EQ);
|
||||
void *p = taosStrdup(buf + strlen(pInfo->tsmaResTbDbFName) + TSDB_NAME_DELIMITER_LEN);
|
||||
void *p = taosStrdup(resTbFullName + strlen(pInfo->tsmaResTbDbFName) + TSDB_NAME_DELIMITER_LEN);
|
||||
if (taosArrayPush(pCtx->pResTbNames, &p) == NULL) {
|
||||
code = terrno;
|
||||
goto _end;
|
||||
|
|
|
@ -693,7 +693,7 @@ class TDTestCase:
|
|||
"======== prepare test env include database, stable, ctables, and insert data: ")
|
||||
paraDict = {'dbName': db,
|
||||
'dropFlag': 1,
|
||||
'vgroups': 2,
|
||||
'vgroups': 4,
|
||||
'stbName': 'meters',
|
||||
'colPrefix': 'c',
|
||||
'tagPrefix': 't',
|
||||
|
@ -1273,6 +1273,21 @@ class TDTestCase:
|
|||
else:
|
||||
tdLog.debug(f'wait query succeed: {sql} to return {expected_row_num}, got: {tdSql.getRows()}')
|
||||
|
||||
def wait_query_err(self, sql: str, timeout_in_seconds: float, err):
|
||||
timeout = timeout_in_seconds
|
||||
while timeout > 0:
|
||||
try:
|
||||
tdSql.query(sql, queryTimes=1)
|
||||
time.sleep(1)
|
||||
timeout = timeout - 1
|
||||
except:
|
||||
tdSql.error(sql, err);
|
||||
break
|
||||
if timeout <= 0:
|
||||
tdLog.exit(f'failed to wait query: {sql} to return error timeout: {timeout_in_seconds}s')
|
||||
else:
|
||||
tdLog.debug(f'wait query error succeed: {sql}')
|
||||
|
||||
def test_drop_tsma(self):
|
||||
function_name = sys._getframe().f_code.co_name
|
||||
tdLog.debug(f'-----{function_name}------')
|
||||
|
@ -1338,15 +1353,15 @@ class TDTestCase:
|
|||
self.create_tsma('tsma1', 'test', 'meters', ['avg(c1)', 'avg(c2)'], '5m')
|
||||
tdSql.execute('alter table test.t0 ttl 2', queryTimes=1)
|
||||
tdSql.execute('flush database test')
|
||||
self.wait_query('show test.tables like "%t0"', 0, wait_query_seconds)
|
||||
res_tb = TSMAQCBuilder().md5('1.test.tsma1_t0')
|
||||
self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917)
|
||||
|
||||
# test drop multi tables
|
||||
tdSql.execute('drop table test.t3, test.t4')
|
||||
self.wait_query('show test.tables like "%t3"', 0, wait_query_seconds)
|
||||
self.wait_query('show test.tables like "%t4"', 0, wait_query_seconds)
|
||||
|
||||
tdSql.query('show test.tables like "%tsma%"')
|
||||
tdSql.checkRows(0)
|
||||
res_tb = TSMAQCBuilder().md5('1.test.tsma1_t3')
|
||||
self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917)
|
||||
res_tb = TSMAQCBuilder().md5('1.test.tsma1_t4')
|
||||
self.wait_query_err(f'desc test.`{res_tb}`', wait_query_seconds, -2147473917)
|
||||
|
||||
# test drop stream
|
||||
tdSql.error('drop stream tsma1', -2147471088) ## TSMA must be dropped first
|
||||
|
|
|
@ -24,6 +24,8 @@ import platform
|
|||
import socket
|
||||
import threading
|
||||
import importlib
|
||||
print(f"Python version: {sys.version}")
|
||||
print(f"Version info: {sys.version_info}")
|
||||
|
||||
import toml
|
||||
sys.path.append("../pytest")
|
||||
|
@ -687,6 +689,6 @@ if __name__ == "__main__":
|
|||
if conn is not None:
|
||||
conn.close()
|
||||
if asan:
|
||||
# tdDnodes.StopAllSigint()
|
||||
#tdDnodes.StopAllSigint()
|
||||
tdLog.info("Address sanitizer mode finished")
|
||||
sys.exit(0)
|
||||
|
|
Loading…
Reference in New Issue