summaryrefslogtreecommitdiff
path: root/storage/xtradb/fts/fts0opt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/xtradb/fts/fts0opt.cc')
-rw-r--r--storage/xtradb/fts/fts0opt.cc81
1 files changed, 60 insertions, 21 deletions
diff --git a/storage/xtradb/fts/fts0opt.cc b/storage/xtradb/fts/fts0opt.cc
index 00b3b4682c3..ccb7090c61d 100644
--- a/storage/xtradb/fts/fts0opt.cc
+++ b/storage/xtradb/fts/fts0opt.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
@@ -87,6 +87,7 @@ enum fts_msg_type_t {
FTS_MSG_DEL_TABLE, /*!< Remove a table from the optimize
threads work queue */
+ FTS_MSG_SYNC_TABLE /*!< Sync fts cache of a table */
};
/** Compressed list of words that have been read from FTS INDEX
@@ -2652,6 +2653,39 @@ fts_optimize_remove_table(
os_event_free(event);
}
+/** Send sync fts cache for the table.
+@param[in] table table to sync */
+UNIV_INTERN
+void
+fts_optimize_request_sync_table(
+ dict_table_t* table)
+{
+ fts_msg_t* msg;
+ table_id_t* table_id;
+
+ /* if the optimize system not yet initialized, return */
+ if (!fts_optimize_wq) {
+ return;
+ }
+
+ /* FTS optimizer thread is already exited */
+ if (fts_opt_start_shutdown) {
+ ib_logf(IB_LOG_LEVEL_INFO,
+ "Try to sync table %s after FTS optimize"
+ " thread exiting.", table->name);
+ return;
+ }
+
+ msg = fts_optimize_create_msg(FTS_MSG_SYNC_TABLE, NULL);
+
+ table_id = static_cast<table_id_t*>(
+ mem_heap_alloc(msg->heap, sizeof(table_id_t)));
+ *table_id = table->id;
+ msg->ptr = table_id;
+
+ ib_wqueue_add(fts_optimize_wq, msg, msg->heap);
+}
+
/**********************************************************************//**
Find the slot for a particular table.
@return slot if found else NULL. */
@@ -2932,6 +2966,25 @@ fts_optimize_need_sync(
}
#endif
+/** Sync fts cache of a table
+@param[in] table_id table id */
+void
+fts_optimize_sync_table(
+ table_id_t table_id)
+{
+ dict_table_t* table = NULL;
+
+ table = dict_table_open_on_id(table_id, FALSE, DICT_TABLE_OP_NORMAL);
+
+ if (table) {
+ if (dict_table_has_fts_index(table) && table->fts->cache) {
+ fts_sync_table(table, true, false);
+ }
+
+ dict_table_close(table, FALSE, FALSE);
+ }
+}
+
/**********************************************************************//**
Optimize all FTS tables.
@return Dummy return */
@@ -3053,6 +3106,11 @@ fts_optimize_thread(
((fts_msg_del_t*) msg->ptr)->event);
break;
+ case FTS_MSG_SYNC_TABLE:
+ fts_optimize_sync_table(
+ *static_cast<table_id_t*>(msg->ptr));
+ break;
+
default:
ut_error;
}
@@ -3079,26 +3137,7 @@ fts_optimize_thread(
ib_vector_get(tables, i));
if (slot->state != FTS_STATE_EMPTY) {
- dict_table_t* table = NULL;
-
- /*slot->table may be freed, so we try to open
- table by slot->table_id.*/
- table = dict_table_open_on_id(
- slot->table_id, FALSE,
- DICT_TABLE_OP_NORMAL);
-
- if (table) {
-
- if (dict_table_has_fts_index(table)) {
- fts_sync_table(table);
- }
-
- if (table->fts) {
- fts_free(table);
- }
-
- dict_table_close(table, FALSE, FALSE);
- }
+ fts_optimize_sync_table(slot->table_id);
}
}
}