MCPcopy
hub / github.com/etcd-io/bbolt / recursivelyCheckPageKeyOrderInternal

Method recursivelyCheckPageKeyOrderInternal

tx_check.go:190–226  ·  view source on GitHub ↗

recursivelyCheckPageKeyOrderInternal verifies that all keys in the subtree rooted at `pgid` are: - >=`minKeyClosed` (can be nil) - <`maxKeyOpen` (can be nil) - Are in right ordering relationship to their parents. `pagesStack` is expected to contain IDs of pages from the tree root to `pgid` for the c

(
	pgId common.Pgid, minKeyClosed, maxKeyOpen []byte, pagesStack []common.Pgid,
	keyToString func([]byte) string, ch chan error)

Source from the content-addressed store, hash-verified

188// - Are in right ordering relationship to their parents.
189// `pagesStack` is expected to contain IDs of pages from the tree root to `pgid` for the clean debugging message.
190func (tx *Tx) recursivelyCheckPageKeyOrderInternal(
191 pgId common.Pgid, minKeyClosed, maxKeyOpen []byte, pagesStack []common.Pgid,
192 keyToString func([]byte) string, ch chan error) (maxKeyInSubtree []byte) {
193
194 p := tx.page(pgId)
195 pagesStack = append(pagesStack, pgId)
196 switch {
197 case p.IsBranchPage():
198 // For branch page we navigate ranges of all subpages.
199 runningMin := minKeyClosed
200 for i := range p.BranchPageElements() {
201 elem := p.BranchPageElement(uint16(i))
202 verifyKeyOrder(elem.Pgid(), "branch", i, elem.Key(), runningMin, maxKeyOpen, ch, keyToString, pagesStack)
203
204 maxKey := maxKeyOpen
205 if i < len(p.BranchPageElements())-1 {
206 maxKey = p.BranchPageElement(uint16(i + 1)).Key()
207 }
208 maxKeyInSubtree = tx.recursivelyCheckPageKeyOrderInternal(elem.Pgid(), elem.Key(), maxKey, pagesStack, keyToString, ch)
209 runningMin = maxKeyInSubtree
210 }
211 return maxKeyInSubtree
212 case p.IsLeafPage():
213 runningMin := minKeyClosed
214 for i := range p.LeafPageElements() {
215 elem := p.LeafPageElement(uint16(i))
216 verifyKeyOrder(pgId, "leaf", i, elem.Key(), runningMin, maxKeyOpen, ch, keyToString, pagesStack)
217 runningMin = elem.Key()
218 }
219 if p.Count() > 0 {
220 return p.LeafPageElement(p.Count() - 1).Key()
221 }
222 default:
223 ch <- fmt.Errorf("unexpected page type (flags: %x) for pgId:%d", p.Flags(), pgId)
224 }
225 return maxKeyInSubtree
226}
227
228/***
229 * verifyKeyOrder checks whether an entry with given #index on pgId (pageType: "branch|leaf") that has given "key",

Callers 1

Calls 13

pageMethod · 0.95
verifyKeyOrderFunction · 0.85
IsBranchPageMethod · 0.80
BranchPageElementsMethod · 0.80
BranchPageElementMethod · 0.80
IsLeafPageMethod · 0.80
LeafPageElementsMethod · 0.80
LeafPageElementMethod · 0.80
CountMethod · 0.65
ErrorfMethod · 0.65
PgidMethod · 0.45
KeyMethod · 0.45

Tested by

no test coverage detected