mirror of
https://github.com/taosdata/TDengine
synced 2026-05-24 10:09:01 +00:00
fix(query): release after opening iter completed.
This commit is contained in:
parent
c5c9796e72
commit
299fe0ae90
1 changed files with 30 additions and 22 deletions
|
|
@ -48,8 +48,8 @@ static void clearStatisInfoCache(SLRUCache *pCache, SSttStatisCacheKey *pKey)
|
|||
static int32_t putStatisInfoIntoCache(SLRUCache *pCache, SSttStatisCacheKey *pKey, SSttStatisCacheValue *pValue,
|
||||
const char *id);
|
||||
static int32_t getStatisInfoFromCache(SLRUCache *pCache, SSttStatisCacheKey *pKey, SSttStatisCacheValue **pValue,
|
||||
const char *id);
|
||||
|
||||
LRUHandle **pHandle, const char *id);
|
||||
static void releaseCacheHandle(SLRUCache* pCache, LRUHandle** pHandle);
|
||||
static void tLDataIterClose2(SLDataIter *pIter);
|
||||
|
||||
// SLDataIter =================================================
|
||||
|
|
@ -1002,6 +1002,7 @@ int32_t tMergeTreeOpen2(SMergeTree *pMTree, SMergeTreeConf *pConf, SSttDataInfoF
|
|||
int32_t lino = 0;
|
||||
int32_t numOfLevels = pFset->lvlArr->size;
|
||||
SSttStatisCacheValue* pValue = NULL;
|
||||
LRUHandle* pHandle = NULL;
|
||||
SSttStatisCacheKey key = {.suid = pConf->suid, .fid = pFset->fid, .vgId = TD_VID(pConf->pTsdb->pVnode)};
|
||||
|
||||
(void)taosThreadOnce(&tsCacheInit, initTableRowsInfoCache);
|
||||
|
|
@ -1029,15 +1030,16 @@ int32_t tMergeTreeOpen2(SMergeTree *pMTree, SMergeTreeConf *pConf, SSttDataInfoF
|
|||
}
|
||||
|
||||
if (pConf->cacheStatis) {
|
||||
int32_t ret = getStatisInfoFromCache(statisCacheInfo.pStatisFileCache, &key, &pValue, pConf->idstr);
|
||||
if (ret == TSDB_CODE_SUCCESS) { // use cached statis info
|
||||
int32_t ret = getStatisInfoFromCache(statisCacheInfo.pStatisFileCache, &key, &pValue, &pHandle, pConf->idstr);
|
||||
if (ret == TSDB_CODE_SUCCESS) { // use cached statis info
|
||||
if (pValue->commitTs == pFset->lastCommit) {
|
||||
loadStatisFromDisk = false;
|
||||
} else {
|
||||
} else { // release the handle ref, and then remove it from lru cache
|
||||
releaseCacheHandle(statisCacheInfo.pStatisFileCache, &pHandle);
|
||||
clearStatisInfoCache(statisCacheInfo.pStatisFileCache, &key);
|
||||
tsdbDebug(
|
||||
tsdbInfo(
|
||||
"cache expired since new commit occurs, remove the cache and load from disk, vgId:%d, fid:%d, suid:%" PRId64
|
||||
", commitTs:%" PRId64 ", new commitTs:%" PRId64 ,
|
||||
", commitTs:%" PRId64 ", new commitTs:%" PRId64,
|
||||
key.vgId, key.fid, key.suid, pValue->commitTs, pFset->lastCommit);
|
||||
}
|
||||
}
|
||||
|
|
@ -1122,19 +1124,17 @@ int32_t tMergeTreeOpen2(SMergeTree *pMTree, SMergeTreeConf *pConf, SSttDataInfoF
|
|||
|
||||
code = buildSttTableRowsInfoKV(pConf, TD_VID(pConf->pTsdb->pVnode), &k, &pVal);
|
||||
if (code == TSDB_CODE_SUCCESS) {
|
||||
// SSttStatisCacheValue *vx = NULL;
|
||||
// int32_t ret = getStatisInfoFromCache(statisCacheInfo.pStatisFileCache, &k, &vx, pConf->idstr);
|
||||
// if (ret != 0) {
|
||||
code = putStatisInfoIntoCache(statisCacheInfo.pStatisFileCache, &k, pVal, pConf->idstr);
|
||||
// } else {
|
||||
// taosMemoryFree(pVal); // already exists
|
||||
// }
|
||||
code = putStatisInfoIntoCache(statisCacheInfo.pStatisFileCache, &k, pVal, pConf->idstr);
|
||||
}
|
||||
}
|
||||
|
||||
return code;
|
||||
|
||||
_end:
|
||||
if (pHandle != NULL && pConf->cacheStatis) {
|
||||
releaseCacheHandle(statisCacheInfo.pStatisFileCache, &pHandle);
|
||||
}
|
||||
|
||||
tMergeTreeClose(pMTree);
|
||||
return code;
|
||||
}
|
||||
|
|
@ -1309,30 +1309,38 @@ int32_t buildSttTableRowsInfoKV(SMergeTreeConf *pConf, int32_t vgId, SSttStatisC
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t getStatisInfoFromCache(SLRUCache* pCache, SSttStatisCacheKey *pKey, SSttStatisCacheValue **pValue,
|
||||
const char *id) {
|
||||
int32_t getStatisInfoFromCache(SLRUCache *pCache, SSttStatisCacheKey *pKey, SSttStatisCacheValue **pValue,
|
||||
LRUHandle **pHandle, const char *id) {
|
||||
*pValue = NULL;
|
||||
*pHandle = NULL;
|
||||
|
||||
(void) taosThreadMutexLock(&statisCacheInfo.lock);
|
||||
LRUHandle *pHandle = taosLRUCacheLookup(pCache, pKey, sizeof(SSttStatisCacheKey));
|
||||
if (pHandle == NULL) {
|
||||
(void)taosThreadMutexLock(&statisCacheInfo.lock);
|
||||
LRUHandle *pItemHandle = taosLRUCacheLookup(pCache, pKey, sizeof(SSttStatisCacheKey));
|
||||
if (pItemHandle == NULL) {
|
||||
(void)taosThreadMutexUnlock(&statisCacheInfo.lock);
|
||||
return TSDB_CODE_NOT_FOUND;
|
||||
}
|
||||
|
||||
void* p = taosLRUCacheValue(pCache, pHandle);
|
||||
void *p = taosLRUCacheValue(pCache, pItemHandle);
|
||||
|
||||
*pValue = p;
|
||||
*pHandle = pItemHandle;
|
||||
|
||||
tsdbDebug("get statis info from cache suid:%" PRId64 ", vgId:%d, fid:%d, %s, commitTs:%" PRId64, pKey->suid,
|
||||
pKey->vgId, pKey->fid, id, (*pValue)->commitTs);
|
||||
|
||||
bool ret = taosLRUCacheRelease(pCache, pHandle, false);
|
||||
|
||||
// (*pEntry)->hitTimes += 1;
|
||||
(void)taosThreadMutexUnlock(&statisCacheInfo.lock);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
void releaseCacheHandle(SLRUCache* pCache, LRUHandle** pHandle) {
|
||||
(void) taosThreadMutexLock(&statisCacheInfo.lock);
|
||||
bool ret = taosLRUCacheRelease(pCache, *pHandle, false);
|
||||
*pHandle = NULL;
|
||||
(void)taosThreadMutexUnlock(&statisCacheInfo.lock);
|
||||
}
|
||||
|
||||
static void freeStatisFileItems(const void* key, size_t keyLen, void* value, void* ud) {
|
||||
(void)ud;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue