fix: ttlMgrFlush endless loop

This commit is contained in:
Shungang Li 2024-08-15 13:48:49 +08:00
parent 5c24933077
commit d2ea41e030
1 changed files with 18 additions and 9 deletions

View File

@ -402,15 +402,20 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
int32_t code = TSDB_CODE_SUCCESS; int32_t code = TSDB_CODE_SUCCESS;
void *pIter = taosHashIterate(pTtlMgr->pDirtyUids, NULL); void *pIter = NULL;
while (pIter != NULL) { while ((pIter = taosHashIterate(pTtlMgr->pDirtyUids, pIter)) != NULL) {
STtlDirtyEntry *pEntry = (STtlDirtyEntry *)pIter; STtlDirtyEntry *pEntry = (STtlDirtyEntry *)pIter;
tb_uid_t *pUid = taosHashGetKey(pIter, NULL); tb_uid_t *pUid = taosHashGetKey(pIter, NULL);
STtlCacheEntry *cacheEntry = taosHashGet(pTtlMgr->pTtlCache, pUid, sizeof(*pUid)); STtlCacheEntry *cacheEntry = taosHashGet(pTtlMgr->pTtlCache, pUid, sizeof(*pUid));
if (cacheEntry == NULL) { if (cacheEntry == NULL) {
metaError("%s, ttlMgr flush failed to get ttl cache, uid: %" PRId64 ", type: %d", pTtlMgr->logPrefix, *pUid, metaInfo("%s, ttlMgr flush failed to get ttl cache, might be restoring, uid: %" PRId64 ", type: %d",
pEntry->type); pTtlMgr->logPrefix, *pUid, pEntry->type);
code = taosHashRemove(pTtlMgr->pDirtyUids, pUid, sizeof(*pUid));
if (TSDB_CODE_SUCCESS != code) {
metaError("%s, ttlMgr flush failed to remove dirty uid since %s", pTtlMgr->logPrefix, tstrerror(code));
goto _out;
}
continue; continue;
} }
@ -422,9 +427,9 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
if (pEntry->type == ENTRY_TYPE_UPSERT) { if (pEntry->type == ENTRY_TYPE_UPSERT) {
// delete old key & upsert new key // delete old key & upsert new key
(void)tdbTbDelete(pTtlMgr->pTtlIdx, &ttlKey, sizeof(ttlKey), pTxn); // maybe first insert, ignore error (void)tdbTbDelete(pTtlMgr->pTtlIdx, &ttlKey, sizeof(ttlKey), pTxn); // maybe first insert, ignore error
code = tdbTbUpsert(pTtlMgr->pTtlIdx, &ttlKeyDirty, sizeof(ttlKeyDirty), &cacheEntry->ttlDaysDirty, code = tdbTbUpsert(pTtlMgr->pTtlIdx, &ttlKeyDirty, sizeof(ttlKeyDirty), &cacheEntry->ttlDaysDirty,
sizeof(cacheEntry->ttlDaysDirty), pTxn); sizeof(cacheEntry->ttlDaysDirty), pTxn);
if (TSDB_CODE_SUCCESS != code) { if (TSDB_CODE_SUCCESS != code) {
metaError("%s, ttlMgr flush failed to upsert since %s", pTtlMgr->logPrefix, tstrerror(code)); metaError("%s, ttlMgr flush failed to upsert since %s", pTtlMgr->logPrefix, tstrerror(code));
goto _out; goto _out;
@ -449,9 +454,11 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
goto _out; goto _out;
} }
void *pIterTmp = pIter; code = taosHashRemove(pTtlMgr->pDirtyUids, pUid, sizeof(*pUid));
pIter = taosHashIterate(pTtlMgr->pDirtyUids, pIterTmp); if (TSDB_CODE_SUCCESS != code) {
(void)taosHashRemove(pTtlMgr->pDirtyUids, pUid, sizeof(tb_uid_t)); metaError("%s, ttlMgr flush failed to remove dirty uid since %s", pTtlMgr->logPrefix, tstrerror(code));
goto _out;
}
} }
taosHashClear(pTtlMgr->pDirtyUids); taosHashClear(pTtlMgr->pDirtyUids);
@ -459,6 +466,8 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
code = TSDB_CODE_SUCCESS; code = TSDB_CODE_SUCCESS;
_out: _out:
taosHashCancelIterate(pTtlMgr->pDirtyUids, pIter);
endNs = taosGetTimestampNs(); endNs = taosGetTimestampNs();
metaTrace("%s, ttl mgr flush end, time consumed: %" PRId64 " ns", pTtlMgr->logPrefix, endNs - startNs); metaTrace("%s, ttl mgr flush end, time consumed: %" PRId64 " ns", pTtlMgr->logPrefix, endNs - startNs);