]> pd.if.org Git - btree/commitdiff
fix a blunder in BtDb layout
authorunknown <karl@E04.petzent.com>
Fri, 7 Feb 2014 00:03:59 +0000 (16:03 -0800)
committerunknown <karl@E04.petzent.com>
Fri, 7 Feb 2014 00:03:59 +0000 (16:03 -0800)
btree2s.c
btree2t.c

index d34d9380c9ec637bfdcc4ef42dc6be629e81e73a..ac7673e75cca8a0c1a9debe608f938163dfa99d0 100644 (file)
--- a/btree2s.c
+++ b/btree2s.c
@@ -166,13 +166,13 @@ typedef struct _BtDb {
        int nodemax;            // highest page cache segment allocated
        int hashmask;           // number of pages in segments - 1
        int hashsize;           // size of hash table
        int nodemax;            // highest page cache segment allocated
        int hashmask;           // number of pages in segments - 1
        int hashsize;           // size of hash table
+       int posted;                     // last loadpage found posted key
+       int found;                      // last deletekey found key
+       int fence;                      // last load page used fence position
        BtHash *lrufirst;       // lru list head
        BtHash *lrulast;        // lru list tail
        ushort *cache;          // hash table for cached segments
        BtHash nodes[1];        // segment cache follows
        BtHash *lrufirst;       // lru list head
        BtHash *lrulast;        // lru list tail
        ushort *cache;          // hash table for cached segments
        BtHash nodes[1];        // segment cache follows
-       int posted;                     // last loadpage found posted key
-       int found;                      // last deletekey found key
-       int fence;                      // last load page used fence position
 } BtDb;
 
 typedef enum {
 } BtDb;
 
 typedef enum {
index 5ec052d1b4a15b4b8f61740ea0f985764fc994fa..00c6f24ccc0c6ccad212e1be350dcc6f91858bfe 100644 (file)
--- a/btree2t.c
+++ b/btree2t.c
@@ -146,7 +146,7 @@ typedef struct {
 #ifndef unix
        HANDLE hmap;
 #endif
 #ifndef unix
        HANDLE hmap;
 #endif
-}BtHash;
+} BtHash;
 
 //     The object structure for Btree access
 
 
 //     The object structure for Btree access
 
@@ -176,12 +176,12 @@ typedef struct _BtDb {
        int nodemax;            // highest page cache segment allocated
        int hashmask;           // number of pages in segments - 1
        int hashsize;           // size of hash table
        int nodemax;            // highest page cache segment allocated
        int hashmask;           // number of pages in segments - 1
        int hashsize;           // size of hash table
+       int posted;                     // last loadpage found posted key
+       int found;                      // last insert/delete found key
        BtHash *lrufirst;       // lru list head
        BtHash *lrulast;        // lru list tail
        ushort *cache;          // hash table for cached segments
        BtHash nodes[1];        // segment cache follows
        BtHash *lrufirst;       // lru list head
        BtHash *lrulast;        // lru list tail
        ushort *cache;          // hash table for cached segments
        BtHash nodes[1];        // segment cache follows
-       int posted;                     // last loadpage found posted key
-       int found;                      // last insert/delete found key
 } BtDb;
 
 typedef enum {
 } BtDb;
 
 typedef enum {
@@ -440,7 +440,6 @@ BtLock lockmode = BtLockWrite;
 BtPage alloc;
 off64_t size;
 uint amt[1];
 BtPage alloc;
 off64_t size;
 uint amt[1];
-BtKey key;
 BtDb* bt;
 
 #ifndef unix
 BtDb* bt;
 
 #ifndef unix
@@ -609,16 +608,12 @@ SYSTEM_INFO sysinfo[1];
        bt->frame->posted = 1;
 
        for( lvl=MIN_lvl; lvl--; ) {
        bt->frame->posted = 1;
 
        for( lvl=MIN_lvl; lvl--; ) {
-               slotptr(bt->frame, 1)->off = bt->page_size - 3;
+               slotptr(bt->frame, 1)->off = offsetof(struct BtPage_, fence);
                bt_putid(slotptr(bt->frame, 1)->id, lvl ? MIN_lvl - lvl + 1 : 0);               // next(lower) page number
                bt_putid(slotptr(bt->frame, 1)->id, lvl ? MIN_lvl - lvl + 1 : 0);               // next(lower) page number
-               key = keyptr(bt->frame, 1);
-               key->len = 2;                   // create stopper key
-               key->key[0] = 0xff;
-               key->key[1] = 0xff;
                bt->frame->fence[0] = 2;
                bt->frame->fence[1] = 0xff;
                bt->frame->fence[2] = 0xff;
                bt->frame->fence[0] = 2;
                bt->frame->fence[1] = 0xff;
                bt->frame->fence[2] = 0xff;
-               bt->frame->min = bt->page_size - 3;
+               bt->frame->min = bt->page_size;
                bt->frame->lvl = lvl;
                bt->frame->cnt = 1;
                bt->frame->act = 1;
                bt->frame->lvl = lvl;
                bt->frame->cnt = 1;
                bt->frame->act = 1;
@@ -1140,29 +1135,34 @@ int chk;
        // obtain access lock using lock chaining
 
        if( prevpage ) {
        // obtain access lock using lock chaining
 
        if( prevpage ) {
-         if( bt_lockpage(bt, page_no, BtLockAccess) )
-               return 0;                                                                       
-
          if( bt_unlockpage(bt, prevpage, BtLockWrite) )
          if( bt_unlockpage(bt, prevpage, BtLockWrite) )
-               return 0;
+               return bt->err;
+         if( bt_unlockpage(bt, prevpage, BtLockParent) )
+               return bt->err;
 
          // obtain parent/fence key maintenance lock
 
          if( bt_lockpage(bt, page_no, BtLockParent) )
 
          // obtain parent/fence key maintenance lock
 
          if( bt_lockpage(bt, page_no, BtLockParent) )
-               return 0;                                                                       
+               return bt->err;                                                                 
+
+         if( bt_lockpage(bt, page_no, BtLockAccess) )
+               return bt->err;                                                                 
+
+         if( bt_unlockpage(bt, prevpage, BtLockWrite) )
+               return bt->err;
 
          // obtain write lock using lock chaining
 
          if( bt_lockpage(bt, page_no, BtLockWrite) )
 
          // obtain write lock using lock chaining
 
          if( bt_lockpage(bt, page_no, BtLockWrite) )
-               return 0;                                                                       
+               return bt->err;                                                                 
 
          if( bt_unlockpage(bt, page_no, BtLockAccess) )
 
          if( bt_unlockpage(bt, page_no, BtLockAccess) )
-               return 0;                                                                       
+               return bt->err;                                                                 
 
          //  map/obtain page contents
 
          if( bt_mappage (bt, &bt->temp, page_no) )
 
          //  map/obtain page contents
 
          if( bt_mappage (bt, &bt->temp, page_no) )
-               return 0;
+               return bt->err;
        }
 
        chk = keycmp ((BtKey)bt->temp->fence, oldfence + 1, *oldfence);
        }
 
        chk = keycmp ((BtKey)bt->temp->fence, oldfence + 1, *oldfence);
@@ -1195,8 +1195,7 @@ int chk;
 
   // return error on end of right chain
 
 
   // return error on end of right chain
 
-  bt->err = BTERR_struct;
-  return 0;    // return error
+  return bt->err = BTERR_struct;
 }
 
 //     return page to free list
 }
 
 //     return page to free list
@@ -1370,7 +1369,7 @@ uid right, ppage_no;
        //      parent fence value
 
        memcpy (rightfence, bt->temp->fence, 256);
        //      parent fence value
 
        memcpy (rightfence, bt->temp->fence, 256);
-       memcpy (pagefence, bt->parent->fence, 256);
+       memcpy (pagefence, parent->page->fence, 256);
        ppage_no = parent->page_no;
 
        //  pull right sibling over ourselves and unlock
        ppage_no = parent->page_no;
 
        //  pull right sibling over ourselves and unlock
@@ -1571,20 +1570,20 @@ retry:
          } else
                  break;
 
          } else
                  break;
 
-       //  update & unlock parent page
+       //  update parent page
 
        if( bt_update (bt, parent->page, parent->page_no) )
                return bt->err;
 
 
        if( bt_update (bt, parent->page, parent->page_no) )
                return bt->err;
 
-       if( bt_unlockpage (bt, parent->page_no, BtLockWrite) )
-               return bt->err;
-
        //      go down the left node's fence keys to the leaf level
        //      and update the fence keys in each page
 
        if( bt_fixfences (bt, left, pagefence) )
                return bt->err;
 
        //      go down the left node's fence keys to the leaf level
        //      and update the fence keys in each page
 
        if( bt_fixfences (bt, left, pagefence) )
                return bt->err;
 
+       if( bt_unlockpage (bt, parent->page_no, BtLockWrite) )
+               return bt->err;
+
        //  free our original page
 
        if( bt_mappage (bt, &bt->temp, page_no) )
        //  free our original page
 
        if( bt_mappage (bt, &bt->temp, page_no) )
@@ -1881,51 +1880,62 @@ BtKey key;
        if( page_no == ROOT_page )
                return bt_splitroot (bt, set, right);
 
        if( page_no == ROOT_page )
                return bt_splitroot (bt, set, right);
 
-       // insert new fences in parent page
+       if( bt_update (bt, set->page, page_no) )
+               return bt->err; 
 
 
-       while( 1 ) {
-               memcpy (fencekey, set->page->fence, 256);
-               right = bt_getid (set->page->right);
-               set->page->posted = 1;
+       if( bt_unlockpage (bt, page_no, BtLockWrite) )
+               return bt->err;
 
 
-               if( bt_update (bt, set->page, page_no) )
-                       return bt->err; 
+       // insert new fences in their parent pages
 
 
-               if( bt_unlockpage (bt, page_no, BtLockWrite) )
+       while( 1 ) {
+               if( bt_lockpage (bt, page_no, BtLockParent) )
                        return bt->err;
 
                        return bt->err;
 
-               if( bt_insertkey (bt, fencekey+1, *fencekey, lvl+1, page_no, time(NULL)) )
+               if( bt_lockpage (bt, page_no, BtLockRead) )
                        return bt->err;
 
                        return bt->err;
 
-               if( bt_unlockpage (bt, page_no, BtLockParent) )
+               if( bt_mappage (bt, &set->page, page_no) )
                        return bt->err;
 
                        return bt->err;
 
-               if( !(page_no = right) )
-                       break;
+               memcpy (fencekey, set->page->fence, 256);
 
 
-               // obtain fence modification/installation lock
+               if( set->page->posted ) {
+                 if( bt_unlockpage (bt, page_no, BtLockParent) )
+                       return bt->err;
+                       
+                 return bt_unlockpage (bt, page_no, BtLockRead);
+               }
 
 
-               if( bt_lockpage (bt, page_no, BtLockParent) )
+               if( bt_unlockpage (bt, page_no, BtLockRead) )
                        return bt->err;
 
                        return bt->err;
 
-               if( bt_lockpage (bt, page_no, BtLockAccess) )
+               if( bt_insertkey (bt, fencekey+1, *fencekey, lvl+1, page_no, time(NULL)) )
                        return bt->err;
 
                if( bt_lockpage (bt, page_no, BtLockWrite) )
                        return bt->err;
 
                        return bt->err;
 
                if( bt_lockpage (bt, page_no, BtLockWrite) )
                        return bt->err;
 
-               if( bt_unlockpage (bt, page_no, BtLockAccess) )
+               if( bt_mappage (bt, &set->page, page_no) )
                        return bt->err;
 
                        return bt->err;
 
-               if( bt_mappage (bt, &set->page, page_no) )
+               right = bt_getid (set->page->right);
+               set->page->posted = 1;
+
+               if( bt_update (bt, set->page, page_no) )
+                       return bt->err; 
+
+               if( bt_unlockpage (bt, page_no, BtLockWrite) )
                        return bt->err;
 
                        return bt->err;
 
-               if( set->page->posted ) {
-                       if( bt_unlockpage (bt, page_no, BtLockWrite) )
-                               return bt->err;
-                       return bt_unlockpage (bt, page_no, BtLockParent);
-               }
+               if( bt_unlockpage (bt, page_no, BtLockParent) )
+                       return bt->err;
+
+               if( !(page_no = right) )
+                       break;
 
 
+               if( bt_mappage (bt, &set->page, page_no) )
+                       return bt->err;
        }
 
        return 0;
        }
 
        return 0;