mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
fix bug with unpinning pages where depth of internal nodes > 1
This commit is contained in:
parent
0b5b9b160e
commit
dc7e3a01aa
3 changed files with 31 additions and 12 deletions
|
|
@ -53,7 +53,7 @@ const PAGE_TYPE_HASH_TABLE = 12
|
|||
// keyBytes
|
||||
// ptrValue (int64) (page number)
|
||||
|
||||
// == tuple payload chunk ==
|
||||
// == leaf payload chunk ==
|
||||
// keyLength (int16)
|
||||
// keyBytes
|
||||
// flags int8
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ func NewBTree(maxKeySize int, objectID int32, shard int32, schema types.Schema,
|
|||
keysPerLeafPage: keysPerLeafPage,
|
||||
keysPerInternalPage: keysPerInternalPage,
|
||||
// debug
|
||||
// pinnedPages: make(map[bufferpool.PageID]bufferpool.PageID),
|
||||
// pinnedPages: make(map[bufferpool.PageID]bufferpool.PageID),
|
||||
}
|
||||
|
||||
headerNode, err := tree.fetchNode(bufferpool.PageID{ObjectID: objectID, Shard: shard, Page: 0})
|
||||
|
|
@ -450,9 +450,6 @@ func (b *BTree) newLeaf() (*BTreeNode, error) {
|
|||
page: page,
|
||||
}
|
||||
//debug
|
||||
// if page.ID().Page == 200 {
|
||||
// fmt.Printf("here\n")
|
||||
// }
|
||||
// _, ok := b.pinnedPages[page.ID()]
|
||||
// if ok {
|
||||
// fmt.Printf("pinning page (already pinned) %v\n", page.ID())
|
||||
|
|
@ -1034,6 +1031,7 @@ func (b *BTree) insertNonFull(node *BTreeNode, key Sortable, tup *BTreeTuple, fo
|
|||
if node.latchState() != bufferpool.Write {
|
||||
// release latch on node
|
||||
node.releaseAnyLatch()
|
||||
b.unpin(node)
|
||||
// release latch on childNode
|
||||
childNode.releaseAnyLatch()
|
||||
b.unpin(childNode)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import (
|
|||
"math/rand"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/featurebasedb/featurebase/v3/bufferpool"
|
||||
"github.com/featurebasedb/featurebase/v3/sql3/parser"
|
||||
|
|
@ -92,7 +93,7 @@ func TestAddItemsToBTreeAndValidate_VeryWide(t *testing.T) {
|
|||
tableSchema := make(types.Schema, 0)
|
||||
|
||||
var numCols = 3000
|
||||
var numRecs = 1000
|
||||
var numRecs = 1000000
|
||||
|
||||
// build schema
|
||||
for i := 0; i < numCols; i++ {
|
||||
|
|
@ -126,8 +127,9 @@ func TestAddItemsToBTreeAndValidate_VeryWide(t *testing.T) {
|
|||
rand.Seed(10)
|
||||
rand.Shuffle(len(inserts), func(i, j int) { inserts[i], inserts[j] = inserts[j], inserts[i] })
|
||||
|
||||
start := time.Now()
|
||||
rr := make(types.Row, numCols+1)
|
||||
for /*j*/ _, i := range inserts {
|
||||
for j, i := range inserts {
|
||||
rr[0] = int64(i)
|
||||
|
||||
for j := 0; j < numCols; j++ {
|
||||
|
|
@ -141,9 +143,9 @@ func TestAddItemsToBTreeAndValidate_VeryWide(t *testing.T) {
|
|||
|
||||
// fmt.Printf("[%d]row key %v\n\n", j, i)
|
||||
|
||||
// if j == 2134 {
|
||||
// fmt.Printf("here\n")
|
||||
// }
|
||||
if j%100000 == 0 {
|
||||
fmt.Printf("inserting (%d)...\n", j)
|
||||
}
|
||||
|
||||
err = b.Insert(tup)
|
||||
if err != nil {
|
||||
|
|
@ -151,10 +153,29 @@ func TestAddItemsToBTreeAndValidate_VeryWide(t *testing.T) {
|
|||
}
|
||||
|
||||
}
|
||||
duration := time.Since(start)
|
||||
fmt.Printf("inserted %d rows in %v\n", numRecs, duration)
|
||||
|
||||
start = time.Now()
|
||||
key, tuple := b.Search(nil, Int(524))
|
||||
duration = time.Since(start)
|
||||
|
||||
fmt.Printf("%v, %v\n\n", key, tuple)
|
||||
vals := "["
|
||||
for i, v := range tuple.Tuple {
|
||||
if i > 10 {
|
||||
vals += "..."
|
||||
break
|
||||
}
|
||||
if i != 0 {
|
||||
vals += ", "
|
||||
}
|
||||
vals += fmt.Sprintf("%v", v)
|
||||
}
|
||||
vals += "]"
|
||||
|
||||
// b.Dump(0)
|
||||
fmt.Printf("retrieved key %v, tuple (%d columns), %s in %v\n", key, len(tuple.TupleSchema), vals, duration)
|
||||
|
||||
fmt.Printf("\n\n")
|
||||
|
||||
b.Dump(0)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue