mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	It includes speed optimizations for HANDLER READ by caching as much as possible in HANDLER OPEN Other things: - Added mysqld option --disable-thr-alarm to be able to benchmark things without thr_alarm - Changed 'Locked' state to 'System lock' and 'Table lock' (these where used in the code but never shown to end user) - Better error message if mysql_install_db.sh fails - Moved handler function prototypes to sql_handler.h - Remove not anymore used 'thd->locked' member include/thr_alarm.h: Added my_disable_thr_alarm include/thr_lock.h: Add new member to THR_LOCK_DATA to remember original lock type state. This is needed as thr_unlock() resets type to TL_UNLOCK. mysql-test/include/check_no_concurrent_insert.inc: Locked -> Table lock mysql-test/include/handler.inc: Locked -> Table lock mysql-test/r/handler_innodb.result: Updated results for new tests mysql-test/r/handler_myisam.result: Updated results for new tests mysql-test/r/sp-threads.result: Locked -> Table lock mysql-test/suite/binlog/t/binlog_stm_row.test: Locked -> Table lock mysql-test/suite/funcs_1/datadict/processlist_val.inc: Locked -> Table lock mysql-test/suite/pbxt/t/lock_multi.test: Locked -> Table lock mysql-test/suite/sys_vars/r/concurrent_insert_func.result: Locked -> Table lock mysql-test/suite/sys_vars/t/concurrent_insert_func.test: Locked -> Table lock mysql-test/suite/sys_vars/t/delayed_insert_limit_func.test: Locked -> Table lock mysql-test/suite/sys_vars/t/query_cache_wlock_invalidate_func.test: Locked -> Table lock mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test: Locked -> Table lock mysql-test/t/insert_notembedded.test: Locked -> Table lock mysql-test/t/lock_multi.test: Locked -> Table lock mysql-test/t/merge-big.test: Locked -> Table lock mysql-test/t/multi_update.test: Locked -> Table lock mysql-test/t/query_cache_28249.test: Locked -> Table lock mysql-test/t/sp_notembedded.test: Locked -> Table lock mysql-test/t/sp_sync.test: Locked -> Table lock mysql-test/t/status.test: Locked -> Table lock mysql-test/t/trigger_notembedded.test: Locked -> Table lock mysys/thr_alarm.c: Added option to disable thr_alarm mysys/thr_lock.c: Detect loops scripts/mysql_install_db.sh: Give better error message if something goes wrong sql/Makefile.am: Added sql_handler.h sql/lock.cc: Split functions to allow one to cache value if store_lock() (for HANDLER functions). - Split mysql_lock_tables() into two functions, where first one allocates MYSQL_LOCK and other other one uses it. - Made get_lock_data() an external function. - Added argument to mysql_unlock_tables() to not free sql_lock. - Added argument to reset_lock_data() to reset lock structure to initial state (as after get_lock_data()) sql/mysql_priv.h: Moved handler function prototypes to sql_handler.h Added new lock functions. sql/mysqld.cc: Added --thread-alarm startup option sql/net_serv.cc: Don't call vio_blocking() if not needed sql/sql_base.cc: include sql_handler.h sql/sql_class.cc: include sql_handler.h Remove not anymore used 'thd->locked' member sql/sql_class.h: Remove not anymore used 'thd->locked' member sql/sql_db.cc: include sql_handler.h sql/sql_delete.cc: include sql_handler.h sql/sql_handler.cc: Rewrote all code to use SQL_HANDLER instead of TABLE_LIST (original interface) Rewrote mysql_ha_open() to cache all things from TABLE_LIST and items for field list, where etc. In mysql_ha_open() also cache MYSQL_LOCK structure from get_lock_data(). Split functions into smaller sub functions (needed to be able to implement mysql_ha_read_prepare()) Added mysql_ha_read_prepare() to allow one to prepare HANDLER READ. sql/sql_handler.h: Interface to sql_handler.cc sql/sql_parse.cc: include sql_handler.h sql/sql_prepare.cc: Added mysql_test_handler_read(), prepare for HANDLER READ sql/sql_rename.cc: include sql_handler.h sql/sql_show.cc: Removed usage of thd->locked sql/sql_table.cc: include sql_handler.h sql/sql_trigger.cc: include sql_handler.h
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
#
 | 
						|
# SUMMARY
 | 
						|
#   Check that statement reading table '$table' doesn't allow concurrent
 | 
						|
#   inserts in it.
 | 
						|
#
 | 
						|
# PARAMETERS 
 | 
						|
#   $table         Table in which concurrent inserts should be disallowed.
 | 
						|
#   $con_aux1      Name of the first auxiliary connection to be used by this
 | 
						|
#                  script.
 | 
						|
#   $con_aux2      Name of the second auxiliary connection to be used by this
 | 
						|
#                  script.
 | 
						|
#   $statement     Statement to be checked.
 | 
						|
#   $restore_table Table which might be modified by statement to be checked
 | 
						|
#                  and thus needs backing up before its execution and
 | 
						|
#                  restoring after it (can be empty).
 | 
						|
#
 | 
						|
# EXAMPLE
 | 
						|
#    lock_sync.test
 | 
						|
#
 | 
						|
--disable_result_log
 | 
						|
--disable_query_log
 | 
						|
 | 
						|
# Reset DEBUG_SYNC facility for safety.
 | 
						|
set debug_sync= "RESET";
 | 
						|
 | 
						|
if ($restore_table)
 | 
						|
{
 | 
						|
--eval create temporary table t_backup select * from $restore_table;
 | 
						|
}
 | 
						|
 | 
						|
connection $con_aux1;
 | 
						|
set debug_sync='after_lock_tables_takes_lock SIGNAL parked WAIT_FOR go';
 | 
						|
--send_eval $statement;
 | 
						|
 | 
						|
connection $con_aux2;
 | 
						|
set debug_sync='now WAIT_FOR parked';
 | 
						|
--send_eval insert into $table (i) values (0);
 | 
						|
 | 
						|
--enable_result_log
 | 
						|
--enable_query_log
 | 
						|
connection default;
 | 
						|
# Wait until concurrent insert is successfully blocked because
 | 
						|
# of our statement.
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Waiting for table level lock" and
 | 
						|
        info = "insert into $table (i) values (0)";
 | 
						|
--source include/wait_condition.inc
 | 
						|
 | 
						|
--disable_result_log
 | 
						|
--disable_query_log
 | 
						|
 | 
						|
set debug_sync= 'now SIGNAL go';
 | 
						|
connection $con_aux1;
 | 
						|
--reap
 | 
						|
connection $con_aux2;
 | 
						|
--reap
 | 
						|
connection default;
 | 
						|
 | 
						|
if ($success)
 | 
						|
{
 | 
						|
--echo Success: '$statement' doesn't allow concurrent inserts into '$table'.
 | 
						|
}
 | 
						|
if (!$success)
 | 
						|
{
 | 
						|
--echo Error: '$statement' allows concurrent inserts into '$table'!
 | 
						|
}
 | 
						|
 | 
						|
--eval delete from $table where i = 0;
 | 
						|
 | 
						|
if ($restore_table)
 | 
						|
{
 | 
						|
--eval truncate table $restore_table;
 | 
						|
--eval insert into $restore_table select * from t_backup;
 | 
						|
drop temporary table t_backup;
 | 
						|
}
 | 
						|
 | 
						|
# Clean-up. Reset DEBUG_SYNC facility after use.
 | 
						|
set debug_sync= "RESET";
 | 
						|
 | 
						|
--enable_result_log
 | 
						|
--enable_query_log
 |