fix drop table with tsma crash
This commit is contained in:
parent
3eeca7a0fe
commit
8c3ec327ba
|
@ -4076,7 +4076,7 @@ typedef struct SMDropTbDbInfo {
|
||||||
|
|
||||||
typedef struct SMDropTbTsmaInfo {
|
typedef struct SMDropTbTsmaInfo {
|
||||||
char tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
|
char tsmaResTbDbFName[TSDB_DB_FNAME_LEN];
|
||||||
char tsmaResTbNamePrefix[TSDB_TABLE_NAME_LEN];
|
char tsmaResTbNamePrefix[TSDB_TABLE_FNAME_LEN];
|
||||||
int32_t suid;
|
int32_t suid;
|
||||||
SMDropTbDbInfo dbInfo; // reference to DbInfo in pDbMap
|
SMDropTbDbInfo dbInfo; // reference to DbInfo in pDbMap
|
||||||
} SMDropTbTsmaInfo;
|
} SMDropTbTsmaInfo;
|
||||||
|
@ -4207,6 +4207,7 @@ static int32_t mndCreateDropTbsTxnPrepare(SRpcMsg *pRsp, SMndDropTbsWithTsmaCtx
|
||||||
SMnode *pMnode = pRsp->info.node;
|
SMnode *pMnode = pRsp->info.node;
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pRsp, "drop-tbs");
|
||||||
mndTransSetChangeless(pTrans);
|
mndTransSetChangeless(pTrans);
|
||||||
|
mndTransSetSerial(pTrans);
|
||||||
if (pTrans == NULL) {
|
if (pTrans == NULL) {
|
||||||
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
|
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
|
||||||
if (terrno != 0) code = terrno;
|
if (terrno != 0) code = terrno;
|
||||||
|
@ -4294,6 +4295,18 @@ static int32_t mndDropTbAdd(SMnode *pMnode, SHashObj *pVgHashMap, const SVgroupI
|
||||||
return 0;
|
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) {
|
static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropTbTsmaInfo *pInfo) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, dbname);
|
SDbObj *pDb = mndAcquireDb(pMnode, dbname);
|
||||||
|
@ -4308,6 +4321,7 @@ static int32_t mndGetDbVgInfoForTsma(SMnode *pMnode, const char *dbname, SMDropT
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
mndBuildDBVgroupInfo(pDb, pMnode, pInfo->dbInfo.dbVgInfos);
|
mndBuildDBVgroupInfo(pDb, pMnode, pInfo->dbInfo.dbVgInfos);
|
||||||
|
taosArraySort(pInfo->dbInfo.dbVgInfos, vgInfoCmp);
|
||||||
|
|
||||||
pInfo->dbInfo.hashPrefix = pDb->cfg.hashPrefix;
|
pInfo->dbInfo.hashPrefix = pDb->cfg.hashPrefix;
|
||||||
pInfo->dbInfo.hashSuffix = pDb->cfg.hashSuffix;
|
pInfo->dbInfo.hashSuffix = pDb->cfg.hashSuffix;
|
||||||
|
@ -4380,9 +4394,8 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith
|
||||||
if (pInfos) {
|
if (pInfos) {
|
||||||
SMDropTbTsmaInfo info = {0};
|
SMDropTbTsmaInfo info = {0};
|
||||||
int32_t len = sprintf(buf, "%s", pSma->name);
|
int32_t len = sprintf(buf, "%s", pSma->name);
|
||||||
len = taosCreateMD5Hash(buf, len);
|
|
||||||
sprintf(info.tsmaResTbDbFName, "%s", pSma->db);
|
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);
|
SMDropTbDbInfo *pDbInfo = taosHashGet(pCtx->pDbMap, pSma->db, TSDB_DB_FNAME_LEN);
|
||||||
info.suid = pSma->dstTbUid;
|
info.suid = pSma->dstTbUid;
|
||||||
if (!pDbInfo) {
|
if (!pDbInfo) {
|
||||||
|
@ -4417,14 +4430,17 @@ static int32_t mndDropTbAddTsmaResTbsForSingleVg(SMnode *pMnode, SMndDropTbsWith
|
||||||
|
|
||||||
SMDropTbTsmaInfos *pInfos = taosHashGet(pCtx->pTsmaMap, &pTb->suid, sizeof(pTb->suid));
|
SMDropTbTsmaInfos *pInfos = taosHashGet(pCtx->pTsmaMap, &pTb->suid, sizeof(pTb->suid));
|
||||||
SArray *pVgInfos = NULL;
|
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) {
|
for (int32_t j = 0; j < pInfos->pTsmaInfos->size; ++j) {
|
||||||
SMDropTbTsmaInfo *pInfo = taosArrayGet(pInfos->pTsmaInfos, j);
|
SMDropTbTsmaInfo *pInfo = taosArrayGet(pInfos->pTsmaInfos, j);
|
||||||
int32_t len = sprintf(buf, "%s.%s_%s", pInfo->tsmaResTbDbFName, pInfo->tsmaResTbNamePrefix, pTb->name);
|
int32_t len = sprintf(buf, "%s_%s", pInfo->tsmaResTbNamePrefix, pTb->name);
|
||||||
uint32_t hashVal =
|
len = taosCreateMD5Hash(buf, len);
|
||||||
taosGetTbHashVal(buf, len, pInfo->dbInfo.hashMethod, pInfo->dbInfo.hashPrefix, pInfo->dbInfo.hashSuffix);
|
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);
|
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) {
|
if (taosArrayPush(pCtx->pResTbNames, &p) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _end;
|
goto _end;
|
||||||
|
|
|
@ -1338,15 +1338,16 @@ class TDTestCase:
|
||||||
self.create_tsma('tsma1', 'test', 'meters', ['avg(c1)', 'avg(c2)'], '5m')
|
self.create_tsma('tsma1', 'test', 'meters', ['avg(c1)', 'avg(c2)'], '5m')
|
||||||
tdSql.execute('alter table test.t0 ttl 2', queryTimes=1)
|
tdSql.execute('alter table test.t0 ttl 2', queryTimes=1)
|
||||||
tdSql.execute('flush database test')
|
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(f'select * from information_schema.ins_tables where table_name = "{res_tb}"', 0, wait_query_seconds)
|
||||||
|
|
||||||
# test drop multi tables
|
# test drop multi tables
|
||||||
tdSql.execute('drop table test.t3, test.t4')
|
tdSql.execute('drop table test.t3, test.t4')
|
||||||
self.wait_query('show test.tables like "%t3"', 0, wait_query_seconds)
|
res_tb = TSMAQCBuilder().md5('1.test.tsma1_t3')
|
||||||
self.wait_query('show test.tables like "%t4"', 0, wait_query_seconds)
|
self.wait_query(f'select * from information_schema.ins_tables where table_name = "{res_tb}"', 0, wait_query_seconds)
|
||||||
|
res_tb = TSMAQCBuilder().md5('1.test.tsma1_t4')
|
||||||
tdSql.query('show test.tables like "%tsma%"')
|
self.wait_query(f'select * from information_schema.ins_tables where table_name = "{res_tb}"', 0, wait_query_seconds)
|
||||||
tdSql.checkRows(0)
|
time.sleep(9999999)
|
||||||
|
|
||||||
# test drop stream
|
# test drop stream
|
||||||
tdSql.error('drop stream tsma1', -2147471088) ## TSMA must be dropped first
|
tdSql.error('drop stream tsma1', -2147471088) ## TSMA must be dropped first
|
||||||
|
|
Loading…
Reference in New Issue