diff options
author | Inaam Rana <inaam.rana@oracle.com> | 2010-06-21 11:52:09 -0400 |
---|---|---|
committer | Inaam Rana <inaam.rana@oracle.com> | 2010-06-21 11:52:09 -0400 |
commit | d860510452fd7a86a83d7d81f5c3a2cb76f5ef10 (patch) | |
tree | 3791c47fd7cbc49d9eff2a364560be183667ef5d /storage/innobase/row/row0upd.c | |
parent | 97d36ef532d4f0e9cd64eeb314167ff45a00ac6d (diff) | |
download | mariadb-git-d860510452fd7a86a83d7d81f5c3a2cb76f5ef10.tar.gz |
Fixes bug#39168.
Make a call to log_free_check() on all DML paths.
Diffstat (limited to 'storage/innobase/row/row0upd.c')
-rw-r--r-- | storage/innobase/row/row0upd.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c index f1a90a3bf1c..39d5036da0d 100644 --- a/storage/innobase/row/row0upd.c +++ b/storage/innobase/row/row0upd.c @@ -92,6 +92,16 @@ the x-latch freed? The most efficient way for performing a searched delete is obviously to keep the x-latch for several steps of query graph execution. */ +/************************************************************************* +IMPORTANT NOTE: Any operation that generates redo MUST check that there +is enough space in the redo log before for that operation. This is +done by calling log_free_check(). The reason for checking the +availability of the redo log space before the start of the operation is +that we MUST not hold any synchonization objects when performing the +check. +If you make a change in this module make sure that no codepath is +introduced where a call to log_free_check() is bypassed. */ + /***********************************************************//** Checks if an update vector changes some of the first ordering fields of an index record. This is only used in foreign key checks and we can assume @@ -1454,7 +1464,6 @@ row_upd_sec_index_entry( entry = row_build_index_entry(node->row, node->ext, index, heap); ut_a(entry); - log_free_check(); mtr_start(&mtr); /* Set the query thread, so that ibuf_insert_low() will be @@ -1557,7 +1566,7 @@ Updates the secondary index record if it is changed in the row update or deletes it if this is a delete. @return DB_SUCCESS if operation successfully completed, else error code or DB_LOCK_WAIT */ -UNIV_INLINE +static ulint row_upd_sec_step( /*=============*/ @@ -2049,6 +2058,7 @@ row_upd( if (node->state == UPD_NODE_UPDATE_CLUSTERED || node->state == UPD_NODE_INSERT_CLUSTERED) { + log_free_check(); err = row_upd_clust_step(node, thr); if (err != DB_SUCCESS) { @@ -2063,6 +2073,8 @@ row_upd( } while (node->index != NULL) { + + log_free_check(); err = row_upd_sec_step(node, thr); if (err != DB_SUCCESS) { |