cache/lru: new applyF API for tlrucache
This commit is contained in:
parent
6d23ea93ea
commit
158ae209bf
|
@ -24,7 +24,8 @@ extern "C" {
|
||||||
|
|
||||||
typedef struct SLRUCache SLRUCache;
|
typedef struct SLRUCache SLRUCache;
|
||||||
|
|
||||||
typedef void (*_taos_lru_deleter_t)(const void *key, size_t keyLen, void *value);
|
typedef void (*_taos_lru_deleter_t)(const void *key, size_t keyLen, void *value, void *ud);
|
||||||
|
typedef int (*_taos_lru_functor_t)(const void *key, size_t keyLen, void *value, void *ud);
|
||||||
|
|
||||||
typedef struct LRUHandle LRUHandle;
|
typedef struct LRUHandle LRUHandle;
|
||||||
|
|
||||||
|
@ -41,10 +42,11 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo
|
||||||
void taosLRUCacheCleanup(SLRUCache *cache);
|
void taosLRUCacheCleanup(SLRUCache *cache);
|
||||||
|
|
||||||
LRUStatus taosLRUCacheInsert(SLRUCache *cache, const void *key, size_t keyLen, void *value, size_t charge,
|
LRUStatus taosLRUCacheInsert(SLRUCache *cache, const void *key, size_t keyLen, void *value, size_t charge,
|
||||||
_taos_lru_deleter_t deleter, LRUHandle **handle, LRUPriority priority);
|
_taos_lru_deleter_t deleter, LRUHandle **handle, LRUPriority priority, void *ud);
|
||||||
LRUHandle *taosLRUCacheLookup(SLRUCache *cache, const void *key, size_t keyLen);
|
LRUHandle *taosLRUCacheLookup(SLRUCache *cache, const void *key, size_t keyLen);
|
||||||
void taosLRUCacheErase(SLRUCache *cache, const void *key, size_t keyLen);
|
void taosLRUCacheErase(SLRUCache *cache, const void *key, size_t keyLen);
|
||||||
|
|
||||||
|
void taosLRUCacheApply(SLRUCache *cache, _taos_lru_functor_t functor, void *ud);
|
||||||
void taosLRUCacheEraseUnrefEntries(SLRUCache *cache);
|
void taosLRUCacheEraseUnrefEntries(SLRUCache *cache);
|
||||||
|
|
||||||
bool taosLRUCacheRef(SLRUCache *cache, LRUHandle *handle);
|
bool taosLRUCacheRef(SLRUCache *cache, LRUHandle *handle);
|
||||||
|
|
|
@ -357,6 +357,11 @@ typedef struct {
|
||||||
STSchema *pTSchema;
|
STSchema *pTSchema;
|
||||||
} SRocksCache;
|
} SRocksCache;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
STsdb *pTsdb;
|
||||||
|
int flush_count;
|
||||||
|
} SCacheFlushState;
|
||||||
|
|
||||||
struct STsdb {
|
struct STsdb {
|
||||||
char *path;
|
char *path;
|
||||||
SVnode *pVnode;
|
SVnode *pVnode;
|
||||||
|
@ -366,6 +371,7 @@ struct STsdb {
|
||||||
SMemTable *imem;
|
SMemTable *imem;
|
||||||
STsdbFS fs;
|
STsdbFS fs;
|
||||||
SLRUCache *lruCache;
|
SLRUCache *lruCache;
|
||||||
|
SCacheFlushState flushState;
|
||||||
TdThreadMutex lruMutex;
|
TdThreadMutex lruMutex;
|
||||||
SLRUCache *biCache;
|
SLRUCache *biCache;
|
||||||
TdThreadMutex biMutex;
|
TdThreadMutex biMutex;
|
||||||
|
|
|
@ -151,7 +151,6 @@ int32_t metaCacheOpen(SMeta* pMeta) {
|
||||||
taosHashSetFreeFp(pCache->sTagFilterResCache.pTableEntry, freeCacheEntryFp);
|
taosHashSetFreeFp(pCache->sTagFilterResCache.pTableEntry, freeCacheEntryFp);
|
||||||
taosThreadMutexInit(&pCache->sTagFilterResCache.lock, NULL);
|
taosThreadMutexInit(&pCache->sTagFilterResCache.lock, NULL);
|
||||||
|
|
||||||
|
|
||||||
pCache->STbGroupResCache.pResCache = taosLRUCacheInit(5 * 1024 * 1024, -1, 0.5);
|
pCache->STbGroupResCache.pResCache = taosLRUCacheInit(5 * 1024 * 1024, -1, 0.5);
|
||||||
if (pCache->STbGroupResCache.pResCache == NULL) {
|
if (pCache->STbGroupResCache.pResCache == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -169,7 +168,6 @@ int32_t metaCacheOpen(SMeta* pMeta) {
|
||||||
taosHashSetFreeFp(pCache->STbGroupResCache.pTableEntry, freeCacheEntryFp);
|
taosHashSetFreeFp(pCache->STbGroupResCache.pTableEntry, freeCacheEntryFp);
|
||||||
taosThreadMutexInit(&pCache->STbGroupResCache.lock, NULL);
|
taosThreadMutexInit(&pCache->STbGroupResCache.lock, NULL);
|
||||||
|
|
||||||
|
|
||||||
pMeta->pCache = pCache;
|
pMeta->pCache = pCache;
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -541,7 +539,8 @@ int32_t metaGetCachedTableUidList(void* pVnode, tb_uid_t suid, const uint8_t* pK
|
||||||
|
|
||||||
uint32_t acc = pMeta->pCache->sTagFilterResCache.accTimes;
|
uint32_t acc = pMeta->pCache->sTagFilterResCache.accTimes;
|
||||||
if ((*pEntry)->hitTimes % 5000 == 0 && (*pEntry)->hitTimes > 0) {
|
if ((*pEntry)->hitTimes % 5000 == 0 && (*pEntry)->hitTimes > 0) {
|
||||||
metaInfo("vgId:%d cache hit:%d, total acc:%d, rate:%.2f", vgId, (*pEntry)->hitTimes, acc, ((double)(*pEntry)->hitTimes) / acc);
|
metaInfo("vgId:%d cache hit:%d, total acc:%d, rate:%.2f", vgId, (*pEntry)->hitTimes, acc,
|
||||||
|
((double)(*pEntry)->hitTimes) / acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosLRUCacheRelease(pCache, pHandle, false);
|
taosLRUCacheRelease(pCache, pHandle, false);
|
||||||
|
@ -551,7 +550,8 @@ int32_t metaGetCachedTableUidList(void* pVnode, tb_uid_t suid, const uint8_t* pK
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeUidCachePayload(const void* key, size_t keyLen, void* value) {
|
static void freeUidCachePayload(const void* key, size_t keyLen, void* value, void* ud) {
|
||||||
|
(void)ud;
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -659,7 +659,7 @@ int32_t metaUidFilterCachePut(void* pVnode, uint64_t suid, const void* pKey, int
|
||||||
|
|
||||||
// add to cache.
|
// add to cache.
|
||||||
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeUidCachePayload, NULL,
|
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeUidCachePayload, NULL,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
_end:
|
_end:
|
||||||
taosThreadMutexUnlock(pLock);
|
taosThreadMutexUnlock(pLock);
|
||||||
metaDebug("vgId:%d, suid:%" PRIu64 " list cache added into cache, total:%d, tables:%d", vgId, suid,
|
metaDebug("vgId:%d, suid:%" PRIu64 " list cache added into cache, total:%d, tables:%d", vgId, suid,
|
||||||
|
@ -738,7 +738,8 @@ int32_t metaGetCachedTbGroup(void* pVnode, tb_uid_t suid, const uint8_t* pKey, i
|
||||||
|
|
||||||
uint32_t acc = pMeta->pCache->STbGroupResCache.accTimes;
|
uint32_t acc = pMeta->pCache->STbGroupResCache.accTimes;
|
||||||
if ((*pEntry)->hitTimes % 5000 == 0 && (*pEntry)->hitTimes > 0) {
|
if ((*pEntry)->hitTimes % 5000 == 0 && (*pEntry)->hitTimes > 0) {
|
||||||
metaInfo("vgId:%d tb group cache hit:%d, total acc:%d, rate:%.2f", vgId, (*pEntry)->hitTimes, acc, ((double)(*pEntry)->hitTimes) / acc);
|
metaInfo("vgId:%d tb group cache hit:%d, total acc:%d, rate:%.2f", vgId, (*pEntry)->hitTimes, acc,
|
||||||
|
((double)(*pEntry)->hitTimes) / acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosLRUCacheRelease(pCache, pHandle, false);
|
taosLRUCacheRelease(pCache, pHandle, false);
|
||||||
|
@ -748,8 +749,8 @@ int32_t metaGetCachedTbGroup(void* pVnode, tb_uid_t suid, const uint8_t* pKey, i
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value, void* ud) {
|
||||||
static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value) {
|
(void)ud;
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -778,8 +779,8 @@ static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value)
|
||||||
taosMemoryFree(tmp);
|
taosMemoryFree(tmp);
|
||||||
|
|
||||||
double el = (taosGetTimestampUs() - st) / 1000.0;
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
metaDebug("clear one item in tb group cache, remain cached item:%d, elapsed time:%.2fms", listNEles(&((*pEntry)->list)),
|
metaDebug("clear one item in tb group cache, remain cached item:%d, elapsed time:%.2fms",
|
||||||
el);
|
listNEles(&((*pEntry)->list)), el);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -788,7 +789,6 @@ static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value)
|
||||||
taosArrayDestroy((SArray*)value);
|
taosArrayDestroy((SArray*)value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
int32_t payloadLen) {
|
int32_t payloadLen) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -836,7 +836,7 @@ int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void* pKey, int
|
||||||
|
|
||||||
// add to cache.
|
// add to cache.
|
||||||
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeTbGroupCachePayload, NULL,
|
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeTbGroupCachePayload, NULL,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
_end:
|
_end:
|
||||||
taosThreadMutexUnlock(pLock);
|
taosThreadMutexUnlock(pLock);
|
||||||
metaDebug("vgId:%d, suid:%" PRIu64 " tb group added into cache, total:%d, tables:%d", vgId, suid,
|
metaDebug("vgId:%d, suid:%" PRIu64 " tb group added into cache, total:%d, tables:%d", vgId, suid,
|
||||||
|
@ -880,5 +880,3 @@ int32_t metaTbGroupCacheClear(SMeta* pMeta, uint64_t suid) {
|
||||||
metaDebug("vgId:%d suid:%" PRId64 " cached related tb group cleared", vgId, suid);
|
metaDebug("vgId:%d suid:%" PRId64 " cached related tb group cleared", vgId, suid);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
*/
|
*/
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
|
#define ROCKS_BATCH_SIZE (4096)
|
||||||
|
|
||||||
static int32_t tsdbOpenBICache(STsdb *pTsdb) {
|
static int32_t tsdbOpenBICache(STsdb *pTsdb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SLRUCache *pCache = taosLRUCacheInit(10 * 1024 * 1024, 0, .5);
|
SLRUCache *pCache = taosLRUCacheInit(10 * 1024 * 1024, 0, .5);
|
||||||
|
@ -226,7 +228,7 @@ static void rocksMayWrite(STsdb *pTsdb, bool force, bool read, bool lock) {
|
||||||
wb = pTsdb->rCache.writebatch;
|
wb = pTsdb->rCache.writebatch;
|
||||||
}
|
}
|
||||||
int count = rocksdb_writebatch_count(wb);
|
int count = rocksdb_writebatch_count(wb);
|
||||||
if ((force && count > 0) || count >= 1024) {
|
if ((force && count > 0) || count >= ROCKS_BATCH_SIZE) {
|
||||||
char *err = NULL;
|
char *err = NULL;
|
||||||
rocksdb_write(pTsdb->rCache.db, pTsdb->rCache.writeoptions, wb, &err);
|
rocksdb_write(pTsdb->rCache.db, pTsdb->rCache.writeoptions, wb, &err);
|
||||||
if (NULL != err) {
|
if (NULL != err) {
|
||||||
|
@ -244,23 +246,7 @@ static void rocksMayWrite(STsdb *pTsdb, bool force, bool read, bool lock) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbCacheCommit(STsdb *pTsdb) {
|
static SLastCol *tsdbCacheDeserialize(char const *value) {
|
||||||
int32_t code = 0;
|
|
||||||
char *err = NULL;
|
|
||||||
|
|
||||||
rocksMayWrite(pTsdb, true, false, true);
|
|
||||||
rocksMayWrite(pTsdb, true, true, true);
|
|
||||||
rocksdb_flush(pTsdb->rCache.db, pTsdb->rCache.flushoptions, &err);
|
|
||||||
if (NULL != err) {
|
|
||||||
tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, err);
|
|
||||||
rocksdb_free(err);
|
|
||||||
code = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
SLastCol *tsdbCacheDeserialize(char const *value) {
|
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -278,7 +264,7 @@ SLastCol *tsdbCacheDeserialize(char const *value) {
|
||||||
return pLastCol;
|
return pLastCol;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) {
|
static void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) {
|
||||||
SColVal *pColVal = &pLastCol->colVal;
|
SColVal *pColVal = &pLastCol->colVal;
|
||||||
size_t length = sizeof(*pLastCol);
|
size_t length = sizeof(*pLastCol);
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
|
@ -300,6 +286,68 @@ void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) {
|
||||||
*size = length;
|
*size = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tsdbCacheFlushDirty(const void *key, size_t klen, void *value, void *ud) {
|
||||||
|
SLastCol *pLastCol = (SLastCol *)value;
|
||||||
|
|
||||||
|
if (pLastCol->dirty) {
|
||||||
|
SCacheFlushState *state = (SCacheFlushState *)ud;
|
||||||
|
STsdb *pTsdb = state->pTsdb;
|
||||||
|
SRocksCache *rCache = &pTsdb->rCache;
|
||||||
|
rocksdb_writebatch_t *wb = rCache->writebatch;
|
||||||
|
char *rocks_value = NULL;
|
||||||
|
size_t vlen = 0;
|
||||||
|
|
||||||
|
tsdbCacheSerialize(pLastCol, &rocks_value, &vlen);
|
||||||
|
rocksdb_writebatch_put(wb, (char *)key, klen, rocks_value, vlen);
|
||||||
|
|
||||||
|
taosMemoryFree(rocks_value);
|
||||||
|
|
||||||
|
if (++state->flush_count >= ROCKS_BATCH_SIZE) {
|
||||||
|
char *err = NULL;
|
||||||
|
rocksdb_write(rCache->db, rCache->writeoptions, wb, &err);
|
||||||
|
if (NULL != err) {
|
||||||
|
tsdbError("vgId:%d, %s failed at line %d, count: %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__,
|
||||||
|
state->flush_count, err);
|
||||||
|
rocksdb_free(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb_writebatch_clear(wb);
|
||||||
|
|
||||||
|
state->flush_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pLastCol->dirty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbCacheCommit(STsdb *pTsdb) {
|
||||||
|
int32_t code = 0;
|
||||||
|
char *err = NULL;
|
||||||
|
|
||||||
|
SLRUCache *pCache = pTsdb->lruCache;
|
||||||
|
rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch;
|
||||||
|
|
||||||
|
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
|
taosLRUCacheApply(pCache, tsdbCacheFlushDirty, wb);
|
||||||
|
|
||||||
|
rocksMayWrite(pTsdb, true, false, true);
|
||||||
|
rocksMayWrite(pTsdb, true, true, true);
|
||||||
|
rocksdb_flush(pTsdb->rCache.db, pTsdb->rCache.flushoptions, &err);
|
||||||
|
|
||||||
|
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
|
if (NULL != err) {
|
||||||
|
tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, err);
|
||||||
|
rocksdb_free(err);
|
||||||
|
code = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static SLastCol *tsdbCacheLookup(STsdb *pTsdb, tb_uid_t uid, int16_t cid, int8_t ltype) {
|
static SLastCol *tsdbCacheLookup(STsdb *pTsdb, tb_uid_t uid, int16_t cid, int8_t ltype) {
|
||||||
SLastCol *pLastCol = NULL;
|
SLastCol *pLastCol = NULL;
|
||||||
|
|
||||||
|
@ -329,20 +377,45 @@ static void reallocVarData(SColVal *pColVal) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tsdbCacheDeleter(const void *key, size_t keyLen, void *value) {
|
static void tsdbCacheDeleter(const void *key, size_t klen, void *value, void *ud) {
|
||||||
|
(void)key;
|
||||||
|
(void)klen;
|
||||||
SLastCol *pLastCol = (SLastCol *)value;
|
SLastCol *pLastCol = (SLastCol *)value;
|
||||||
|
|
||||||
// TODO: add dirty flag to SLastCol
|
|
||||||
if (pLastCol->dirty) {
|
if (pLastCol->dirty) {
|
||||||
// TODO: queue into dirty list, free it after save to backstore
|
SCacheFlushState *state = (SCacheFlushState *)ud;
|
||||||
} else {
|
STsdb *pTsdb = state->pTsdb;
|
||||||
|
SRocksCache *rCache = &pTsdb->rCache;
|
||||||
|
rocksdb_writebatch_t *wb = rCache->writebatch;
|
||||||
|
char *rocks_value = NULL;
|
||||||
|
size_t vlen = 0;
|
||||||
|
|
||||||
|
tsdbCacheSerialize(pLastCol, &rocks_value, &vlen);
|
||||||
|
rocksdb_writebatch_put(wb, (char *)key, klen, rocks_value, vlen);
|
||||||
|
|
||||||
|
taosMemoryFree(rocks_value);
|
||||||
|
|
||||||
|
if (++state->flush_count >= ROCKS_BATCH_SIZE) {
|
||||||
|
char *err = NULL;
|
||||||
|
rocksdb_write(rCache->db, rCache->writeoptions, wb, &err);
|
||||||
|
if (NULL != err) {
|
||||||
|
tsdbError("vgId:%d, %s failed at line %d, count: %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__,
|
||||||
|
state->flush_count, err);
|
||||||
|
rocksdb_free(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb_writebatch_clear(wb);
|
||||||
|
|
||||||
|
state->flush_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.type) /* && pLastCol->colVal.value.nData > 0*/) {
|
if (IS_VAR_DATA_TYPE(pLastCol->colVal.type) /* && pLastCol->colVal.value.nData > 0*/) {
|
||||||
taosMemoryFree(pLastCol->colVal.value.pData);
|
taosMemoryFree(pLastCol->colVal.value.pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(value);
|
taosMemoryFree(value);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int idx;
|
int idx;
|
||||||
|
@ -412,12 +485,15 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pLastCol->dirty = 1;
|
||||||
|
/*
|
||||||
char *value = NULL;
|
char *value = NULL;
|
||||||
size_t vlen = 0;
|
size_t vlen = 0;
|
||||||
tsdbCacheSerialize(pLastCol, &value, &vlen);
|
tsdbCacheSerialize(pLastCol, &value, &vlen);
|
||||||
// tsdbCacheSerialize(&(SLastCol){.ts = keyTs, .colVal = *pColVal}, &value, &vlen);
|
// tsdbCacheSerialize(&(SLastCol){.ts = keyTs, .colVal = *pColVal}, &value, &vlen);
|
||||||
rocksdb_writebatch_put(wb, (char *)key, klen, value, vlen);
|
rocksdb_writebatch_put(wb, (char *)key, klen, value, vlen);
|
||||||
taosMemoryFree(value);
|
taosMemoryFree(value);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
taosLRUCacheRelease(pCache, h, false);
|
taosLRUCacheRelease(pCache, h, false);
|
||||||
|
@ -454,11 +530,14 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pLastCol->dirty = 1;
|
||||||
|
/*
|
||||||
char *value = NULL;
|
char *value = NULL;
|
||||||
size_t vlen = 0;
|
size_t vlen = 0;
|
||||||
tsdbCacheSerialize(pLastCol, &value, &vlen);
|
tsdbCacheSerialize(pLastCol, &value, &vlen);
|
||||||
rocksdb_writebatch_put(wb, (char *)key, klen, value, vlen);
|
rocksdb_writebatch_put(wb, (char *)key, klen, value, vlen);
|
||||||
taosMemoryFree(value);
|
taosMemoryFree(value);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
taosLRUCacheRelease(pCache, h, false);
|
taosLRUCacheRelease(pCache, h, false);
|
||||||
|
@ -523,7 +602,7 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus status = taosLRUCacheInsert(pTsdb->lruCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge,
|
LRUStatus status = taosLRUCacheInsert(pTsdb->lruCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge,
|
||||||
tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW);
|
tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -551,7 +630,7 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus status = taosLRUCacheInsert(pTsdb->lruCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge,
|
LRUStatus status = taosLRUCacheInsert(pTsdb->lruCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge,
|
||||||
tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW);
|
tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -800,7 +879,7 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, NULL,
|
LRUStatus status = taosLRUCacheInsert(pCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, NULL,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -875,7 +954,7 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter,
|
LRUStatus status = taosLRUCacheInsert(pCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter,
|
||||||
NULL, TAOS_LRU_PRIORITY_LOW);
|
NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -994,7 +1073,7 @@ int32_t tsdbCacheGet(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCacheRowsR
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, &h,
|
LRUStatus status = taosLRUCacheInsert(pCache, key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, &h,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -1150,7 +1229,8 @@ static void getTableCacheKey(tb_uid_t uid, int cacheType, char *key, int *len) {
|
||||||
*len = sizeof(uint64_t);
|
*len = sizeof(uint64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deleteTableCacheLast(const void *key, size_t keyLen, void *value) {
|
static void deleteTableCacheLast(const void *key, size_t keyLen, void *value, void *ud) {
|
||||||
|
(void)ud;
|
||||||
SArray *pLastArray = (SArray *)value;
|
SArray *pLastArray = (SArray *)value;
|
||||||
int16_t nCol = taosArrayGetSize(pLastArray);
|
int16_t nCol = taosArrayGetSize(pLastArray);
|
||||||
for (int16_t iCol = 0; iCol < nCol; ++iCol) {
|
for (int16_t iCol = 0; iCol < nCol; ++iCol) {
|
||||||
|
@ -3234,7 +3314,8 @@ int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *
|
||||||
|
|
||||||
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
||||||
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW);
|
LRUStatus status =
|
||||||
|
taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -3274,7 +3355,7 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr,
|
||||||
size_t charge = pLastArray->capacity * pLastArray->elemSize + sizeof(*pLastArray);
|
size_t charge = pLastArray->capacity * pLastArray->elemSize + sizeof(*pLastArray);
|
||||||
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
||||||
LRUStatus status =
|
LRUStatus status =
|
||||||
taosLRUCacheInsert(pCache, key, keyLen, pLastArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW);
|
taosLRUCacheInsert(pCache, key, keyLen, pLastArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -3347,7 +3428,8 @@ static int32_t tsdbCacheLoadBlockIdx(SDataFReader *pFileReader, SArray **aBlockI
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deleteBICache(const void *key, size_t keyLen, void *value) {
|
static void deleteBICache(const void *key, size_t keyLen, void *value, void *ud) {
|
||||||
|
(void)ud;
|
||||||
SArray *pArray = (SArray *)value;
|
SArray *pArray = (SArray *)value;
|
||||||
|
|
||||||
taosArrayDestroy(pArray);
|
taosArrayDestroy(pArray);
|
||||||
|
@ -3378,7 +3460,8 @@ int32_t tsdbCacheGetBlockIdx(SLRUCache *pCache, SDataFReader *pFileReader, LRUHa
|
||||||
|
|
||||||
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
||||||
_taos_lru_deleter_t deleter = deleteBICache;
|
_taos_lru_deleter_t deleter = deleteBICache;
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW);
|
LRUStatus status =
|
||||||
|
taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,7 +466,12 @@ static STableCachedVal* createTableCacheVal(const SMetaReader* pMetaReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// const void *key, size_t keyLen, void *value
|
// const void *key, size_t keyLen, void *value
|
||||||
static void freeCachedMetaItem(const void* key, size_t keyLen, void* value) { freeTableCachedVal(value); }
|
static void freeCachedMetaItem(const void* key, size_t keyLen, void* value, void* ud) {
|
||||||
|
(void)key;
|
||||||
|
(void)keyLen;
|
||||||
|
(void)ud;
|
||||||
|
freeTableCachedVal(value);
|
||||||
|
}
|
||||||
|
|
||||||
static void doSetNullValue(SSDataBlock* pBlock, const SExprInfo* pExpr, int32_t numOfExpr) {
|
static void doSetNullValue(SSDataBlock* pBlock, const SExprInfo* pExpr, int32_t numOfExpr) {
|
||||||
for (int32_t j = 0; j < numOfExpr; ++j) {
|
for (int32_t j = 0; j < numOfExpr; ++j) {
|
||||||
|
@ -554,7 +559,7 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
|
||||||
freeReader = true;
|
freeReader = true;
|
||||||
|
|
||||||
int32_t ret = taosLRUCacheInsert(pCache->pTableMetaEntryCache, &pBlock->info.id.uid, sizeof(uint64_t), pVal,
|
int32_t ret = taosLRUCacheInsert(pCache->pTableMetaEntryCache, &pBlock->info.id.uid, sizeof(uint64_t), pVal,
|
||||||
sizeof(STableCachedVal), freeCachedMetaItem, NULL, TAOS_LRU_PRIORITY_LOW);
|
sizeof(STableCachedVal), freeCachedMetaItem, NULL, TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (ret != TAOS_LRU_STATUS_OK) {
|
if (ret != TAOS_LRU_STATUS_OK) {
|
||||||
qError("failed to put meta into lru cache, code:%d, %s", ret, idStr);
|
qError("failed to put meta into lru cache, code:%d, %s", ret, idStr);
|
||||||
freeTableCachedVal(pVal);
|
freeTableCachedVal(pVal);
|
||||||
|
|
|
@ -29,7 +29,10 @@ typedef struct {
|
||||||
char buf[0];
|
char buf[0];
|
||||||
} SDataBlock;
|
} SDataBlock;
|
||||||
|
|
||||||
static void deleteDataBlockFromLRU(const void* key, size_t keyLen, void* value) { taosMemoryFree(value); }
|
static void deleteDataBlockFromLRU(const void* key, size_t keyLen, void* value, void* ud) {
|
||||||
|
(void)ud;
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE void idxGenLRUKey(char* buf, const char* path, int32_t blockId) {
|
static FORCE_INLINE void idxGenLRUKey(char* buf, const char* path, int32_t blockId) {
|
||||||
char* p = buf;
|
char* p = buf;
|
||||||
|
@ -136,7 +139,7 @@ static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t of
|
||||||
memcpy(buf + total, blk->buf + blkOffset, nread);
|
memcpy(buf + total, blk->buf + blkOffset, nread);
|
||||||
|
|
||||||
LRUStatus s = taosLRUCacheInsert(ctx->lru, key, strlen(key), blk, cacheMemSize, deleteDataBlockFromLRU, NULL,
|
LRUStatus s = taosLRUCacheInsert(ctx->lru, key, strlen(key), blk, cacheMemSize, deleteDataBlockFromLRU, NULL,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (s != TAOS_LRU_STATUS_OK) {
|
if (s != TAOS_LRU_STATUS_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include "syncVoteMgr.h"
|
#include "syncVoteMgr.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "syncUtil.h"
|
|
||||||
|
|
||||||
static void syncNodeEqPingTimer(void* param, void* tmrId);
|
static void syncNodeEqPingTimer(void* param, void* tmrId);
|
||||||
static void syncNodeEqElectTimer(void* param, void* tmrId);
|
static void syncNodeEqElectTimer(void* param, void* tmrId);
|
||||||
|
@ -323,8 +322,8 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSyncNode->totalReplicaNum > 1) {
|
if (pSyncNode->totalReplicaNum > 1) {
|
||||||
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER && pSyncNode->state != TAOS_SYNC_STATE_FOLLOWER
|
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER && pSyncNode->state != TAOS_SYNC_STATE_FOLLOWER &&
|
||||||
&& pSyncNode->state != TAOS_SYNC_STATE_LEARNER) {
|
pSyncNode->state != TAOS_SYNC_STATE_LEARNER) {
|
||||||
sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 " candidate or unknown state, do not delete wal",
|
sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 " candidate or unknown state, do not delete wal",
|
||||||
lastApplyIndex);
|
lastApplyIndex);
|
||||||
syncNodeRelease(pSyncNode);
|
syncNodeRelease(pSyncNode);
|
||||||
|
@ -586,11 +585,9 @@ int32_t syncIsCatchUp(int64_t rid) {
|
||||||
pSyncNode->vgId, pSyncNode->pLogBuf->totalIndex, pSyncNode->pLogBuf->commitIndex,
|
pSyncNode->vgId, pSyncNode->pLogBuf->totalIndex, pSyncNode->pLogBuf->commitIndex,
|
||||||
pSyncNode->pLogBuf->matchIndex);
|
pSyncNode->pLogBuf->matchIndex);
|
||||||
isCatchUp = 0;
|
isCatchUp = 0;
|
||||||
}
|
} else {
|
||||||
else{
|
sInfo("vgId:%d, Catch up, totalIndex:%" PRId64 " commitIndex:%" PRId64 " matchIndex:%" PRId64, pSyncNode->vgId,
|
||||||
sInfo("vgId:%d, Catch up, totalIndex:%" PRId64 " commitIndex:%" PRId64 " matchIndex:%" PRId64,
|
pSyncNode->pLogBuf->totalIndex, pSyncNode->pLogBuf->commitIndex, pSyncNode->pLogBuf->matchIndex);
|
||||||
pSyncNode->vgId, pSyncNode->pLogBuf->totalIndex, pSyncNode->pLogBuf->commitIndex,
|
|
||||||
pSyncNode->pLogBuf->matchIndex);
|
|
||||||
isCatchUp = 1;
|
isCatchUp = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,8 +799,8 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
|
||||||
pSyncNode->vgId = pSyncInfo->vgId;
|
pSyncNode->vgId = pSyncInfo->vgId;
|
||||||
SSyncCfg* pCfg = &pSyncNode->raftCfg.cfg;
|
SSyncCfg* pCfg = &pSyncNode->raftCfg.cfg;
|
||||||
bool updated = false;
|
bool updated = false;
|
||||||
sInfo("vgId:%d, start to open sync node, totalReplicaNum:%d replicaNum:%d selfIndex:%d",
|
sInfo("vgId:%d, start to open sync node, totalReplicaNum:%d replicaNum:%d selfIndex:%d", pSyncNode->vgId,
|
||||||
pSyncNode->vgId, pCfg->totalReplicaNum, pCfg->replicaNum, pCfg->myIndex);
|
pCfg->totalReplicaNum, pCfg->replicaNum, pCfg->myIndex);
|
||||||
for (int32_t i = 0; i < pCfg->totalReplicaNum; ++i) {
|
for (int32_t i = 0; i < pCfg->totalReplicaNum; ++i) {
|
||||||
SNodeInfo* pNode = &pCfg->nodeInfo[i];
|
SNodeInfo* pNode = &pCfg->nodeInfo[i];
|
||||||
if (tmsgUpdateDnodeInfo(&pNode->nodeId, &pNode->clusterId, pNode->nodeFqdn, &pNode->nodePort)) {
|
if (tmsgUpdateDnodeInfo(&pNode->nodeId, &pNode->clusterId, pNode->nodeFqdn, &pNode->nodePort)) {
|
||||||
|
@ -1112,8 +1109,7 @@ int32_t syncNodeStart(SSyncNode* pSyncNode) {
|
||||||
// start raft
|
// start raft
|
||||||
if (pSyncNode->raftCfg.cfg.nodeInfo[pSyncNode->raftCfg.cfg.myIndex].nodeRole == TAOS_SYNC_ROLE_LEARNER) {
|
if (pSyncNode->raftCfg.cfg.nodeInfo[pSyncNode->raftCfg.cfg.myIndex].nodeRole == TAOS_SYNC_ROLE_LEARNER) {
|
||||||
syncNodeBecomeLearner(pSyncNode, "first start");
|
syncNodeBecomeLearner(pSyncNode, "first start");
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
if (pSyncNode->replicaNum == 1) {
|
if (pSyncNode->replicaNum == 1) {
|
||||||
raftStoreNextTerm(pSyncNode);
|
raftStoreNextTerm(pSyncNode);
|
||||||
syncNodeBecomeLeader(pSyncNode, "one replica start");
|
syncNodeBecomeLeader(pSyncNode, "one replica start");
|
||||||
|
@ -1476,9 +1472,8 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
|
||||||
|
|
||||||
// log begin config change
|
// log begin config change
|
||||||
sNInfo(pSyncNode, "begin do config change, from %d to %d, from %" PRId64 " to %" PRId64 ", replicas:%d",
|
sNInfo(pSyncNode, "begin do config change, from %d to %d, from %" PRId64 " to %" PRId64 ", replicas:%d",
|
||||||
pSyncNode->vgId,
|
pSyncNode->vgId, oldConfig.totalReplicaNum, pNewConfig->totalReplicaNum, oldConfig.lastIndex,
|
||||||
oldConfig.totalReplicaNum, pNewConfig->totalReplicaNum,
|
pNewConfig->lastIndex);
|
||||||
oldConfig.lastIndex, pNewConfig->lastIndex);
|
|
||||||
|
|
||||||
if (IamInNew) {
|
if (IamInNew) {
|
||||||
pSyncNode->raftCfg.isStandBy = 0; // change isStandBy to normal
|
pSyncNode->raftCfg.isStandBy = 0; // change isStandBy to normal
|
||||||
|
@ -2234,7 +2229,10 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
|
||||||
syncNodeRelease(pSyncNode);
|
syncNodeRelease(pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deleteCacheEntry(const void* key, size_t keyLen, void* value) { taosMemoryFree(value); }
|
static void deleteCacheEntry(const void* key, size_t keyLen, void* value, void* ud) {
|
||||||
|
(void)ud;
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHandle** h) {
|
int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHandle** h) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
@ -2243,7 +2241,7 @@ int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHand
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t entryLen = sizeof(*pEntry) + pEntry->dataLen;
|
int32_t entryLen = sizeof(*pEntry) + pEntry->dataLen;
|
||||||
LRUStatus status = taosLRUCacheInsert(pLogStore->pCache, &pEntry->index, sizeof(pEntry->index), pEntry, entryLen,
|
LRUStatus status = taosLRUCacheInsert(pLogStore->pCache, &pEntry->index, sizeof(pEntry->index), pEntry, entryLen,
|
||||||
deleteCacheEntry, h, TAOS_LRU_PRIORITY_LOW);
|
deleteCacheEntry, h, TAOS_LRU_PRIORITY_LOW, NULL);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -2409,9 +2407,8 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
pMsgReply->startTime = ths->startTime;
|
pMsgReply->startTime = ths->startTime;
|
||||||
pMsgReply->timeStamp = tsMs;
|
pMsgReply->timeStamp = tsMs;
|
||||||
|
|
||||||
sTrace(
|
sTrace("vgId:%d, heartbeat msg from dnode:%d, cluster:%d, Msgterm:%" PRId64 " currentTerm:%" PRId64, ths->vgId,
|
||||||
"vgId:%d, heartbeat msg from dnode:%d, cluster:%d, Msgterm:%" PRId64 " currentTerm:%" PRId64,
|
DID(&(pMsg->srcId)), CID(&(pMsg->srcId)), pMsg->term, currentTerm);
|
||||||
ths->vgId, DID(&(pMsg->srcId)), CID(&(pMsg->srcId)), pMsg->term, currentTerm);
|
|
||||||
|
|
||||||
if (pMsg->term > currentTerm && ths->state == TAOS_SYNC_STATE_LEARNER) {
|
if (pMsg->term > currentTerm && ths->state == TAOS_SYNC_STATE_LEARNER) {
|
||||||
raftStoreSetTerm(ths, pMsg->term);
|
raftStoreSetTerm(ths, pMsg->term);
|
||||||
|
|
|
@ -39,6 +39,7 @@ enum {
|
||||||
struct SLRUEntry {
|
struct SLRUEntry {
|
||||||
void *value;
|
void *value;
|
||||||
_taos_lru_deleter_t deleter;
|
_taos_lru_deleter_t deleter;
|
||||||
|
void *ud;
|
||||||
SLRUEntry *nextHash;
|
SLRUEntry *nextHash;
|
||||||
SLRUEntry *next;
|
SLRUEntry *next;
|
||||||
SLRUEntry *prev;
|
SLRUEntry *prev;
|
||||||
|
@ -94,7 +95,7 @@ static void taosLRUEntryFree(SLRUEntry *entry) {
|
||||||
ASSERT(entry->refs == 0);
|
ASSERT(entry->refs == 0);
|
||||||
|
|
||||||
if (entry->deleter) {
|
if (entry->deleter) {
|
||||||
(*entry->deleter)(entry->keyData, entry->keyLength, entry->value);
|
(*entry->deleter)(entry->keyData, entry->keyLength, entry->value, entry->ud);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(entry);
|
taosMemoryFree(entry);
|
||||||
|
@ -146,6 +147,25 @@ static void taosLRUEntryTableCleanup(SLRUEntryTable *table) {
|
||||||
taosMemoryFree(table->list);
|
taosMemoryFree(table->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int taosLRUEntryTableApplyF(SLRUEntryTable *table, _taos_lru_functor_t functor, void *ud) {
|
||||||
|
int ret = 0;
|
||||||
|
uint32_t end = 1 << table->lengthBits;
|
||||||
|
for (uint32_t i = 0; i < end; ++i) {
|
||||||
|
SLRUEntry *h = table->list[i];
|
||||||
|
while (h) {
|
||||||
|
SLRUEntry *n = h->nextHash;
|
||||||
|
ASSERT(TAOS_LRU_ENTRY_IN_CACHE(h));
|
||||||
|
ret = functor(h->keyData, h->keyLength, h->value, ud);
|
||||||
|
if (!ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
h = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static SLRUEntry **taosLRUEntryTableFindPtr(SLRUEntryTable *table, const void *key, size_t keyLen, uint32_t hash) {
|
static SLRUEntry **taosLRUEntryTableFindPtr(SLRUEntryTable *table, const void *key, size_t keyLen, uint32_t hash) {
|
||||||
SLRUEntry **entry = &table->list[hash >> (32 - table->lengthBits)];
|
SLRUEntry **entry = &table->list[hash >> (32 - table->lengthBits)];
|
||||||
while (*entry && ((*entry)->hash != hash || memcmp(key, (*entry)->keyData, keyLen) != 0)) {
|
while (*entry && ((*entry)->hash != hash || memcmp(key, (*entry)->keyData, keyLen) != 0)) {
|
||||||
|
@ -424,7 +444,7 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
|
||||||
|
|
||||||
static LRUStatus taosLRUCacheShardInsert(SLRUCacheShard *shard, const void *key, size_t keyLen, uint32_t hash,
|
static LRUStatus taosLRUCacheShardInsert(SLRUCacheShard *shard, const void *key, size_t keyLen, uint32_t hash,
|
||||||
void *value, size_t charge, _taos_lru_deleter_t deleter, LRUHandle **handle,
|
void *value, size_t charge, _taos_lru_deleter_t deleter, LRUHandle **handle,
|
||||||
LRUPriority priority) {
|
LRUPriority priority, void *ud) {
|
||||||
SLRUEntry *e = taosMemoryCalloc(1, sizeof(SLRUEntry) - 1 + keyLen);
|
SLRUEntry *e = taosMemoryCalloc(1, sizeof(SLRUEntry) - 1 + keyLen);
|
||||||
if (!e) {
|
if (!e) {
|
||||||
return TAOS_LRU_STATUS_FAIL;
|
return TAOS_LRU_STATUS_FAIL;
|
||||||
|
@ -433,6 +453,7 @@ static LRUStatus taosLRUCacheShardInsert(SLRUCacheShard *shard, const void *key,
|
||||||
e->value = value;
|
e->value = value;
|
||||||
e->flags = 0;
|
e->flags = 0;
|
||||||
e->deleter = deleter;
|
e->deleter = deleter;
|
||||||
|
e->ud = ud;
|
||||||
e->keyLength = keyLen;
|
e->keyLength = keyLen;
|
||||||
e->hash = hash;
|
e->hash = hash;
|
||||||
e->refs = 0;
|
e->refs = 0;
|
||||||
|
@ -490,6 +511,18 @@ static void taosLRUCacheShardErase(SLRUCacheShard *shard, const void *key, size_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int taosLRUCacheShardApply(SLRUCacheShard *shard, _taos_lru_functor_t functor, void *ud) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
taosThreadMutexLock(&shard->mutex);
|
||||||
|
|
||||||
|
ret = taosLRUEntryTableApplyF(&shard->table, functor, ud);
|
||||||
|
|
||||||
|
taosThreadMutexUnlock(&shard->mutex);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
|
static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
|
||||||
SArray *lastReferenceList = taosArrayInit(16, POINTER_BYTES);
|
SArray *lastReferenceList = taosArrayInit(16, POINTER_BYTES);
|
||||||
|
|
||||||
|
@ -700,12 +733,12 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUStatus taosLRUCacheInsert(SLRUCache *cache, const void *key, size_t keyLen, void *value, size_t charge,
|
LRUStatus taosLRUCacheInsert(SLRUCache *cache, const void *key, size_t keyLen, void *value, size_t charge,
|
||||||
_taos_lru_deleter_t deleter, LRUHandle **handle, LRUPriority priority) {
|
_taos_lru_deleter_t deleter, LRUHandle **handle, LRUPriority priority, void *ud) {
|
||||||
uint32_t hash = TAOS_LRU_CACHE_SHARD_HASH32(key, keyLen);
|
uint32_t hash = TAOS_LRU_CACHE_SHARD_HASH32(key, keyLen);
|
||||||
uint32_t shardIndex = hash & cache->shardedCache.shardMask;
|
uint32_t shardIndex = hash & cache->shardedCache.shardMask;
|
||||||
|
|
||||||
return taosLRUCacheShardInsert(&cache->shards[shardIndex], key, keyLen, hash, value, charge, deleter, handle,
|
return taosLRUCacheShardInsert(&cache->shards[shardIndex], key, keyLen, hash, value, charge, deleter, handle,
|
||||||
priority);
|
priority, ud);
|
||||||
}
|
}
|
||||||
|
|
||||||
LRUHandle *taosLRUCacheLookup(SLRUCache *cache, const void *key, size_t keyLen) {
|
LRUHandle *taosLRUCacheLookup(SLRUCache *cache, const void *key, size_t keyLen) {
|
||||||
|
@ -722,6 +755,15 @@ void taosLRUCacheErase(SLRUCache *cache, const void *key, size_t keyLen) {
|
||||||
return taosLRUCacheShardErase(&cache->shards[shardIndex], key, keyLen, hash);
|
return taosLRUCacheShardErase(&cache->shards[shardIndex], key, keyLen, hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void taosLRUCacheApply(SLRUCache *cache, _taos_lru_functor_t functor, void *ud) {
|
||||||
|
int numShards = cache->numShards;
|
||||||
|
for (int i = 0; i < numShards; ++i) {
|
||||||
|
if (0 != taosLRUCacheShardApply(&cache->shards[i], functor, ud)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void taosLRUCacheEraseUnrefEntries(SLRUCache *cache) {
|
void taosLRUCacheEraseUnrefEntries(SLRUCache *cache) {
|
||||||
int numShards = cache->numShards;
|
int numShards = cache->numShards;
|
||||||
for (int i = 0; i < numShards; ++i) {
|
for (int i = 0; i < numShards; ++i) {
|
||||||
|
|
Loading…
Reference in New Issue