List:Commits« Previous MessageNext Message »
From:Daniel Fischer Date:March 27 2008 2:13pm
Subject:bk commit into 5.1 tree (df:1.2582) BUG#35220
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of df.  When df 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, 2008-03-27 15:13:10+01:00, df@stripped +11 -0
  apply snapshot innodb-5.1-ss2387
  
  ------------------------------------------------------------------------
  r2361 | sunny | 2008-03-12 09:08:09 +0200 (Wed, 12 Mar 2008) | 3 lines
  Changed paths:
     M /branches/5.1/include/srv0srv.h
     M /branches/5.1/os/os0file.c
     M /branches/5.1/srv/srv0srv.c
     M /branches/5.1/srv/srv0start.c
  
  branches/5.1: Remove the innodb_flush_method fdatasync option since it was
  not being used and there was a potential it could mislead users.
  
  ------------------------------------------------------------------------
  r2367 | marko | 2008-03-17 10:23:03 +0200 (Mon, 17 Mar 2008) | 5 lines
  Changed paths:
     M /branches/5.1/handler/ha_innodb.cc
  
  branches/5.1: ha_innobase::check_if_incompatible_data(): Check
  HA_CREATE_USED_ROW_FORMAT before comparing row_type.  Previously,
  the comparison was incorrectly guarded by the presence of an
  AUTO_INCREMENT attribute.
  
  ------------------------------------------------------------------------
  r2374 | vasil | 2008-03-18 09:35:30 +0200 (Tue, 18 Mar 2008) | 11 lines
  Changed paths:
     M /branches/5.1/dict/dict0dict.c
     A /branches/5.1/mysql-test/innodb_bug35220.result
     A /branches/5.1/mysql-test/innodb_bug35220.test
  
  branches/5.1:
  
  Fix Bug#35220 ALTER TABLE too picky on reserved word "foreign".
  
  In ALTER TABLE, change the internal parser to search for
  ``FOREIGN[[:space:]]'' instead of only ``FOREIGN'' when parsing
  ALTER TABLE ... DROP FOREIGN KEY ...; otherwise it could be mistaken
  with ALTER TABLE ... DROP foreign_col;
  
  Approved by:    Heikki
  
  ------------------------------------------------------------------------
  r2379 | vasil | 2008-03-19 18:48:00 +0200 (Wed, 19 Mar 2008) | 10 lines
  Changed paths:
     M /branches/5.1/os/os0file.c
  
  branches/5.1:
  
  Fix Bug#34823:
  fsync() occasionally returns ENOLCK and causes InnoDB to restart mysqld
  
  Create a wrapper to fsync(2) that retries the operation if the error is
  ENOLCK. Use that wrapper instead of fsync(2).
  
  Approved by:    Heikki
  
  ------------------------------------------------------------------------
  r2380 | sunny | 2008-03-21 05:03:56 +0200 (Fri, 21 Mar 2008) | 9 lines
  Changed paths:
     M /branches/5.1/include/trx0undo.h
     M /branches/5.1/trx/trx0trx.c
     M /branches/5.1/trx/trx0undo.c
  
  branches/5.1: Fix for Bug# 35352. We've added a heuristic that checks
  the size of the UNDO slots cache lists (insert and upate). If either of
  cached lists has more than 500 entries then we add any UNDO slots that are
  freed, to the common free list instead of the cache list, this is to avoid
  the case where all the free slots end up in only one of the lists on startup
  after a crash.
  
  Tested with test case for 26590 and passes all mysql-test(s).
  
  ------------------------------------------------------------------------
  r2383 | vasil | 2008-03-26 09:35:22 +0200 (Wed, 26 Mar 2008) | 4 lines
  Changed paths:
     M /branches/5.1/include/row0mysql.h
  
  branches/5.1:
  
  Fix typo in comment.
  
  ------------------------------------------------------------------------
  r2384 | vasil | 2008-03-26 18:26:54 +0200 (Wed, 26 Mar 2008) | 20 lines
  Changed paths:
     A /branches/5.1/mysql-test/innodb_bug34300.result
     A /branches/5.1/mysql-test/innodb_bug34300.test
     M /branches/5.1/row/row0sel.c
  
  branches/5.1:
  
  Fix Bug#34300 Tinyblob & tinytext fields currupted after export/import and alter in 5.1
  
  Copy the BLOB fields, that are stored internally, to a safe place
  (prebuilt->blob_heap) when converting a row from InnoDB format to
  MySQL format in row_sel_store_mysql_rec().
  
  The bug was introduced in:
  
   ------------------------------------------------------------------------
   r587 | osku | 2006-05-23 15:35:58 +0300 (Tue, 23 May 2006) | 3 lines
  
   Optimize BLOB selects by using prebuilt->blob_heap directly instead of first
   reading BLOB data to a temporary heap and then copying it to
   prebuilt->blob_heap.
   ------------------------------------------------------------------------
  
  Approved by:    Heikki
  
  ------------------------------------------------------------------------
  r2386 | vasil | 2008-03-27 07:45:02 +0200 (Thu, 27 Mar 2008) | 22 lines
  Changed paths:
     M /branches/5.1/mysql-test/innodb.result
  
  branches/5.1:
  
  Merge change from MySQL (this fixes the failing innodb test):
  
  ChangeSet@stripped, 2008-02-07 02:33:21+04:00, gshchepa@stripped +9 -0
    Fixed bug#30059.
    Server handles truncation for assignment of too-long values
    into CHAR/VARCHAR/TEXT columns in a different ways when the
    truncated characters are spaces:
    1. CHAR(N) columns silently ignore end-space truncation;
    2. TEXT columns post a truncation warning/error in the
       non-strict/strict mode.
    3. VARCHAR columns always post a truncation note in
       any mode.
  
    Space truncation processing has been synchronised over
    CHAR/VARCHAR/TEXT columns: current behavior of VARCHAR
    columns has been propagated as standard.
  
    Binary-encoded string/BLOB columns are not affected.
  
  
  ------------------------------------------------------------------------
  r2387 | vasil | 2008-03-27 08:49:05 +0200 (Thu, 27 Mar 2008) | 8 lines
  Changed paths:
     M /branches/5.1/row/row0sel.c
  
  branches/5.1:
  
  Check whether *trx->mysql_query_str is != NULL in addition to
  trx->mysql_query_str. This adds more safety.
  
  This may or may not fix Bug#35226 RBR event crashes slave.
  
  
  ------------------------------------------------------------------------

  storage/innobase/dict/dict0dict.c@stripped, 2008-03-27 15:12:48+01:00, df@stripped +1 -1
    apply snapshot innodb-5.1-ss2387

  storage/innobase/handler/ha_innodb.cc@stripped, 2008-03-27 15:12:49+01:00, df@stripped +1 -1
    apply snapshot innodb-5.1-ss2387

  storage/innobase/include/row0mysql.h@stripped, 2008-03-27 15:12:49+01:00, df@stripped +1 -1
    apply snapshot innodb-5.1-ss2387

  storage/innobase/include/srv0srv.h@stripped, 2008-03-27 15:12:49+01:00, df@stripped +1 -5
    apply snapshot innodb-5.1-ss2387

  storage/innobase/include/trx0undo.h@stripped, 2008-03-27 15:12:49+01:00, df@stripped +1 -0
    apply snapshot innodb-5.1-ss2387

  storage/innobase/os/os0file.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +52 -9
    apply snapshot innodb-5.1-ss2387

  storage/innobase/row/row0sel.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +22 -1
    apply snapshot innodb-5.1-ss2387

  storage/innobase/srv/srv0srv.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +1 -1
    apply snapshot innodb-5.1-ss2387

  storage/innobase/srv/srv0start.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +3 -3
    apply snapshot innodb-5.1-ss2387

  storage/innobase/trx/trx0trx.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +3 -3
    apply snapshot innodb-5.1-ss2387

  storage/innobase/trx/trx0undo.c@stripped, 2008-03-27 15:12:49+01:00, df@stripped +22 -4
    apply snapshot innodb-5.1-ss2387

diff -Nrup a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c
--- a/storage/innobase/dict/dict0dict.c	2008-03-27 02:37:04 +01:00
+++ b/storage/innobase/dict/dict0dict.c	2008-03-27 15:12:48 +01:00
@@ -3395,7 +3395,7 @@ loop:
 
 	ptr = dict_accept(cs, ptr, "FOREIGN", &success);
 
-	if (!success) {
+	if (!success || !my_isspace(cs, *ptr)) {
 
 		goto loop;
 	}
diff -Nrup a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
--- a/storage/innobase/handler/ha_innodb.cc	2008-03-27 02:37:05 +01:00
+++ b/storage/innobase/handler/ha_innodb.cc	2008-03-27 15:12:49 +01:00
@@ -7935,7 +7935,7 @@ bool ha_innobase::check_if_incompatible_
 	}
 
 	/* Check that row format didn't change */
-	if ((info->used_fields & HA_CREATE_USED_AUTO) &&
+	if ((info->used_fields & HA_CREATE_USED_ROW_FORMAT) &&
 		get_row_type() != info->row_type) {
 
 		return COMPATIBLE_DATA_NO;
diff -Nrup a/storage/innobase/include/row0mysql.h b/storage/innobase/include/row0mysql.h
--- a/storage/innobase/include/row0mysql.h	2008-02-19 03:11:26 +01:00
+++ b/storage/innobase/include/row0mysql.h	2008-03-27 15:12:49 +01:00
@@ -679,7 +679,7 @@ struct row_prebuilt_struct {
 					fetched row in fetch_cache */
 	ulint		n_fetch_cached;	/* number of not yet fetched rows
 					in fetch_cache */
-	mem_heap_t*	blob_heap;	/* in SELECTS BLOB fie lds are copied
+	mem_heap_t*	blob_heap;	/* in SELECTS BLOB fields are copied
 					to this heap */
 	mem_heap_t*	old_vers_heap;	/* memory heap where a previous
 					version is built in consistent read */
diff -Nrup a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
--- a/storage/innobase/include/srv0srv.h	2007-03-06 18:36:07 +01:00
+++ b/storage/innobase/include/srv0srv.h	2008-03-27 15:12:49 +01:00
@@ -249,11 +249,7 @@ extern srv_sys_t*	srv_sys;
 
 /* Alternatives for the file flush option in Unix; see the InnoDB manual
 about what these mean */
-#define SRV_UNIX_FDATASYNC	1	/* This is the default; it is
-					currently mapped to a call of
-					fsync() because fdatasync() seemed
-					to corrupt files in Linux and
-					Solaris */
+#define SRV_UNIX_FSYNC		1	/* This is the default */
 #define SRV_UNIX_O_DSYNC	2
 #define SRV_UNIX_LITTLESYNC	3
 #define SRV_UNIX_NOSYNC		4
diff -Nrup a/storage/innobase/include/trx0undo.h b/storage/innobase/include/trx0undo.h
--- a/storage/innobase/include/trx0undo.h	2007-07-10 02:16:00 +02:00
+++ b/storage/innobase/include/trx0undo.h	2008-03-27 15:12:49 +01:00
@@ -240,6 +240,7 @@ trx_undo_set_state_at_finish(
 /*=========================*/
 				/* out: undo log segment header page,
 				x-latched */
+	trx_rseg_t*	rseg,	/* in: rollback segment memory object */
 	trx_t*		trx,	/* in: transaction */
 	trx_undo_t*	undo,	/* in: undo log memory copy */
 	mtr_t*		mtr);	/* in: mtr */
diff -Nrup a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c
--- a/storage/innobase/os/os0file.c	2007-08-16 01:44:21 +02:00
+++ b/storage/innobase/os/os0file.c	2008-03-27 15:12:49 +01:00
@@ -22,8 +22,6 @@ Created 10/21/1995 Heikki Tuuri
 #include <errno.h>
 #endif /* UNIV_HOTBACKUP */
 
-#undef HAVE_FDATASYNC
-
 #ifdef POSIX_ASYNC_IO
 /* We assume in this case that the OS has standard Posix aio (at least SunOS
 2.6, HP-UX 11i and AIX 4.3 have) */
@@ -1812,6 +1810,55 @@ os_file_set_eof(
 #endif /* __WIN__ */
 }
 
+#ifndef __WIN__
+/***************************************************************************
+Wrapper to fsync(2) that retries the call on some errors.
+Returns the value 0 if successful; otherwise the value -1 is returned and
+the global variable errno is set to indicate the error. */
+
+static
+int
+os_file_fsync(
+/*==========*/
+				/* out: 0 if success, -1 otherwise */
+	os_file_t	file)	/* in: handle to a file */
+{
+	int	ret;
+	int	failures;
+	ibool	retry;
+
+	failures = 0;
+
+	do {
+		ret = fsync(file);
+
+		os_n_fsyncs++;
+
+		if (ret == -1 && errno == ENOLCK) {
+
+			if (failures % 100 == 0) {
+
+				ut_print_timestamp(stderr);
+				fprintf(stderr,
+					"  InnoDB: fsync(): "
+					"No locks available; retrying\n");
+			}
+
+			os_thread_sleep(200000 /* 0.2 sec */);
+
+			failures++;
+
+			retry = TRUE;
+		} else {
+
+			retry = FALSE;
+		}
+	} while (retry);
+
+	return(ret);
+}
+#endif /* !__WIN__ */
+
 /***************************************************************************
 Flushes the write buffers of a given file to the disk. */
 
@@ -1869,23 +1916,19 @@ os_file_flush(
 		/* If we are not on an operating system that supports this,
 		then fall back to a plain fsync. */
 
-		ret = fsync(file);
+		ret = os_file_fsync(file);
 	} else {
 		ret = fcntl(file, F_FULLFSYNC, NULL);
 
 		if (ret) {
 			/* If we are not on a file system that supports this,
 			then fall back to a plain fsync. */
-			ret = fsync(file);
+			ret = os_file_fsync(file);
 		}
 	}
-#elif HAVE_FDATASYNC
-	ret = fdatasync(file);
 #else
-	/*	fprintf(stderr, "Flushing to file %p\n", file); */
-	ret = fsync(file);
+	ret = os_file_fsync(file);
 #endif
-	os_n_fsyncs++;
 
 	if (ret == 0) {
 		return(TRUE);
diff -Nrup a/storage/innobase/row/row0sel.c b/storage/innobase/row/row0sel.c
--- a/storage/innobase/row/row0sel.c	2008-03-27 02:37:08 +01:00
+++ b/storage/innobase/row/row0sel.c	2008-03-27 15:12:49 +01:00
@@ -2643,6 +2643,25 @@ row_sel_store_mysql_rec(
 
 			data = rec_get_nth_field(rec, offsets,
 						 templ->rec_field_no, &len);
+
+			if (UNIV_UNLIKELY(templ->type == DATA_BLOB)
+			    && len != UNIV_SQL_NULL) {
+
+				/* It is a BLOB field locally stored in the
+				InnoDB record: we MUST copy its contents to
+				prebuilt->blob_heap here because later code
+				assumes all BLOB values have been copied to a
+				safe place. */
+
+				if (prebuilt->blob_heap == NULL) {
+					prebuilt->blob_heap = mem_heap_create(
+						UNIV_PAGE_SIZE);
+				}
+
+				data = memcpy(mem_heap_alloc(
+						prebuilt->blob_heap, len),
+						data, len);
+			}
 		}
 
 		if (len != UNIV_SQL_NULL) {
@@ -3558,7 +3577,9 @@ shortcut_fails_too_big_rec:
 
 	if (trx->isolation_level <= TRX_ISO_READ_COMMITTED
 	    && prebuilt->select_lock_type != LOCK_NONE
-	    && trx->mysql_query_str && trx->mysql_thd) {
+	    && trx->mysql_query_str != NULL
+	    && *trx->mysql_query_str != NULL
+	    && trx->mysql_thd != NULL) {
 
 		/* Scan the MySQL query string; check if SELECT is the first
 		word there */
diff -Nrup a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
--- a/storage/innobase/srv/srv0srv.c	2008-02-19 03:11:26 +01:00
+++ b/storage/innobase/srv/srv0srv.c	2008-03-27 15:12:49 +01:00
@@ -192,7 +192,7 @@ a heavier load on the I/O sub system. */
 ulong	srv_insert_buffer_batch_size = 20;
 
 char*	srv_file_flush_method_str = NULL;
-ulint	srv_unix_file_flush_method = SRV_UNIX_FDATASYNC;
+ulint	srv_unix_file_flush_method = SRV_UNIX_FSYNC;
 ulint	srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED;
 
 ulint	srv_max_n_open_files	  = 300;
diff -Nrup a/storage/innobase/srv/srv0start.c b/storage/innobase/srv/srv0start.c
--- a/storage/innobase/srv/srv0start.c	2007-07-10 02:16:01 +02:00
+++ b/storage/innobase/srv/srv0start.c	2008-03-27 15:12:49 +01:00
@@ -1122,12 +1122,12 @@ innobase_start_or_create_for_mysql(void)
 	if (srv_file_flush_method_str == NULL) {
 		/* These are the default options */
 
-		srv_unix_file_flush_method = SRV_UNIX_FDATASYNC;
+		srv_unix_file_flush_method = SRV_UNIX_FSYNC;
 
 		srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED;
 #ifndef __WIN__
-	} else if (0 == ut_strcmp(srv_file_flush_method_str, "fdatasync")) {
-		srv_unix_file_flush_method = SRV_UNIX_FDATASYNC;
+	} else if (0 == ut_strcmp(srv_file_flush_method_str, "fsync")) {
+		srv_unix_file_flush_method = SRV_UNIX_FSYNC;
 
 	} else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DSYNC")) {
 		srv_unix_file_flush_method = SRV_UNIX_O_DSYNC;
diff -Nrup a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
--- a/storage/innobase/trx/trx0trx.c	2008-01-15 06:49:29 +01:00
+++ b/storage/innobase/trx/trx0trx.c	2008-03-27 15:12:49 +01:00
@@ -757,8 +757,8 @@ trx_commit_off_kernel(
 		mutex_enter(&(rseg->mutex));
 
 		if (trx->insert_undo != NULL) {
-			trx_undo_set_state_at_finish(trx, trx->insert_undo,
-						     &mtr);
+			trx_undo_set_state_at_finish(
+				rseg, trx, trx->insert_undo, &mtr);
 		}
 
 		undo = trx->update_undo;
@@ -774,7 +774,7 @@ trx_commit_off_kernel(
 			transaction commit for this transaction. */
 
 			update_hdr_page = trx_undo_set_state_at_finish(
-				trx, undo, &mtr);
+				rseg, trx, undo, &mtr);
 
 			/* We have to do the cleanup for the update log while
 			holding the rseg mutex because update log headers
diff -Nrup a/storage/innobase/trx/trx0undo.c b/storage/innobase/trx/trx0undo.c
--- a/storage/innobase/trx/trx0undo.c	2007-07-10 02:16:01 +02:00
+++ b/storage/innobase/trx/trx0undo.c	2008-03-27 15:12:49 +01:00
@@ -1725,6 +1725,7 @@ trx_undo_set_state_at_finish(
 /*=========================*/
 				/* out: undo log segment header page,
 				x-latched */
+	trx_rseg_t*	rseg,	/* in: rollback segment memory object */
 	trx_t*		trx __attribute__((unused)), /* in: transaction */
 	trx_undo_t*	undo,	/* in: undo log memory copy */
 	mtr_t*		mtr)	/* in: mtr */
@@ -1734,7 +1735,10 @@ trx_undo_set_state_at_finish(
 	page_t*		undo_page;
 	ulint		state;
 
-	ut_ad(trx && undo && mtr);
+	ut_ad(trx);
+	ut_ad(undo);
+	ut_ad(mtr);
+	ut_ad(mutex_own(&rseg->mutex));
 
 	if (undo->id >= TRX_RSEG_N_SLOTS) {
 		fprintf(stderr, "InnoDB: Error: undo->id is %lu\n",
@@ -1748,9 +1752,23 @@ trx_undo_set_state_at_finish(
 	seg_hdr = undo_page + TRX_UNDO_SEG_HDR;
 	page_hdr = undo_page + TRX_UNDO_PAGE_HDR;
 
-	if (undo->size == 1 && mach_read_from_2(page_hdr + TRX_UNDO_PAGE_FREE)
-	    < TRX_UNDO_PAGE_REUSE_LIMIT) {
-		state = TRX_UNDO_CACHED;
+	if (undo->size == 1
+	    && mach_read_from_2(page_hdr + TRX_UNDO_PAGE_FREE)
+	       < TRX_UNDO_PAGE_REUSE_LIMIT) {
+
+		/* This is a heuristic to avoid the problem of all UNDO
+		slots ending up in one of the UNDO lists. Previously if
+		the server crashed with all the slots in one of the lists,
+		transactions that required the slots of a different type
+		would fail for lack of slots. */
+
+		if (UT_LIST_GET_LEN(rseg->update_undo_list) < 500
+		    && UT_LIST_GET_LEN(rseg->insert_undo_list) < 500) {
+
+			state = TRX_UNDO_CACHED;
+		} else {
+			state = TRX_UNDO_TO_FREE;
+		}
 
 	} else if (undo->type == TRX_UNDO_INSERT) {
 
Thread
bk commit into 5.1 tree (df:1.2582) BUG#35220Daniel Fischer27 Mar
  • Re: bk commit into 5.1 tree (df:1.2582) BUG#35220Vasil Dimov30 Apr