Skip to content

Commit

Permalink
Merge branch 'merge/merge-innodb-5.6' into 10.0
Browse files Browse the repository at this point in the history
5.6.32
  • Loading branch information
vuvova committed Aug 10, 2016
2 parents 309c08c + b4f97a1 commit 57fbc60
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 22 deletions.
67 changes: 55 additions & 12 deletions storage/innobase/fts/fts0fts.cc
Expand Up @@ -265,13 +265,15 @@ FTS auxiliary INDEX table and clear the cache at the end.
@param[in,out] sync sync state
@param[in] unlock_cache whether unlock cache lock when write node
@param[in] wait whether wait when a sync is in progress
@param[in] has_dict whether has dict operation lock
@return DB_SUCCESS if all OK */
static
dberr_t
fts_sync(
fts_sync_t* sync,
bool unlock_cache,
bool wait);
bool wait,
bool has_dict);

/****************************************************************//**
Release all resources help by the words rb tree e.g., the node ilist. */
Expand Down Expand Up @@ -3567,7 +3569,7 @@ fts_add_doc_by_id(

DBUG_EXECUTE_IF(
"fts_instrument_sync_debug",
fts_sync(cache->sync, true, true);
fts_sync(cache->sync, true, true, false);
);

DEBUG_SYNC_C("fts_instrument_sync_request");
Expand Down Expand Up @@ -4379,13 +4381,11 @@ fts_sync_index(
}

/** Check if index cache has been synced completely
@param[in,out] sync sync state
@param[in,out] index_cache index cache
@return true if index is synced, otherwise false. */
static
bool
fts_sync_index_check(
fts_sync_t* sync,
fts_index_cache_t* index_cache)
{
const ib_rbt_node_t* rbt_node;
Expand All @@ -4408,14 +4408,36 @@ fts_sync_index_check(
return(true);
}

/*********************************************************************//**
Commit the SYNC, change state of processed doc ids etc.
/** Reset synced flag in index cache when rollback
@param[in,out] index_cache index cache */
static
void
fts_sync_index_reset(
fts_index_cache_t* index_cache)
{
const ib_rbt_node_t* rbt_node;

for (rbt_node = rbt_first(index_cache->words);
rbt_node != NULL;
rbt_node = rbt_next(index_cache->words, rbt_node)) {

fts_tokenizer_word_t* word;
word = rbt_value(fts_tokenizer_word_t, rbt_node);

fts_node_t* fts_node;
fts_node = static_cast<fts_node_t*>(ib_vector_last(word->nodes));

fts_node->synced = false;
}
}

/** Commit the SYNC, change state of processed doc ids etc.
@param[in,out] sync sync state
@return DB_SUCCESS if all OK */
static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t
fts_sync_commit(
/*============*/
fts_sync_t* sync) /*!< in: sync state */
fts_sync_t* sync)
{
dberr_t error;
trx_t* trx = sync->trx;
Expand Down Expand Up @@ -4468,6 +4490,8 @@ fts_sync_commit(
(double) n_nodes/ (double) elapsed_time);
}

/* Avoid assertion in trx_free(). */
trx->dict_operation_lock_mode = 0;
trx_free_for_background(trx);

return(error);
Expand All @@ -4490,6 +4514,10 @@ fts_sync_rollback(
index_cache = static_cast<fts_index_cache_t*>(
ib_vector_get(cache->indexes, i));

/* Reset synced flag so nodes will not be skipped
in the next sync, see fts_sync_write_words(). */
fts_sync_index_reset(index_cache);

for (j = 0; fts_index_selector[j].value; ++j) {

if (index_cache->ins_graph[j] != NULL) {
Expand All @@ -4515,6 +4543,9 @@ fts_sync_rollback(
rw_lock_x_unlock(&cache->lock);

fts_sql_rollback(trx);

/* Avoid assertion in trx_free(). */
trx->dict_operation_lock_mode = 0;
trx_free_for_background(trx);
}

Expand All @@ -4523,13 +4554,15 @@ FTS auxiliary INDEX table and clear the cache at the end.
@param[in,out] sync sync state
@param[in] unlock_cache whether unlock cache lock when write node
@param[in] wait whether wait when a sync is in progress
@param[in] has_dict whether has dict operation lock
@return DB_SUCCESS if all OK */
static
dberr_t
fts_sync(
fts_sync_t* sync,
bool unlock_cache,
bool wait)
bool wait,
bool has_dict)
{
ulint i;
dberr_t error = DB_SUCCESS;
Expand Down Expand Up @@ -4558,6 +4591,12 @@ fts_sync(
DEBUG_SYNC_C("fts_sync_begin");
fts_sync_begin(sync);

/* When sync in background, we hold dict operation lock
to prevent DDL like DROP INDEX, etc. */
if (has_dict) {
sync->trx->dict_operation_lock_mode = RW_S_LATCH;
}

begin_sync:
if (cache->total_size > fts_max_cache_size) {
/* Avoid the case: sync never finish when
Expand Down Expand Up @@ -4598,7 +4637,7 @@ fts_sync(
ib_vector_get(cache->indexes, i));

if (index_cache->index->to_be_dropped
|| fts_sync_index_check(sync, index_cache)) {
|| fts_sync_index_check(index_cache)) {
continue;
}

Expand All @@ -4613,6 +4652,7 @@ fts_sync(
}

rw_lock_x_lock(&cache->lock);
sync->interrupted = false;
sync->in_progress = false;
os_event_set(sync->event);
rw_lock_x_unlock(&cache->lock);
Expand All @@ -4636,20 +4676,23 @@ FTS auxiliary INDEX table and clear the cache at the end.
@param[in,out] table fts table
@param[in] unlock_cache whether unlock cache when write node
@param[in] wait whether wait for existing sync to finish
@param[in] has_dict whether has dict operation lock
@return DB_SUCCESS on success, error code on failure. */
UNIV_INTERN
dberr_t
fts_sync_table(
dict_table_t* table,
bool unlock_cache,
bool wait)
bool wait,
bool has_dict)
{
dberr_t err = DB_SUCCESS;

ut_ad(table->fts);

if (!dict_table_is_discarded(table) && table->fts->cache) {
err = fts_sync(table->fts->cache->sync, unlock_cache, wait);
err = fts_sync(table->fts->cache->sync,
unlock_cache, wait, has_dict);
}

return(err);
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/fts/fts0opt.cc
Expand Up @@ -2986,7 +2986,7 @@ fts_optimize_sync_table(

if (table) {
if (dict_table_has_fts_index(table) && table->fts->cache) {
fts_sync_table(table, true, false);
fts_sync_table(table, true, false, true);
}

dict_table_close(table, FALSE, FALSE);
Expand Down
7 changes: 5 additions & 2 deletions storage/innobase/handler/ha_innodb.cc
Expand Up @@ -6966,6 +6966,7 @@ dberr_t
ha_innobase::innobase_lock_autoinc(void)
/*====================================*/
{
DBUG_ENTER("ha_innobase::innobase_lock_autoinc");
dberr_t error = DB_SUCCESS;

ut_ad(!srv_read_only_mode);
Expand Down Expand Up @@ -7005,6 +7006,8 @@ ha_innobase::innobase_lock_autoinc(void)
/* Fall through to old style locking. */

case AUTOINC_OLD_STYLE_LOCKING:
DBUG_EXECUTE_IF("die_if_autoinc_old_lock_style_used",
ut_ad(0););
error = row_lock_table_autoinc_for_mysql(prebuilt);

if (error == DB_SUCCESS) {
Expand All @@ -7018,7 +7021,7 @@ ha_innobase::innobase_lock_autoinc(void)
ut_error;
}

return(error);
DBUG_RETURN(error);
}

/********************************************************************//**
Expand Down Expand Up @@ -11895,7 +11898,7 @@ ha_innobase::optimize(
if (innodb_optimize_fulltext_only) {
if (prebuilt->table->fts && prebuilt->table->fts->cache
&& !dict_table_is_discarded(prebuilt->table)) {
fts_sync_table(prebuilt->table, false, true);
fts_sync_table(prebuilt->table, false, true, false);
fts_optimize_table(prebuilt->table);
}
return(HA_ADMIN_OK);
Expand Down
39 changes: 37 additions & 2 deletions storage/innobase/handler/i_s.cc
@@ -1,6 +1,6 @@
/*****************************************************************************

Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2007, 2016, 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
Expand Down Expand Up @@ -2963,15 +2963,26 @@ i_s_fts_deleted_generic_fill(
DBUG_RETURN(0);
}

deleted = fts_doc_ids_create();
/* Prevent DDL to drop fts aux tables. */
rw_lock_s_lock(&dict_operation_lock);

user_table = dict_table_open_on_name(
fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);

if (!user_table) {
rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
} else if (!dict_table_has_fts_index(user_table)) {
dict_table_close(user_table, FALSE, FALSE);

rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

deleted = fts_doc_ids_create();

trx = trx_allocate_for_background();
trx->op_info = "Select for FTS DELETE TABLE";

Expand Down Expand Up @@ -2999,6 +3010,8 @@ i_s_fts_deleted_generic_fill(

dict_table_close(user_table, FALSE, FALSE);

rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

Expand Down Expand Up @@ -3372,6 +3385,12 @@ i_s_fts_index_cache_fill(
DBUG_RETURN(0);
}

if (user_table->fts == NULL || user_table->fts->cache == NULL) {
dict_table_close(user_table, FALSE, FALSE);

DBUG_RETURN(0);
}

cache = user_table->fts->cache;

ut_a(cache);
Expand Down Expand Up @@ -3806,10 +3825,15 @@ i_s_fts_index_table_fill(
DBUG_RETURN(0);
}

/* Prevent DDL to drop fts aux tables. */
rw_lock_s_lock(&dict_operation_lock);

user_table = dict_table_open_on_name(
fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);

if (!user_table) {
rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

Expand All @@ -3822,6 +3846,8 @@ i_s_fts_index_table_fill(

dict_table_close(user_table, FALSE, FALSE);

rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

Expand Down Expand Up @@ -3957,14 +3983,21 @@ i_s_fts_config_fill(

fields = table->field;

/* Prevent DDL to drop fts aux tables. */
rw_lock_s_lock(&dict_operation_lock);

user_table = dict_table_open_on_name(
fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);

if (!user_table) {
rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
} else if (!dict_table_has_fts_index(user_table)) {
dict_table_close(user_table, FALSE, FALSE);

rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

Expand Down Expand Up @@ -4020,6 +4053,8 @@ i_s_fts_config_fill(

dict_table_close(user_table, FALSE, FALSE);

rw_lock_s_unlock(&dict_operation_lock);

DBUG_RETURN(0);
}

Expand Down
4 changes: 3 additions & 1 deletion storage/innobase/include/fts0fts.h
Expand Up @@ -840,13 +840,15 @@ FTS auxiliary INDEX table and clear the cache at the end.
@param[in,out] table fts table
@param[in] unlock_cache whether unlock cache when write node
@param[in] wait whether wait for existing sync to finish
@param[in] has_dict whether has dict operation lock
@return DB_SUCCESS on success, error code on failure. */
UNIV_INTERN
dberr_t
fts_sync_table(
dict_table_t* table,
bool unlock_cache,
bool wait);
bool wait,
bool has_dict);

/****************************************************************//**
Free the query graph but check whether dict_sys->mutex is already
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/include/univ.i
Expand Up @@ -44,7 +44,7 @@ Created 1/20/1994 Heikki Tuuri

#define INNODB_VERSION_MAJOR 5
#define INNODB_VERSION_MINOR 6
#define INNODB_VERSION_BUGFIX 31
#define INNODB_VERSION_BUGFIX 32

/* The following is the InnoDB version as shown in
SELECT plugin_version FROM information_schema.plugins;
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/row/row0merge.cc
Expand Up @@ -1987,7 +1987,7 @@ row_merge_read_clustered_index(
/* Sync fts cache for other fts indexes to keep all
fts indexes consistent in sync_doc_id. */
err = fts_sync_table(const_cast<dict_table_t*>(new_table),
false, true);
false, true, false);

if (err == DB_SUCCESS) {
fts_update_next_doc_id(
Expand Down
7 changes: 5 additions & 2 deletions storage/innobase/srv/srv0mon.cc
@@ -1,6 +1,6 @@
/*****************************************************************************

Copyright (c) 2010, 2014, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc.

This program is free software; you can redistribute it and/or modify it under
Expand Down Expand Up @@ -1367,7 +1367,10 @@ srv_mon_set_module_control(
module */
set_current_module = FALSE;
} else if (module_id == MONITOR_ALL_COUNTER) {
continue;
if (!(innodb_counter_info[ix].monitor_type
& MONITOR_GROUP_MODULE)) {
continue;
}
} else {
/* Hitting the next module, stop */
break;
Expand Down

0 comments on commit 57fbc60

Please sign in to comment.