]> pd.if.org Git - btree/commitdiff
Fix errors in threadskv1 and threadskv3
authorunknown <karl@E04.petzent.com>
Wed, 3 Sep 2014 22:41:26 +0000 (15:41 -0700)
committerunknown <karl@E04.petzent.com>
Wed, 3 Sep 2014 22:41:26 +0000 (15:41 -0700)
threadskv1.c
threadskv3.c

index 67761e784e7e11bc803af759070d68c1c53a2f00..3ce5b8a6d9c58fd020d4ba6ecb756ad4cefbefa4 100644 (file)
@@ -1504,8 +1504,10 @@ BtPool *prevpool;
        //  find key on page at this level
        //  and descend to requested level
 
        //  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;
 
          if( drill == lvl )
                return slot;
 
@@ -1518,7 +1520,7 @@ BtPool *prevpool;
          page_no = bt_getid(valptr(set->page, slot)->value);
          drill--;
          continue;
          page_no = bt_getid(valptr(set->page, slot)->value);
          drill--;
          continue;
-        }
+       }
 
        //  or slide right into next page
 
 
        //  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];
 {
 unsigned char leftkey[256], rightkey[256];
 unsigned char value[BtId];
-uid page_no;
 BtKey ptr;
 
        //      remove the old fence value
 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);
 
        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_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;
 
        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;
 
                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);
                // 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);
 
                ((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;
                // set up the slot
 
                slotptr(page, ++idx)->off = nxt;
index bc7db88a63c518a44a96d6f80d168695fee2fac8..25501fde77ea14df59ce0904be2b58a74fcff5c7 100644 (file)
@@ -1506,8 +1506,10 @@ BtPool *prevpool;
        //  find key on page at this level
        //  and descend to requested level
 
        //  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;
 
          if( drill == lvl )
                return slot;
 
@@ -1520,7 +1522,7 @@ BtPool *prevpool;
          page_no = bt_getid(valptr(set->page, slot)->value);
          drill--;
          continue;
          page_no = bt_getid(valptr(set->page, slot)->value);
          drill--;
          continue;
-        }
+       }
 
        //  or slide right into next page
 
 
        //  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];
 {
 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);
 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);
        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_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;
 
        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--;
 
                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 ) {
 
                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;
 
                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);
                // 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);
 
                ((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;
                // make a librarian slot
 
                slotptr(page, ++idx)->off = nxt;