Commit 4ef64e01 authored by Vicențiu Ciorbaru's avatar Vicențiu Ciorbaru

5.6.38

parent d36bd697
...@@ -195,7 +195,7 @@ dict_stats_wait_bg_to_stop_using_table( ...@@ -195,7 +195,7 @@ dict_stats_wait_bg_to_stop_using_table(
unlocking/locking the data dict */ unlocking/locking the data dict */
{ {
while (!dict_stats_stop_bg(table)) { while (!dict_stats_stop_bg(table)) {
DICT_STATS_BG_YIELD(trx); DICT_BG_YIELD(trx);
} }
} }
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -25,6 +25,7 @@ Full Text Search interface ...@@ -25,6 +25,7 @@ Full Text Search interface
#include "row0mysql.h" #include "row0mysql.h"
#include "row0upd.h" #include "row0upd.h"
#include "dict0types.h" #include "dict0types.h"
#include "dict0stats_bg.h"
#include "row0sel.h" #include "row0sel.h"
#include "fts0fts.h" #include "fts0fts.h"
...@@ -867,18 +868,37 @@ fts_drop_index( ...@@ -867,18 +868,37 @@ fts_drop_index(
err = fts_drop_index_tables(trx, index); err = fts_drop_index_tables(trx, index);
fts_free(table); for(;;) {
bool retry = false;
if (index->index_fts_syncing) {
retry = true;
}
if (!retry){
fts_free(table);
break;
}
DICT_BG_YIELD(trx);
}
return(err); return(err);
} }
current_doc_id = table->fts->cache->next_doc_id; for(;;) {
first_doc_id = table->fts->cache->first_doc_id; bool retry = false;
fts_cache_clear(table->fts->cache); if (index->index_fts_syncing) {
fts_cache_destroy(table->fts->cache); retry = true;
table->fts->cache = fts_cache_create(table); }
table->fts->cache->next_doc_id = current_doc_id; if (!retry){
table->fts->cache->first_doc_id = first_doc_id; current_doc_id = table->fts->cache->next_doc_id;
first_doc_id = table->fts->cache->first_doc_id;
fts_cache_clear(table->fts->cache);
fts_cache_destroy(table->fts->cache);
table->fts->cache = fts_cache_create(table);
table->fts->cache->next_doc_id = current_doc_id;
table->fts->cache->first_doc_id = first_doc_id;
break;
}
DICT_BG_YIELD(trx);
}
} else { } else {
fts_cache_t* cache = table->fts->cache; fts_cache_t* cache = table->fts->cache;
fts_index_cache_t* index_cache; fts_index_cache_t* index_cache;
...@@ -888,9 +908,17 @@ fts_drop_index( ...@@ -888,9 +908,17 @@ fts_drop_index(
index_cache = fts_find_index_cache(cache, index); index_cache = fts_find_index_cache(cache, index);
if (index_cache != NULL) { if (index_cache != NULL) {
if (index_cache->words) { for(;;) {
fts_words_free(index_cache->words); bool retry = false;
rbt_free(index_cache->words); if (index->index_fts_syncing) {
retry = true;
}
if (!retry && index_cache->words) {
fts_words_free(index_cache->words);
rbt_free(index_cache->words);
break;
}
DICT_BG_YIELD(trx);
} }
ib_vector_remove(cache->indexes, *(void**) index_cache); ib_vector_remove(cache->indexes, *(void**) index_cache);
...@@ -4611,10 +4639,16 @@ fts_sync( ...@@ -4611,10 +4639,16 @@ fts_sync(
index_cache = static_cast<fts_index_cache_t*>( index_cache = static_cast<fts_index_cache_t*>(
ib_vector_get(cache->indexes, i)); ib_vector_get(cache->indexes, i));
if (index_cache->index->to_be_dropped) { if (index_cache->index->to_be_dropped
|| index_cache->index->table->to_be_dropped) {
continue; continue;
} }
index_cache->index->index_fts_syncing = true;
DBUG_EXECUTE_IF("fts_instrument_sync_sleep_drop_waits",
os_thread_sleep(10000000);
);
error = fts_sync_index(sync, index_cache); error = fts_sync_index(sync, index_cache);
if (error != DB_SUCCESS && !sync->interrupted) { if (error != DB_SUCCESS && !sync->interrupted) {
...@@ -4647,11 +4681,33 @@ fts_sync( ...@@ -4647,11 +4681,33 @@ fts_sync(
end_sync: end_sync:
if (error == DB_SUCCESS && !sync->interrupted) { if (error == DB_SUCCESS && !sync->interrupted) {
error = fts_sync_commit(sync); error = fts_sync_commit(sync);
if (error == DB_SUCCESS) {
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
fts_index_cache_t* index_cache;
index_cache = static_cast<fts_index_cache_t*>(
ib_vector_get(cache->indexes, i));
if (index_cache->index->index_fts_syncing) {
index_cache->index->index_fts_syncing
= false;
}
}
}
} else { } else {
fts_sync_rollback(sync); fts_sync_rollback(sync);
} }
rw_lock_x_lock(&cache->lock); rw_lock_x_lock(&cache->lock);
/* Clear fts syncing flags of any indexes incase sync is
interrupeted */
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
fts_index_cache_t* index_cache;
index_cache = static_cast<fts_index_cache_t*>(
ib_vector_get(cache->indexes, i));
if (index_cache->index->index_fts_syncing == true) {
index_cache->index->index_fts_syncing = false;
}
}
sync->interrupted = false; sync->interrupted = false;
sync->in_progress = false; sync->in_progress = false;
os_event_set(sync->event); os_event_set(sync->event);
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -2970,13 +2970,6 @@ fts_optimize_sync_table( ...@@ -2970,13 +2970,6 @@ fts_optimize_sync_table(
{ {
dict_table_t* table = NULL; dict_table_t* table = NULL;
/* Prevent DROP INDEX etc. from running when we are syncing
cache in background. */
if (!rw_lock_s_lock_nowait(&dict_operation_lock, __FILE__, __LINE__)) {
/* Exit when fail to get dict operation lock. */
return;
}
table = dict_table_open_on_id(table_id, FALSE, DICT_TABLE_OP_NORMAL); table = dict_table_open_on_id(table_id, FALSE, DICT_TABLE_OP_NORMAL);
if (table) { if (table) {
...@@ -2986,8 +2979,6 @@ fts_optimize_sync_table( ...@@ -2986,8 +2979,6 @@ fts_optimize_sync_table(
dict_table_close(table, FALSE, FALSE); dict_table_close(table, FALSE, FALSE);
} }
rw_lock_s_unlock(&dict_operation_lock);
} }
/**********************************************************************//** /**********************************************************************//**
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -3632,6 +3632,11 @@ fts_query_free( ...@@ -3632,6 +3632,11 @@ fts_query_free(
fts_doc_ids_free(query->deleted); fts_doc_ids_free(query->deleted);
} }
if (query->intersection) {
fts_query_free_doc_ids(query, query->intersection);
query->intersection = NULL;
}
if (query->doc_ids) { if (query->doc_ids) {
fts_query_free_doc_ids(query, query->doc_ids); fts_query_free_doc_ids(query, query->doc_ids);
} }
......
...@@ -15834,7 +15834,7 @@ buffer_pool_load_now( ...@@ -15834,7 +15834,7 @@ buffer_pool_load_now(
const void* save) /*!< in: immediate result from const void* save) /*!< in: immediate result from
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save && !srv_read_only_mode) {
buf_load_start(); buf_load_start();
} }
} }
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -5607,7 +5607,47 @@ ha_innobase::commit_inplace_alter_table( ...@@ -5607,7 +5607,47 @@ ha_innobase::commit_inplace_alter_table(
break; break;
} }
DICT_STATS_BG_YIELD(trx); DICT_BG_YIELD(trx);
}
/* Make a concurrent Drop fts Index to wait until sync of that
fts index is happening in the background */
for (;;) {
bool retry = false;
for (inplace_alter_handler_ctx** pctx = ctx_array;
*pctx; pctx++) {
int count =0;
ha_innobase_inplace_ctx* ctx
= static_cast<ha_innobase_inplace_ctx*>(*pctx);
DBUG_ASSERT(new_clustered == ctx->need_rebuild());
if (dict_fts_index_syncing(ctx->old_table)) {
count++;
if (count == 100) {
fprintf(stderr,
"Drop index waiting for background sync"
"to finish\n");
}
retry = true;
}
if (new_clustered && dict_fts_index_syncing(ctx->new_table)) {
count++;
if (count == 100) {
fprintf(stderr,
"Drop index waiting for background sync"
"to finish\n");
}
retry = true;
}
}
if (!retry) {
break;
}
DICT_BG_YIELD(trx);
} }
/* Apply the changes to the data dictionary tables, for all /* Apply the changes to the data dictionary tables, for all
...@@ -5923,8 +5963,13 @@ ha_innobase::commit_inplace_alter_table( ...@@ -5923,8 +5963,13 @@ ha_innobase::commit_inplace_alter_table(
ut_d(dict_table_check_for_dup_indexes( ut_d(dict_table_check_for_dup_indexes(
ctx->new_table, CHECK_ABORTED_OK)); ctx->new_table, CHECK_ABORTED_OK));
ut_a(fts_check_cached_index(ctx->new_table));
#ifdef UNIV_DEBUG
if (!(ctx->new_table->fts != NULL
&& ctx->new_table->fts->cache->sync->in_progress)) {
ut_a(fts_check_cached_index(ctx->new_table));
}
#endif
if (new_clustered) { if (new_clustered) {
/* Since the table has been rebuilt, we remove /* Since the table has been rebuilt, we remove
all persistent statistics corresponding to the all persistent statistics corresponding to the
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -909,6 +909,27 @@ dict_table_x_lock_indexes( ...@@ -909,6 +909,27 @@ dict_table_x_lock_indexes(
} }
} }
/*********************************************************************//**
Returns true if the particular FTS index in the table is still syncing
in the background, false otherwise.
@param [in] table Table containing FTS index
@return True if sync of fts index is still going in the background */
UNIV_INLINE
bool
dict_fts_index_syncing(
dict_table_t* table)
{
dict_index_t* index;
for (index = dict_table_get_first_index(table);
index != NULL;
index = dict_table_get_next_index(index)) {
if (index->index_fts_syncing) {
return(true);
}
}
return(false);
}
/*********************************************************************//** /*********************************************************************//**
Release the exclusive locks on all index tree. */ Release the exclusive locks on all index tree. */
UNIV_INLINE UNIV_INLINE
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
...@@ -606,6 +606,8 @@ struct dict_index_t{ ...@@ -606,6 +606,8 @@ struct dict_index_t{
dict_sys->mutex. Other changes are dict_sys->mutex. Other changes are
protected by index->lock. */ protected by index->lock. */
dict_field_t* fields; /*!< array of field descriptions */ dict_field_t* fields; /*!< array of field descriptions */
bool index_fts_syncing;/*!< Whether the fts index is
still syncing in the background */
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
UT_LIST_NODE_T(dict_index_t) UT_LIST_NODE_T(dict_index_t)
indexes;/*!< list of indexes of the table */ indexes;/*!< list of indexes of the table */
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -59,7 +59,7 @@ dict_stats_recalc_pool_del( ...@@ -59,7 +59,7 @@ dict_stats_recalc_pool_del(
/** Yield the data dictionary latch when waiting /** Yield the data dictionary latch when waiting
for the background thread to stop accessing a table. for the background thread to stop accessing a table.
@param trx transaction holding the data dictionary locks */ @param trx transaction holding the data dictionary locks */
#define DICT_STATS_BG_YIELD(trx) do { \ #define DICT_BG_YIELD(trx) do { \
row_mysql_unlock_data_dictionary(trx); \ row_mysql_unlock_data_dictionary(trx); \
os_thread_sleep(250000); \ os_thread_sleep(250000); \
row_mysql_lock_data_dictionary(trx); \ row_mysql_lock_data_dictionary(trx); \
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -56,6 +56,7 @@ Created 9/17/2000 Heikki Tuuri ...@@ -56,6 +56,7 @@ Created 9/17/2000 Heikki Tuuri
#include "log0log.h" #include "log0log.h"
#include "btr0sea.h" #include "btr0sea.h"
#include "fil0fil.h" #include "fil0fil.h"
#include "srv0srv.h"
#include "ibuf0ibuf.h" #include "ibuf0ibuf.h"
#include "fts0fts.h" #include "fts0fts.h"
#include "fts0types.h" #include "fts0types.h"
...@@ -3870,6 +3871,16 @@ row_drop_table_for_mysql( ...@@ -3870,6 +3871,16 @@ row_drop_table_for_mysql(
ut_ad(!table->fts->add_wq); ut_ad(!table->fts->add_wq);
ut_ad(lock_trx_has_sys_table_locks(trx) == 0); ut_ad(lock_trx_has_sys_table_locks(trx) == 0);
for (;;) {
bool retry = false;
if (dict_fts_index_syncing(table)) {
retry = true;
}
if (!retry) {
break;
}
DICT_BG_YIELD(trx);
}
row_mysql_unlock_data_dictionary(trx); row_mysql_unlock_data_dictionary(trx);
fts_optimize_remove_table(table); fts_optimize_remove_table(table);
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
......
...@@ -2964,8 +2964,8 @@ row_sel_store_mysql_rec( ...@@ -2964,8 +2964,8 @@ row_sel_store_mysql_rec(
const ulint* offsets, const ulint* offsets,
bool clust_templ_for_sec) bool clust_templ_for_sec)
{ {
ulint i; ulint i;
std::vector<ulint> template_col; std::vector<const dict_col_t*> template_col;
ut_ad(rec_clust || index == prebuilt->index); ut_ad(rec_clust || index == prebuilt->index);
ut_ad(!rec_clust || dict_index_is_clust(index)); ut_ad(!rec_clust || dict_index_is_clust(index));
...@@ -2976,13 +2976,24 @@ row_sel_store_mysql_rec( ...@@ -2976,13 +2976,24 @@ row_sel_store_mysql_rec(
} }
if (clust_templ_for_sec) { if (clust_templ_for_sec) {
/* Store all clustered index field of /* Store all clustered index column of
secondary index record. */ secondary index record. */
for (i = 0; i < dict_index_get_n_fields( for (i = 0; i < dict_index_get_n_fields(
prebuilt->index); i++) { prebuilt->index); i++) {
ulint sec_field = dict_index_get_nth_field_pos( ulint sec_field = dict_index_get_nth_field_pos(
index, prebuilt->index, i); index, prebuilt->index, i);
template_col.push_back(sec_field);
if (sec_field == ULINT_UNDEFINED) {
template_col.push_back(NULL);
continue;
}
const dict_field_t* field =
dict_index_get_nth_field(index, sec_field);
const dict_col_t* col =
dict_field_get_col(field);
template_col.push_back(col);
} }
} }
...@@ -3000,9 +3011,13 @@ row_sel_store_mysql_rec( ...@@ -3000,9 +3011,13 @@ row_sel_store_mysql_rec(
== 0); == 0);
if (clust_templ_for_sec) { if (clust_templ_for_sec) {
std::vector<ulint>::iterator it; std::vector<const dict_col_t*>::iterator it;
const dict_field_t* field =
dict_index_get_nth_field(index, field_no);
const dict_col_t* col = dict_field_get_col(
field);
it = std::find(template_col.begin(), it = std::find(template_col.begin(),
template_col.end(), field_no); template_col.end(), col);
if (it == template_col.end()) { if (it == template_col.end()) {
continue; continue;
...@@ -4345,6 +4360,10 @@ row_search_for_mysql( ...@@ -4345,6 +4360,10 @@ row_search_for_mysql(
if (page_rec_is_supremum(rec)) { if (page_rec_is_supremum(rec)) {
DBUG_EXECUTE_IF("compare_end_range",
if (end_loop < 100) {
end_loop = 100;
});
/** Compare the last record of the page with end range /** Compare the last record of the page with end range
passed to InnoDB when there is no ICP and number of loops passed to InnoDB when there is no ICP and number of loops
in row_search_for_mysql for rows found but not in row_search_for_mysql for rows found but not
...@@ -4385,7 +4404,7 @@ row_search_for_mysql( ...@@ -4385,7 +4404,7 @@ row_search_for_mysql(
/** In case of prebuilt->fetch, /** In case of prebuilt->fetch,
set the error in prebuilt->end_range. */ set the error in prebuilt->end_range. */
if (prebuilt->n_fetch_cached > 0) { if (next_buf != NULL) {
prebuilt->end_range = true; prebuilt->end_range = true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment