Merge pull request #19419 from taosdata/fix/TD-21784
fix: fix no available disk error
This commit is contained in:
commit
cdd3c67c69
|
@ -73,10 +73,10 @@ void tMemBucketDestroy(tMemBucket *pBucket);
|
||||||
|
|
||||||
int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size);
|
int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size);
|
||||||
|
|
||||||
double getPercentile(tMemBucket *pMemBucket, double percent);
|
int32_t getPercentile(tMemBucket *pMemBucket, double percent, double *result);
|
||||||
|
|
||||||
#endif // TDENGINE_TPERCENTILE_H
|
#endif // TDENGINE_TPERCENTILE_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1670,15 +1670,14 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
|
|
||||||
tMemBucket* pMemBucket = ppInfo->pMemBucket;
|
tMemBucket* pMemBucket = ppInfo->pMemBucket;
|
||||||
if (pMemBucket != NULL && pMemBucket->total > 0) { // check for null
|
if (pMemBucket != NULL && pMemBucket->total > 0) { // check for null
|
||||||
SET_DOUBLE_VAL(&ppInfo->result, getPercentile(pMemBucket, v));
|
int32_t code = getPercentile(pMemBucket, v, &ppInfo->result);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tMemBucketDestroy(pMemBucket);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tMemBucketDestroy(pMemBucket);
|
tMemBucketDestroy(pMemBucket);
|
||||||
|
|
||||||
if (ppInfo->result < 0) {
|
|
||||||
return TSDB_CODE_NO_AVAIL_DISK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return functionFinalize(pCtx, pBlock);
|
return functionFinalize(pCtx, pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ static void resetPosInfo(SSlotInfo *pInfo) {
|
||||||
pInfo->data = NULL;
|
pInfo->data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
double findOnlyResult(tMemBucket *pMemBucket) {
|
int32_t findOnlyResult(tMemBucket *pMemBucket, double *result) {
|
||||||
ASSERT(pMemBucket->total == 1);
|
ASSERT(pMemBucket->total == 1);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pMemBucket->numOfSlots; ++i) {
|
for (int32_t i = 0; i < pMemBucket->numOfSlots; ++i) {
|
||||||
|
@ -115,17 +115,17 @@ double findOnlyResult(tMemBucket *pMemBucket) {
|
||||||
int32_t *pageId = taosArrayGet(list, 0);
|
int32_t *pageId = taosArrayGet(list, 0);
|
||||||
SFilePage *pPage = getBufPage(pMemBucket->pBuffer, *pageId);
|
SFilePage *pPage = getBufPage(pMemBucket->pBuffer, *pageId);
|
||||||
if (pPage == NULL) {
|
if (pPage == NULL) {
|
||||||
return -1;
|
return TSDB_CODE_NO_AVAIL_DISK;
|
||||||
}
|
}
|
||||||
ASSERT(pPage->num == 1);
|
ASSERT(pPage->num == 1);
|
||||||
|
|
||||||
double v = 0;
|
GET_TYPED_DATA(*result, double, pMemBucket->type, pPage->data);
|
||||||
GET_TYPED_DATA(v, double, pMemBucket->type, pPage->data);
|
return TSDB_CODE_SUCCESS;
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
*result = 0.0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) {
|
int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) {
|
||||||
|
@ -447,7 +447,7 @@ static double getIdenticalDataVal(tMemBucket *pMemBucket, int32_t slotIndex) {
|
||||||
return finalResult;
|
return finalResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
double getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction) {
|
int32_t getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction, double *result) {
|
||||||
int32_t num = 0;
|
int32_t num = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pMemBucket->numOfSlots; ++i) {
|
for (int32_t i = 0; i < pMemBucket->numOfSlots; ++i) {
|
||||||
|
@ -480,15 +480,15 @@ double getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction)
|
||||||
|
|
||||||
ASSERT(minOfNextSlot > maxOfThisSlot);
|
ASSERT(minOfNextSlot > maxOfThisSlot);
|
||||||
|
|
||||||
double val = (1 - fraction) * maxOfThisSlot + fraction * minOfNextSlot;
|
*result = (1 - fraction) * maxOfThisSlot + fraction * minOfNextSlot;
|
||||||
return val;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSlot->info.size <= pMemBucket->maxCapacity) {
|
if (pSlot->info.size <= pMemBucket->maxCapacity) {
|
||||||
// data in buffer and file are merged together to be processed.
|
// data in buffer and file are merged together to be processed.
|
||||||
SFilePage *buffer = loadDataFromFilePage(pMemBucket, i);
|
SFilePage *buffer = loadDataFromFilePage(pMemBucket, i);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
return -1;
|
return TSDB_CODE_NO_AVAIL_DISK;
|
||||||
}
|
}
|
||||||
int32_t currentIdx = count - num;
|
int32_t currentIdx = count - num;
|
||||||
|
|
||||||
|
@ -499,13 +499,14 @@ double getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction)
|
||||||
GET_TYPED_DATA(td, double, pMemBucket->type, thisVal);
|
GET_TYPED_DATA(td, double, pMemBucket->type, thisVal);
|
||||||
GET_TYPED_DATA(nd, double, pMemBucket->type, nextVal);
|
GET_TYPED_DATA(nd, double, pMemBucket->type, nextVal);
|
||||||
|
|
||||||
double val = (1 - fraction) * td + fraction * nd;
|
*result = (1 - fraction) * td + fraction * nd;
|
||||||
taosMemoryFreeClear(buffer);
|
taosMemoryFreeClear(buffer);
|
||||||
|
|
||||||
return val;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else { // incur a second round bucket split
|
} else { // incur a second round bucket split
|
||||||
if (isIdenticalData(pMemBucket, i)) {
|
if (isIdenticalData(pMemBucket, i)) {
|
||||||
return getIdenticalDataVal(pMemBucket, i);
|
*result = getIdenticalDataVal(pMemBucket, i);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// try next round
|
// try next round
|
||||||
|
@ -534,37 +535,37 @@ double getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction)
|
||||||
int32_t *pageId = taosArrayGet(list, f);
|
int32_t *pageId = taosArrayGet(list, f);
|
||||||
SFilePage *pg = getBufPage(pMemBucket->pBuffer, *pageId);
|
SFilePage *pg = getBufPage(pMemBucket->pBuffer, *pageId);
|
||||||
if (pg == NULL) {
|
if (pg == NULL) {
|
||||||
return -1;
|
return TSDB_CODE_NO_AVAIL_DISK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = tMemBucketPut(pMemBucket, pg->data, (int32_t)pg->num);
|
int32_t code = tMemBucketPut(pMemBucket, pg->data, (int32_t)pg->num);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return -1;
|
return code;
|
||||||
}
|
}
|
||||||
setBufPageDirty(pg, true);
|
setBufPageDirty(pg, true);
|
||||||
releaseBufPage(pMemBucket->pBuffer, pg);
|
releaseBufPage(pMemBucket->pBuffer, pg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getPercentileImpl(pMemBucket, count - num, fraction);
|
return getPercentileImpl(pMemBucket, count - num, fraction, result);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
num += pSlot->info.size;
|
num += pSlot->info.size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
*result = 0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
double getPercentile(tMemBucket *pMemBucket, double percent) {
|
int32_t getPercentile(tMemBucket *pMemBucket, double percent, double *result) {
|
||||||
if (pMemBucket->total == 0) {
|
if (pMemBucket->total == 0) {
|
||||||
return 0.0;
|
*result = 0.0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if only one elements exists, return it
|
// if only one elements exists, return it
|
||||||
if (pMemBucket->total == 1) {
|
if (pMemBucket->total == 1) {
|
||||||
if (findOnlyResult(pMemBucket) < 0) {
|
return findOnlyResult(pMemBucket, result);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
percent = fabs(percent);
|
percent = fabs(percent);
|
||||||
|
@ -574,21 +575,21 @@ double getPercentile(tMemBucket *pMemBucket, double percent) {
|
||||||
MinMaxEntry *pRange = &pMemBucket->range;
|
MinMaxEntry *pRange = &pMemBucket->range;
|
||||||
|
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pMemBucket->type)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pMemBucket->type)) {
|
||||||
double v = (double)(fabs(percent - 100) < DBL_EPSILON ? pRange->i64MaxVal : pRange->i64MinVal);
|
*result = (double)(fabs(percent - 100) < DBL_EPSILON ? pRange->i64MaxVal : pRange->i64MinVal);
|
||||||
return v;
|
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pMemBucket->type)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pMemBucket->type)) {
|
||||||
double v = (double)(fabs(percent - 100) < DBL_EPSILON ? pRange->u64MaxVal : pRange->u64MinVal);
|
*result = (double)(fabs(percent - 100) < DBL_EPSILON ? pRange->u64MaxVal : pRange->u64MinVal);
|
||||||
return v;
|
|
||||||
} else {
|
} else {
|
||||||
return fabs(percent - 100) < DBL_EPSILON ? pRange->dMaxVal : pRange->dMinVal;
|
*result = fabs(percent - 100) < DBL_EPSILON ? pRange->dMaxVal : pRange->dMinVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
double percentVal = (percent * (pMemBucket->total - 1)) / ((double)100.0);
|
double percentVal = (percent * (pMemBucket->total - 1)) / ((double)100.0);
|
||||||
|
|
||||||
// do put data by using buckets
|
// do put data by using buckets
|
||||||
int32_t orderIdx = (int32_t)percentVal;
|
int32_t orderIdx = (int32_t)percentVal;
|
||||||
return getPercentileImpl(pMemBucket, orderIdx, percentVal - orderIdx);
|
return getPercentileImpl(pMemBucket, orderIdx, percentVal - orderIdx, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue