------------------------------------------------------ merge() returns a new segmentStack, merging all the segments that are at the given newTopLevel and higher.
(mergeAll bool, base *segmentStack)
| 40 | // merge() returns a new segmentStack, merging all the segments that |
| 41 | // are at the given newTopLevel and higher. |
| 42 | func (ss *segmentStack) merge(mergeAll bool, base *segmentStack) ( |
| 43 | *segmentStack, uint64, error) { |
| 44 | newTopLevel := 0 |
| 45 | var numFullMerges uint64 |
| 46 | if !mergeAll { |
| 47 | // If we have not been asked to merge all segments, |
| 48 | // then heuristically calc a newTopLevel. |
| 49 | newTopLevel = ss.calcTargetTopLevel() |
| 50 | } |
| 51 | if newTopLevel <= 0 { |
| 52 | numFullMerges++ |
| 53 | } |
| 54 | |
| 55 | // ---------------------------------------------------- |
| 56 | // First, rough estimate the bytes neeeded. |
| 57 | |
| 58 | var totOps int |
| 59 | var totKeyBytes, totValBytes uint64 |
| 60 | for i := newTopLevel; i < len(ss.a); i++ { |
| 61 | totOps += ss.a[i].Len() |
| 62 | nk, nv := ss.a[i].NumKeyValBytes() |
| 63 | totKeyBytes += nk |
| 64 | totValBytes += nv |
| 65 | } |
| 66 | |
| 67 | // ---------------------------------------------------- |
| 68 | // Next, use an iterator for the actual merge. |
| 69 | |
| 70 | mergedSegment, err := newSegment(totOps, int(totKeyBytes+totValBytes)) |
| 71 | if err != nil { |
| 72 | return nil, 0, err |
| 73 | } |
| 74 | |
| 75 | err = ss.mergeInto(newTopLevel, len(ss.a), mergedSegment, base, true, |
| 76 | true, nil) |
| 77 | if err != nil { |
| 78 | return nil, 0, err |
| 79 | } |
| 80 | |
| 81 | a := make([]Segment, 0, newTopLevel+1) |
| 82 | a = append(a, ss.a[0:newTopLevel]...) |
| 83 | a = append(a, mergedSegment) |
| 84 | |
| 85 | rv := &segmentStack{ |
| 86 | options: ss.options, |
| 87 | stats: ss.stats, |
| 88 | a: a, |
| 89 | refs: 1, |
| 90 | lowerLevelSnapshot: ss.lowerLevelSnapshot.addRef(), |
| 91 | incarNum: ss.incarNum, |
| 92 | } |
| 93 | |
| 94 | // --------------------------------------------------- |
| 95 | // Recursively merge all the child segmentStacks with the base |
| 96 | // stack, dropping any deleted collections present in base but not |
| 97 | // in me. |
| 98 | |
| 99 | for cName, childSegStack := range ss.childSegStacks { |
no test coverage detected