From dc7e3a01aadaca4fe8772eb991e221345aa66424 Mon Sep 17 00:00:00 2001 From: pokeeffe-molecula Date: Mon, 27 Mar 2023 09:00:30 -0500 Subject: [PATCH] fix bug with unpinning pages where depth of internal nodes > 1 --- bufferpool/page.go | 2 +- tstore/btree.go | 6 ++---- tstore/btree_test.go | 35 ++++++++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/bufferpool/page.go b/bufferpool/page.go index 71d23d043..9cb25a974 100644 --- a/bufferpool/page.go +++ b/bufferpool/page.go @@ -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 diff --git a/tstore/btree.go b/tstore/btree.go index 70af5bd95..494c9543a 100644 --- a/tstore/btree.go +++ b/tstore/btree.go @@ -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) diff --git a/tstore/btree_test.go b/tstore/btree_test.go index a8f441ed9..229e91944 100644 --- a/tstore/btree_test.go +++ b/tstore/btree_test.go @@ -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) }