MCPcopy Create free account
hub / github.com/couchbase/moss / merge

Method merge

segment_stack_merge.go:42–133  ·  view source on GitHub ↗

------------------------------------------------------ merge() returns a new segmentStack, merging all the segments that are at the given newTopLevel and higher.

(mergeAll bool, base *segmentStack)

Source from the content-addressed store, hash-verified

40// merge() returns a new segmentStack, merging all the segments that
41// are at the given newTopLevel and higher.
42func (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 {

Callers 1

mergerMainMethod · 0.80

Calls 7

calcTargetTopLevelMethod · 0.95
mergeIntoMethod · 0.95
CloseMethod · 0.95
newSegmentFunction · 0.85
LenMethod · 0.65
NumKeyValBytesMethod · 0.65
addRefMethod · 0.45

Tested by

no test coverage detected