Bug#16971045 ASSERTION FAILURES ON ROLLBACK OF AN INSERT AFTER A

FAILED BLOB WRITE

btr_store_big_rec_extern_fields(): Relax a debug assertion so that
some BLOB pointers may remain zero if an error occurs.

btr_free_externally_stored_field(), row_undo_ins(): Allow the BLOB
pointer to be zero on any rollback.

rb#3059 approved by Jimmy Yang, Kevin Lewis
This commit is contained in:
Marko Mäkelä 2013-08-14 09:43:21 +03:00
parent 8977c8fa98
commit 84b2f38d01
3 changed files with 26 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2013-08-14 The InnoDB Team
* btr/btr0cur.c, row/row0uins.c:
Fix Bug#16971045 ASSERTION FAILURES ON ROLLBACK OF AN INSERT AFTER
A FAILED BLOB WRITE
2013-05-15 The InnoDB Team
* page/page0zip.c:

View File

@ -4320,6 +4320,10 @@ next_zip_page:
}
}
}
DBUG_EXECUTE_IF("btr_store_big_rec_extern",
error = DB_OUT_OF_FILE_SPACE;
goto func_exit;);
}
func_exit:
@ -4352,9 +4356,11 @@ func_exit:
field_ref = btr_rec_get_field_ref(rec, offsets, i);
/* The pointer must not be zero. */
/* The pointer must not be zero if the operation
succeeded. */
ut_a(0 != memcmp(field_ref, field_ref_zero,
BTR_EXTERN_FIELD_REF_SIZE));
BTR_EXTERN_FIELD_REF_SIZE)
|| error != DB_SUCCESS);
/* The column must not be disowned by this record. */
ut_a(!(field_ref[BTR_EXTERN_LEN] & BTR_EXTERN_OWNER_FLAG));
}
@ -4450,10 +4456,10 @@ btr_free_externally_stored_field(
if (UNIV_UNLIKELY(!memcmp(field_ref, field_ref_zero,
BTR_EXTERN_FIELD_REF_SIZE))) {
/* In the rollback of uncommitted transactions, we may
encounter a clustered index record whose BLOBs have
not been written. There is nothing to free then. */
ut_a(rb_ctx == RB_RECOVERY || rb_ctx == RB_RECOVERY_PURGE_REC);
/* In the rollback, we may encounter a clustered index
record with some unwritten off-page columns. There is
nothing to free then. */
ut_a(rb_ctx != RB_NONE);
return;
}

View File

@ -336,13 +336,14 @@ row_undo_ins(
/* The database must have crashed after
inserting a clustered index record but before
writing all the externally stored columns of
that record. Because secondary index entries
are inserted after the clustered index record,
we may assume that the secondary index record
does not exist. However, this situation may
only occur during the rollback of incomplete
transactions. */
ut_a(trx_is_recv(node->trx));
that record, or a statement is being rolled
back because an error occurred while storing
off-page columns.
Because secondary index entries are inserted
after the clustered index record, we may
assume that the secondary index record does
not exist. */
} else {
log_free_check();
err = row_undo_ins_remove_sec(node->index, entry);