summaryrefslogtreecommitdiff
path: root/storage/tokudb/PerconaFT/ft/ft-flusher.h
diff options
context:
space:
mode:
Diffstat (limited to 'storage/tokudb/PerconaFT/ft/ft-flusher.h')
-rw-r--r--storage/tokudb/PerconaFT/ft/ft-flusher.h147
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 00000000000..347bc325a92
--- /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);