]> pd.if.org Git - btree/blobdiff - threadskv5.c
Fix small bug in main when there is less t han one input file
[btree] / threadskv5.c
index 42293dcc80c0d5d0d59b9df6f7be0ccd194579d8..ec46ace3a3f7738d261fe9587ecf1ae7df7940d9 100644 (file)
@@ -1207,7 +1207,6 @@ uint subpage = (uint)(page_no & bt->mgr->poolmask); // page within mapping
 BtPage page;
 
        page = (BtPage)(pool->map + (subpage << bt->mgr->page_bits));
-//     madvise (page, bt->mgr->page_size, MADV_WILLNEED);
        return page;
 }
 
@@ -1395,6 +1394,7 @@ void bt_unlockpage(BtLock mode, BtLatchSet *set)
 }
 
 //     allocate a new page
+//     return with page pinned.
 
 BTERR bt_newpage(BtDb *bt, BtPageSet *set)
 {
@@ -1938,6 +1938,12 @@ BtVal *val;
        if( slotptr(set->page, slot)->type == Duplicate )
                len -= BtId;
 
+       //      not there if we reach the stopper key
+
+       if( slot == set->page->cnt )
+         if( !bt_getid (set->page->right) )
+               break;
+
        // if key exists, return >= 0 value bytes copied
        //      otherwise return (-1)
 
@@ -2001,7 +2007,9 @@ BtVal *val;
        while( cnt++ < max ) {
                if( cnt == slot )
                        newslot = idx + 2;
-               if( cnt < max && slotptr(bt->frame,cnt)->dead )
+
+               if( cnt < max || page->lvl )
+                 if( slotptr(bt->frame,cnt)->dead )
                        continue;
 
                // copy the value across
@@ -2018,11 +2026,9 @@ BtVal *val;
 
                // make a librarian slot
 
-               if( idx ) {
-                       slotptr(page, ++idx)->off = nxt;
-                       slotptr(page, idx)->type = Librarian;
-                       slotptr(page, idx)->dead = 1;
-               }
+               slotptr(page, ++idx)->off = nxt;
+               slotptr(page, idx)->type = Librarian;
+               slotptr(page, idx)->dead = 1;
 
                // set up the slot
 
@@ -2138,7 +2144,8 @@ uint prev;
        idx = 0;
 
        while( cnt++ < max ) {
-               if( slotptr(set->page, cnt)->dead && cnt < max )
+               if( cnt < max || set->page->lvl )
+                 if( slotptr(set->page, cnt)->dead )
                        continue;
                src = valptr(set->page, cnt);
                nxt -= src->len + sizeof(BtVal);
@@ -2150,11 +2157,9 @@ uint prev;
 
                //      add librarian slot
 
-               if( idx ) {
-                       slotptr(bt->frame, ++idx)->off = nxt;
-                       slotptr(bt->frame, idx)->type = Librarian;
-                       slotptr(bt->frame, idx)->dead = 1;
-               }
+               slotptr(bt->frame, ++idx)->off = nxt;
+               slotptr(bt->frame, idx)->type = Librarian;
+               slotptr(bt->frame, idx)->dead = 1;
 
                //  add actual slot
 
@@ -2193,7 +2198,6 @@ uint prev;
                return bt->err;
 
        memcpy (right->page, bt->frame, bt->mgr->page_size);
-       bt_unpinpool (right->pool);
 
        //      update lower keys to continue in old page
 
@@ -2224,11 +2228,9 @@ uint prev;
 
                //      add librarian slot
 
-               if( idx ) {
-                       slotptr(set->page, ++idx)->off = nxt;
-                       slotptr(set->page, idx)->type = Librarian;
-                       slotptr(set->page, idx)->dead = 1;
-               }
+               slotptr(set->page, ++idx)->off = nxt;
+               slotptr(set->page, idx)->type = Librarian;
+               slotptr(set->page, idx)->dead = 1;
 
                //      add actual slot
 
@@ -2261,15 +2263,17 @@ uint prev;
        // insert new fence for reformulated left block of smaller keys
 
        bt_putid (value, set->page_no);
+       ptr = (BtKey*)fencekey;
 
-       if( bt_insertkey (bt, fencekey+1, *fencekey, lvl+1, value, BtId, 1) )
+       if( bt_insertkey (bt, ptr->key, ptr->len, lvl+1, value, BtId, 1) )
                return bt->err;
 
        // switch fence for right block of larger keys to new right page
 
        bt_putid (value, right->page_no);
+       ptr = (BtKey*)rightkey;
 
-       if( bt_insertkey (bt, rightkey+1, *rightkey, lvl+1, value, BtId, 1) )
+       if( bt_insertkey (bt, ptr->key, ptr->len, lvl+1, value, BtId, 1) )
                return bt->err;
 
        bt_unlockpage (BtLockParent, set->latch);
@@ -2278,6 +2282,7 @@ uint prev;
 
        bt_unlockpage (BtLockParent, right->latch);
        bt_unpinlatch (right->latch);
+       bt_unpinpool (right->pool);
        return 0;
 }
 
@@ -2664,6 +2669,18 @@ struct timeval tv[1];
 }
 #endif
 
+void bt_poolaudit (BtMgr *mgr)
+{
+uint slot = 0;
+BtPool *pool;
+
+       while( slot++ < mgr->poolcnt ) {
+               pool = mgr->pool + slot;
+               if( pool->pin & ~CLOCK_bit )
+                 fprintf(stderr, "pool slot %d pinned\n", slot);
+       }
+}
+
 uint bt_latchaudit (BtDb *bt)
 {
 ushort idx, hashidx;
@@ -2736,7 +2753,7 @@ BtKey *ptr;
                if( !bt->frame->free ) {
                 for( idx = 0; idx++ < bt->frame->cnt - 1; ) {
                  ptr = keyptr(bt->frame, idx+1);
-                 if( keycmp (keyptr(bt->frame, idx), ptr->key, ptr->len) >= 0 )
+                 if( keycmp (keyptr(bt->frame, idx), ptr->key, ptr->len) > 0 )
                        fprintf(stderr, "page %.8x idx %.2x out of order\n", page_no, idx);
                 }
                 if( !bt->frame->lvl )
@@ -2853,6 +2870,7 @@ FILE *in;
                        }
                        else if( len < BT_maxkey )
                                key[len++] = ch;
+
                fprintf(stderr, "finished %s for %d keys, %d found\n", args->infile, line, found);
                break;
 
@@ -2887,6 +2905,7 @@ FILE *in;
                                set->page = bt_page (bt, set->pool, page_no);
                        else
                                break;
+                       madvise (set->page, bt->mgr->page_size, MADV_WILLNEED);
                        set->latch = bt_pinlatch (bt, page_no);
                        bt_lockpage (BtLockRead, set->latch);
                        next = bt_getid (set->page->right);
@@ -3084,6 +3103,7 @@ BtDb *bt;
        elapsed = getCpuTime(2);
        fprintf(stderr, " sys  %dm%.3fs\n", (int)(elapsed/60), elapsed - (int)(elapsed/60)*60);
 
+       bt_poolaudit (mgr);
        bt_mgrclose (mgr);
 }