[TD-437] stable refcount error while drop db
This commit is contained in:
parent
488addaf44
commit
87e4d500df
|
@ -27,7 +27,8 @@ void mnodeCleanupVgroups();
|
||||||
SVgObj *mnodeGetVgroup(int32_t vgId);
|
SVgObj *mnodeGetVgroup(int32_t vgId);
|
||||||
void mnodeIncVgroupRef(SVgObj *pVgroup);
|
void mnodeIncVgroupRef(SVgObj *pVgroup);
|
||||||
void mnodeDecVgroupRef(SVgObj *pVgroup);
|
void mnodeDecVgroupRef(SVgObj *pVgroup);
|
||||||
void mnodeDropAllDbVgroups(SDbObj *pDropDb, bool sendMsg);
|
void mnodeDropAllDbVgroups(SDbObj *pDropDb);
|
||||||
|
void mnodeSendDropAllDbVgroupsMsg(SDbObj *pDropDb);
|
||||||
void mnodeDropAllDnodeVgroups(SDnodeObj *pDropDnode);
|
void mnodeDropAllDnodeVgroups(SDnodeObj *pDropDnode);
|
||||||
void mnodeUpdateAllDbVgroups(SDbObj *pAlterDb);
|
void mnodeUpdateAllDbVgroups(SDbObj *pAlterDb);
|
||||||
|
|
||||||
|
|
|
@ -81,10 +81,10 @@ static int32_t mnodeDbActionDelete(SSdbOper *pOper) {
|
||||||
SDbObj *pDb = pOper->pObj;
|
SDbObj *pDb = pOper->pObj;
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
||||||
|
|
||||||
mnodeDropDbFromAcct(pAcct, pDb);
|
|
||||||
mnodeDropAllChildTables(pDb);
|
mnodeDropAllChildTables(pDb);
|
||||||
mnodeDropAllSuperTables(pDb);
|
mnodeDropAllSuperTables(pDb);
|
||||||
mnodeDropAllDbVgroups(pDb, false);
|
mnodeDropAllDbVgroups(pDb);
|
||||||
|
mnodeDropDbFromAcct(pAcct, pDb);
|
||||||
mnodeDecAcctRef(pAcct);
|
mnodeDecAcctRef(pAcct);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -998,19 +998,7 @@ static int32_t mnodeProcessDropDbMsg(SMnodeMsg *pMsg) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
mnodeSendDropAllDbVgroupsMsg(pMsg->pDb);
|
||||||
mnodeDropAllDbVgroups(pMsg->pDb, true);
|
|
||||||
#else
|
|
||||||
SVgObj *pVgroup = pMsg->pDb->pHead;
|
|
||||||
if (pVgroup != NULL) {
|
|
||||||
mPrint("vgId:%d, will be dropped", pVgroup->vgId);
|
|
||||||
SMnodeMsg *newMsg = mnodeCloneMsg(pMsg);
|
|
||||||
newMsg->ahandle = pVgroup;
|
|
||||||
newMsg->expected = pVgroup->numOfVnodes;
|
|
||||||
mnodeDropVgroup(pVgroup, newMsg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mTrace("db:%s, all vgroups is dropped", pMsg->pDb->name);
|
mTrace("db:%s, all vgroups is dropped", pMsg->pDb->name);
|
||||||
return mnodeDropDb(pMsg);
|
return mnodeDropDb(pMsg);
|
||||||
|
|
|
@ -211,7 +211,7 @@ static int32_t mnodeProcessRetrieveMsg(SMnodeMsg *pMsg) {
|
||||||
pMsg->rpcRsp.rsp = pRsp;
|
pMsg->rpcRsp.rsp = pRsp;
|
||||||
pMsg->rpcRsp.len = size;
|
pMsg->rpcRsp.len = size;
|
||||||
|
|
||||||
if (rowsToRead == 0 || (rowsRead == rowsToRead)) {
|
if (rowsToRead == 0 || rowsRead == rowsToRead) {
|
||||||
pRsp->completed = 1;
|
pRsp->completed = 1;
|
||||||
mnodeReleaseShowObj(pShow, true);
|
mnodeReleaseShowObj(pShow, true);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -148,37 +148,30 @@ static int32_t mnodeChildTableActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_INVALID_VGROUP_ID;
|
return TSDB_CODE_INVALID_VGROUP_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
SVgObj *pVgroup = mnodeGetVgroup(pTable->vgId);
|
SVgObj *pVgroup = NULL;
|
||||||
if (pVgroup == NULL) {
|
SDbObj *pDb = NULL;
|
||||||
return TSDB_CODE_INVALID_VGROUP_ID;
|
SAcctObj *pAcct = NULL;
|
||||||
}
|
|
||||||
mnodeDecVgroupRef(pVgroup);
|
|
||||||
|
|
||||||
SDbObj *pDb = mnodeGetDb(pVgroup->dbName);
|
pVgroup = mnodeGetVgroup(pTable->vgId);
|
||||||
if (pDb == NULL) {
|
if (pVgroup != NULL) pDb = mnodeGetDb(pVgroup->dbName);
|
||||||
mError("ctable:%s, vgId:%d not in DB:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName);
|
if (pDb != NULL) pAcct = mnodeGetAcct(pDb->acct);
|
||||||
return TSDB_CODE_INVALID_DB;
|
|
||||||
}
|
|
||||||
mnodeDecDbRef(pDb);
|
|
||||||
|
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
|
||||||
if (pAcct == NULL) {
|
|
||||||
mError("ctable:%s, acct:%s not exists", pTable->info.tableId, pDb->acct);
|
|
||||||
return TSDB_CODE_INVALID_ACCT;
|
|
||||||
}
|
|
||||||
mnodeDecAcctRef(pAcct);
|
|
||||||
|
|
||||||
if (pTable->info.type == TSDB_CHILD_TABLE) {
|
if (pTable->info.type == TSDB_CHILD_TABLE) {
|
||||||
grantRestore(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1);
|
grantRestore(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1);
|
||||||
pAcct->acctInfo.numOfTimeSeries -= (pTable->superTable->numOfColumns - 1);
|
if (pAcct != NULL) pAcct->acctInfo.numOfTimeSeries -= (pTable->superTable->numOfColumns - 1);
|
||||||
mnodeRemoveTableFromStable(pTable->superTable, pTable);
|
mnodeRemoveTableFromStable(pTable->superTable, pTable);
|
||||||
mnodeDecTableRef(pTable->superTable);
|
mnodeDecTableRef(pTable->superTable);
|
||||||
} else {
|
} else {
|
||||||
grantRestore(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1);
|
grantRestore(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1);
|
||||||
pAcct->acctInfo.numOfTimeSeries -= (pTable->numOfColumns - 1);
|
if (pAcct != NULL) pAcct->acctInfo.numOfTimeSeries -= (pTable->numOfColumns - 1);
|
||||||
}
|
}
|
||||||
mnodeRemoveTableFromDb(pDb);
|
|
||||||
mnodeRemoveTableFromVgroup(pVgroup, pTable);
|
if (pDb != NULL) mnodeRemoveTableFromDb(pDb);
|
||||||
|
if (pVgroup != NULL) mnodeRemoveTableFromVgroup(pVgroup, pTable);
|
||||||
|
|
||||||
|
mnodeDecVgroupRef(pVgroup);
|
||||||
|
mnodeDecDbRef(pDb);
|
||||||
|
mnodeDecAcctRef(pAcct);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -693,10 +686,10 @@ static int32_t mnodeProcessCreateTableMsg(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCreate->numOfTags != 0) {
|
if (pCreate->numOfTags != 0) {
|
||||||
mTrace("table:%s, create msg is received from thandle:%p", pCreate->tableId, pMsg->rpcMsg.handle);
|
mTrace("table:%s, create stable msg is received from thandle:%p", pCreate->tableId, pMsg->rpcMsg.handle);
|
||||||
return mnodeProcessCreateSuperTableMsg(pMsg);
|
return mnodeProcessCreateSuperTableMsg(pMsg);
|
||||||
} else {
|
} else {
|
||||||
mTrace("table:%s, create msg is received from thandle:%p", pCreate->tableId, pMsg->rpcMsg.handle);
|
mTrace("table:%s, create ctable msg is received from thandle:%p", pCreate->tableId, pMsg->rpcMsg.handle);
|
||||||
return mnodeProcessCreateChildTableMsg(pMsg);
|
return mnodeProcessCreateChildTableMsg(pMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1288,7 +1281,7 @@ static int32_t mnodeProcessSuperTableVgroupMsg(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRsp->numOfTables = htonl(numOfTable);
|
pRsp->numOfTables = htonl(numOfTable);
|
||||||
char* msg = (char*) pRsp + sizeof(SCMSTableVgroupRspMsg);
|
char *msg = (char *)pRsp + sizeof(SCMSTableVgroupRspMsg);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTable; ++i) {
|
for (int32_t i = 0; i < numOfTable; ++i) {
|
||||||
char *stableName = (char*)pInfo + sizeof(SCMSTableVgroupMsg) + (TSDB_TABLE_ID_LEN) * i;
|
char *stableName = (char*)pInfo + sizeof(SCMSTableVgroupMsg) + (TSDB_TABLE_ID_LEN) * i;
|
||||||
|
@ -1318,6 +1311,7 @@ static int32_t mnodeProcessSuperTableVgroupMsg(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashDestroyIter(pIter);
|
taosHashDestroyIter(pIter);
|
||||||
|
mnodeDecTableRef(pTable);
|
||||||
|
|
||||||
pVgroupInfo->numOfVgroups = htonl(vgSize);
|
pVgroupInfo->numOfVgroups = htonl(vgSize);
|
||||||
|
|
||||||
|
@ -1738,7 +1732,7 @@ static int32_t mnodeDoGetChildTableMeta(SMnodeMsg *pMsg, STableMetaMsg *pMeta) {
|
||||||
|
|
||||||
static int32_t mnodeAutoCreateChildTable(SMnodeMsg *pMsg) {
|
static int32_t mnodeAutoCreateChildTable(SMnodeMsg *pMsg) {
|
||||||
SCMTableInfoMsg *pInfo = pMsg->rpcMsg.pCont;
|
SCMTableInfoMsg *pInfo = pMsg->rpcMsg.pCont;
|
||||||
STagData* pTag = (STagData*)pInfo->tags;
|
STagData *pTag = (STagData *)pInfo->tags;
|
||||||
|
|
||||||
int32_t contLen = sizeof(SCMCreateTableMsg) + offsetof(STagData, data) + ntohl(pTag->dataLen);
|
int32_t contLen = sizeof(SCMCreateTableMsg) + offsetof(STagData, data) + ntohl(pTag->dataLen);
|
||||||
SCMCreateTableMsg *pCreateMsg = rpcMallocCont(contLen);
|
SCMCreateTableMsg *pCreateMsg = rpcMallocCont(contLen);
|
||||||
|
@ -1754,14 +1748,13 @@ static int32_t mnodeAutoCreateChildTable(SMnodeMsg *pMsg) {
|
||||||
pCreateMsg->contLen = htonl(contLen);
|
pCreateMsg->contLen = htonl(contLen);
|
||||||
|
|
||||||
memcpy(pCreateMsg->schema, pInfo->tags, contLen - sizeof(SCMCreateTableMsg));
|
memcpy(pCreateMsg->schema, pInfo->tags, contLen - sizeof(SCMCreateTableMsg));
|
||||||
mTrace("table:%s, start to create on demand, stable:%s", pInfo->tableId, pInfo->tags);
|
mTrace("table:%s, start to create on demand, stable:%s", pInfo->tableId, ((STagData *)(pCreateMsg->schema))->name);
|
||||||
|
|
||||||
rpcFreeCont(pMsg->rpcMsg.pCont);
|
rpcFreeCont(pMsg->rpcMsg.pCont);
|
||||||
pMsg->rpcMsg.msgType = TSDB_MSG_TYPE_CM_CREATE_TABLE;
|
pMsg->rpcMsg.msgType = TSDB_MSG_TYPE_CM_CREATE_TABLE;
|
||||||
pMsg->rpcMsg.pCont = pCreateMsg;
|
pMsg->rpcMsg.pCont = pCreateMsg;
|
||||||
pMsg->rpcMsg.contLen = contLen;
|
pMsg->rpcMsg.contLen = contLen;
|
||||||
|
|
||||||
|
|
||||||
return TSDB_CODE_ACTION_NEED_REPROCESSED;
|
return TSDB_CODE_ACTION_NEED_REPROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -784,7 +784,7 @@ void mnodeUpdateAllDbVgroups(SDbObj *pAlterDb) {
|
||||||
mPrint("db:%s, all vgroups is updated in sdb", pAlterDb->name);
|
mPrint("db:%s, all vgroups is updated in sdb", pAlterDb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeDropAllDbVgroups(SDbObj *pDropDb, bool sendMsg) {
|
void mnodeDropAllDbVgroups(SDbObj *pDropDb) {
|
||||||
void * pIter = NULL;
|
void * pIter = NULL;
|
||||||
int32_t numOfVgroups = 0;
|
int32_t numOfVgroups = 0;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
|
@ -802,10 +802,6 @@ void mnodeDropAllDbVgroups(SDbObj *pDropDb, bool sendMsg) {
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&oper);
|
||||||
numOfVgroups++;
|
numOfVgroups++;
|
||||||
|
|
||||||
if (sendMsg) {
|
|
||||||
mnodeSendDropVgroupMsg(pVgroup, NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeDecVgroupRef(pVgroup);
|
mnodeDecVgroupRef(pVgroup);
|
||||||
|
@ -815,3 +811,25 @@ void mnodeDropAllDbVgroups(SDbObj *pDropDb, bool sendMsg) {
|
||||||
|
|
||||||
mPrint("db:%s, all vgroups:%d is dropped from sdb", pDropDb->name, numOfVgroups);
|
mPrint("db:%s, all vgroups:%d is dropped from sdb", pDropDb->name, numOfVgroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mnodeSendDropAllDbVgroupsMsg(SDbObj *pDropDb) {
|
||||||
|
void * pIter = NULL;
|
||||||
|
int32_t numOfVgroups = 0;
|
||||||
|
SVgObj *pVgroup = NULL;
|
||||||
|
|
||||||
|
mPrint("db:%s, all vgroups will be dropped in dnode", pDropDb->name);
|
||||||
|
while (1) {
|
||||||
|
pIter = mnodeGetNextVgroup(pIter, &pVgroup);
|
||||||
|
if (pVgroup == NULL) break;
|
||||||
|
|
||||||
|
if (pVgroup->pDb == pDropDb) {
|
||||||
|
mnodeSendDropVgroupMsg(pVgroup, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeDecVgroupRef(pVgroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbFreeIter(pIter);
|
||||||
|
|
||||||
|
mPrint("db:%s, all vgroups:%d drop msg is sent to dnode", pDropDb->name, numOfVgroups);
|
||||||
|
}
|
Loading…
Reference in New Issue