summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorAnnamalai Gurusami <annamalai.gurusami@oracle.com>2014-02-11 16:44:37 +0530
committerAnnamalai Gurusami <annamalai.gurusami@oracle.com>2014-02-11 16:44:37 +0530
commit6193c6321127731cf8d8a954fac1a8a61c91ee2f (patch)
tree4be0083156b6865b5490c6b65b627f8f7fd24b1a /storage
parenta58449098904fdc2f596ce4c226a2262b2d41a75 (diff)
downloadmariadb-git-6193c6321127731cf8d8a954fac1a8a61c91ee2f.tar.gz
Bug#18185930 UPD_NODE_INSERT_BLOB CAUSES BTR_EXTERN_OWNER_FLAG ASSERTION
Problem: In the clustered index, when an update operation is done the overall scenario (after rb#4479) is as follows: 1. Delete mark the old record that is to be updated. 2. The old record disowns the blobs. 3. Insert the new record into clustered index. 4. For non-updated blobs, new record must own it. Verified by assert. 5. For non-updated blobs, in new record marked as inherited. Scenario involving DB_LOCK_WAIT: If step 3 times out, then we will skip 1 and 2 and will continue from step 3. This skipping is achieved by the UPD_NODE_INSERT_BLOB state. In this case, step 4 is not correct. Because of step 1, the new record need not own the blobs. Hence the assert failure. Solution: The assert in step 4 is removed. Instead code is added to ensure that the record owns the blob. Note: This is a regression caused by rb#4479. rb#4571 approved by Marko
Diffstat (limited to 'storage')
-rw-r--r--storage/innobase/row/row0ins.c6
-rw-r--r--storage/innobase/row/row0upd.c4
2 files changed, 6 insertions, 4 deletions
diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c
index 7650bc07848..9d5212db6e8 100644
--- a/storage/innobase/row/row0ins.c
+++ b/storage/innobase/row/row0ins.c
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2013, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -2250,6 +2250,10 @@ row_ins_index_entry(
{
ulint err;
+ DBUG_EXECUTE_IF("row_ins_index_entry_timeout", {
+ DBUG_SET("-d,row_ins_index_entry_timeout");
+ return(DB_LOCK_WAIT);});
+
if (foreign && UT_LIST_GET_FIRST(index->table->foreign_list)) {
err = row_ins_check_foreign_constraints(index->table, index,
entry, thr);
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c
index dccfa5ceb5c..825902c4ff2 100644
--- a/storage/innobase/row/row0upd.c
+++ b/storage/innobase/row/row0upd.c
@@ -1769,9 +1769,7 @@ row_upd_clust_rec_by_insert_inherit_func(
data += len - BTR_EXTERN_FIELD_REF_SIZE;
/* The pointer must not be zero. */
ut_a(memcmp(data, field_ref_zero, BTR_EXTERN_FIELD_REF_SIZE));
- /* The BLOB must be owned. */
- ut_a(!(data[BTR_EXTERN_LEN] & BTR_EXTERN_OWNER_FLAG));
-
+ data[BTR_EXTERN_LEN] &= ~BTR_EXTERN_OWNER_FLAG;
data[BTR_EXTERN_LEN] |= BTR_EXTERN_INHERITED_FLAG;
/* The BTR_EXTERN_INHERITED_FLAG only matters in
rollback. Purge will always free the extern fields of