From 3f5d6ea226a37eab34f5da0c9561540d2451b56a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Sep 2014 15:41:26 -0700 Subject: [PATCH] Fix errors in threadskv1 and threadskv3 --- threadskv1.c | 24 ++++++++++++------------ threadskv3.c | 27 ++++++++++++++------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/threadskv1.c b/threadskv1.c index 67761e7..3ce5b8a 100644 --- a/threadskv1.c +++ b/threadskv1.c @@ -1504,8 +1504,10 @@ BtPool *prevpool; // find key on page at this level // and descend to requested level - if( !set->page->kill ) - if( slot = bt_findslot (set, key, len) ) { + if( set->page->kill ) + goto slideright; + + if( slot = bt_findslot (set, key, len) ) { if( drill == lvl ) return slot; @@ -1518,7 +1520,7 @@ BtPool *prevpool; page_no = bt_getid(valptr(set->page, slot)->value); drill--; continue; - } + } // or slide right into next page @@ -1566,7 +1568,6 @@ BTERR bt_fixfence (BtDb *bt, BtPageSet *set, uint lvl) { unsigned char leftkey[256], rightkey[256]; unsigned char value[BtId]; -uid page_no; BtKey ptr; // remove the old fence value @@ -1579,14 +1580,13 @@ BtKey ptr; ptr = keyptr(set->page, set->page->cnt); memcpy (leftkey, ptr, ptr->len + 1); - page_no = set->page_no; bt_lockpage (BtLockParent, set->latch); bt_unlockpage (BtLockWrite, set->latch); // insert new (now smaller) fence key - bt_putid (value, page_no); + bt_putid (value, set->page_no); if( bt_insertkey (bt, leftkey+1, *leftkey, lvl+1, value, BtId) ) return bt->err; @@ -1844,12 +1844,6 @@ BtVal val; if( cnt < max && slotptr(bt->frame,cnt)->dead ) continue; - // copy the key across - - key = keyptr(bt->frame, cnt); - nxt -= key->len + 1; - memcpy ((unsigned char *)page + nxt, key, key->len + 1); - // copy the value across val = valptr(bt->frame, cnt); @@ -1857,6 +1851,12 @@ BtVal val; ((unsigned char *)page)[nxt] = val->len; memcpy ((unsigned char *)page + nxt + 1, val->value, val->len); + // copy the key across + + key = keyptr(bt->frame, cnt); + nxt -= key->len + 1; + memcpy ((unsigned char *)page + nxt, key, key->len + 1); + // set up the slot slotptr(page, ++idx)->off = nxt; diff --git a/threadskv3.c b/threadskv3.c index bc7db88..25501fd 100644 --- a/threadskv3.c +++ b/threadskv3.c @@ -1506,8 +1506,10 @@ BtPool *prevpool; // find key on page at this level // and descend to requested level - if( !set->page->kill ) - if( slot = bt_findslot (set, key, len) ) { + if( set->page->kill ) + goto slideright; + + if( slot = bt_findslot (set, key, len) ) { if( drill == lvl ) return slot; @@ -1520,7 +1522,7 @@ BtPool *prevpool; page_no = bt_getid(valptr(set->page, slot)->value); drill--; continue; - } + } // or slide right into next page @@ -1568,27 +1570,26 @@ BTERR bt_fixfence (BtDb *bt, BtPageSet *set, uint lvl) { unsigned char leftkey[256], rightkey[256]; unsigned char value[BtId]; -uid page_no; BtKey ptr; BtVal val; // remove the old fence value ptr = keyptr(set->page, set->page->cnt); + val = valptr(set->page, set->page->cnt); memcpy (rightkey, ptr, ptr->len + 1); set->page->garbage += ptr->len + val->len + 2; memset (slotptr(set->page, set->page->cnt--), 0, sizeof(BtSlot)); ptr = keyptr(set->page, set->page->cnt); memcpy (leftkey, ptr, ptr->len + 1); - page_no = set->page_no; bt_lockpage (BtLockParent, set->latch); bt_unlockpage (BtLockWrite, set->latch); // insert new (now smaller) fence key - bt_putid (value, page_no); + bt_putid (value, set->page_no); if( bt_insertkey (bt, leftkey+1, *leftkey, lvl+1, value, BtId) ) return bt->err; @@ -1676,7 +1677,7 @@ BtVal val; set->page->garbage += ptr->len + val->len + 2; set->page->act--; - // collapse empty slots + // collapse empty slots beneath our slot while( idx = set->page->cnt - 1 ) if( slotptr(set->page, idx)->dead ) { @@ -1859,12 +1860,6 @@ BtVal val; if( cnt < max && slotptr(bt->frame,cnt)->dead ) continue; - // copy the key across - - key = keyptr(bt->frame, cnt); - nxt -= key->len + 1; - memcpy ((unsigned char *)page + nxt, key, key->len + 1); - // copy the value across val = valptr(bt->frame, cnt); @@ -1872,6 +1867,12 @@ BtVal val; ((unsigned char *)page)[nxt] = val->len; memcpy ((unsigned char *)page + nxt + 1, val->value, val->len); + // copy the key across + + key = keyptr(bt->frame, cnt); + nxt -= key->len + 1; + memcpy ((unsigned char *)page + nxt, key, key->len + 1); + // make a librarian slot slotptr(page, ++idx)->off = nxt; -- 2.40.0