mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
147 lines
4.6 KiB
C++
147 lines
4.6 KiB
C++
/* -*- 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);
|