SOURCES (MYSQL_5_0): mysql-acc-pslist.patch (NEW), mysql-control_flush_and_...

glen glen at pld-linux.org
Wed Sep 17 16:22:49 CEST 2008


Author: glen                         Date: Wed Sep 17 14:22:49 2008 GMT
Module: SOURCES                       Tag: MYSQL_5_0
---- Log message:
- from http://www.percona.com/mysql/5.0.68/patches/

---- Files affected:
SOURCES:
   mysql-acc-pslist.patch (NONE -> 1.1.2.1)  (NEW), mysql-control_flush_and_merge_and_read.patch (NONE -> 1.1.2.1)  (NEW), mysql-control_io-threads.patch (NONE -> 1.1.2.1)  (NEW), mysql-microslow_innodb.patch (NONE -> 1.1.2.1)  (NEW), mysql-mysqld_safe_syslog.patch (NONE -> 1.1.2.1)  (NEW), mysql-show_patches.patch (NONE -> 1.1.2.1)  (NEW), mysql-split_buf_pool_mutex_fixed_optimistic_safe.patch (NONE -> 1.1.2.1)  (NEW), mysql-userstats-testsuite.patch (NONE -> 1.1.2.1)  (NEW), mysql-userstats.patch (NONE -> 1.1.2.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/mysql-acc-pslist.patch
diff -u /dev/null SOURCES/mysql-acc-pslist.patch:1.1.2.1
--- /dev/null	Wed Sep 17 16:22:50 2008
+++ SOURCES/mysql-acc-pslist.patch	Wed Sep 17 16:22:39 2008
@@ -0,0 +1,115 @@
+diff -r 174803e7e869 mysql-test/r/create.result
+--- a/mysql-test/r/create.result	Thu Sep 04 12:17:56 2008 -0700
++++ b/mysql-test/r/create.result	Thu Sep 04 12:20:19 2008 -0700
+@@ -1720,7 +1720,8 @@
+   `COMMAND` varchar(16) NOT NULL DEFAULT '',
+   `TIME` bigint(7) NOT NULL DEFAULT '0',
+   `STATE` varchar(64) DEFAULT NULL,
+-  `INFO` longtext
++  `INFO` longtext,
++  `TIME_MS` decimal(22,3) NOT NULL DEFAULT '0.000'
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8
+ drop table t1;
+ create temporary table t1 like information_schema.processlist;
+@@ -1734,7 +1735,8 @@
+   `COMMAND` varchar(16) NOT NULL DEFAULT '',
+   `TIME` bigint(7) NOT NULL DEFAULT '0',
+   `STATE` varchar(64) DEFAULT NULL,
+-  `INFO` longtext
++  `INFO` longtext,
++  `TIME_MS` decimal(22,3) NOT NULL DEFAULT '0.000'
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8
+ drop table t1;
+ create table t1 like information_schema.character_sets;
+diff -r 174803e7e869 mysql-test/r/not_embedded_server.result
+--- a/mysql-test/r/not_embedded_server.result	Thu Sep 04 12:17:56 2008 -0700
++++ b/mysql-test/r/not_embedded_server.result	Thu Sep 04 12:20:19 2008 -0700
+@@ -1,7 +1,7 @@
+ prepare stmt1 from ' SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND!=\'Daemon\' ';
+ execute stmt1;
+-ID	USER	HOST	DB	COMMAND	TIME	STATE	INFO
+-number	root	localhost	test	Query	time	executing	SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND!='Daemon'
++ID	USER	HOST	DB	COMMAND	TIME	STATE	INFO	TIME_MS
++number	root	localhost	test	Query	time	executing	SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND!='Daemon'	time_ms
+ deallocate prepare stmt1;
+ FLUSH STATUS;
+ SHOW GLOBAL STATUS LIKE 'com_select';
+diff -r 174803e7e869 mysql-test/t/not_embedded_server.test
+--- a/mysql-test/t/not_embedded_server.test	Thu Sep 04 12:17:56 2008 -0700
++++ b/mysql-test/t/not_embedded_server.test	Thu Sep 04 12:20:19 2008 -0700
+@@ -16,7 +16,7 @@
+ # End of 4.1 tests
+ 
+ prepare stmt1 from ' SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND!=\'Daemon\' ';
+---replace_column 1 number 6 time 3 localhost
++--replace_column 1 number 6 time 3 localhost 9 time_ms
+ execute stmt1;
+ deallocate prepare stmt1;
+ 
+diff -r 174803e7e869 patch_info/acc-pslist.info
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/patch_info/acc-pslist.info	Thu Sep 04 12:20:19 2008 -0700
+@@ -0,0 +1,6 @@
++File=acc-pslist.patch
++Name=Milliseconds in PROCESSLIST
++Version=1.0
++Author=Percona <info at percona.com>
++License=GPL
++Comment=
+diff -r 174803e7e869 sql/sql_show.cc
+--- a/sql/sql_show.cc	Thu Sep 04 12:17:56 2008 -0700
++++ b/sql/sql_show.cc	Thu Sep 04 12:20:19 2008 -0700
+@@ -1803,7 +1803,7 @@
+   TABLE *table= tables->table;
+   CHARSET_INFO *cs= system_charset_info;
+   char *user;
+-  time_t now= my_time(0);
++  ulonglong unow= my_micro_time();
+   DBUG_ENTER("fill_process_list");
+ 
+   user= thd->security_ctx->master_access & PROCESS_ACL ?
+@@ -1861,8 +1861,8 @@
+         table->field[4]->store(command_name[tmp->command].str,
+                                command_name[tmp->command].length, cs);
+       /* MYSQL_TIME */
+-      table->field[5]->store((uint32)(tmp->start_time ?
+-                                      now - tmp->start_time : 0), TRUE);
++      const ulonglong utime= tmp->start_utime ? unow - tmp->start_utime : 0;
++      table->field[5]->store(utime / 1000000, TRUE);
+       /* STATE */
+ #ifndef EMBEDDED_LIBRARY
+       val= (char*) (tmp->locked ? "Locked" :
+@@ -1896,11 +1896,15 @@
+         table->field[7]->set_notnull();
+       }
+ 
++      /* TIME_MS */
++      table->field[8]->store((double)(utime / 1000.0));
++
+       if (schema_table_store_record(thd, table))
+       {
+         VOID(pthread_mutex_unlock(&LOCK_thread_count));
+         DBUG_RETURN(1);
+       }
++
+     }
+   }
+ 
+@@ -5532,7 +5536,7 @@
+     into it two numbers, based on modulus of base-10 numbers.  In the ones
+     position is the number of decimals.  Tens position is unused.  In the
+     hundreds and thousands position is a two-digit decimal number representing
+-    length.  Encode this value with  (decimals*100)+length  , where
++    length.  Encode this value with  (length*100)+decimals  , where
+     0<decimals<10 and 0<=length<100 .
+ 
+   @param
+@@ -6540,6 +6544,8 @@
+   {"STATE", 64, MYSQL_TYPE_STRING, 0, 1, "State", SKIP_OPEN_TABLE},
+   {"INFO", PROCESS_LIST_INFO_WIDTH, MYSQL_TYPE_STRING, 0, 1, "Info",
+    SKIP_OPEN_TABLE},
++  {"TIME_MS", 100 * (MY_INT64_NUM_DECIMAL_DIGITS + 1) + 3, MYSQL_TYPE_DECIMAL,
++    0, 0, "Time_ms", SKIP_OPEN_TABLE},
+   {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
+ };
+ 

================================================================
Index: SOURCES/mysql-control_flush_and_merge_and_read.patch
diff -u /dev/null SOURCES/mysql-control_flush_and_merge_and_read.patch:1.1.2.1
--- /dev/null	Wed Sep 17 16:22:50 2008
+++ SOURCES/mysql-control_flush_and_merge_and_read.patch	Wed Sep 17 16:22:39 2008
@@ -0,0 +1,238 @@
+diff -r 2fdaeb546d25 innobase/buf/buf0rea.c
+--- a/innobase/buf/buf0rea.c	Mon Sep 08 16:39:06 2008 -0700
++++ b/innobase/buf/buf0rea.c	Mon Sep 08 16:40:14 2008 -0700
+@@ -188,6 +188,10 @@
+ 	ulint		low, high;
+ 	ulint		err;
+ 	ulint		i;
++
++	if (!(srv_read_ahead & 1)) {
++		return(0);
++	}
+ 
+ 	if (srv_startup_is_before_trx_rollback_phase) {
+ 	        /* No read-ahead to avoid thread deadlocks */
+@@ -396,6 +400,10 @@
+ 	ulint		err;
+ 	ulint		i;
+ 	
++	if (!(srv_read_ahead & 2)) {
++		return(0);
++	}
++
+ 	if (srv_startup_is_before_trx_rollback_phase) {
+ 	        /* No read-ahead to avoid thread deadlocks */
+ 	        return(0);
+diff -r 2fdaeb546d25 innobase/include/srv0srv.h
+--- a/innobase/include/srv0srv.h	Mon Sep 08 16:39:06 2008 -0700
++++ b/innobase/include/srv0srv.h	Mon Sep 08 16:40:14 2008 -0700
+@@ -131,6 +131,12 @@
+ extern ulong	srv_max_purge_lag;
+ extern ibool	srv_use_awe;
+ extern ibool	srv_use_adaptive_hash_indexes;
++
++extern ulint	srv_read_ahead;
++extern ulint	srv_ibuf_contract_const;
++extern ulint	srv_ibuf_contract_burst;
++extern ulint	srv_buf_flush_const;
++extern ulint	srv_buf_flush_burst;
+ /*-------------------------------------------*/
+ 
+ extern ulint	srv_n_rows_inserted;
+diff -r 2fdaeb546d25 innobase/srv/srv0srv.c
+--- a/innobase/srv/srv0srv.c	Mon Sep 08 16:39:06 2008 -0700
++++ b/innobase/srv/srv0srv.c	Mon Sep 08 16:40:14 2008 -0700
+@@ -322,6 +322,11 @@
+ ibool	srv_use_awe			= FALSE;
+ ibool	srv_use_adaptive_hash_indexes 	= TRUE;
+ 
++ulint	srv_read_ahead = 3; /* 1: random  2: linear  3: Both */
++ulint	srv_ibuf_contract_const	= 5;
++ulint	srv_ibuf_contract_burst = 20;
++ulint	srv_buf_flush_const = 10;
++ulint	srv_buf_flush_burst = 100;
+ /*-------------------------------------------*/
+ ulong	srv_n_spin_wait_rounds	= 20;
+ ulong	srv_n_free_tickets_to_enter = 500;
+@@ -2298,7 +2303,7 @@
+ 						+ buf_pool->n_pages_written;
+ 		if (n_pend_ios < 3 && (n_ios - n_ios_old < 5)) {
+ 			srv_main_thread_op_info = "doing insert buffer merge";
+-			ibuf_contract_for_n_pages(TRUE, 5);
++			ibuf_contract_for_n_pages(TRUE, srv_ibuf_contract_burst);
+ 
+ 			srv_main_thread_op_info = "flushing log";
+ 
+@@ -2311,7 +2316,7 @@
+ 			/* Try to keep the number of modified pages in the
+ 			buffer pool under the limit wished by the user */
+ 			
+-			n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100,
++			n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, srv_buf_flush_burst,
+ 							  ut_dulint_max);
+ 
+ 		        /* If we had to do the flush, it may have taken
+@@ -2349,7 +2354,7 @@
+ 	if (n_pend_ios < 3 && (n_ios - n_ios_very_old < 200)) {
+ 
+ 		srv_main_thread_op_info = "flushing buffer pool pages";
+-		buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max);
++		buf_flush_batch(BUF_FLUSH_LIST, srv_buf_flush_burst, ut_dulint_max);
+ 
+ 		srv_main_thread_op_info = "flushing log";
+ 		log_buffer_flush_to_disk();
+@@ -2359,7 +2364,7 @@
+ 	even if the server were active */
+ 
+ 	srv_main_thread_op_info = "doing insert buffer merge";
+-	ibuf_contract_for_n_pages(TRUE, 5);
++	ibuf_contract_for_n_pages(TRUE, srv_ibuf_contract_const);
+ 
+ 	srv_main_thread_op_info = "flushing log";
+ 	log_buffer_flush_to_disk();
+@@ -2401,14 +2406,14 @@
+ 		(> 70 %), we assume we can afford reserving the disk(s) for
+ 		the time it requires to flush 100 pages */
+ 
+-	        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100,
++	        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, srv_buf_flush_burst,
+ 							ut_dulint_max);
+ 	} else {
+ 	        /* Otherwise, we only flush a small number of pages so that
+ 		we do not unnecessarily use much disk i/o capacity from
+ 		other work */
+ 
+-	        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 10,
++	        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, srv_buf_flush_const,
+ 							ut_dulint_max);
+ 	}
+ 
+@@ -2497,7 +2502,7 @@
+ 	if (srv_fast_shutdown && srv_shutdown_state > 0) {
+ 	        n_bytes_merged = 0;
+ 	} else {
+-	        n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20);
++	        n_bytes_merged = ibuf_contract_for_n_pages(TRUE, srv_ibuf_contract_burst);
+ 	}
+ 
+ 	srv_main_thread_op_info = "reserving kernel mutex";
+@@ -2514,7 +2519,7 @@
+ 
+ 	if (srv_fast_shutdown < 2) {
+ 		n_pages_flushed =
+-			buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max);
++			buf_flush_batch(BUF_FLUSH_LIST, srv_buf_flush_burst, ut_dulint_max);
+ 	} else {
+ 		/* In the fastest shutdown we do not flush the buffer pool
+ 		to data files: we set n_pages_flushed to 0 artificially. */
+diff -r 2fdaeb546d25 patch_info/control_flush_and_merge_and_read.info
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/patch_info/control_flush_and_merge_and_read.info	Mon Sep 08 16:40:14 2008 -0700
+@@ -0,0 +1,6 @@
++File=control_flush_and_merge_and_read.patch
++Name=InnoDB patch to control insert buffer and flushing
++Version=1.0
++Author=Yasufumi Kinoshita
++License=BSD
++Comment=
+diff -r 2fdaeb546d25 sql/ha_innodb.h
+--- a/sql/ha_innodb.h	Mon Sep 08 16:39:06 2008 -0700
++++ b/sql/ha_innodb.h	Mon Sep 08 16:40:14 2008 -0700
+@@ -234,6 +234,11 @@
+ extern ulong srv_thread_concurrency;
+ extern ulong srv_commit_concurrency;
+ extern ulong srv_flush_log_at_trx_commit;
++extern ulong srv_read_ahead;
++extern ulong srv_ibuf_contract_const;
++extern ulong srv_ibuf_contract_burst;
++extern ulong srv_buf_flush_const;
++extern ulong srv_buf_flush_burst;
+ }
+ 
+ bool innobase_init(void);
+diff -r 2fdaeb546d25 sql/mysqld.cc
+--- a/sql/mysqld.cc	Mon Sep 08 16:39:06 2008 -0700
++++ b/sql/mysqld.cc	Mon Sep 08 16:40:14 2008 -0700
+@@ -5014,7 +5014,10 @@
+   OPT_SECURE_FILE_PRIV,
+   OPT_KEEP_FILES_ON_CREATE,
+   OPT_INNODB_ADAPTIVE_HASH_INDEX,
+-  OPT_FEDERATED
++  OPT_FEDERATED,
++  OPT_INNODB_READ_AHEAD,
++  OPT_INNODB_IBUF_CONTRACT_CONST, OPT_INNODB_IBUF_CONTRACT_BURST,
++  OPT_INNODB_BUF_FLUSH_CONST, OPT_INNODB_BUF_FLUSH_BURST
+ };
+ 
+ 
+@@ -5321,6 +5324,26 @@
+    (gptr*) &global_system_variables.innodb_table_locks,
+    (gptr*) &global_system_variables.innodb_table_locks,
+    0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
++  {"innodb_read_ahead", OPT_INNODB_READ_AHEAD,
++   "Enable/Diasable read aheads bit0:random bit1:linear",
++   (gptr*) &srv_read_ahead, (gptr*) &srv_read_ahead,
++   0, GET_ULONG, REQUIRED_ARG, 3, 0, 3, 0, 0, 0},
++  {"innodb_ibuf_contract_const", OPT_INNODB_IBUF_CONTRACT_CONST,
++   "Const activity of merging insert buffer",
++   (gptr*) &srv_ibuf_contract_const, (gptr*) &srv_ibuf_contract_const,
++   0, GET_ULONG, REQUIRED_ARG, 5, 1, 50000, 0, 0, 0},
++  {"innodb_ibuf_contract_burst", OPT_INNODB_IBUF_CONTRACT_BURST,
++   "Burst activity of merging insert buffer",
++   (gptr*) &srv_ibuf_contract_burst, (gptr*) &srv_ibuf_contract_burst,
++   0, GET_ULONG, REQUIRED_ARG, 20, 1, 50000, 0, 0, 0},
++  {"innodb_buf_flush_const", OPT_INNODB_BUF_FLUSH_CONST,
++   "Const activity of flushing buffer pool",
++   (gptr*) &srv_buf_flush_const, (gptr*) &srv_buf_flush_const,
++   0, GET_ULONG, REQUIRED_ARG, 10, 1, 50000, 0, 0, 0},
++  {"innodb_buf_flush_burst", OPT_INNODB_BUF_FLUSH_BURST,
++   "Burst activity of flushing buffer pool",
++   (gptr*) &srv_buf_flush_burst, (gptr*) &srv_buf_flush_burst,
++   0, GET_ULONG, REQUIRED_ARG, 100, 1, 50000, 0, 0, 0},
+ #endif /* End HAVE_INNOBASE_DB */
+   {"isam", OPT_ISAM, "Obsolete. ISAM storage engine is no longer supported.",
+    (gptr*) &opt_isam, (gptr*) &opt_isam, 0, GET_BOOL, NO_ARG, 0, 0, 0,
+diff -r 2fdaeb546d25 sql/set_var.cc
+--- a/sql/set_var.cc	Mon Sep 08 16:39:06 2008 -0700
++++ b/sql/set_var.cc	Mon Sep 08 16:40:14 2008 -0700
+@@ -476,6 +476,16 @@
+ sys_var_long_ptr  sys_innodb_flush_log_at_trx_commit(
+                                         "innodb_flush_log_at_trx_commit",
+                                         &srv_flush_log_at_trx_commit);
++sys_var_long_ptr	sys_innodb_read_ahead("innodb_read_ahead",
++                                              &srv_read_ahead);
++sys_var_long_ptr	sys_innodb_ibuf_contract_const("innodb_ibuf_contract_const",
++                                                       &srv_ibuf_contract_const);
++sys_var_long_ptr	sys_innodb_ibuf_contract_burst("innodb_ibuf_contract_burst",
++                                                       &srv_ibuf_contract_burst);
++sys_var_long_ptr	sys_innodb_buf_flush_const("innodb_buf_flush_const",
++                                                   &srv_buf_flush_const);
++sys_var_long_ptr	sys_innodb_buf_flush_burst("innodb_buf_flush_burst",
++                                                   &srv_buf_flush_burst);
+ #endif
+ 
+ /* Condition pushdown to storage engine */
+@@ -818,6 +828,11 @@
+   &sys_innodb_thread_concurrency,
+   &sys_innodb_commit_concurrency,
+   &sys_innodb_flush_log_at_trx_commit,
++  &sys_innodb_read_ahead,
++  &sys_innodb_ibuf_contract_const,
++  &sys_innodb_ibuf_contract_burst,
++  &sys_innodb_buf_flush_const,
++  &sys_innodb_buf_flush_burst,
+ #endif
+   &sys_trust_routine_creators,
+   &sys_trust_function_creators,
+@@ -953,6 +968,11 @@
+   {sys_innodb_table_locks.name, (char*) &sys_innodb_table_locks, SHOW_SYS},
+   {sys_innodb_thread_concurrency.name, (char*) &sys_innodb_thread_concurrency, SHOW_SYS},
+   {sys_innodb_thread_sleep_delay.name, (char*) &sys_innodb_thread_sleep_delay, SHOW_SYS},
++  {sys_innodb_read_ahead.name, (char*) &sys_innodb_read_ahead, SHOW_SYS},
++  {sys_innodb_ibuf_contract_const.name, (char*) &sys_innodb_ibuf_contract_const, SHOW_SYS},
++  {sys_innodb_ibuf_contract_burst.name, (char*) &sys_innodb_ibuf_contract_burst, SHOW_SYS},
++  {sys_innodb_buf_flush_const.name, (char*) &sys_innodb_buf_flush_const, SHOW_SYS},
++  {sys_innodb_buf_flush_burst.name, (char*) &sys_innodb_buf_flush_burst, SHOW_SYS},
+ #endif
+   {sys_interactive_timeout.name,(char*) &sys_interactive_timeout,   SHOW_SYS},
+   {sys_join_buffer_size.name,   (char*) &sys_join_buffer_size,	    SHOW_SYS},

================================================================
Index: SOURCES/mysql-control_io-threads.patch
diff -u /dev/null SOURCES/mysql-control_io-threads.patch:1.1.2.1
--- /dev/null	Wed Sep 17 16:22:51 2008
+++ SOURCES/mysql-control_io-threads.patch	Wed Sep 17 16:22:40 2008
@@ -0,0 +1,69 @@
+diff -r 4dca80df8ee3 innobase/os/os0file.c
+--- a/innobase/os/os0file.c	Mon Sep 08 16:40:14 2008 -0700
++++ b/innobase/os/os0file.c	Mon Sep 08 16:40:20 2008 -0700
+@@ -3180,6 +3180,13 @@
+ 	struct aiocb*	control;
+ #endif
+ 	ulint		i;
++	ulint		prim_segment;
++	ulint		n;
++
++	n = array->n_slots / array->n_segments;
++	/* 64 blocks' striping ( aligning max(BUF_READ_AHEAD_AREA) ) */
++	prim_segment = ( offset >> (UNIV_PAGE_SIZE_SHIFT + 6) ) % (array->n_segments);
++
+ loop:
+ 	os_mutex_enter(array->mutex);
+ 
+@@ -3198,11 +3205,22 @@
+ 		goto loop;
+ 	}
+ 
+-	for (i = 0;; i++) {
++	for (i = prim_segment * n; i < array->n_slots; i++) {
+ 		slot = os_aio_array_get_nth_slot(array, i);
+ 
+ 		if (slot->reserved == FALSE) {
+ 			break;
++		}
++	}
++
++	if (slot->reserved == TRUE){
++		/* Not found after the intended segment. So we should search before. */
++		for (i = 0;; i++) {
++			slot = os_aio_array_get_nth_slot(array, i);
++
++			if (slot->reserved == FALSE) {
++				break;
++			}
+ 		}
+ 	}
+ 
+diff -r 4dca80df8ee3 innobase/srv/srv0start.c
+--- a/innobase/srv/srv0start.c	Mon Sep 08 16:40:14 2008 -0700
++++ b/innobase/srv/srv0start.c	Mon Sep 08 16:40:20 2008 -0700
+@@ -1213,12 +1213,12 @@
+ 
+ 	if (!os_aio_use_native_aio) {
+  		/* In simulated aio we currently have use only for 4 threads */
+-		srv_n_file_io_threads = 4;
++		/*srv_n_file_io_threads = 4;*/
+ 
+ 		os_aio_init(8 * SRV_N_PENDING_IOS_PER_THREAD
+ 						* srv_n_file_io_threads,
+ 					srv_n_file_io_threads,
+-					SRV_MAX_N_PENDING_SYNC_IOS);
++					SRV_MAX_N_PENDING_SYNC_IOS * srv_n_file_io_threads / 4);
+ 	} else {
+ 		os_aio_init(SRV_N_PENDING_IOS_PER_THREAD
+ 						* srv_n_file_io_threads,
+diff -r 4dca80df8ee3 patch_info/control_io-threads.info
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/patch_info/control_io-threads.info	Mon Sep 08 16:40:20 2008 -0700
+@@ -0,0 +1,6 @@
++File=control_io-threads.patch
++Name=InnoDB patch to control count of IO threads
++Version=1.0
++Author=Yasufumi Kinoshita
++License=BSD
++Comment=

================================================================
Index: SOURCES/mysql-microslow_innodb.patch
diff -u /dev/null SOURCES/mysql-microslow_innodb.patch:1.1.2.1
--- /dev/null	Wed Sep 17 16:22:52 2008
+++ SOURCES/mysql-microslow_innodb.patch	Wed Sep 17 16:22:40 2008
@@ -0,0 +1,2333 @@
+diff -r bb81fcdd7db2 include/my_time.h
+--- a/include/my_time.h	Mon Sep 08 16:38:33 2008 -0700
++++ b/include/my_time.h	Mon Sep 08 16:38:46 2008 -0700
+@@ -140,7 +140,7 @@
+ int my_date_to_str(const MYSQL_TIME *l_time, char *to);
+ int my_datetime_to_str(const MYSQL_TIME *l_time, char *to);
+ int my_TIME_to_str(const MYSQL_TIME *l_time, char *to);
+-
++ulonglong my_timer(ulonglong *ltime, ulonglong frequency);
+ C_MODE_END
+ 
+ #endif /* _my_time_h_ */
+diff -r bb81fcdd7db2 innobase/buf/buf0buf.c
+--- a/innobase/buf/buf0buf.c	Mon Sep 08 16:38:33 2008 -0700
++++ b/innobase/buf/buf0buf.c	Mon Sep 08 16:38:46 2008 -0700
+@@ -37,6 +37,7 @@
+ #include "log0log.h"
+ #include "trx0undo.h"
+ #include "srv0srv.h"
++#include "thr0loc.h"
+ 
+ /*
+ 		IMPLEMENTATION OF THE BUFFER POOL
+@@ -1086,6 +1087,31 @@
+ 	return(block);
+ }
+ 
++inline void _increment_page_get_statistics(buf_block_t* block, trx_t* trx)
++{
++	ulint           block_hash;
++	ulint           block_hash_byte;
++	byte            block_hash_offset;
++
++	ut_ad(block);
++
++	if (!trx || !trx->distinct_page_access_hash)
++		return;
++
++        block_hash = ut_hash_ulint((block->space << 20) + block->space +
++					block->offset, DPAH_SIZE << 3);
++	block_hash_byte = block_hash >> 3;
++	block_hash_offset = (byte) block_hash & 0x07;
++	if (block_hash_byte < 0 || block_hash_byte >= DPAH_SIZE)
++		fprintf(stderr, "!!! block_hash_byte = %lu  block_hash_offset = %lu !!!\n", block_hash_byte, block_hash_offset);
++	if (block_hash_offset < 0 || block_hash_offset > 7)
++		fprintf(stderr, "!!! block_hash_byte = %lu  block_hash_offset = %lu !!!\n", block_hash_byte, block_hash_offset);
++	if ((trx->distinct_page_access_hash[block_hash_byte] & ((byte) 0x01 << block_hash_offset)) == 0)
++		trx->distinct_page_access++;
++	trx->distinct_page_access_hash[block_hash_byte] |= (byte) 0x01 << block_hash_offset;
++	return;
++}
++
+ /************************************************************************
+ This is the general function used to get access to a database page. */
+ 
+@@ -1108,6 +1134,11 @@
+ 	ulint		fix_type;
+ 	ibool		success;
+ 	ibool		must_read;
++	trx_t*          trx;
++	ulint           sec;
++	ulint           ms;
++	ib_longlong     start_time;
++	ib_longlong     finish_time;
+ 	
+ 	ut_ad(mtr);
+ 	ut_ad((rw_latch == RW_S_LATCH)
+@@ -1119,6 +1150,7 @@
+ #ifndef UNIV_LOG_DEBUG
+ 	ut_ad(!ibuf_inside() || ibuf_page(space, offset));
+ #endif
++	trx = thr_local_get_trx(os_thread_get_curr_id());
+ 	buf_pool->n_page_gets++;
+ loop:
+ 	block = NULL;
+@@ -1148,7 +1180,7 @@
+ 			return(NULL);
+ 		}
+ 
+-		buf_read_page(space, offset);
++		buf_read_page(space, offset, trx);
+ 
+ #ifdef UNIV_DEBUG
+ 		buf_dbg_counter++;
+@@ -1261,6 +1293,11 @@
+ 		        /* Let us wait until the read operation
+ 			completes */
+ 
++			if (trx)
++			{
++				ut_usectime(&sec, &ms);
++				start_time = (ib_longlong)sec * 1000000 + ms;
++			}
+ 		        for (;;) {
+ 				mutex_enter(&block->mutex);
+ 
+@@ -1275,6 +1312,12 @@
+ 
+ 				       break;
+ 				}
++			}
++                	if (trx)
++			{
++				ut_usectime(&sec, &ms);
++        	        	finish_time = (ib_longlong)sec * 1000000 + ms;
++                		trx->io_reads_wait_timer += (ulint)(finish_time - start_time);
+ 			}
+ 		}
+ 
+@@ -1296,12 +1339,15 @@
+ 		/* In the case of a first access, try to apply linear
+ 		read-ahead */
+ 
+-		buf_read_ahead_linear(space, offset);
++		buf_read_ahead_linear(space, offset, trx);
+ 	}
+ 
+ #ifdef UNIV_IBUF_DEBUG
+ 	ut_a(ibuf_count_get(block->space, block->offset) == 0);
+ #endif
++
++	_increment_page_get_statistics(block, trx);
++	
+ 	return(block->frame);		
+ }
+ 
+@@ -1326,6 +1372,7 @@
+ 	ibool		accessed;
+ 	ibool		success;
+ 	ulint		fix_type;
++	trx_t*          trx;
+ 
+ 	ut_ad(mtr && block);
+ 	ut_ad((rw_latch == RW_S_LATCH) || (rw_latch == RW_X_LATCH));
+@@ -1440,13 +1487,16 @@
+ 		read-ahead */
+ 
+ 		buf_read_ahead_linear(buf_frame_get_space_id(guess),
+-					buf_frame_get_page_no(guess));
++					buf_frame_get_page_no(guess), trx);
+ 	}
+ 
+ #ifdef UNIV_IBUF_DEBUG
+ 	ut_a(ibuf_count_get(block->space, block->offset) == 0);
+ #endif
+ 	buf_pool->n_page_gets++;
++
++	trx = thr_local_get_trx(os_thread_get_curr_id());
++	_increment_page_get_statistics(block, trx);
+ 
+ 	return(TRUE);
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list