diff options
Diffstat (limited to 'storage/innobase/include/lock0lock.h')
-rw-r--r-- | storage/innobase/include/lock0lock.h | 89 |
1 files changed, 52 insertions, 37 deletions
diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index a1ffe87d5bd..8e6fdaed3d5 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2012, 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 @@ -275,7 +275,7 @@ the query thread to the lock wait state and inserts a waiting request for a gap x-lock to the lock queue. @return DB_SUCCESS, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -ulint +dberr_t lock_rec_insert_check_and_lock( /*===========================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG bit is @@ -285,10 +285,11 @@ lock_rec_insert_check_and_lock( dict_index_t* index, /*!< in: index */ que_thr_t* thr, /*!< in: query thread */ mtr_t* mtr, /*!< in/out: mini-transaction */ - ibool* inherit);/*!< out: set to TRUE if the new + ibool* inherit)/*!< out: set to TRUE if the new inserted record maybe should inherit LOCK_GAP type locks from the successor record */ + __attribute__((nonnull, warn_unused_result)); /*********************************************************************//** Checks if locks of other transactions prevent an immediate modify (update, delete mark, or delete unmark) of a clustered index record. If they do, @@ -298,7 +299,7 @@ lock wait state and inserts a waiting request for a record x-lock to the lock queue. @return DB_SUCCESS, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -ulint +dberr_t lock_clust_rec_modify_check_and_lock( /*=================================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG @@ -308,13 +309,14 @@ lock_clust_rec_modify_check_and_lock( modified */ dict_index_t* index, /*!< in: clustered index */ const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ - que_thr_t* thr); /*!< in: query thread */ + que_thr_t* thr) /*!< in: query thread */ + __attribute__((warn_unused_result, nonnull)); /*********************************************************************//** Checks if locks of other transactions prevent an immediate modify (delete mark or delete unmark) of a secondary index record. @return DB_SUCCESS, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -ulint +dberr_t lock_sec_rec_modify_check_and_lock( /*===============================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG @@ -326,15 +328,17 @@ lock_sec_rec_modify_check_and_lock( clustered index record first: see the comment below */ dict_index_t* index, /*!< in: secondary index */ - que_thr_t* thr, /*!< in: query thread */ - mtr_t* mtr); /*!< in/out: mini-transaction */ + que_thr_t* thr, /*!< in: query thread + (can be NULL if BTR_NO_LOCKING_FLAG) */ + mtr_t* mtr) /*!< in/out: mini-transaction */ + __attribute__((warn_unused_result, nonnull(2,3,4,6))); /*********************************************************************//** Like lock_clust_rec_read_check_and_lock(), but reads a secondary index record. @return DB_SUCCESS, DB_SUCCESS_LOCKED_REC, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -enum db_err +dberr_t lock_sec_rec_read_check_and_lock( /*=============================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG @@ -364,7 +368,7 @@ lock on the record. @return DB_SUCCESS, DB_SUCCESS_LOCKED_REC, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -enum db_err +dberr_t lock_clust_rec_read_check_and_lock( /*===============================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG @@ -395,7 +399,7 @@ lock_clust_rec_read_check_and_lock() that does not require the parameter "offsets". @return DB_SUCCESS, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -ulint +dberr_t lock_clust_rec_read_check_and_lock_alt( /*===================================*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG @@ -413,13 +417,14 @@ lock_clust_rec_read_check_and_lock_alt( SELECT FOR UPDATE */ ulint gap_mode,/*!< in: LOCK_ORDINARY, LOCK_GAP, or LOCK_REC_NOT_GAP */ - que_thr_t* thr); /*!< in: query thread */ + que_thr_t* thr) /*!< in: query thread */ + __attribute__((nonnull, warn_unused_result)); /*********************************************************************//** Checks that a record is seen in a consistent read. -@return TRUE if sees, or FALSE if an earlier version of the record +@return true if sees, or false if an earlier version of the record should be retrieved */ UNIV_INTERN -ibool +bool lock_clust_rec_cons_read_sees( /*==========================*/ const rec_t* rec, /*!< in: user record which should be read or @@ -431,26 +436,27 @@ lock_clust_rec_cons_read_sees( Checks that a non-clustered index record is seen in a consistent read. NOTE that a non-clustered index page contains so little information on -its modifications that also in the case FALSE, the present version of +its modifications that also in the case false, the present version of rec may be the right, but we must check this from the clustered index record. -@return TRUE if certainly sees, or FALSE if an earlier version of the +@return true if certainly sees, or false if an earlier version of the clustered index record might be needed */ UNIV_INTERN -ulint +bool lock_sec_rec_cons_read_sees( /*========================*/ const rec_t* rec, /*!< in: user record which should be read or passed over by a read cursor */ - const read_view_t* view); /*!< in: consistent read view */ + const read_view_t* view) /*!< in: consistent read view */ + __attribute__((nonnull, warn_unused_result)); /*********************************************************************//** Locks the specified database table in the mode given. If the lock cannot be granted immediately, the query thread is put to wait. @return DB_SUCCESS, DB_LOCK_WAIT, DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */ UNIV_INTERN -ulint +dberr_t lock_table( /*=======*/ ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG bit is set, @@ -458,7 +464,8 @@ lock_table( dict_table_t* table, /*!< in/out: database table in dictionary cache */ enum lock_mode mode, /*!< in: lock mode */ - que_thr_t* thr); /*!< in: query thread */ + que_thr_t* thr) /*!< in: query thread */ + __attribute__((nonnull, warn_unused_result)); /*************************************************************//** Removes a granted record lock of a transaction from the queue and grants locks to other transactions waiting in the queue if they now are entitled @@ -780,7 +787,7 @@ was selected as a deadlock victim, or if it has to wait then cancel the wait lock. @return DB_DEADLOCK, DB_LOCK_WAIT or DB_SUCCESS */ UNIV_INTERN -enum db_err +dberr_t lock_trx_handle_wait( /*=================*/ trx_t* trx) /*!< in/out: trx lock state */ @@ -864,29 +871,35 @@ lock_trx_has_sys_table_locks( remains set when the waiting lock is granted, or if the lock is inherited to a neighboring record */ -#if (LOCK_WAIT|LOCK_GAP|LOCK_REC_NOT_GAP|LOCK_INSERT_INTENTION)&LOCK_MODE_MASK +#define LOCK_CONV_BY_OTHER 4096 /*!< this bit is set when the lock is created + by other transaction */ +#if (LOCK_WAIT|LOCK_GAP|LOCK_REC_NOT_GAP|LOCK_INSERT_INTENTION|LOCK_CONV_BY_OTHER)&LOCK_MODE_MASK # error #endif -#if (LOCK_WAIT|LOCK_GAP|LOCK_REC_NOT_GAP|LOCK_INSERT_INTENTION)&LOCK_TYPE_MASK +#if (LOCK_WAIT|LOCK_GAP|LOCK_REC_NOT_GAP|LOCK_INSERT_INTENTION|LOCK_CONV_BY_OTHER)&LOCK_TYPE_MASK # error #endif /* @} */ +/** Checks if this is a waiting lock created by lock->trx itself. +@param type_mode lock->type_mode +@return whether it is a waiting lock belonging to lock->trx */ +#define lock_is_wait_not_by_other(type_mode) \ + ((type_mode & (LOCK_CONV_BY_OTHER | LOCK_WAIT)) == LOCK_WAIT) + /** Lock operation struct */ -typedef struct lock_op_struct lock_op_t; -/** Lock operation struct */ -struct lock_op_struct{ +struct lock_op_t{ dict_table_t* table; /*!< table to be locked */ enum lock_mode mode; /*!< lock mode */ }; /** The lock system struct */ -struct lock_sys_struct{ - mutex_t mutex; /*!< Mutex protecting the +struct lock_sys_t{ + ib_mutex_t mutex; /*!< Mutex protecting the locks */ hash_table_t* rec_hash; /*!< hash table of the record locks */ - mutex_t wait_mutex; /*!< Mutex protecting the + ib_mutex_t wait_mutex; /*!< Mutex protecting the next two fields */ srv_slot_t* waiting_threads; /*!< Array of user threads suspended while waiting for @@ -901,6 +914,16 @@ struct lock_sys_struct{ recovered transactions is complete. Protected by lock_sys->mutex */ + + ulint n_lock_max_wait_time; /*!< Max wait time */ + + os_event_t timeout_event; /*!< Set to the event that is + created in the lock wait monitor + thread. A value of 0 means the + thread is not active */ + + bool timeout_thread_active; /*!< True if the timeout thread + is running */ }; /** The lock system */ @@ -935,14 +958,6 @@ extern lock_sys_t* lock_sys; mutex_exit(&lock_sys->wait_mutex); \ } while (0) -// FIXME: Move these to lock_sys_t -extern ibool srv_lock_timeout_active; -extern ulint srv_n_lock_wait_count; -extern ulint srv_n_lock_wait_current_count; -extern ib_int64_t srv_n_lock_wait_time; -extern ulint srv_n_lock_max_wait_time; -extern os_event_t srv_lock_timeout_thread_event; - #ifndef UNIV_NONINL #include "lock0lock.ic" #endif |