From d731fc0dbf3dd487a7dec16e3a733dbb687e9629 Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Mon, 18 Nov 2019 21:36:53 +0800 Subject: [PATCH] fix #742 --- src/system/detail/src/vnodeImport.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/system/detail/src/vnodeImport.c b/src/system/detail/src/vnodeImport.c index 260d531200..0d3cd2b338 100644 --- a/src/system/detail/src/vnodeImport.c +++ b/src/system/detail/src/vnodeImport.c @@ -479,7 +479,7 @@ int vnodeImportToFile(SImportInfo *pImport) { slot = (slot + 1 + pInfo->maxBlocks) % pInfo->maxBlocks; } - // last slot, the uncommitted slots shall be shifted + // last slot, the uncommitted slots shall be shifted, a cache block may have empty rows SCacheBlock *pCacheBlock = pInfo->cacheBlocks[slot]; int points = pCacheBlock->numOfPoints - pInfo->commitPoint; if (points > 0) { @@ -568,7 +568,7 @@ int vnodeImportToCache(SImportInfo *pImport, char *payload, int rows) { } } - // copy the overwritten data into buffer + // copy the overwritten data into buffer, merge cache blocks tpoints = rows; pos = pImport->pos; slot = pImport->slot; @@ -603,6 +603,19 @@ int vnodeImportToCache(SImportInfo *pImport, char *payload, int rows) { pos = 0; tpoints -= points; + if (tpoints == 0) { + // free the rest of cache blocks, since cache blocks are merged + int currentSlot = slot; + while (slot != pInfo->currentSlot) { + slot = (slot + 1) % pInfo->maxBlocks; + pCacheBlock = pInfo->cacheBlocks[slot]; + vnodeFreeCacheBlock(pCacheBlock); + } + + pInfo->currentSlot = currentSlot; + slot = currentSlot; // make sure to exit from the while loop + } + if (slot == pInfo->currentSlot) break; slot = (slot + 1) % pInfo->maxBlocks; } -- GitLab