diff options
Diffstat (limited to 'storage/tokudb/PerconaFT/ft/ft-flusher.h')
-rw-r--r-- | storage/tokudb/PerconaFT/ft/ft-flusher.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/storage/tokudb/PerconaFT/ft/ft-flusher.h b/storage/tokudb/PerconaFT/ft/ft-flusher.h new file mode 100644 index 00000000..347bc325 --- /dev/null +++ b/storage/tokudb/PerconaFT/ft/ft-flusher.h @@ -0,0 +1,147 @@ +/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: +#ident "$Id$" +/*====== +This file is part of PerconaFT. + + +Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. + + PerconaFT is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2, + as published by the Free Software Foundation. + + PerconaFT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. + +---------------------------------------- + + PerconaFT is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License, version 3, + as published by the Free Software Foundation. + + PerconaFT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. +======= */ + +#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." + +#pragma once + +#include "ft/ft-internal.h" + +void toku_ft_flusher_get_status(FT_FLUSHER_STATUS); + +/** + * Only for testing, not for production. + * + * Set a callback the flusher thread will use to signal various points + * during its execution. + */ +void +toku_flusher_thread_set_callback( + void (*callback_f)(int, void*), + void* extra + ); + +/** + * Puts a workitem on the flusher thread queue, scheduling the node to be + * flushed by toku_ft_flush_some_child. + */ +void toku_ft_flush_node_on_background_thread(FT ft, FTNODE parent); + +enum split_mode { + SPLIT_EVENLY, + SPLIT_LEFT_HEAVY, + SPLIT_RIGHT_HEAVY +}; + + +// Given pinned node and pinned child, split child into two +// and update node with information about its new child. +void toku_ft_split_child( + FT ft, + FTNODE node, + int childnum, + FTNODE child, + enum split_mode split_mode + ); + +// Given pinned node, merge childnum with a neighbor and update node with +// information about the change +void toku_ft_merge_child( + FT ft, + FTNODE node, + int childnum + ); + +/** + * Effect: Split a leaf node. + * Argument "node" is node to be split. + * Upon return: + * nodea and nodeb point to new nodes that result from split of "node" + * nodea is the left node that results from the split + * splitk is the right-most key of nodea + */ +// TODO: Rename toku_ft_leaf_split +void +ftleaf_split( + FT ft, + FTNODE node, + FTNODE *nodea, + FTNODE *nodeb, + DBT *splitk, + bool create_new_node, + enum split_mode split_mode, + uint32_t num_dependent_nodes, + FTNODE* dependent_nodes + ); + +/** + * Effect: node must be a node-leaf node. It is split into two nodes, and + * the fanout is split between them. + * Sets splitk->data pointer to a malloc'd value + * Sets nodea, and nodeb to the two new nodes. + * The caller must replace the old node with the two new nodes. + * This function will definitely reduce the number of children for the node, + * but it does not guarantee that the resulting nodes are smaller than nodesize. + */ +void +// TODO: Rename toku_ft_nonleaf_split +ft_nonleaf_split( + FT ft, + FTNODE node, + FTNODE *nodea, + FTNODE *nodeb, + DBT *splitk, + uint32_t num_dependent_nodes, + FTNODE* dependent_nodes + ); + +/************************************************************************ + * HOT optimize, should perhaps be factored out to its own header file * + ************************************************************************ + */ +void toku_ft_hot_get_status(FT_HOT_STATUS); + +/** + * Takes given FT and pushes all pending messages between left and right to the leaf nodes. + * All messages between left and right (inclusive) will be pushed, as will some others + * that happen to share buffers with messages near the boundary. + * If left is NULL, messages from beginning of FT are pushed. If right is NULL, that means + * we go until the end of the FT. + */ +int +toku_ft_hot_optimize(FT_HANDLE ft_h, DBT* left, DBT* right, + int (*progress_callback)(void *extra, float progress), + void *progress_extra, uint64_t* loops_run); |