MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Davi Arnaut Date:February 4 2009 11:56am
Subject:bzr push into mysql-6.0-bugteam branch (davi:3009 to 3010)
View as plain text  
 3010 Davi Arnaut	2009-02-04 [merge]
      Merge bug 40536 to 6.0-bugteam
modified:
  include/thr_lock.h
  mysql-test/r/delayed.result
  mysql-test/t/delayed.test
  mysys/thr_lock.c
  sql/sql_insert.cc

 3009 Satya B	2009-02-04 [merge]
      merge to latest 6.0-bugteam
added:
  mysql-test/include/count_sessions.inc
  mysql-test/include/wait_until_count_sessions.inc
modified:
  mysql-test/r/grant2.result
  mysql-test/r/lock_tables_lost_commit.result
  mysql-test/r/mysqldump.result
  mysql-test/r/outfile.result
  mysql-test/t/grant2.test
  mysql-test/t/grant3.test
  mysql-test/t/lock_tables_lost_commit.test
  mysql-test/t/mysqldump.test
  mysql-test/t/openssl_1.test
  mysql-test/t/outfile.test

=== modified file 'include/thr_lock.h'
--- a/include/thr_lock.h	2008-12-17 18:40:14 +0000
+++ b/include/thr_lock.h	2009-02-04 11:52:20 +0000
@@ -162,7 +162,8 @@ thr_lock_merge_status(THR_LOCK_DATA **da
 void thr_abort_locks(THR_LOCK *lock, my_bool upgrade_lock);
 my_bool thr_abort_locks_for_thread(THR_LOCK *lock, my_thread_id thread);
 void thr_print_locks(void);		/* For debugging */
-my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data);
+my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data,
+                                     enum thr_lock_type new_lock_type);
 void    thr_downgrade_write_lock(THR_LOCK_DATA *data,
                                  enum thr_lock_type new_lock_type);
 my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data);

=== modified file 'mysql-test/r/delayed.result'
--- a/mysql-test/r/delayed.result	2007-12-13 12:59:16 +0000
+++ b/mysql-test/r/delayed.result	2009-02-04 11:52:20 +0000
@@ -284,4 +284,30 @@ ERROR 22007: Incorrect date value: '0000
 INSERT DELAYED INTO t2 VALUES (0,'2007-00-00');
 ERROR 22007: Incorrect date value: '2007-00-00' for column 'f1' at row 1
 DROP TABLE t1,t2;
+set @old_delayed_updates = @@global.low_priority_updates;
+set global low_priority_updates = 1;
+select @@global.low_priority_updates;
+@@global.low_priority_updates
+1
+drop table if exists t1;
+create table t1 (a int, b int);
+insert into t1 values (1,1);
+lock table t1 read;
+connection: update
+insert delayed into t1 values (2,2);;
+connection: select
+select * from t1;
+a	b
+1	1
+connection: default
+select * from t1;
+a	b
+1	1
+unlock tables;
+select * from t1;
+a	b
+1	1
+2	2
+drop table t1;
+set global low_priority_updates = @old_delayed_updates;
 End of 5.1 tests

=== modified file 'mysql-test/t/delayed.test'
--- a/mysql-test/t/delayed.test	2007-12-16 15:03:44 +0000
+++ b/mysql-test/t/delayed.test	2009-02-04 11:52:20 +0000
@@ -294,4 +294,47 @@ INSERT DELAYED INTO t2 VALUES (0,'0000-0
 INSERT DELAYED INTO t2 VALUES (0,'2007-00-00');
 DROP TABLE t1,t2;
 
+#
+# Bug#40536: SELECT is blocked by INSERT DELAYED waiting on upgrading lock,
+#            even with low_priority_updates
+#
+
+set @old_delayed_updates = @@global.low_priority_updates;
+set global low_priority_updates = 1;
+select @@global.low_priority_updates;
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int, b int);
+insert into t1 values (1,1);
+lock table t1 read;
+connect (update,localhost,root,,);
+connection update;
+--echo connection: update
+--send insert delayed into t1 values (2,2);
+connection default;
+let $wait_condition=
+  select count(*) = 1 from information_schema.processlist
+  where command = "Delayed insert" and state = "upgrading lock";
+--source include/wait_condition.inc
+connect (select,localhost,root,,);
+--echo connection: select
+select * from t1;
+connection default;
+--echo connection: default
+select * from t1;
+connection default;
+disconnect update;
+disconnect select;
+unlock tables;
+let $wait_condition=
+  select count(*) = 1 from information_schema.processlist
+  where command = "Delayed insert" and state = "Waiting for INSERT";
+--source include/wait_condition.inc
+select * from t1;
+drop table t1;
+
+set global low_priority_updates = @old_delayed_updates;
+
 --echo End of 5.1 tests

=== modified file 'mysys/thr_lock.c'
--- a/mysys/thr_lock.c	2009-01-16 11:53:32 +0000
+++ b/mysys/thr_lock.c	2009-02-04 11:52:20 +0000
@@ -1423,7 +1423,8 @@ void thr_downgrade_write_lock(THR_LOCK_D
 
 /* Upgrade a WRITE_DELAY lock to a WRITE_LOCK */
 
-my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data)
+my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data,
+                                     enum thr_lock_type new_lock_type)
 {
   THR_LOCK *lock=data->lock;
   DBUG_ENTER("thr_upgrade_write_delay_lock");
@@ -1436,7 +1437,7 @@ my_bool thr_upgrade_write_delay_lock(THR
   }
   check_locks(lock,"before upgrading lock",0);
   /* TODO:  Upgrade to TL_WRITE_CONCURRENT_INSERT in some cases */
-  data->type=TL_WRITE;				/* Upgrade lock */
+  data->type= new_lock_type;                    /* Upgrade lock */
 
   /* Check if someone has given us the lock */
   if (!data->cond)
@@ -1475,6 +1476,7 @@ my_bool thr_upgrade_write_delay_lock(THR
 my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data)
 {
   THR_LOCK *lock=data->lock;
+  enum thr_lock_type write_lock_type;
   DBUG_ENTER("thr_reschedule_write_lock");
 
   pthread_mutex_lock(&lock->mutex);
@@ -1484,6 +1486,7 @@ my_bool thr_reschedule_write_lock(THR_LO
     DBUG_RETURN(0);
   }
 
+  write_lock_type= data->type;
   data->type=TL_WRITE_DELAYED;
   if (lock->update_status)
     (*lock->update_status)(data->status_param);
@@ -1502,7 +1505,7 @@ my_bool thr_reschedule_write_lock(THR_LO
   free_all_read_locks(lock,0);
 
   pthread_mutex_unlock(&lock->mutex);
-  DBUG_RETURN(thr_upgrade_write_delay_lock(data));
+  DBUG_RETURN(thr_upgrade_write_delay_lock(data, write_lock_type));
 }
 
 

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2009-01-18 23:21:43 +0000
+++ b/sql/sql_insert.cc	2009-02-04 11:52:20 +0000
@@ -1733,6 +1733,7 @@ public:
 
 class Delayed_insert :public ilink {
   uint locks_in_memory;
+  thr_lock_type delayed_lock;
 public:
   THD thd;
   TABLE *table;
@@ -1775,6 +1776,8 @@ public:
     pthread_cond_init(&cond_client,NULL);
     pthread_mutex_lock(&LOCK_thread_count);
     delayed_insert_threads++;
+    delayed_lock= global_system_variables.low_priority_updates ?
+                                          TL_WRITE_LOW_PRIORITY : TL_WRITE;
     pthread_mutex_unlock(&LOCK_thread_count);
   }
   ~Delayed_insert()
@@ -2614,7 +2617,7 @@ bool Delayed_insert::handle_inserts(void
   table->use_all_columns();
 
   thd_proc_info(&thd, "upgrading lock");
-  if (thr_upgrade_write_delay_lock(*thd.lock->locks))
+  if (thr_upgrade_write_delay_lock(*thd.lock->locks, delayed_lock))
   {
     /*
       This can happen if thread is killed either by a shutdown

Thread
bzr push into mysql-6.0-bugteam branch (davi:3009 to 3010) Davi Arnaut4 Feb