diff --git a/source/dnode/vnode/src/meta/metaCache.c b/source/dnode/vnode/src/meta/metaCache.c index b8cc9f0df2f10d6bd42f6d68f801d2a749479626..d4bdafcb80d42f40947f378e54d5b65a8619df32 100644 --- a/source/dnode/vnode/src/meta/metaCache.c +++ b/source/dnode/vnode/src/meta/metaCache.c @@ -26,9 +26,12 @@ struct SMetaCacheEntry { }; struct SMetaCache { - int32_t nEntry; - int32_t nBucket; - SMetaCacheEntry** aBucket; + // child, normal, super, table entry cache + struct SEntryCache { + int32_t nEntry; + int32_t nBucket; + SMetaCacheEntry** aBucket; + } sEntryCache; }; int32_t metaCacheOpen(SMeta* pMeta) { @@ -41,10 +44,12 @@ int32_t metaCacheOpen(SMeta* pMeta) { goto _err; } - pCache->nEntry = 0; - pCache->nBucket = META_CACHE_BASE_BUCKET; - pCache->aBucket = (SMetaCacheEntry**)taosMemoryCalloc(pCache->nBucket, sizeof(SMetaCacheEntry*)); - if (pCache->aBucket == NULL) { + // open entry cache + pCache->sEntryCache.nEntry = 0; + pCache->sEntryCache.nBucket = META_CACHE_BASE_BUCKET; + pCache->sEntryCache.aBucket = + (SMetaCacheEntry**)taosMemoryCalloc(pCache->sEntryCache.nBucket, sizeof(SMetaCacheEntry*)); + if (pCache->sEntryCache.aBucket == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; taosMemoryFree(pCache); goto _err; @@ -62,15 +67,16 @@ _err: void metaCacheClose(SMeta* pMeta) { if (pMeta->pCache) { - for (int32_t iBucket = 0; iBucket < pMeta->pCache->nBucket; iBucket++) { - SMetaCacheEntry* pEntry = pMeta->pCache->aBucket[iBucket]; + // close entry cache + for (int32_t iBucket = 0; iBucket < pMeta->pCache->sEntryCache.nBucket; iBucket++) { + SMetaCacheEntry* pEntry = pMeta->pCache->sEntryCache.aBucket[iBucket]; while (pEntry) { SMetaCacheEntry* tEntry = pEntry->next; taosMemoryFree(pEntry); pEntry = tEntry; } } - taosMemoryFree(pMeta->pCache->aBucket); + taosMemoryFree(pMeta->pCache->sEntryCache.aBucket); taosMemoryFree(pMeta->pCache); pMeta->pCache = NULL; } @@ -81,9 +87,9 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { int32_t nBucket; if (expand) { - nBucket = pCache->nBucket * 2; + nBucket = pCache->sEntryCache.nBucket * 2; } else { - nBucket = pCache->nBucket / 2; + nBucket = pCache->sEntryCache.nBucket / 2; } SMetaCacheEntry** aBucket = (SMetaCacheEntry**)taosMemoryCalloc(nBucket, sizeof(SMetaCacheEntry*)); @@ -93,8 +99,8 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { } // rehash - for (int32_t iBucket = 0; iBucket < pCache->nBucket; iBucket++) { - SMetaCacheEntry* pEntry = pCache->aBucket[iBucket]; + for (int32_t iBucket = 0; iBucket < pCache->sEntryCache.nBucket; iBucket++) { + SMetaCacheEntry* pEntry = pCache->sEntryCache.aBucket[iBucket]; while (pEntry) { SMetaCacheEntry* pTEntry = pEntry->next; @@ -107,9 +113,9 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { } // final set - taosMemoryFree(pCache->aBucket); - pCache->nBucket = nBucket; - pCache->aBucket = aBucket; + taosMemoryFree(pCache->sEntryCache.aBucket); + pCache->sEntryCache.nBucket = nBucket; + pCache->sEntryCache.aBucket = aBucket; _exit: return code; @@ -122,8 +128,8 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { // search SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(pInfo->uid) % pCache->nBucket; - SMetaCacheEntry** ppEntry = &pCache->aBucket[iBucket]; + int32_t iBucket = TABS(pInfo->uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry** ppEntry = &pCache->sEntryCache.aBucket[iBucket]; while (*ppEntry && (*ppEntry)->info.uid != pInfo->uid) { ppEntry = &(*ppEntry)->next; } @@ -135,11 +141,11 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { (*ppEntry)->info.skmVer = pInfo->skmVer; } } else { // insert - if (pCache->nEntry >= pCache->nBucket) { + if (pCache->sEntryCache.nEntry >= pCache->sEntryCache.nBucket) { code = metaRehashCache(pCache, 1); if (code) goto _exit; - iBucket = TABS(pInfo->uid) % pCache->nBucket; + iBucket = TABS(pInfo->uid) % pCache->sEntryCache.nBucket; } SMetaCacheEntry* pEntryNew = (SMetaCacheEntry*)taosMemoryMalloc(sizeof(*pEntryNew)); @@ -149,9 +155,9 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { } pEntryNew->info = *pInfo; - pEntryNew->next = pCache->aBucket[iBucket]; - pCache->aBucket[iBucket] = pEntryNew; - pCache->nEntry++; + pEntryNew->next = pCache->sEntryCache.aBucket[iBucket]; + pCache->sEntryCache.aBucket[iBucket] = pEntryNew; + pCache->sEntryCache.nEntry++; } _exit: @@ -162,8 +168,8 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid) { int32_t code = 0; SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(uid) % pCache->nBucket; - SMetaCacheEntry** ppEntry = &pCache->aBucket[iBucket]; + int32_t iBucket = TABS(uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry** ppEntry = &pCache->sEntryCache.aBucket[iBucket]; while (*ppEntry && (*ppEntry)->info.uid != uid) { ppEntry = &(*ppEntry)->next; } @@ -172,8 +178,9 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid) { if (pEntry) { *ppEntry = pEntry->next; taosMemoryFree(pEntry); - pCache->nEntry--; - if (pCache->nEntry < pCache->nBucket / 4 && pCache->nBucket > META_CACHE_BASE_BUCKET) { + pCache->sEntryCache.nEntry--; + if (pCache->sEntryCache.nEntry < pCache->sEntryCache.nBucket / 4 && + pCache->sEntryCache.nBucket > META_CACHE_BASE_BUCKET) { code = metaRehashCache(pCache, 0); if (code) goto _exit; } @@ -189,8 +196,8 @@ int32_t metaCacheGet(SMeta* pMeta, int64_t uid, SMetaInfo* pInfo) { int32_t code = 0; SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(uid) % pCache->nBucket; - SMetaCacheEntry* pEntry = pCache->aBucket[iBucket]; + int32_t iBucket = TABS(uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry* pEntry = pCache->sEntryCache.aBucket[iBucket]; while (pEntry && pEntry->info.uid != uid) { pEntry = pEntry->next;