From 2d3f09b6d9abae2489843aa5612bae6141e101bb Mon Sep 17 00:00:00 2001 From: faceair Date: Sat, 16 Sep 2023 01:04:54 +0800 Subject: [PATCH] lib/storage: remove ForceMergeAllParts internal loop (#4999) Signed-off-by: faceair --- lib/storage/partition.go | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/lib/storage/partition.go b/lib/storage/partition.go index 37b5e64fa..e30c35173 100644 --- a/lib/storage/partition.go +++ b/lib/storage/partition.go @@ -945,29 +945,25 @@ func (pt *partition) ForceMergeAllParts() error { // Nothing to merge. return nil } - for { - // Check whether there is enough disk space for merging pws. - newPartSize := getPartsSize(pws) - maxOutBytes := fs.MustGetFreeSpace(pt.bigPartsPath) - if newPartSize > maxOutBytes { - freeSpaceNeededBytes := newPartSize - maxOutBytes - forceMergeLogger.Warnf("cannot initiate force merge for the partition %s; additional space needed: %d bytes", pt.name, freeSpaceNeededBytes) - pt.releasePartsToMerge(pws) - return nil - } - // If len(pws) == 1, then the merge must run anyway. - // This allows applying the configured retention, removing the deleted series - // and performing de-duplication if needed. - if err := pt.mergePartsOptimal(pws, pt.stopCh); err != nil { - return fmt.Errorf("cannot force merge %d parts from partition %q: %w", len(pws), pt.name, err) - } - pws = pt.getAllPartsForMerge() - if len(pws) <= 1 { - pt.releasePartsToMerge(pws) - return nil - } + // Check whether there is enough disk space for merging pws. + newPartSize := getPartsSize(pws) + maxOutBytes := fs.MustGetFreeSpace(pt.bigPartsPath) + if newPartSize > maxOutBytes { + freeSpaceNeededBytes := newPartSize - maxOutBytes + forceMergeLogger.Warnf("cannot initiate force merge for the partition %s; additional space needed: %d bytes", pt.name, freeSpaceNeededBytes) + pt.releasePartsToMerge(pws) + return nil } + + // If len(pws) == 1, then the merge must run anyway. + // This allows applying the configured retention, removing the deleted series + // and performing de-duplication if needed. + if err := pt.mergePartsOptimal(pws, pt.stopCh); err != nil { + return fmt.Errorf("cannot force merge %d parts from partition %q: %w", len(pws), pt.name, err) + } + + return nil } var forceMergeLogger = logger.WithThrottler("forceMerge", time.Minute)