diff --git a/bucket.go b/bucket.go index 25ad1ba..a57f456 100644 --- a/bucket.go +++ b/bucket.go @@ -476,6 +476,7 @@ func (b *Bucket) spill() error { b.rootNode = b.rootNode.root() // Update the root node for this bucket. + _assert(b.rootNode.pgid < b.tx.meta.pgid, "pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid) b.root = b.rootNode.pgid return nil diff --git a/db.go b/db.go index d96a161..0b74621 100644 --- a/db.go +++ b/db.go @@ -705,6 +705,10 @@ func (m *meta) copy(dest *meta) { // write writes the meta onto a page. func (m *meta) write(p *page) { + + _assert(m.root.root < m.pgid, "root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid) + _assert(m.freelist < m.pgid, "freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid) + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. p.id = pgid(m.txid % 2) p.flags |= metaPageFlag diff --git a/node.go b/node.go index 1bc889d..14bf136 100644 --- a/node.go +++ b/node.go @@ -98,6 +98,8 @@ func (n *node) prevSibling() *node { // put inserts a key/value. func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + _assert(pgid < n.bucket.tx.meta.pgid, "pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid) + // Find insertion index. index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) @@ -278,6 +280,7 @@ func (n *node) spill() error { } // Write the node. + _assert(p.id < tx.meta.pgid, "pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid) node.pgid = p.id node.write(p) @@ -307,6 +310,7 @@ func (n *node) spill() error { } // Write the new root. + _assert(p.id < tx.meta.pgid, "pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid) parent.pgid = p.id parent.write(p) }