+ /* For leaf pages, check the split point based on what
+ * fits where, since otherwise add_node can fail.
+ */
+ if (IS_LEAF(&mdp->p)) {
+ unsigned int psize, nsize;
+ /* Maximum free space in an empty page */
+ pmax = txn->mt_env->me_psize - PAGEHDRSZ;
+ nsize = mdb_leaf_size(txn->mt_env, newkey, newdata);
+ if (newindx <= split_indx) {
+split1:
+ psize = nsize;
+ for (i=0; i<split_indx; i++) {
+ node = NODEPTR(&mdp->p, i);
+ psize += NODESIZE + NODEKSZ(node);
+ if (F_ISSET(node->mn_flags, F_BIGDATA))
+ psize += sizeof(pgno_t);
+ else
+ psize += NODEDSZ(node);
+ if (psize > pmax) {
+ split_indx--;
+ goto split1;
+ }
+ }
+ } else {
+split2:
+ psize = nsize;
+ for (i=split_indx; i<nkeys; i++) {
+ node = NODEPTR(&mdp->p, i);
+ psize += NODESIZE + NODEKSZ(node);
+ if (F_ISSET(node->mn_flags, F_BIGDATA))
+ psize += sizeof(pgno_t);
+ else
+ psize += NODEDSZ(node);
+ if (psize > pmax) {
+ split_indx++;
+ goto split2;
+ }
+ }
+ }
+ }