fix:[TD-32592] fix bug when percentile split bucket.

This commit is contained in:
Jing Sima 2024-10-16 23:35:53 +08:00
parent 6a2b38faca
commit 15c13cc853
1 changed files with 21 additions and 18 deletions

View File

@ -224,19 +224,18 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value, int32_t *index
*index = -1; *index = -1;
if (v > pBucket->range.dMaxVal || v < pBucket->range.dMinVal) { if (v > pBucket->range.dMaxVal || v < pBucket->range.dMinVal || isnan(v)) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
// divide a range of [dMinVal, dMaxVal] into 1024 buckets // divide a range of [dMinVal, dMaxVal] into 1024 buckets
double span = pBucket->range.dMaxVal - pBucket->range.dMinVal; double span = pBucket->range.dMaxVal - pBucket->range.dMinVal;
if (span < pBucket->numOfSlots) { if (fabs(span) < DBL_EPSILON) {
int32_t delta = (int32_t)(v - pBucket->range.dMinVal); *index = 0;
*index = (delta % pBucket->numOfSlots);
} else { } else {
double slotSpan = span / pBucket->numOfSlots; double slotSpan = span / pBucket->numOfSlots;
*index = (int32_t)((v - pBucket->range.dMinVal) / slotSpan); *index = (int32_t)((v - pBucket->range.dMinVal) / slotSpan);
if (v == pBucket->range.dMaxVal) { if (fabs(v - pBucket->range.dMaxVal) < DBL_EPSILON) {
*index -= 1; *index -= 1;
} }
} }
@ -583,48 +582,52 @@ int32_t getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction
*result = getIdenticalDataVal(pMemBucket, i); *result = getIdenticalDataVal(pMemBucket, i);
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
// try next round // try next round
pMemBucket->times += 1; tMemBucket *tmpBucket = NULL;
// qDebug("MemBucket:%p, start next round data bucketing, time:%d", pMemBucket, pMemBucket->times); int32_t code = tMemBucketCreate(pMemBucket->bytes, pMemBucket->type, pSlot->range.dMinVal, pSlot->range.dMaxVal,
false, &tmpBucket);
pMemBucket->range = pSlot->range; if (TSDB_CODE_SUCCESS != code) {
pMemBucket->total = 0; tMemBucketDestroy(&tmpBucket);
return code;
resetSlotInfo(pMemBucket); }
int32_t groupId = getGroupId(pMemBucket->numOfSlots, i, pMemBucket->times);
int32_t groupId = getGroupId(pMemBucket->numOfSlots, i, pMemBucket->times - 1);
SArray* list; SArray* list;
void *p = taosHashGet(pMemBucket->groupPagesMap, &groupId, sizeof(groupId)); void *p = taosHashGet(pMemBucket->groupPagesMap, &groupId, sizeof(groupId));
if (p != NULL) { if (p != NULL) {
list = *(SArray **)p; list = *(SArray **)p;
if (list == NULL || list->size <= 0) { if (list == NULL || list->size <= 0) {
tMemBucketDestroy(&tmpBucket);
return -1; return -1;
} }
} else { } else {
tMemBucketDestroy(&tmpBucket);
return -1; return -1;
} }
for (int32_t f = 0; f < list->size; ++f) { for (int32_t f = 0; f < list->size; ++f) {
int32_t *pageId = taosArrayGet(list, f); int32_t *pageId = taosArrayGet(list, f);
if (NULL == pageId) { if (NULL == pageId) {
tMemBucketDestroy(&tmpBucket);
return TSDB_CODE_OUT_OF_RANGE; return TSDB_CODE_OUT_OF_RANGE;
} }
SFilePage *pg = getBufPage(pMemBucket->pBuffer, *pageId); SFilePage *pg = getBufPage(pMemBucket->pBuffer, *pageId);
if (pg == NULL) { if (pg == NULL) {
tMemBucketDestroy(&tmpBucket);
return terrno; return terrno;
} }
int32_t code = tMemBucketPut(pMemBucket, pg->data, (int32_t)pg->num); code = tMemBucketPut(tmpBucket, pg->data, (int32_t)pg->num);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
tMemBucketDestroy(&tmpBucket);
return code; return code;
} }
setBufPageDirty(pg, true); setBufPageDirty(pg, true);
releaseBufPage(pMemBucket->pBuffer, pg); releaseBufPage(pMemBucket->pBuffer, pg);
} }
code = getPercentileImpl(tmpBucket, count - num, fraction, result);
return getPercentileImpl(pMemBucket, count - num, fraction, result); tMemBucketDestroy(&tmpBucket);
return code;
} }
} else { } else {
num += pSlot->info.size; num += pSlot->info.size;