#ident "$Id$" #ident "Copyright (c) 2007-2011 Tokutek Inc. All rights reserved." /* The goal of this test: Make sure that when we aggressively promote * that we don't get a fencepost error on the size. (#399, I think) * * For various values of I do the following: * * Make a tree of height 3 (that is, the root is of height 2) * use small nodes (say 4KB) * you have this tree: * A * B * C0 C1 C2 .. C15 * A has only one child. B has as many children as it can get. * Fill the C nodes (the leaves) all almost full. * Fill B's buffer up with a big message X for C15, and a slightly smaller message Y for C1. * Put into A's buffer a little message Z aimed at C0. * Now when insert a message of size I aimed at C0. I and Z together are too big to fit in A. * First: X will be pushed into C15, resulting in this split * A * B0 * C0 C1 ... C8 * B1 * C9 C10 ... C15 C16 * At this point C0 through C14 are full, Y is in B0's buffer, and A's buffer contains I and Z. * So we try to push Z if it fits. Which it does. * So then we try to I if it fits. If we calculated wrong, everything breaks now. * */ #include "test.h" #include "includes.h" static TOKUTXN const null_txn = 0; static DB * const null_db = 0; enum { NODESIZE = 1024, KSIZE=NODESIZE-100, TOKU_PSIZE=20 }; CACHETABLE ct; BRT t; int fnamelen; char *fname; static void doit (int ksize __attribute__((__unused__))) { BLOCKNUM cnodes[BRT_FANOUT], bnode, anode; char *keys[BRT_FANOUT-1]; int keylens[BRT_FANOUT-1]; int i; int r; fnamelen = strlen(__SRCFILE__) + 20; fname = toku_malloc(fnamelen); assert(fname!=0); snprintf(fname, fnamelen, "%s.brt", __SRCFILE__); r = toku_brt_create_cachetable(&ct, 16*1024, ZERO_LSN, NULL_LOGGER); assert(r==0); unlink(fname); r = toku_open_brt(fname, 1, &t, NODESIZE, NODESIZE, TOKU_DEFAULT_COMPRESSION_METHOD, ct, null_txn, toku_builtin_compare_fun); assert(r==0); toku_free(fname); toku_testsetup_initialize(); // must precede any other toku_testsetup calls for (i=0; i