summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnil Toshniwal <anil.toshniwal@oracle.com>2013-10-17 18:09:04 +0530
committerAnil Toshniwal <anil.toshniwal@oracle.com>2013-10-17 18:09:04 +0530
commit7c3d3f192ed893ae0990aeeedf4d0307084c77bf (patch)
tree0325a35bb64806c53b6dcd11aca164adea2882aa
parent1b199c144dee341833cb6c4e28721f5db67a1f74 (diff)
downloadmariadb-git-7c3d3f192ed893ae0990aeeedf4d0307084c77bf.tar.gz
Bug#17513737 INTRODUCE CHECK TABLE...QUICK
--Implemented CHECK TABLE...QUICK. Introduce CHECK TABLE...QUICK that would skip the btr_validate_index() and btr_search_validate() call, and count the no. of records in each index. Approved by Marko and Kevin. (rb#3567).
-rw-r--r--include/my_check_opt.h69
-rw-r--r--include/myisam.h47
-rw-r--r--storage/innobase/dict/dict0dict.c2
-rw-r--r--storage/innobase/handler/ha_innodb.cc68
-rw-r--r--storage/innobase/include/btr0sea.h2
5 files changed, 112 insertions, 76 deletions
diff --git a/include/my_check_opt.h b/include/my_check_opt.h
new file mode 100644
index 00000000000..7b064f69ef1
--- /dev/null
+++ b/include/my_check_opt.h
@@ -0,0 +1,69 @@
+/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; version 2 of the License.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
+
+#ifndef _my_check_opt_h
+#define _my_check_opt_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ All given definitions needed for MyISAM storage engine:
+ myisamchk.c or/and ha_myisam.cc or/and micheck.c
+ Some definitions are needed by the MySQL parser.
+*/
+
+#define T_AUTO_INC (1UL << 0)
+#define T_AUTO_REPAIR (1UL << 1)
+#define T_BACKUP_DATA (1UL << 2)
+#define T_CALC_CHECKSUM (1UL << 3)
+#define T_CHECK (1UL << 4)
+#define T_CHECK_ONLY_CHANGED (1UL << 5)
+#define T_CREATE_MISSING_KEYS (1UL << 6)
+#define T_DESCRIPT (1UL << 7)
+#define T_DONT_CHECK_CHECKSUM (1UL << 8)
+#define T_EXTEND (1UL << 9)
+#define T_FAST (1UL << 10)
+#define T_FORCE_CREATE (1UL << 11)
+#define T_FORCE_UNIQUENESS (1UL << 12)
+#define T_INFO (1UL << 13)
+/** CHECK TABLE...MEDIUM (the default) */
+#define T_MEDIUM (1UL << 14)
+/** CHECK TABLE...QUICK */
+#define T_QUICK (1UL << 15)
+#define T_READONLY (1UL << 16)
+#define T_REP (1UL << 17)
+#define T_REP_BY_SORT (1UL << 18)
+#define T_REP_PARALLEL (1UL << 19)
+#define T_RETRY_WITHOUT_QUICK (1UL << 20)
+#define T_SAFE_REPAIR (1UL << 21)
+#define T_SILENT (1UL << 22)
+#define T_SORT_INDEX (1UL << 23)
+#define T_SORT_RECORDS (1UL << 24)
+#define T_STATISTICS (1UL << 25)
+#define T_UNPACK (1UL << 26)
+#define T_UPDATE_STATE (1UL << 27)
+#define T_VERBOSE (1UL << 28)
+#define T_VERY_SILENT (1UL << 29)
+#define T_WAIT_FOREVER (1UL << 30)
+#define T_WRITE_LOOP (1UL << 31)
+
+#define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/myisam.h b/include/myisam.h
index dc9eac8f100..bf94fd7d8cd 100644
--- a/include/myisam.h
+++ b/include/myisam.h
@@ -33,7 +33,7 @@ extern "C" {
#endif
#include "my_compare.h"
#include <mysql/plugin.h>
-
+#include <my_check_opt.h>
/*
Limit max keys according to HA_MAX_POSSIBLE_KEY
*/
@@ -312,51 +312,6 @@ extern uint mi_get_pointer_length(ulonglong file_length, uint def);
#define MYISAMCHK_VERIFY 2 /* Verify, run repair if failure */
/*
- Definitions needed for myisamchk.c
-
- Entries marked as "QQ to be removed" are NOT used to
- pass check/repair options to mi_check.c. They are used
- internally by myisamchk.c or/and ha_myisam.cc and should NOT
- be stored together with other flags. They should be removed
- from the following list to make addition of new flags possible.
-*/
-
-#define T_AUTO_INC 1
-#define T_AUTO_REPAIR 2 /* QQ to be removed */
-#define T_BACKUP_DATA 4
-#define T_CALC_CHECKSUM 8
-#define T_CHECK 16 /* QQ to be removed */
-#define T_CHECK_ONLY_CHANGED 32 /* QQ to be removed */
-#define T_CREATE_MISSING_KEYS 64
-#define T_DESCRIPT 128
-#define T_DONT_CHECK_CHECKSUM 256
-#define T_EXTEND 512
-#define T_FAST (1L << 10) /* QQ to be removed */
-#define T_FORCE_CREATE (1L << 11) /* QQ to be removed */
-#define T_FORCE_UNIQUENESS (1L << 12)
-#define T_INFO (1L << 13)
-#define T_MEDIUM (1L << 14)
-#define T_QUICK (1L << 15) /* QQ to be removed */
-#define T_READONLY (1L << 16) /* QQ to be removed */
-#define T_REP (1L << 17)
-#define T_REP_BY_SORT (1L << 18) /* QQ to be removed */
-#define T_REP_PARALLEL (1L << 19) /* QQ to be removed */
-#define T_RETRY_WITHOUT_QUICK (1L << 20)
-#define T_SAFE_REPAIR (1L << 21)
-#define T_SILENT (1L << 22)
-#define T_SORT_INDEX (1L << 23) /* QQ to be removed */
-#define T_SORT_RECORDS (1L << 24) /* QQ to be removed */
-#define T_STATISTICS (1L << 25)
-#define T_UNPACK (1L << 26)
-#define T_UPDATE_STATE (1L << 27)
-#define T_VERBOSE (1L << 28)
-#define T_VERY_SILENT (1L << 29)
-#define T_WAIT_FOREVER (1L << 30)
-#define T_WRITE_LOOP ((ulong) 1L << 31)
-
-#define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
-
-/*
Flags used by myisamchk.c or/and ha_myisam.cc that are NOT passed
to mi_check.c follows:
*/
diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c
index 1fe7000f718..546794be26c 100644
--- a/storage/innobase/dict/dict0dict.c
+++ b/storage/innobase/dict/dict0dict.c
@@ -4485,6 +4485,8 @@ dict_update_statistics(
dict_index_t* index;
ulint sum_of_index_sizes = 0;
+ DBUG_EXECUTE_IF("skip_innodb_statistics", return;);
+
if (table->ibd_file_missing) {
ut_print_timestamp(stderr);
fprintf(stderr,
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 7d0a363be69..546b0b8905b 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -53,6 +53,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include <mysql/innodb_priv.h>
#include <mysql/psi/psi.h>
#include <my_sys.h>
+#include <my_check_opt.h>
/** @file ha_innodb.cc */
@@ -8466,8 +8467,7 @@ int
ha_innobase::check(
/*===============*/
THD* thd, /*!< in: user thread handle */
- HA_CHECK_OPT* check_opt) /*!< in: check options, currently
- ignored */
+ HA_CHECK_OPT* check_opt) /*!< in: check options */
{
dict_index_t* index;
ulint n_rows;
@@ -8524,11 +8524,6 @@ ha_innobase::check(
do additional check */
prebuilt->table->corrupted = FALSE;
- /* Enlarge the fatal lock wait timeout during CHECK TABLE. */
- mutex_enter(&kernel_mutex);
- srv_fatal_semaphore_wait_threshold += SRV_SEMAPHORE_WAIT_EXTENSION;
- mutex_exit(&kernel_mutex);
-
for (index = dict_table_get_first_index(prebuilt->table);
index != NULL;
index = dict_table_get_next_index(index)) {
@@ -8541,20 +8536,41 @@ ha_innobase::check(
/* If this is an index being created, break */
if (*index->name == TEMP_INDEX_PREFIX) {
- break;
- } else if (!btr_validate_index(index, prebuilt->trx)) {
- is_ok = FALSE;
+ continue;
+ }
+ if (!(check_opt->flags & T_QUICK)) {
+ /* Enlarge the fatal lock wait timeout during
+ CHECK TABLE. */
+ mutex_enter(&kernel_mutex);
+ srv_fatal_semaphore_wait_threshold +=
+ SRV_SEMAPHORE_WAIT_EXTENSION;
+ mutex_exit(&kernel_mutex);
+
+ ibool valid = TRUE;
+ valid = btr_validate_index(index, prebuilt->trx);
+
+ /* Restore the fatal lock wait timeout after
+ CHECK TABLE. */
+ mutex_enter(&kernel_mutex);
+ srv_fatal_semaphore_wait_threshold -=
+ SRV_SEMAPHORE_WAIT_EXTENSION;
+ mutex_exit(&kernel_mutex);
+
+ if (!valid) {
+ is_ok = FALSE;
- innobase_format_name(
- index_name, sizeof index_name,
- prebuilt->index->name, TRUE);
+ innobase_format_name(
+ index_name, sizeof index_name,
+ index->name, TRUE);
+ push_warning_printf(thd,
+ MYSQL_ERROR::WARN_LEVEL_WARN,
+ ER_NOT_KEYFILE,
+ "InnoDB: The B-tree of"
+ " index %s is corrupted.",
+ index_name);
- push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
- ER_NOT_KEYFILE,
- "InnoDB: The B-tree of"
- " index %s is corrupted.",
- index_name);
- continue;
+ continue;
+ }
}
/* Instead of invoking change_active_index(), set up
@@ -8658,21 +8674,17 @@ ha_innobase::check(
/* Restore the original isolation level */
prebuilt->trx->isolation_level = old_isolation_level;
- /* We validate also the whole adaptive hash index for all tables
- at every CHECK TABLE */
+#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
+ /* We validate the whole adaptive hash index for all tables
+ at every CHECK TABLE only when QUICK flag is not present. */
- if (!btr_search_validate()) {
+ if (!(check_opt->flags & T_QUICK) && !btr_search_validate()) {
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_NOT_KEYFILE,
"InnoDB: The adaptive hash index is corrupted.");
is_ok = FALSE;
}
-
- /* Restore the fatal lock wait timeout after CHECK TABLE. */
- mutex_enter(&kernel_mutex);
- srv_fatal_semaphore_wait_threshold -= SRV_SEMAPHORE_WAIT_EXTENSION;
- mutex_exit(&kernel_mutex);
-
+#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
prebuilt->trx->op_info = "";
if (thd_killed(user_thd)) {
my_error(ER_QUERY_INTERRUPTED, MYF(0));
diff --git a/storage/innobase/include/btr0sea.h b/storage/innobase/include/btr0sea.h
index 0ee68101ee7..081dc88435e 100644
--- a/storage/innobase/include/btr0sea.h
+++ b/storage/innobase/include/btr0sea.h
@@ -188,8 +188,6 @@ UNIV_INTERN
ibool
btr_search_validate(void);
/*======================*/
-#else
-# define btr_search_validate() TRUE
#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
/** The search info struct in an index */