Commit 6ab4529c authored by Bradley C. Kuszmaul's avatar Bradley C. Kuszmaul

Switch over the fingerprints to be in the subfield

git-svn-id: file:///svn/tokudb@977 c7de825b-a66e-492c-adef-691d508d4ae1
parent 4ccaaf02
...@@ -35,10 +35,12 @@ struct brtnode_nonleaf_pivotinfo { ...@@ -35,10 +35,12 @@ struct brtnode_nonleaf_pivotinfo {
}; };
struct brtnode_nonleaf_childinfo { struct brtnode_nonleaf_childinfo {
u_int32_t subtree_fingerprint; u_int32_t subtree_fingerprint;
#if 0
DISKOFF diskoff; DISKOFF diskoff;
HASHTABLE htable; HASHTABLE htable;
unsigned int n_bytes_in_hashtable; /* How many bytes are in each hashtable (including overheads for the disk-representation) */ unsigned int n_bytes_in_hashtable; /* How many bytes are in each hashtable (including overheads for the disk-representation) */
unsigned int n_cursors; unsigned int n_cursors;
#endif
}; };
typedef struct brtnode *BRTNODE; typedef struct brtnode *BRTNODE;
...@@ -63,17 +65,23 @@ struct brtnode { ...@@ -63,17 +65,23 @@ struct brtnode {
unsigned int totalchildkeylens; unsigned int totalchildkeylens;
unsigned int n_bytes_in_hashtables; unsigned int n_bytes_in_hashtables;
struct brtnode_nonleaf_childinfo childinfos[TREE_FANOUT+1]; /* One extra so we can grow */
#if 0
u_int32_t child_subtree_fingerprints[TREE_FANOUT+1];
#define BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node,i) ((node)->u.n.child_subtree_fingerprints[i])
#else
#define BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node,i) ((node)->u.n.childinfos[i].subtree_fingerprint)
#endif
//#define CHSTRUCT //#define CHSTRUCT
#ifdef CHSTRUCT #ifdef CHSTRUCT
struct brtnode_nonleaf_pivotinfo pivots[TREE_FANOUT]; /* One extra one so we can grow. */ struct brtnode_nonleaf_pivotinfo pivots[TREE_FANOUT]; /* One extra one so we can grow. */
struct brtnode_nonleaf_childinfo children[TREE_FANOUT+1]; /* One extra so we can grow */
#else #else
u_int32_t child_subtree_fingerprints[TREE_FANOUT+1];
struct kv_pair *childkeys[TREE_FANOUT]; /* Pivot keys. Child 0's keys are <= childkeys[0]. Child 1's keys are <= childkeys[1]. struct kv_pair *childkeys[TREE_FANOUT]; /* Pivot keys. Child 0's keys are <= childkeys[0]. Child 1's keys are <= childkeys[1].
Note: It is possible that Child 1's keys are == to child 0's key's, so it is Note: It is possible that Child 1's keys are == to child 0's key's, so it is
not necessarily true that child 1's keys are > childkeys[0]. not necessarily true that child 1's keys are > childkeys[0].
However, in the absense of duplicate keys, child 1's keys *are* > childkeys[0]. */ However, in the absense of duplicate keys, child 1's keys *are* > childkeys[0]. */
// unsigned int childkeylens[TREE_FANOUT];
unsigned char pivotflags[TREE_FANOUT]; unsigned char pivotflags[TREE_FANOUT];
DISKOFF children[TREE_FANOUT+1]; /* unused if height==0 */ /* Note: The last element of these arrays is used only temporarily while splitting a node. */ DISKOFF children[TREE_FANOUT+1]; /* unused if height==0 */ /* Note: The last element of these arrays is used only temporarily while splitting a node. */
HASHTABLE htables[TREE_FANOUT+1]; HASHTABLE htables[TREE_FANOUT+1];
......
...@@ -37,8 +37,8 @@ static void test_serialize(void) { ...@@ -37,8 +37,8 @@ static void test_serialize(void) {
sn.u.n.pivotflags[0] = 42; sn.u.n.pivotflags[0] = 42;
sn.u.n.children[0] = sn.nodesize*30; sn.u.n.children[0] = sn.nodesize*30;
sn.u.n.children[1] = sn.nodesize*35; sn.u.n.children[1] = sn.nodesize*35;
sn.u.n.child_subtree_fingerprints[0] = random(); BRTNODE_CHILD_SUBTREE_FINGERPRINTS(&sn, 0) = random();
sn.u.n.child_subtree_fingerprints[1] = random(); BRTNODE_CHILD_SUBTREE_FINGERPRINTS(&sn, 0) = random();
r = toku_hashtable_create(&sn.u.n.htables[0]); assert(r==0); r = toku_hashtable_create(&sn.u.n.htables[0]); assert(r==0);
r = toku_hashtable_create(&sn.u.n.htables[1]); assert(r==0); r = toku_hashtable_create(&sn.u.n.htables[1]); assert(r==0);
r = toku_hash_insert(sn.u.n.htables[0], "a", 2, "aval", 5, BRT_NONE); assert(r==0); sn.local_fingerprint += randval*toku_calccrc32_cmd(BRT_NONE, "a", 2, "aval", 5); r = toku_hash_insert(sn.u.n.htables[0], "a", 2, "aval", 5, BRT_NONE); assert(r==0); sn.local_fingerprint += randval*toku_calccrc32_cmd(BRT_NONE, "a", 2, "aval", 5);
...@@ -73,7 +73,7 @@ static void test_serialize(void) { ...@@ -73,7 +73,7 @@ static void test_serialize(void) {
{ {
int i; int i;
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
assert(dn->u.n.child_subtree_fingerprints[i]==sn.u.n.child_subtree_fingerprints[i]); assert(BRTNODE_CHILD_SUBTREE_FINGERPRINTS(dn, i)==BRTNODE_CHILD_SUBTREE_FINGERPRINTS(&sn, i));
} }
assert(dn->local_fingerprint==sn.local_fingerprint); assert(dn->local_fingerprint==sn.local_fingerprint);
} }
......
...@@ -124,13 +124,13 @@ void toku_serialize_brtnode_to(int fd, DISKOFF off, DISKOFF size, BRTNODE node) ...@@ -124,13 +124,13 @@ void toku_serialize_brtnode_to(int fd, DISKOFF off, DISKOFF size, BRTNODE node)
{ {
u_int32_t subtree_fingerprint = node->local_fingerprint; u_int32_t subtree_fingerprint = node->local_fingerprint;
for (i=0; i<node->u.n.n_children; i++) { for (i=0; i<node->u.n.n_children; i++) {
subtree_fingerprint += node->u.n.child_subtree_fingerprints[i]; subtree_fingerprint += BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, i);
} }
wbuf_int(&w, subtree_fingerprint); wbuf_int(&w, subtree_fingerprint);
} }
wbuf_int(&w, node->u.n.n_children); wbuf_int(&w, node->u.n.n_children);
for (i=0; i<node->u.n.n_children; i++) { for (i=0; i<node->u.n.n_children; i++) {
wbuf_int(&w, node->u.n.child_subtree_fingerprints[i]); wbuf_int(&w, BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, i));
} }
//printf("%s:%d w.ndone=%d\n", __FILE__, __LINE__, w.ndone); //printf("%s:%d w.ndone=%d\n", __FILE__, __LINE__, w.ndone);
for (i=0; i<node->u.n.n_children-1; i++) for (i=0; i<node->u.n.n_children-1; i++)
...@@ -279,7 +279,7 @@ int toku_deserialize_brtnode_from (int fd, DISKOFF off, BRTNODE *brtnode, int fl ...@@ -279,7 +279,7 @@ int toku_deserialize_brtnode_from (int fd, DISKOFF off, BRTNODE *brtnode, int fl
if (result->height>0) { if (result->height>0) {
result->u.n.totalchildkeylens=0; result->u.n.totalchildkeylens=0;
for (i=0; i<TREE_FANOUT; i++) { for (i=0; i<TREE_FANOUT; i++) {
result->u.n.child_subtree_fingerprints[i]=0; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(result, i)=0;
result->u.n.childkeys[i]=0; result->u.n.childkeys[i]=0;
} }
for (i=0; i<TREE_FANOUT+1; i++) { for (i=0; i<TREE_FANOUT+1; i++) {
...@@ -295,7 +295,7 @@ int toku_deserialize_brtnode_from (int fd, DISKOFF off, BRTNODE *brtnode, int fl ...@@ -295,7 +295,7 @@ int toku_deserialize_brtnode_from (int fd, DISKOFF off, BRTNODE *brtnode, int fl
assert(result->u.n.n_children>=0 && result->u.n.n_children<=TREE_FANOUT); assert(result->u.n.n_children>=0 && result->u.n.n_children<=TREE_FANOUT);
for (i=0; i<result->u.n.n_children; i++) { for (i=0; i<result->u.n.n_children; i++) {
u_int32_t childfp = rbuf_int(&rc); u_int32_t childfp = rbuf_int(&rc);
result->u.n.child_subtree_fingerprints[i]= childfp; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(result, i)= childfp;
check_subtree_fingerprint += childfp; check_subtree_fingerprint += childfp;
} }
for (i=0; i<result->u.n.n_children-1; i++) for (i=0; i<result->u.n.n_children-1; i++)
......
...@@ -40,7 +40,7 @@ static void verify_parent_fingerprint (BRTNODE node) { ...@@ -40,7 +40,7 @@ static void verify_parent_fingerprint (BRTNODE node) {
if (node->height>0) { if (node->height>0) {
int i; int i;
for (i=0; i<node->u.n.n_children; i++) { for (i=0; i<node->u.n.n_children; i++) {
subtree_fingerprint+=node->u.n.child_subtree_fingerprints[i]; subtree_fingerprint += BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, i);
} }
} }
if (parent) { if (parent) {
...@@ -48,7 +48,7 @@ static void verify_parent_fingerprint (BRTNODE node) { ...@@ -48,7 +48,7 @@ static void verify_parent_fingerprint (BRTNODE node) {
assert(parent->height>0); assert(parent->height>0);
for (i=0; i<parent->u.n.n_children; i++) { for (i=0; i<parent->u.n.n_children; i++) {
if (parent->u.n.children[i]==node->thisnodename) { if (parent->u.n.children[i]==node->thisnodename) {
assert(parent->u.n.child_subtree_fingerprints[i]==subtree_fingerprint); assert(BRTNODE_CHILD_SUBTREE_FINGERPRINTS(parent, i)==subtree_fingerprint);
return; return;
} }
} }
......
...@@ -114,12 +114,12 @@ static void fixup_child_fingerprint(BRTNODE node, int childnum_of_node, BRTNODE ...@@ -114,12 +114,12 @@ static void fixup_child_fingerprint(BRTNODE node, int childnum_of_node, BRTNODE
if (child->height>0) { if (child->height>0) {
int i; int i;
for (i=0; i<child->u.n.n_children; i++) { for (i=0; i<child->u.n.n_children; i++) {
sum += child->u.n.child_subtree_fingerprints[i]; sum += BRTNODE_CHILD_SUBTREE_FINGERPRINTS(child,i);
} }
} }
// Don't try to get fancy about not modifying the fingerprint if it didn't change. // Don't try to get fancy about not modifying the fingerprint if it didn't change.
// We only call this function if we have reason to believe that the child's fingerprint did change. // We only call this function if we have reason to believe that the child's fingerprint did change.
node->u.n.child_subtree_fingerprints[childnum_of_node]=sum; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node,childnum_of_node)=sum;
node->dirty=1; node->dirty=1;
} }
...@@ -317,7 +317,7 @@ static void initialize_brtnode (BRT t, BRTNODE n, DISKOFF nodename, int height) ...@@ -317,7 +317,7 @@ static void initialize_brtnode (BRT t, BRTNODE n, DISKOFF nodename, int height)
} }
n->u.n.totalchildkeylens = 0; n->u.n.totalchildkeylens = 0;
for (i=0; i<TREE_FANOUT+1; i++) { for (i=0; i<TREE_FANOUT+1; i++) {
n->u.n.child_subtree_fingerprints[i] = 0; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(n, i) = 0;
// n->u.n.children[i] = 0; // n->u.n.children[i] = 0;
// n->u.n.htables[i] = 0; // n->u.n.htables[i] = 0;
n->u.n.n_bytes_in_hashtable[i] = 0; n->u.n.n_bytes_in_hashtable[i] = 0;
...@@ -455,7 +455,7 @@ static void brt_nonleaf_split (BRT t, BRTNODE node, BRTNODE *nodea, BRTNODE *nod ...@@ -455,7 +455,7 @@ static void brt_nonleaf_split (BRT t, BRTNODE node, BRTNODE *nodea, BRTNODE *nod
A->u.n.children[i] = node->u.n.children[i]; A->u.n.children[i] = node->u.n.children[i];
A->u.n.htables[i] = htab; A->u.n.htables[i] = htab;
A->u.n.n_bytes_in_hashtables += (A->u.n.n_bytes_in_hashtable[i] = node->u.n.n_bytes_in_hashtable[i]); A->u.n.n_bytes_in_hashtables += (A->u.n.n_bytes_in_hashtable[i] = node->u.n.n_bytes_in_hashtable[i]);
A->u.n.child_subtree_fingerprints[i] = node->u.n.child_subtree_fingerprints[i]; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(A, i) = BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, i);
node->u.n.htables[i] = 0; node->u.n.htables[i] = 0;
node->u.n.n_bytes_in_hashtables -= node->u.n.n_bytes_in_hashtable[i]; node->u.n.n_bytes_in_hashtables -= node->u.n.n_bytes_in_hashtable[i];
...@@ -469,7 +469,7 @@ static void brt_nonleaf_split (BRT t, BRTNODE node, BRTNODE *nodea, BRTNODE *nod ...@@ -469,7 +469,7 @@ static void brt_nonleaf_split (BRT t, BRTNODE node, BRTNODE *nodea, BRTNODE *nod
B->u.n.children[targchild] = node->u.n.children[i]; B->u.n.children[targchild] = node->u.n.children[i];
B->u.n.htables[targchild] = htab; B->u.n.htables[targchild] = htab;
B->u.n.n_bytes_in_hashtables += (B->u.n.n_bytes_in_hashtable[targchild] = node->u.n.n_bytes_in_hashtable[i]); B->u.n.n_bytes_in_hashtables += (B->u.n.n_bytes_in_hashtable[targchild] = node->u.n.n_bytes_in_hashtable[i]);
B->u.n.child_subtree_fingerprints[targchild] = node->u.n.child_subtree_fingerprints[i]; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(B, targchild) = BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, i);
node->u.n.htables[i] = 0; node->u.n.htables[i] = 0;
node->u.n.n_bytes_in_hashtables -= node->u.n.n_bytes_in_hashtable[i]; node->u.n.n_bytes_in_hashtables -= node->u.n.n_bytes_in_hashtable[i];
...@@ -670,7 +670,7 @@ static int handle_split_of_child (BRT t, BRTNODE node, int childnum, ...@@ -670,7 +670,7 @@ static int handle_split_of_child (BRT t, BRTNODE node, int childnum,
for (cnum=node->u.n.n_children; cnum>childnum+1; cnum--) { for (cnum=node->u.n.n_children; cnum>childnum+1; cnum--) {
node->u.n.children[cnum] = node->u.n.children[cnum-1]; node->u.n.children[cnum] = node->u.n.children[cnum-1];
node->u.n.htables[cnum] = node->u.n.htables[cnum-1]; node->u.n.htables[cnum] = node->u.n.htables[cnum-1];
node->u.n.child_subtree_fingerprints[cnum] = node->u.n.child_subtree_fingerprints[cnum-1]; BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, cnum) = BRTNODE_CHILD_SUBTREE_FINGERPRINTS(node, cnum-1);
node->u.n.n_bytes_in_hashtable[cnum] = node->u.n.n_bytes_in_hashtable[cnum-1]; node->u.n.n_bytes_in_hashtable[cnum] = node->u.n.n_bytes_in_hashtable[cnum-1];
node->u.n.n_cursors[cnum] = node->u.n.n_cursors[cnum-1]; node->u.n.n_cursors[cnum] = node->u.n.n_cursors[cnum-1];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment