rpms/mysql/devel mysql-stack-guard.patch, 1.1, 1.2 mysql.init, 1.21, 1.22 mysql.spec, 1.104, 1.105

Tom Lane (tgl) fedora-extras-commits at redhat.com
Mon Mar 3 22:30:29 UTC 2008


Author: tgl

Update of /cvs/pkgs/rpms/mysql/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv4781

Modified Files:
	mysql-stack-guard.patch mysql.init mysql.spec 
Log Message:
Second try at stack-guard patch, also apply fix for bug #435494

mysql-stack-guard.patch:

Index: mysql-stack-guard.patch
===================================================================
RCS file: /cvs/pkgs/rpms/mysql/devel/mysql-stack-guard.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mysql-stack-guard.patch	28 Feb 2008 21:23:49 -0000	1.1
+++ mysql-stack-guard.patch	3 Mar 2008 22:30:11 -0000	1.2
@@ -1,26 +1,84 @@
 mysql is not accounting for the "guard page" when setting thread stack size
 requests.  This is fatal on PPC systems, which may use guard pages as large
-as 64K.  I'll bet a good deal that the hacks it uses for IA64 are a result
-of misdiagnosis of a similar problem, so remove them.
+as 64K.  This patch also documents the IA64 situation a bit better.
 
-It is not at this point entirely clear whether mysql is wrong in ignoring
-the guard page, or whether this is a RHEL bug (see our bz#435337).  So not
-reporting this upstream yet.  But we need the patch now, so we can build mysql
-in rawhide (the build machines are using RHEL5 kernels).
+Note: there are quite a few other setstacksize calls besides the two in
+mysqld.cc; is it important to fix any of the others?
 
 
 diff -Naur mysql-5.0.45.orig/sql/mysqld.cc mysql-5.0.45/sql/mysqld.cc
 --- mysql-5.0.45.orig/sql/mysqld.cc	2007-07-04 09:06:03.000000000 -0400
-+++ mysql-5.0.45/sql/mysqld.cc	2008-02-28 15:17:20.000000000 -0500
-@@ -2286,6 +2286,7 @@
- {
-   int error;
-   pthread_attr_t thr_attr;
++++ mysql-5.0.45/sql/mysqld.cc	2008-03-03 17:16:25.000000000 -0500
+@@ -2281,6 +2281,68 @@
+   DBUG_VOID_RETURN;
+ }
+ 
++/* pthread_attr_setstacksize without so much platform-dependency */
++/* returns the actual stack size if possible */
++static size_t my_setstacksize(pthread_attr_t *attr, size_t stacksize)
++{
 +  size_t guard_size = 0;
-   DBUG_ENTER("start_signal_handler");
++
++#if defined(__ia64__) || defined(__ia64)
++  /*
++    On IA64, half of the requested stack size is used for "normal stack"
++    and half for "register stack".  The space measured by check_stack_overrun
++    is the "normal stack", so double the request to make sure we have the
++    caller-expected amount of normal stack.
++
++    NOTE: there is no guarantee that the register stack can't grow faster
++    than normal stack, so it's very unclear that we won't dump core due to
++    stack overrun despite check_stack_overrun's efforts.  Experimentation
++    shows that in the execution_constants test, the register stack grows
++    less than half as fast as normal stack, but perhaps other scenarios are
++    less forgiving.  If it turns out that more space is needed for the
++    register stack, that could be forced (rather inefficiently) by using a
++    multiplier higher than 2 here.
++  */
++  stacksize *= 2;
++#endif
++
++  /*
++    On many machines, the "guard space" is subtracted from the requested
++    stack size, and that space is quite large on some platforms.  So add
++    it to our request, if we can find out what it is.
++
++    FIXME: autoconfiscate use of pthread_attr_getguardsize
++  */
++  if (pthread_attr_getguardsize(attr, &guard_size))
++    guard_size = 0;		/* if can't find it out, treat as 0 */
++
++  pthread_attr_setstacksize(attr, stacksize + guard_size);
++
++  /* Retrieve actual stack size if possible */
++#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
++  {
++    size_t real_stack_size= 0;
++    /* We must ignore real_stack_size = 0 as Solaris 2.9 can return 0 here */
++    if (pthread_attr_getstacksize(attr, &real_stack_size) == 0 &&
++	real_stack_size > guard_size)
++    {
++      real_stack_size -= guard_size;
++      if (real_stack_size < stacksize)
++      {
++	if (global_system_variables.log_warnings)
++	  sql_print_warning("Asked for %ld thread stack, but got %ld",
++			    (long) stacksize, (long) real_stack_size);
++	stacksize= real_stack_size;
++      }
++    }
++  }
++#endif
++
++#if defined(__ia64__) || defined(__ia64)
++  stacksize /= 2;
++#endif
++  return stacksize;
++}
  
-   (void) pthread_attr_init(&thr_attr);
-@@ -2294,15 +2295,9 @@
+ static void start_signal_handler(void)
+ {
+@@ -2294,15 +2356,7 @@
    (void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED);
    if (!(opt_specialflag & SPECIAL_NO_PRIOR))
      my_pthread_attr_setprio(&thr_attr,INTERRUPT_PRIOR);
@@ -33,13 +91,11 @@
 -#else
 -  pthread_attr_setstacksize(&thr_attr,thread_stack);
 -#endif
-+
-+  pthread_attr_getguardsize(&thr_attr, &guard_size);
-+  pthread_attr_setstacksize(&thr_attr, thread_stack + guard_size);
++  (void) my_setstacksize(&thr_attr,thread_stack);
  #endif
  
    (void) pthread_mutex_lock(&LOCK_thread_count);
-@@ -3499,37 +3494,29 @@
+@@ -3499,41 +3553,12 @@
    init_signals();
    if (!(opt_specialflag & SPECIAL_NO_PRIOR))
      my_pthread_setprio(pthread_self(),CONNECT_PRIOR);
@@ -53,27 +109,17 @@
 -  pthread_attr_setstacksize(&connection_attrib,thread_stack);
 -#endif
 -#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
-+
-   {
-+    size_t guard_size = 0;
-+    size_t stack_size = 0;
-+
-+    pthread_attr_getguardsize(&connection_attrib, &guard_size);
-+
-+    pthread_attr_setstacksize(&connection_attrib, thread_stack + guard_size);
-+
-+#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
-     /* Retrieve used stack size;  Needed for checking stack overflows */
+-  {
+-    /* Retrieve used stack size;  Needed for checking stack overflows */
 -    size_t stack_size= 0;
-     pthread_attr_getstacksize(&connection_attrib, &stack_size);
+-    pthread_attr_getstacksize(&connection_attrib, &stack_size);
 -#if defined(__ia64__) || defined(__ia64)
 -    stack_size/= 2;
 -#endif
-     /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */
+-    /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */
 -    if (stack_size && stack_size < thread_stack)
-+    if (stack_size && stack_size < thread_stack + guard_size)
-     {
-       if (global_system_variables.log_warnings)
+-    {
+-      if (global_system_variables.log_warnings)
 -	sql_print_warning("Asked for %lu thread stack, but got %ld",
 -			  thread_stack, (long) stack_size);
 -#if defined(__ia64__) || defined(__ia64)
@@ -81,14 +127,16 @@
 -#else
 -      thread_stack= stack_size;
 -#endif
-+	sql_print_warning("Asked for %lu+%lu thread stack, but got %ld",
-+			  thread_stack, (long) guard_size, (long) stack_size);
-+      thread_stack= stack_size - guard_size;
-     }
+-    }
 -  }
- #endif
-+  }
+-#endif
 +
  #ifdef __NETWARE__
    /* Increasing stacksize of threads on NetWare */
+-
+   pthread_attr_setstacksize(&connection_attrib, NW_THD_STACKSIZE);
++#else
++  thread_stack = my_setstacksize(&connection_attrib,thread_stack);
+ #endif
  
+   (void) thr_setconcurrency(concurrency);	// 10 by default


Index: mysql.init
===================================================================
RCS file: /cvs/pkgs/rpms/mysql/devel/mysql.init,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- mysql.init	29 Mar 2007 22:47:48 -0000	1.21
+++ mysql.init	3 Mar 2008 22:30:11 -0000	1.22
@@ -68,7 +68,7 @@
 	if [ $ret -eq 0 ]; then
 	    STARTTIMEOUT=30
 	    while [ $STARTTIMEOUT -gt 0 ]; do
-		RESPONSE=`/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping 2>&1` && break
+		RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` && break
 		echo "$RESPONSE" | grep -q "Access denied for user" && break
 		sleep 1
 		let STARTTIMEOUT=${STARTTIMEOUT}-1


Index: mysql.spec
===================================================================
RCS file: /cvs/pkgs/rpms/mysql/devel/mysql.spec,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -r1.104 -r1.105
--- mysql.spec	3 Mar 2008 17:55:21 -0000	1.104
+++ mysql.spec	3 Mar 2008 22:30:11 -0000	1.105
@@ -1,6 +1,6 @@
 Name: mysql
 Version: 5.0.45
-Release: 10%{?dist}
+Release: 11%{?dist}
 Summary: MySQL client programs and shared libraries
 Group: Applications/Databases
 URL: http://www.mysql.com
@@ -484,8 +484,13 @@
 %{_mandir}/man1/mysql_client_test.1*
 
 %changelog
+* Mon Mar  3 2008 Tom Lane <tgl at redhat.com> 5.0.45-11
+- Fix mysql-stack-guard patch to work correctly on IA64
+- Fix mysql.init to wait correctly when socket is not in default place
+Related: #435494
+
 * Mon Mar 03 2008 Dennis Gilmore <dennis at ausil.us> 5.0.45-10
-- add sparc64 to  64 bit arches for  test suite checking
+- add sparc64 to 64 bit arches for test suite checking
 - add sparc, sparcv9 and sparc64 to multilib handling
 
 * Thu Feb 28 2008 Tom Lane <tgl at redhat.com> 5.0.45-9




More information about the fedora-extras-commits mailing list