summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-08-10 19:19:05 +0200
committerSergei Golubchik <serg@mariadb.org>2016-08-10 19:19:05 +0200
commit309c08c17c56d35e5635a5874fb70719935e5f54 (patch)
treedb63b0f496364456789f390eb5f693dabf0f94a1 /storage
parentc6fdb92ca829fed893d9e7324e80b1450de16087 (diff)
parent5ad02062d928cccbd29c0a2db6f0f7ceb33195d1 (diff)
downloadmariadb-git-309c08c17c56d35e5635a5874fb70719935e5f54.tar.gz
Merge branch '5.5' into 10.0
Diffstat (limited to 'storage')
-rw-r--r--storage/innobase/include/os0sync.h13
-rw-r--r--storage/innobase/include/sync0sync.ic5
-rw-r--r--storage/innobase/page/page0cur.cc20
-rw-r--r--storage/myisam/ha_myisam.cc3
-rw-r--r--storage/xtradb/include/log0online.h4
-rw-r--r--storage/xtradb/include/os0sync.h13
-rw-r--r--storage/xtradb/include/sync0sync.ic5
-rw-r--r--storage/xtradb/log/log0online.cc4
-rw-r--r--storage/xtradb/page/page0cur.cc20
9 files changed, 62 insertions, 25 deletions
diff --git a/storage/innobase/include/os0sync.h b/storage/innobase/include/os0sync.h
index 1cf4e9ce501..bd9acb13028 100644
--- a/storage/innobase/include/os0sync.h
+++ b/storage/innobase/include/os0sync.h
@@ -479,20 +479,13 @@ os_atomic_test_and_set(volatile lock_word_t* ptr)
}
/** Do an atomic release.
-
-In theory __sync_lock_release should be used to release the lock.
-Unfortunately, it does not work properly alone. The workaround is
-that more conservative __sync_lock_test_and_set is used instead.
-
-Performance regression was observed at some conditions for Intel
-architecture. Disable release barrier on Intel architecture for now.
@param[in,out] ptr Memory location to write to
@return the previous value */
inline
-lock_word_t
+void
os_atomic_clear(volatile lock_word_t* ptr)
{
- return(__sync_lock_test_and_set(ptr, 0));
+ __sync_lock_release(ptr);
}
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
@@ -861,7 +854,7 @@ for synchronization */
architecture. Disable memory barrier for Intel architecture for now. */
# define os_rmb do { } while(0)
# define os_wmb do { } while(0)
-# define os_isync do { } while(0)
+# define os_mb do { } while(0)
# define IB_MEMORY_BARRIER_STARTUP_MSG \
"Memory barrier is not used"
#elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE)
diff --git a/storage/innobase/include/sync0sync.ic b/storage/innobase/include/sync0sync.ic
index 55f728fd744..84a9be971b9 100644
--- a/storage/innobase/include/sync0sync.ic
+++ b/storage/innobase/include/sync0sync.ic
@@ -178,6 +178,11 @@ mutex_exit_func(
to wake up possible hanging threads if
they are missed in mutex_signal_object. */
+ /* We add a memory barrier to prevent reading of the
+ number of waiters before releasing the lock. */
+
+ os_mb;
+
if (mutex_get_waiters(mutex) != 0) {
mutex_signal_object(mutex);
diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc
index f5f7e1299ce..28368182b3e 100644
--- a/storage/innobase/page/page0cur.cc
+++ b/storage/innobase/page/page0cur.cc
@@ -1055,6 +1055,26 @@ use_heap:
insert_rec = rec_copy(insert_buf, rec, offsets);
rec_offs_make_valid(insert_rec, index, offsets);
+ /* This is because assertion below is debug assertion */
+#ifdef UNIV_DEBUG
+ if (UNIV_UNLIKELY(current_rec == insert_rec)) {
+ ulint extra_len, data_len;
+ extra_len = rec_offs_extra_size(offsets);
+ data_len = rec_offs_data_size(offsets);
+
+ fprintf(stderr, "InnoDB: Error: current_rec == insert_rec "
+ " extra_len %lu data_len %lu insert_buf %p rec %p\n",
+ extra_len, data_len, insert_buf, rec);
+ fprintf(stderr, "InnoDB; Physical record: \n");
+ rec_print(stderr, rec, index);
+ fprintf(stderr, "InnoDB: Inserted record: \n");
+ rec_print(stderr, insert_rec, index);
+ fprintf(stderr, "InnoDB: Current record: \n");
+ rec_print(stderr, current_rec, index);
+ ut_a(current_rec != insert_rec);
+ }
+#endif /* UNIV_DEBUG */
+
/* 4. Insert the record in the linked list of records */
ut_ad(current_rec != insert_rec);
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index d97aa503d42..dac01b8af89 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -1454,6 +1454,7 @@ int ha_myisam::enable_indexes(uint mode)
else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
{
THD *thd= table->in_use;
+ int was_error= thd->is_error();
HA_CHECK &param= *(HA_CHECK*) thd->alloc(sizeof(param));
const char *save_proc_info=thd->proc_info;
@@ -1499,7 +1500,7 @@ int ha_myisam::enable_indexes(uint mode)
might have been set by the first repair. They can still be seen
with SHOW WARNINGS then.
*/
- if (! error)
+ if (! error && ! was_error)
thd->clear_error();
}
info(HA_STATUS_CONST);
diff --git a/storage/xtradb/include/log0online.h b/storage/xtradb/include/log0online.h
index 67dc0d72b4b..5706f3af4b0 100644
--- a/storage/xtradb/include/log0online.h
+++ b/storage/xtradb/include/log0online.h
@@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
+this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+Street, Fifth Floor, Boston, MA 02110-1301, USA
*****************************************************************************/
diff --git a/storage/xtradb/include/os0sync.h b/storage/xtradb/include/os0sync.h
index 0f93f3ff074..c7a9318c841 100644
--- a/storage/xtradb/include/os0sync.h
+++ b/storage/xtradb/include/os0sync.h
@@ -530,20 +530,13 @@ os_atomic_test_and_set(volatile lock_word_t* ptr)
}
/** Do an atomic release.
-
-In theory __sync_lock_release should be used to release the lock.
-Unfortunately, it does not work properly alone. The workaround is
-that more conservative __sync_lock_test_and_set is used instead.
-
-Performance regression was observed at some conditions for Intel
-architecture. Disable release barrier on Intel architecture for now.
@param[in,out] ptr Memory location to write to
@return the previous value */
inline
-lock_word_t
+void
os_atomic_clear(volatile lock_word_t* ptr)
{
- return(__sync_lock_test_and_set(ptr, 0));
+ __sync_lock_release(ptr);
}
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
@@ -912,7 +905,7 @@ for synchronization */
architecture. Disable memory barrier for Intel architecture for now. */
# define os_rmb do { } while(0)
# define os_wmb do { } while(0)
-# define os_isync do { } while(0)
+# define os_mb do { } while(0)
# define IB_MEMORY_BARRIER_STARTUP_MSG \
"Memory barrier is not used"
#elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE)
diff --git a/storage/xtradb/include/sync0sync.ic b/storage/xtradb/include/sync0sync.ic
index 00db854341a..823389d4cbe 100644
--- a/storage/xtradb/include/sync0sync.ic
+++ b/storage/xtradb/include/sync0sync.ic
@@ -181,6 +181,11 @@ mutex_exit_func(
to wake up possible hanging threads if
they are missed in mutex_signal_object. */
+ /* We add a memory barrier to prevent reading of the
+ number of waiters before releasing the lock. */
+
+ os_mb;
+
if (mutex_get_waiters(mutex) != 0) {
mutex_signal_object(mutex);
diff --git a/storage/xtradb/log/log0online.cc b/storage/xtradb/log/log0online.cc
index 4aa9174328d..65176548532 100644
--- a/storage/xtradb/log/log0online.cc
+++ b/storage/xtradb/log/log0online.cc
@@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
+this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+Street, Fifth Floor, Boston, MA 02110-1301, USA
*****************************************************************************/
diff --git a/storage/xtradb/page/page0cur.cc b/storage/xtradb/page/page0cur.cc
index f5f7e1299ce..28368182b3e 100644
--- a/storage/xtradb/page/page0cur.cc
+++ b/storage/xtradb/page/page0cur.cc
@@ -1055,6 +1055,26 @@ use_heap:
insert_rec = rec_copy(insert_buf, rec, offsets);
rec_offs_make_valid(insert_rec, index, offsets);
+ /* This is because assertion below is debug assertion */
+#ifdef UNIV_DEBUG
+ if (UNIV_UNLIKELY(current_rec == insert_rec)) {
+ ulint extra_len, data_len;
+ extra_len = rec_offs_extra_size(offsets);
+ data_len = rec_offs_data_size(offsets);
+
+ fprintf(stderr, "InnoDB: Error: current_rec == insert_rec "
+ " extra_len %lu data_len %lu insert_buf %p rec %p\n",
+ extra_len, data_len, insert_buf, rec);
+ fprintf(stderr, "InnoDB; Physical record: \n");
+ rec_print(stderr, rec, index);
+ fprintf(stderr, "InnoDB: Inserted record: \n");
+ rec_print(stderr, insert_rec, index);
+ fprintf(stderr, "InnoDB: Current record: \n");
+ rec_print(stderr, current_rec, index);
+ ut_a(current_rec != insert_rec);
+ }
+#endif /* UNIV_DEBUG */
+
/* 4. Insert the record in the linked list of records */
ut_ad(current_rec != insert_rec);