mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
A pre-requisite patch for the fix for Bug#52044.
This patch also fixes Bug#55452 "SET PASSWORD is replicated twice in RBR mode". The goal of this patch is to remove the release of metadata locks from close_thread_tables(). This is necessary to not mistakenly release the locks in the course of a multi-step operation that involves multiple close_thread_tables() or close_tables_for_reopen(). On the same token, move statement commit outside close_thread_tables(). Other cleanups: Cleanup COM_FIELD_LIST. Don't call close_thread_tables() in COM_SHUTDOWN -- there are no open tables there that can be closed (we leave the locked tables mode in THD destructor, and this close_thread_tables() won't leave it anyway). Make open_and_lock_tables() and open_and_lock_tables_derived() call close_thread_tables() upon failure. Remove the calls to close_thread_tables() that are now unnecessary. Simplify the back off condition in Open_table_context. Streamline metadata lock handling in LOCK TABLES implementation. Add asserts to ensure correct life cycle of statement transaction in a session. Remove a piece of dead code that has also become redundant after the fix for Bug 37521.
This commit is contained in:
@ -36,7 +36,7 @@
|
||||
#include "sql_priv.h"
|
||||
#include "sql_servers.h"
|
||||
#include "unireg.h"
|
||||
#include "sql_base.h" // close_thread_tables
|
||||
#include "sql_base.h" // close_mysql_tables
|
||||
#include "records.h" // init_read_record, end_read_record
|
||||
#include "hash_filo.h"
|
||||
#include <m_ctype.h>
|
||||
@ -280,9 +280,7 @@ bool servers_reload(THD *thd)
|
||||
}
|
||||
|
||||
end:
|
||||
trans_commit_implicit(thd);
|
||||
close_thread_tables(thd);
|
||||
thd->mdl_context.release_transactional_locks();
|
||||
close_mysql_tables(thd);
|
||||
DBUG_PRINT("info", ("unlocking servers_cache"));
|
||||
mysql_rwlock_unlock(&THR_LOCK_servers);
|
||||
DBUG_RETURN(return_val);
|
||||
@ -535,6 +533,7 @@ int insert_server_record(TABLE *table, FOREIGN_SERVER *server)
|
||||
{
|
||||
int error;
|
||||
DBUG_ENTER("insert_server_record");
|
||||
tmp_disable_binlog(table->in_use);
|
||||
table->use_all_columns();
|
||||
|
||||
empty_record(table);
|
||||
@ -571,6 +570,8 @@ int insert_server_record(TABLE *table, FOREIGN_SERVER *server)
|
||||
}
|
||||
else
|
||||
error= ER_FOREIGN_SERVER_EXISTS;
|
||||
|
||||
reenable_binlog(table->in_use);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
@ -625,7 +626,7 @@ int drop_server(THD *thd, LEX_SERVER_OPTIONS *server_options)
|
||||
error= delete_server_record(table, name.str, name.length);
|
||||
|
||||
/* close the servers table before we call closed_cached_connection_tables */
|
||||
close_thread_tables(thd);
|
||||
close_mysql_tables(thd);
|
||||
|
||||
if (close_cached_connection_tables(thd, TRUE, &name))
|
||||
{
|
||||
@ -880,6 +881,7 @@ update_server_record(TABLE *table, FOREIGN_SERVER *server)
|
||||
{
|
||||
int error=0;
|
||||
DBUG_ENTER("update_server_record");
|
||||
tmp_disable_binlog(table->in_use);
|
||||
table->use_all_columns();
|
||||
/* set the field that's the PK to the value we're looking for */
|
||||
table->field[0]->store(server->server_name,
|
||||
@ -913,6 +915,7 @@ update_server_record(TABLE *table, FOREIGN_SERVER *server)
|
||||
}
|
||||
|
||||
end:
|
||||
reenable_binlog(table->in_use);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
@ -938,6 +941,7 @@ delete_server_record(TABLE *table,
|
||||
{
|
||||
int error;
|
||||
DBUG_ENTER("delete_server_record");
|
||||
tmp_disable_binlog(table->in_use);
|
||||
table->use_all_columns();
|
||||
|
||||
/* set the field that's the PK to the value we're looking for */
|
||||
@ -959,6 +963,7 @@ delete_server_record(TABLE *table,
|
||||
table->file->print_error(error, MYF(0));
|
||||
}
|
||||
|
||||
reenable_binlog(table->in_use);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
@ -1050,7 +1055,7 @@ int alter_server(THD *thd, LEX_SERVER_OPTIONS *server_options)
|
||||
error= update_server(thd, existing, altered);
|
||||
|
||||
/* close the servers table before we call closed_cached_connection_tables */
|
||||
close_thread_tables(thd);
|
||||
close_mysql_tables(thd);
|
||||
|
||||
if (close_cached_connection_tables(thd, FALSE, &name))
|
||||
{
|
||||
|
Reference in New Issue
Block a user