diff options
Diffstat (limited to 'storage/tokudb/PerconaFT/ft/ft-flusher-internal.h')
-rw-r--r-- | storage/tokudb/PerconaFT/ft/ft-flusher-internal.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/storage/tokudb/PerconaFT/ft/ft-flusher-internal.h b/storage/tokudb/PerconaFT/ft/ft-flusher-internal.h new file mode 100644 index 00000000000..0e47cbb7dd0 --- /dev/null +++ b/storage/tokudb/PerconaFT/ft/ft-flusher-internal.h @@ -0,0 +1,183 @@ +/* -*- 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 + +#define flt_flush_before_applying_inbox 1 +#define flt_flush_before_child_pin 2 +#define ft_flush_aflter_child_pin 3 +#define flt_flush_before_split 4 +#define flt_flush_during_split 5 +#define flt_flush_before_merge 6 +#define ft_flush_aflter_merge 7 +#define ft_flush_aflter_rebalance 8 +#define flt_flush_before_unpin_remove 9 +#define flt_flush_before_pin_second_node_for_merge 10 + +typedef struct flusher_advice FLUSHER_ADVICE; + +/** + * Choose a child to flush to. Returns a childnum, or -1 if we should + * go no further. + * + * Flusher threads: pick the heaviest child buffer + * Cleaner threads: pick the heaviest child buffer + * Cleaner thread merging leaf nodes: follow down to a key + * Hot optimize table: follow down to the right of a key + */ +typedef int (*FA_PICK_CHILD)(FT ft, FTNODE parent, void* extra); + +/** + * Decide whether to call `toku_ft_flush_some_child` on the child if it is + * stable and a nonleaf node. + * + * Flusher threads: yes if child is gorged + * Cleaner threads: yes if child is gorged + * Cleaner thread merging leaf nodes: always yes + * Hot optimize table: always yes + */ +typedef bool (*FA_SHOULD_RECURSIVELY_FLUSH)(FTNODE child, void* extra); + +/** + * Called if the child needs merging. Should do something to get the + * child out of a fusible state. Must unpin parent and child. + * + * Flusher threads: just do the merge + * Cleaner threads: if nonleaf, just merge, otherwise start a "cleaner + * thread merge" + * Cleaner thread merging leaf nodes: just do the merge + * Hot optimize table: just do the merge + */ +typedef void (*FA_MAYBE_MERGE_CHILD)(struct flusher_advice *fa, + FT ft, + FTNODE parent, + int childnum, + FTNODE child, + void* extra); + +/** + * Cleaner threads may need to destroy basement nodes which have been + * brought more up to date than the height 1 node flushing to them. + * This function is used to determine if we need to check for basement + * nodes that are too up to date, and then destroy them if we find + * them. + * + * Flusher threads: no + * Cleaner threads: yes + * Cleaner thread merging leaf nodes: no + * Hot optimize table: no + */ +typedef bool (*FA_SHOULD_DESTROY_BN)(void* extra); + +/** + * Update `ft_flusher_status` in whatever way necessary. Called once + * by `toku_ft_flush_some_child` right before choosing what to do next (split, + * merge, recurse), with the number of nodes that were dirtied by this + * execution of `toku_ft_flush_some_child`. + */ +typedef void (*FA_UPDATE_STATUS)(FTNODE child, int dirtied, void* extra); + +/** + * Choose whether to go to the left or right child after a split. Called + * by `ft_split_child`. If -1 is returned, `ft_split_child` defaults to + * the old behavior. + */ +typedef int (*FA_PICK_CHILD_AFTER_SPLIT)(FT ft, + FTNODE node, + int childnuma, + int childnumb, + void* extra); + +/** + * A collection of callbacks used by the flushing machinery to make + * various decisions. There are implementations of each of these + * functions for flusher threads (flt_*), cleaner threads (ct_*), , and hot + * optimize table (hot_*). + */ +struct flusher_advice { + FA_PICK_CHILD pick_child; + FA_SHOULD_RECURSIVELY_FLUSH should_recursively_flush; + FA_MAYBE_MERGE_CHILD maybe_merge_child; + FA_SHOULD_DESTROY_BN should_destroy_basement_nodes; + FA_UPDATE_STATUS update_status; + FA_PICK_CHILD_AFTER_SPLIT pick_child_after_split; + void* extra; // parameter passed into callbacks +}; + +void +flusher_advice_init( + struct flusher_advice *fa, + FA_PICK_CHILD pick_child, + FA_SHOULD_DESTROY_BN should_destroy_basement_nodes, + FA_SHOULD_RECURSIVELY_FLUSH should_recursively_flush, + FA_MAYBE_MERGE_CHILD maybe_merge_child, + FA_UPDATE_STATUS update_status, + FA_PICK_CHILD_AFTER_SPLIT pick_child_after_split, + void* extra + ); + +void toku_ft_flush_some_child( + FT ft, + FTNODE parent, + struct flusher_advice *fa + ); + +bool +always_recursively_flush(FTNODE child, void* extra); + +bool +never_recursively_flush(FTNODE UU(child), void* UU(extra)); + +bool +dont_destroy_basement_nodes(void* extra); + +void +default_merge_child(struct flusher_advice *fa, + FT ft, + FTNODE parent, + int childnum, + FTNODE child, + void* extra); + +int +default_pick_child_after_split(FT ft, + FTNODE parent, + int childnuma, + int childnumb, + void *extra); + |