Skip to content

Commit

Permalink
5.6.32
Browse files Browse the repository at this point in the history
  • Loading branch information
vuvova committed Aug 10, 2016
1 parent 720e04f commit b4f97a1
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 21 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 @@ -3566,7 +3568,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 @@ -4378,13 +4380,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 @@ -4407,14 +4407,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 @@ -4467,6 +4489,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 @@ -4489,6 +4513,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 @@ -4514,6 +4542,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 @@ -4522,13 +4553,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 @@ -4557,6 +4590,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 @@ -4597,7 +4636,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 @@ -4612,6 +4651,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 @@ -4635,20 +4675,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 @@ -6529,6 +6529,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 @@ -6563,6 +6564,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 @@ -6576,7 +6579,7 @@ ha_innobase::innobase_lock_autoinc(void)
ut_error;
}

return(error);
DBUG_RETURN(error);
}

/********************************************************************//**
Expand Down Expand Up @@ -11392,7 +11395,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 @@ -3004,15 +3004,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 @@ -3040,6 +3051,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 @@ -3421,6 +3434,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 @@ -3859,10 +3878,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 @@ -3875,6 +3899,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 @@ -4014,14 +4040,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 @@ -4077,6 +4110,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/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 @@ -1347,7 +1347,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 b4f97a1

Please sign in to comment.