From 683695bee08caa11f8c1265581bb757840deb024 Mon Sep 17 00:00:00 2001 From: Zardosht Kasheff Date: Wed, 17 Apr 2013 00:00:00 -0400 Subject: [PATCH] [t:4923], use brtnode_put_cmd in push_something_at_root. In Maxwell we changed it because we applied messages to in-memory leaves. Now, we have indexed buffers, so we can consolidate some code. I am not too happy with how max_msn_applied_on_disk is handled, but I will deal with that in another checkin git-svn-id: file:///svn/toku/tokudb@37957 c7de825b-a66e-492c-adef-691d508d4ae1 --- newbrt/brt.c | 75 ++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 43 deletions(-) diff --git a/newbrt/brt.c b/newbrt/brt.c index 84336ca25c0..69d791e96d5 100644 --- a/newbrt/brt.c +++ b/newbrt/brt.c @@ -2060,16 +2060,13 @@ brtnode_put_cmd ( ) // Effect: Push CMD into the subtree rooted at NODE. // If NODE is a leaf, then -// put CMD into leaf, applying it to the leafentries +// put CMD into leaf, applying it to the leafentries // If NODE is a nonleaf, then push the cmd into the FIFO(s) of the relevent child(ren). // The node may become overfull. That's not our problem. { toku_assert_entire_node_in_memory(node); if (node->height==0) { - // we need to make sure that after doing all the put_cmd operations - // that the tree above is completely flushed out, - // otherwise may have an inconsistency (part of the data is there, and part isn't) - bool made_change = false; + bool made_change = false; uint64_t workdone = 0; toku_apply_cmd_to_leaf( compare_fun, @@ -2083,7 +2080,7 @@ brtnode_put_cmd ( live_list_reverse ); } else { - brt_nonleaf_put_cmd(compare_fun, desc, node, cmd, is_fresh); + brt_nonleaf_put_cmd(compare_fun, desc, node, cmd, is_fresh); } } @@ -2184,46 +2181,38 @@ static void push_something_at_root (BRT brt, BRTNODE *nodep, BRT_MSG cmd) { BRTNODE node = *nodep; toku_assert_entire_node_in_memory(node); - if (node->height==0) { - // Must special case height 0, since brtnode_put_cmd() doesn't modify leaves. - // Part of the problem is: if the node is in memory, then it was updated as part of the in-memory operation. - // If the root node is not in memory, then we must apply it. - bool made_dirty = 0; - uint64_t workdone_ignore = 0; // ignore workdone for root-leaf node - // not up to date, which means the get_and_pin actually fetched it - // into memory. - TOKULOGGER logger = toku_cachefile_logger(brt->cf); - OMT snapshot_txnids = logger ? logger->snapshot_txnids : NULL; - OMT live_list_reverse = logger ? logger->live_list_reverse : NULL; - // passing down snapshot_txnids and live_list_reverse directly - // since we're holding the ydb lock. TODO: verify this is correct - toku_apply_cmd_to_leaf( - brt->compare_fun, - brt->update_fun, - &brt->h->descriptor, - node, - cmd, - &made_dirty, - &workdone_ignore, - snapshot_txnids, - live_list_reverse - ); + TOKULOGGER logger = toku_cachefile_logger(brt->cf); + OMT snapshot_txnids = logger ? logger->snapshot_txnids : NULL; + OMT live_list_reverse = logger ? logger->live_list_reverse : NULL; + brtnode_put_cmd( + brt->compare_fun, + brt->update_fun, + &brt->h->descriptor, + node, + cmd, + true, + snapshot_txnids, + live_list_reverse + ); + if (node->height == 0) { MSN cmd_msn = cmd->msn; invariant(cmd_msn.msn > node->max_msn_applied_to_node_on_disk.msn); - // max_msn_applied_to_node_on_disk is normally set only when leaf is serialized, - // but needs to be done here (for root leaf) so msn can be set in new commands. + // max_msn_applied_to_node_on_disk is normally set only when leaf is serialized, + // but needs to be done here (for root leaf) so msn can be set in new commands. node->max_msn_applied_to_node_on_disk = cmd_msn; - toku_mark_node_dirty(node); - } else { - uint64_t msgsize = brt_msg_size(cmd); - brt_status.msg_bytes_in += msgsize; - brt_status.msg_bytes_curr += msgsize; - if (brt_status.msg_bytes_curr > brt_status.msg_bytes_max) - brt_status.msg_bytes_max = brt_status.msg_bytes_curr; - brt_status.msg_num++; - if (brt_msg_applies_all(cmd)) - brt_status.msg_num_broadcast++; - brt_nonleaf_put_cmd(brt->compare_fun, &brt->h->descriptor, node, cmd, true); + toku_mark_node_dirty(node); + } + else { + uint64_t msgsize = brt_msg_size(cmd); + brt_status.msg_bytes_in += msgsize; + brt_status.msg_bytes_curr += msgsize; + if (brt_status.msg_bytes_curr > brt_status.msg_bytes_max) { + brt_status.msg_bytes_max = brt_status.msg_bytes_curr; + } + brt_status.msg_num++; + if (brt_msg_applies_all(cmd)) { + brt_status.msg_num_broadcast++; + } } }