List:Commits« Previous MessageNext Message »
From:kpettersson Date:August 14 2007 1:52pm
Subject:bk commit into 5.0 tree (thek:1.2480) BUG#21074
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of thek. When thek does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-08-14 15:52:46+02:00, thek@adventure.(none) +1 -0
  Bug #21074 Large query_cache freezes mysql server sporadically under heavy load
  
  Invaldating a subset of a sufficiently large query cache can take a long time.
  During this time the server is efficiently frozen and no other operation can
  be executed. This patch addresses this problem by setting a time limit on
  how long time a dictionary access request can take before giving up on the 
  attempt. This patch does not work for query cache invalidations issued by
  DROP, ALTER or RENAME TABLE operations.

  sql/sql_cache.cc@stripped, 2007-08-14 15:52:44+02:00, thek@adventure.(none) +27 -1
    Changed mutex locking to a timed spinn lock. If access to query cache dictionary
    takes "a long time" (currently more than 0.1 seconds) the system fall backs on
    ordinary statement execution.

diff -Nrup a/sql/sql_cache.cc b/sql/sql_cache.cc
--- a/sql/sql_cache.cc	2007-05-10 14:54:53 +02:00
+++ b/sql/sql_cache.cc	2007-08-14 15:52:44 +02:00
@@ -1023,6 +1023,13 @@ Query_cache::send_result_to_client(THD *
   Query_cache_block_table *block_table, *block_table_end;
   ulong tot_length;
   Query_cache_query_flags flags;
+  const uint spin_treshold= 50000;
+  const double lock_time_treshold= 0.1; /* Time in seconds */
+  uint spin_count= 0;
+  int lock_status= 0;
+  ulong new_time= 0;
+  ulong stop_time= 0;
+
   DBUG_ENTER("Query_cache::send_result_to_client");
 
   /*
@@ -1069,7 +1076,26 @@ Query_cache::send_result_to_client(THD *
     }
   }
 
-  STRUCT_LOCK(&structure_guard_mutex);
+  stop_time= my_clock()+(ulong)lock_time_treshold*CLOCKS_PER_SEC;
+  while ((lock_status= pthread_mutex_trylock(&structure_guard_mutex)) == EBUSY
+         && spin_count < spin_treshold
+         && new_time < stop_time)
+  {
+    spin_count++;
+    if (spin_count%5)
+      new_time= my_clock();
+    pthread_yield();
+  }
+
+  if (lock_status != 0)
+  {
+    /*
+      Query cache is too busy doing something else.
+      Fall back on ordinary statement execution.
+    */
+    DBUG_RETURN(0);
+  }
+
   if (query_cache_size == 0 || flush_in_progress)
   {
     DBUG_PRINT("qcache", ("query cache disabled"));
Thread
bk commit into 5.0 tree (thek:1.2480) BUG#21074kpettersson14 Aug
  • Re: bk commit into 5.0 tree (thek:1.2480) BUG#21074Konstantin Osipov29 Aug
    • Re: bk commit into 5.0 tree (thek:1.2480) BUG#21074He Zhenxing11 Oct
      • Re: bk commit into 5.0 tree (thek:1.2480) BUG#21074Sergei Golubchik12 Oct