I've been trying to debug this a bit. 20 years since I did any C
programming to any great degree.

I enabled and added some debugging to btree.c:

Index: btree.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/btree.c,v
retrieving revision 1.37
diff -u -p -u -r1.37 btree.c
--- btree.c     2 Dec 2016 05:52:01 -0000       1.37
+++ btree.c     26 May 2017 13:56:06 -0000
@@ -36,7 +36,7 @@
 
 #include "btree.h"
 
-/* #define DEBUG */
+#define DEBUG
 
 #ifdef DEBUG
 # define DPRINTF(...)  do { fprintf(stderr, "%s:%d: ", __func__, __LINE__); \
@@ -1855,6 +1855,9 @@ btree_new_page(struct btree *bt, uint32_
        mp->page->flags = flags;
        mp->page->lower = PAGEHDRSZ;
        mp->page->upper = bt->head.psize;
+
+       DPRINTF("new mpage %u, page upper %u, page lower %u",
+           mp->pgno, mp->page->upper, mp->page->lower);
 
        if (IS_BRANCH(mp))
                bt->meta.branch_pages++;


Running ldapd with this extra code I get these messages just before the
assertion failure:

.
.
btree_search_page:1470: tree is empty
btree_txn_put:2948: allocating new root leaf page
btree_new_page:1847: allocating new mpage 1, page size 65536
btree_new_page:1860: new mpage 1, page upper 0, page lower 12
btree_txn_put:2962: there are 0 keys, should insert new key at index 0
assertion "p->upper >= p->lower" failed: file 
"/usr/src/usr.sbin/ldapd/btree.c", line 1952, function "btree_add_node"

Note the debug statement at line 1847 has page size (bt->head.psize) as
65536, while at line 1860 the value of mp->page->upper is 0, but it
should have just been assigned the value from bt->head.psize. I'm not
seeing anything that should have changed bt->head.psize between those
two lines.

If I run this on my local desktop I get the following.

.
.
btree_search_page:1470: tree is empty
btree_txn_put:2948: allocating new root leaf page
btree_new_page:1847: allocating new mpage 1, page size 16384
btree_new_page:1860: new mpage 1, page upper 16384, page lower 12
btree_txn_put:2962: there are 0 keys, should insert new key at index 0
btree_add_node:1957: add node [dc=example,dc=org] to leaf page 1 at index 0, 
key size 17

Note the "page size" is different. On the Dell R710 the message says
"page size 65536" which is one higher than 0xffff, which seems like a
red flag? The "upper" and "lower" fields look to be of type indx_t which
is defined as a uint16_t, but in the bt_head struct, psize is a
uint32_t. So the line

   mp->page->upper = bt->head.psize;

Is going to result in mp->page->upper being zero, if bt->head.psize is 65536.

I don't understand why the R710 has a different behavior than my desktop
machine, but that's what I'm seeing.

Allan

Reply via email to