Skip to content

Commit

Permalink
MDEV-7004 - Merge scalability fixes from 10.0-power
Browse files Browse the repository at this point in the history
Preallocate locks on THD mem_root to avoid expensive malloc.
  • Loading branch information
Sergey Vojtovich committed Dec 5, 2014
1 parent 9bc5cec commit b4ec230
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
20 changes: 14 additions & 6 deletions sql/lock.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@
table_handler->external_lock(thd, F_UNLCK) for each table that was locked,
excluding one that caused failure. That means handler must cleanup itself
in case external_lock() fails.
@todo
Change to use my_malloc() ONLY when using LOCK TABLES command or when
we are forced to use mysql_lock_merge.
*/

#include <my_global.h>
Expand Down Expand Up @@ -266,19 +262,24 @@ void reset_lock_data(MYSQL_LOCK *sql_lock, bool unlock)
MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags)
{
MYSQL_LOCK *sql_lock;
uint gld_flags= GET_LOCK_STORE_LOCKS;
DBUG_ENTER("mysql_lock_tables(tables)");

if (lock_tables_check(thd, tables, count, flags))
DBUG_RETURN(NULL);

if (! (sql_lock= get_lock_data(thd, tables, count, GET_LOCK_STORE_LOCKS)))
if (!(thd->variables.option_bits & OPTION_TABLE_LOCK))
gld_flags|= GET_LOCK_ON_THD;

if (! (sql_lock= get_lock_data(thd, tables, count, gld_flags)))
DBUG_RETURN(NULL);

if (mysql_lock_tables(thd, sql_lock, flags))
{
/* Clear the lock type of all lock data to avoid reusage. */
reset_lock_data(sql_lock, 1);
my_free(sql_lock);
if (!(gld_flags & GET_LOCK_ON_THD))
my_free(sql_lock);
sql_lock= 0;
}
DBUG_RETURN(sql_lock);
Expand Down Expand Up @@ -382,6 +383,13 @@ static int lock_external(THD *thd, TABLE **tables, uint count)
}


void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock)
{
mysql_unlock_tables(thd, sql_lock,
thd->variables.option_bits & OPTION_TABLE_LOCK);
}


void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
{
DBUG_ENTER("mysql_unlock_tables");
Expand Down
3 changes: 2 additions & 1 deletion sql/lock.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ typedef struct st_mysql_lock MYSQL_LOCK;

MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, uint flags);
bool mysql_lock_tables(THD *thd, MYSQL_LOCK *sql_lock, uint flags);
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock= 1);
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock);
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock);
void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock);
void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count);
void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table);
Expand Down
12 changes: 8 additions & 4 deletions sql/sql_reload.cc
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,8 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
}
}

thd->variables.option_bits|= OPTION_TABLE_LOCK;

/*
Before opening and locking tables the below call also waits
for old shares to go away, so the fact that we don't pass
Expand All @@ -534,7 +536,7 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
if (open_and_lock_tables(thd, all_tables, FALSE,
MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK,
&lock_tables_prelocking_strategy))
goto error;
goto error_reset_bits;

if (thd->lex->type & REFRESH_FOR_EXPORT)
{
Expand All @@ -546,15 +548,14 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
{
my_error(ER_ILLEGAL_HA, MYF(0),table_list->table->file->table_type(),
table_list->db, table_list->table_name);
return true;
goto error_reset_bits;
}
}
}

if (thd->locked_tables_list.init_locked_tables(thd))
goto error;
goto error_reset_bits;

thd->variables.option_bits|= OPTION_TABLE_LOCK;

/*
We don't downgrade MDL_SHARED_NO_WRITE here as the intended
Expand All @@ -565,6 +566,9 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)

return FALSE;

error_reset_bits:
close_thread_tables(thd);
thd->variables.option_bits&= ~OPTION_TABLE_LOCK;
error:
return TRUE;
}
Expand Down

0 comments on commit b4ec230

Please sign in to comment.