MCPcopy
hub / github.com/dgraph-io/badger / iterateAndMerge

Method iterateAndMerge

merge.go:61–100  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

59var errNoMerge = errors.New("No need for merge")
60
61func (op *MergeOperator) iterateAndMerge() (newVal []byte, latest uint64, err error) {
62 txn := op.db.NewTransaction(false)
63 defer txn.Discard()
64 opt := DefaultIteratorOptions
65 opt.AllVersions = true
66 it := txn.NewKeyIterator(op.key, opt)
67 defer it.Close()
68
69 var numVersions int
70 for it.Rewind(); it.Valid(); it.Next() {
71 item := it.Item()
72 numVersions++
73 if numVersions == 1 {
74 // This should be the newVal, considering this is the latest version.
75 newVal, err = item.ValueCopy(newVal)
76 if err != nil {
77 return nil, 0, err
78 }
79 latest = item.Version()
80 } else {
81 if err := item.Value(func(oldVal []byte) error {
82 // The merge should always be on the newVal considering it has the merge result of
83 // the latest version. The value read should be the oldVal.
84 newVal = op.f(oldVal, newVal)
85 return nil
86 }); err != nil {
87 return nil, 0, err
88 }
89 }
90 if item.DiscardEarlierVersions() {
91 break
92 }
93 }
94 if numVersions == 0 {
95 return nil, latest, ErrKeyNotFound
96 } else if numVersions == 1 {
97 return newVal, latest, errNoMerge
98 }
99 return newVal, latest, nil
100}
101
102func (op *MergeOperator) compact() error {
103 op.Lock()

Callers 2

compactMethod · 0.95
GetMethod · 0.95

Calls 12

NewTransactionMethod · 0.80
DiscardMethod · 0.80
NewKeyIteratorMethod · 0.80
ItemMethod · 0.80
VersionMethod · 0.80
CloseMethod · 0.65
RewindMethod · 0.65
ValidMethod · 0.65
NextMethod · 0.65
ValueMethod · 0.65
ValueCopyMethod · 0.45

Tested by

no test coverage detected