-
Notifications
You must be signed in to change notification settings - Fork 122
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
FT-684 : estimated # of rows in a table could become inaccurate after…
… deletes * Implemented 'logical row count' for new tables or recounted tables. * This will not replace the existing physical counting mechanism internally. * Adds a new, persisted counter value to the ft_header and return this new value in toku_ft_stat64 instead of the current value. * Counting: - New value will increment and decrement at high level calls from db_put, db_delete, etc: + toku_ft_insert_unique + toku_ft_maybe_insert + toku_ft_maybe_delete - Lower level leaf entry calls will also return delta values up to a point where they can be applied to the counter and are a result of message application to a leaf node. + inject_msg_in_locked_node - These deltas are needed for cases where the original count adjustment is not correct for the action: + An insert that turns into an update due to a duplicate key. (upsert) + A delete where the key doesn’t exist. (blind delete) + Transaction rollback. (unapplied rollback messages) *NOTE* If any of these three situations occur, the count will still report as somewhat inaccurate until the messages have been applied to all leaf entries affected. This is strictly a message delivery issue. * The new counter will need some starting state: - On a new index, the count will be set to 0 and counted correctly forward from there. - On an existing/upgraded index: + The count value will be set to some marker value (-1). When in this state, no logical row counting will be applied to this value and the row count estimate will return the current physical row count. + A new function will be exposed added that will perform a logical recount of all rows. Upon successful completion the logical row count in the ft_header will be set to this recounted value. + int recount_rows(DB*, int (*progress_callback)(uint64_t count, uint64_t deleted)void* progress_extra), void* progress_extra); + Algorithm will recount all real, logical rows in the tree and update the logical count value in ft_header. + progress_callback will be passed the current key count and the number of deleted ules seen since the last call. + Returning > 0 from progress_callback will cancel the operation and will not update the ft_header will not be updated if cancelled. + recount_rows will return 0 on success or > 0 if cancelled or error. + Initial implementation is very simple and uses the existing PerconaFT cursor navigation. This may be inefficient due to needing to take individual dives (and locks) down the tree for each key. + Resulting row count will be (more) inaccurate if tree has unapplied messages for any of the following conditions (which can be rectified by running an OPTIMIZE TABLE before running a row recount): = INSERT messages that will be converted to UPDATE on apply due to key already existing. (upserts) = DELETE messages that get discarded in apply due to missing keys. (blind deletes) = Rows that need rollback applied for INSERT or DELETE. (unapplied rollback messages) * Since the new counter extends the ft_header and bumps the version, there are data format upgrade/downgrade issues that need to be considered. * A fair bit of code format fixes on any adjacent lines, mostly function signature reformatting to style guidelines and line length restriction to 80.
- Loading branch information
George O. Lorch III
committed
Nov 14, 2015
1 parent
5573396
commit 944a0d9
Showing
33 changed files
with
2,241 additions
and
742 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,6 +36,7 @@ set(FT_SOURCES | |
ft-flusher | ||
ft-hot-flusher | ||
ft-ops | ||
ft-recount-rows | ||
ft-status | ||
ft-test-helpers | ||
ft-verify | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
/* -*- 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." | ||
|
||
#include "ft/serialize/block_table.h" | ||
#include "ft/ft.h" | ||
#include "ft/ft-internal.h" | ||
#include "ft/cursor.h" | ||
|
||
struct recount_rows_extra_t { | ||
int (*_progress_callback)( | ||
uint64_t count, | ||
uint64_t deleted, | ||
void* progress_extra); | ||
void* _progress_extra; | ||
uint64_t _keys; | ||
bool _cancelled; | ||
}; | ||
|
||
static int recount_rows_found( | ||
uint32_t UU(keylen), | ||
const void* key, | ||
uint32_t UU(vallen), | ||
const void* UU(val), | ||
void* extra, | ||
bool UU(lock_only)) { | ||
|
||
recount_rows_extra_t* rre = (recount_rows_extra_t*)extra; | ||
|
||
if (FT_LIKELY(key != nullptr)) { | ||
rre->_keys++; | ||
} | ||
return rre->_cancelled | ||
= rre->_progress_callback(rre->_keys, 0, rre->_progress_extra); | ||
} | ||
static bool recount_rows_interrupt(void* extra, uint64_t deleted_rows) { | ||
recount_rows_extra_t* rre = (recount_rows_extra_t*)extra; | ||
|
||
return rre->_cancelled = | ||
rre->_progress_callback(rre->_keys, deleted_rows, rre->_progress_extra); | ||
} | ||
int toku_ft_recount_rows( | ||
FT_HANDLE ft, | ||
int (*progress_callback)( | ||
uint64_t count, | ||
uint64_t deleted, | ||
void* progress_extra), | ||
void* progress_extra) { | ||
|
||
int ret = 0; | ||
recount_rows_extra_t rre = { | ||
progress_callback, | ||
progress_extra, | ||
0, | ||
false | ||
}; | ||
|
||
ft_cursor c; | ||
ret = toku_ft_cursor_create(ft, &c, nullptr, C_READ_ANY, false, false); | ||
if (ret) return ret; | ||
|
||
toku_ft_cursor_set_check_interrupt_cb( | ||
&c, | ||
recount_rows_interrupt, | ||
&rre); | ||
|
||
ret = toku_ft_cursor_first(&c, recount_rows_found, &rre); | ||
while (FT_LIKELY(ret == 0)) { | ||
ret = toku_ft_cursor_next(&c, recount_rows_found, &rre); | ||
} | ||
|
||
toku_ft_cursor_destroy(&c); | ||
|
||
if (rre._cancelled == false) { | ||
// update ft count | ||
toku_unsafe_set(&ft->ft->in_memory_logical_rows, rre._keys); | ||
ret = 0; | ||
} | ||
|
||
return ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.