Commit c4dcfb60 authored by Sergei Golubchik's avatar Sergei Golubchik

Merge branch 'merge-innodb-5.6' into 10.0

5.6.30
parents 872649c7 f1aae861
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, 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
...@@ -3047,8 +3047,6 @@ fil_create_link_file( ...@@ -3047,8 +3047,6 @@ fil_create_link_file(
const char* tablename, /*!< in: tablename */ const char* tablename, /*!< in: tablename */
const char* filepath) /*!< in: pathname of tablespace */ const char* filepath) /*!< in: pathname of tablespace */
{ {
os_file_t file;
ibool success;
dberr_t err = DB_SUCCESS; dberr_t err = DB_SUCCESS;
char* link_filepath; char* link_filepath;
char* prev_filepath = fil_read_link_file(tablename); char* prev_filepath = fil_read_link_file(tablename);
...@@ -3067,13 +3065,24 @@ fil_create_link_file( ...@@ -3067,13 +3065,24 @@ fil_create_link_file(
link_filepath = fil_make_isl_name(tablename); link_filepath = fil_make_isl_name(tablename);
file = os_file_create_simple_no_error_handling( /** Check if the file already exists. */
innodb_file_data_key, link_filepath, FILE* file = NULL;
OS_FILE_CREATE, OS_FILE_READ_WRITE, &success); ibool exists;
os_file_type_t ftype;
if (!success) { bool success = os_file_status(link_filepath, &exists, &ftype);
/* The following call will print an error message */
ulint error = os_file_get_last_error(true); ulint error = 0;
if (success && !exists) {
file = fopen(link_filepath, "w");
if (file == NULL) {
/* This call will print its own error message */
error = os_file_get_last_error(true);
}
} else {
error = OS_FILE_ALREADY_EXISTS;
}
if (error != 0) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Cannot create file ", stderr); fputs(" InnoDB: Cannot create file ", stderr);
...@@ -3098,13 +3107,17 @@ fil_create_link_file( ...@@ -3098,13 +3107,17 @@ fil_create_link_file(
return(err); return(err);
} }
if (!os_file_write(link_filepath, file, filepath, 0, ulint rbytes = fwrite(filepath, 1, strlen(filepath), file);
strlen(filepath))) { if (rbytes != strlen(filepath)) {
os_file_get_last_error(true);
ib_logf(IB_LOG_LEVEL_ERROR,
"cannot write link file "
"%s",filepath);
err = DB_ERROR; err = DB_ERROR;
} }
/* Close the file, we only need it at startup */ /* Close the file, we only need it at startup */
os_file_close(file); fclose(file);
mem_free(link_filepath); mem_free(link_filepath);
......
This diff is collapsed.
/***************************************************************************** /*****************************************************************************
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 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
...@@ -87,6 +87,7 @@ enum fts_msg_type_t { ...@@ -87,6 +87,7 @@ enum fts_msg_type_t {
FTS_MSG_DEL_TABLE, /*!< Remove a table from the optimize FTS_MSG_DEL_TABLE, /*!< Remove a table from the optimize
threads work queue */ threads work queue */
FTS_MSG_SYNC_TABLE /*!< Sync fts cache of a table */
}; };
/** Compressed list of words that have been read from FTS INDEX /** Compressed list of words that have been read from FTS INDEX
...@@ -2652,6 +2653,39 @@ fts_optimize_remove_table( ...@@ -2652,6 +2653,39 @@ fts_optimize_remove_table(
os_event_free(event); 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. Find the slot for a particular table.
@return slot if found else NULL. */ @return slot if found else NULL. */
...@@ -2932,6 +2966,25 @@ fts_optimize_need_sync( ...@@ -2932,6 +2966,25 @@ fts_optimize_need_sync(
} }
#endif #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. Optimize all FTS tables.
@return Dummy return */ @return Dummy return */
...@@ -3053,6 +3106,11 @@ fts_optimize_thread( ...@@ -3053,6 +3106,11 @@ fts_optimize_thread(
((fts_msg_del_t*) msg->ptr)->event); ((fts_msg_del_t*) msg->ptr)->event);
break; break;
case FTS_MSG_SYNC_TABLE:
fts_optimize_sync_table(
*static_cast<table_id_t*>(msg->ptr));
break;
default: default:
ut_error; ut_error;
} }
...@@ -3079,26 +3137,7 @@ fts_optimize_thread( ...@@ -3079,26 +3137,7 @@ fts_optimize_thread(
ib_vector_get(tables, i)); ib_vector_get(tables, i));
if (slot->state != FTS_STATE_EMPTY) { if (slot->state != FTS_STATE_EMPTY) {
dict_table_t* table = NULL; fts_optimize_sync_table(slot->table_id);
/*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);
}
} }
} }
} }
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc. Copyright (c) 2009, Percona Inc.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
...@@ -3497,6 +3497,16 @@ innobase_init( ...@@ -3497,6 +3497,16 @@ innobase_init(
innobase_open_files = tc_size; innobase_open_files = tc_size;
} }
} }
if (innobase_open_files > (long) open_files_limit) {
fprintf(stderr,
"innodb_open_files should not be greater"
" than the open_files_limit.\n");
if (innobase_open_files > (long) tc_size) {
innobase_open_files = tc_size;
}
}
srv_max_n_open_files = (ulint) innobase_open_files; srv_max_n_open_files = (ulint) innobase_open_files;
srv_innodb_status = (ibool) innobase_create_status_file; srv_innodb_status = (ibool) innobase_create_status_file;
...@@ -11866,7 +11876,7 @@ ha_innobase::optimize( ...@@ -11866,7 +11876,7 @@ ha_innobase::optimize(
if (innodb_optimize_fulltext_only) { if (innodb_optimize_fulltext_only) {
if (prebuilt->table->fts && prebuilt->table->fts->cache if (prebuilt->table->fts && prebuilt->table->fts->cache
&& !dict_table_is_discarded(prebuilt->table)) { && !dict_table_is_discarded(prebuilt->table)) {
fts_sync_table(prebuilt->table); fts_sync_table(prebuilt->table, false, true);
fts_optimize_table(prebuilt->table); fts_optimize_table(prebuilt->table);
} }
return(HA_ADMIN_OK); return(HA_ADMIN_OK);
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2011, 2016, 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
...@@ -724,6 +724,13 @@ fts_optimize_remove_table( ...@@ -724,6 +724,13 @@ fts_optimize_remove_table(
/*======================*/ /*======================*/
dict_table_t* table); /*!< in: table to remove */ dict_table_t* table); /*!< in: table to remove */
/** 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);
/**********************************************************************//** /**********************************************************************//**
Signal the optimize thread to prepare for shutdown. */ Signal the optimize thread to prepare for shutdown. */
UNIV_INTERN UNIV_INTERN
...@@ -826,15 +833,18 @@ fts_drop_index_split_tables( ...@@ -826,15 +833,18 @@ fts_drop_index_split_tables(
dict_index_t* index) /*!< in: fts instance */ dict_index_t* index) /*!< in: fts instance */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
/****************************************************************//** /** Run SYNC on the table, i.e., write out data from the cache to the
Run SYNC on the table, i.e., write out data from the cache to the FTS auxiliary INDEX table and clear the cache at the end.
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
@return DB_SUCCESS on success, error code on failure. */
UNIV_INTERN UNIV_INTERN
dberr_t dberr_t
fts_sync_table( fts_sync_table(
/*===========*/ dict_table_t* table,
dict_table_t* table) /*!< in: table */ bool unlock_cache,
__attribute__((nonnull)); bool wait);
/****************************************************************//** /****************************************************************//**
Free the query graph but check whether dict_sys->mutex is already Free the query graph but check whether dict_sys->mutex is already
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2011, 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 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
...@@ -122,7 +122,11 @@ struct fts_sync_t { ...@@ -122,7 +122,11 @@ struct fts_sync_t {
doc_id_t max_doc_id; /*!< The doc id at which the cache was doc_id_t max_doc_id; /*!< The doc id at which the cache was
noted as being full, we use this to noted as being full, we use this to
set the upper_limit field */ set the upper_limit field */
ib_time_t start_time; /*!< SYNC start time */ ib_time_t start_time; /*!< SYNC start time */
bool in_progress; /*!< flag whether sync is in progress.*/
bool unlock_cache; /*!< flag whether unlock cache when
write fts node */
os_event_t event; /*!< sync finish event */
}; };
/** The cache for the FTS system. It is a memory-based inverted index /** The cache for the FTS system. It is a memory-based inverted index
...@@ -165,7 +169,6 @@ struct fts_cache_t { ...@@ -165,7 +169,6 @@ struct fts_cache_t {
objects, they are recreated after objects, they are recreated after
a SYNC is completed */ a SYNC is completed */
ib_alloc_t* self_heap; /*!< This heap is the heap out of ib_alloc_t* self_heap; /*!< This heap is the heap out of
which an instance of the cache itself which an instance of the cache itself
was created. Objects created using was created. Objects created using
...@@ -212,6 +215,7 @@ struct fts_node_t { ...@@ -212,6 +215,7 @@ struct fts_node_t {
ulint ilist_size_alloc; ulint ilist_size_alloc;
/*!< Allocated size of ilist in /*!< Allocated size of ilist in
bytes */ bytes */
bool synced; /*!< flag whether the node is synced */
}; };
/** A tokenizer word. Contains information about one word. */ /** A tokenizer word. Contains information about one word. */
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
...@@ -466,28 +466,7 @@ amount to decrement. */ ...@@ -466,28 +466,7 @@ amount to decrement. */
# define os_atomic_decrement_uint64(ptr, amount) \ # define os_atomic_decrement_uint64(ptr, amount) \
os_atomic_decrement(ptr, amount) os_atomic_decrement(ptr, amount)
# if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) # if defined(IB_STRONG_MEMORY_MODEL)
/** Do an atomic test-and-set.
@param[in,out] ptr Memory location to set to non-zero
@return the previous value */
inline
lock_word_t
os_atomic_test_and_set(volatile lock_word_t* ptr)
{
return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
}
/** Do an atomic clear.
@param[in,out] ptr Memory location to set to zero */
inline
void
os_atomic_clear(volatile lock_word_t* ptr)
{
__atomic_clear(ptr, __ATOMIC_RELEASE);
}
# elif defined(HAVE_ATOMIC_BUILTINS)
/** Do an atomic test and set. /** Do an atomic test and set.
@param[in,out] ptr Memory location to set to non-zero @param[in,out] ptr Memory location to set to non-zero
...@@ -516,6 +495,27 @@ os_atomic_clear(volatile lock_word_t* ptr) ...@@ -516,6 +495,27 @@ os_atomic_clear(volatile lock_word_t* ptr)
return(__sync_lock_test_and_set(ptr, 0)); return(__sync_lock_test_and_set(ptr, 0));
} }
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
/** Do an atomic test-and-set.
@param[in,out] ptr Memory location to set to non-zero
@return the previous value */
inline
lock_word_t
os_atomic_test_and_set(volatile lock_word_t* ptr)
{
return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
}
/** Do an atomic clear.
@param[in,out] ptr Memory location to set to zero */
inline
void
os_atomic_clear(volatile lock_word_t* ptr)
{
__atomic_clear(ptr, __ATOMIC_RELEASE);
}
# else # else
# error "Unsupported platform" # error "Unsupported platform"
......
...@@ -44,7 +44,7 @@ Created 1/20/1994 Heikki Tuuri ...@@ -44,7 +44,7 @@ Created 1/20/1994 Heikki Tuuri
#define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MAJOR 5
#define INNODB_VERSION_MINOR 6 #define INNODB_VERSION_MINOR 6
#define INNODB_VERSION_BUGFIX 29 #define INNODB_VERSION_BUGFIX 30
/* The following is the InnoDB version as shown in /* The following is the InnoDB version as shown in
SELECT plugin_version FROM information_schema.plugins; SELECT plugin_version FROM information_schema.plugins;
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2005, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2016, 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
...@@ -1986,7 +1986,8 @@ row_merge_read_clustered_index( ...@@ -1986,7 +1986,8 @@ row_merge_read_clustered_index(
if (max_doc_id && err == DB_SUCCESS) { if (max_doc_id && err == DB_SUCCESS) {
/* Sync fts cache for other fts indexes to keep all /* Sync fts cache for other fts indexes to keep all
fts indexes consistent in sync_doc_id. */ fts indexes consistent in sync_doc_id. */
err = fts_sync_table(const_cast<dict_table_t*>(new_table)); err = fts_sync_table(const_cast<dict_table_t*>(new_table),
false, true);
if (err == DB_SUCCESS) { if (err == DB_SUCCESS) {
fts_update_next_doc_id( fts_update_next_doc_id(
......
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