MySQL 8.0.40
Source Code Documentation
lock0guards.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2020, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28#ifndef lock0guards_h
29#define lock0guards_h
30
31#include "lock0lock.h"
32#include "ut0class_life_cycle.h"
33
34namespace locksys {
35/**
36A RAII helper which latches global_latch in exclusive mode during constructor,
37and unlatches it during destruction, preventing any other threads from activity
38within lock_sys for it's entire scope.
39*/
41 public:
44};
45
46/**
47A RAII helper which tries to exclusively latch the global_lach in constructor
48and unlatches it, if needed, during destruction, preventing any other threads
49from activity within lock_sys for it's entire scope, if owns_lock().
50*/
52 public:
55 /** Checks if succeeded to latch the global_latch during construction.
56 @return true iff the current thread owns (through this instance) the exclusive
57 global lock_sys latch */
58 bool owns_lock() const noexcept { return m_owns_exclusive_global_latch; }
59
60 private:
61 /** Did the constructor succeed to acquire exclusive global lock_sys latch? */
63};
64
65/**
66A RAII helper which latches global_latch in shared mode during constructor,
67and unlatches it during destruction, preventing any other thread from acquiring
68exclusive latch. This should be used in combination Shard_naked_latch_guard,
69preferably by simply using Shard_latch_guard which combines the two for you.
70*/
72 public:
75 /** Checks if there is a thread requesting the global_latch in exclusive mode
76 blocked by our thread.
77 @return true iff there is an x-latcher blocked by our s-latch. */
78 bool is_x_blocked_by_us();
79};
80
81/**
82A RAII helper which latches the mutex protecting given shard during constructor,
83and unlatches it during destruction.
84You quite probably don't want to use this class, which only takes a shard's
85latch, without acquiring global_latch - which gives no protection from threads
86which latch only the global_latch exclusively to prevent any activity.
87You should use it in combination with Global_shared_latch_guard, so that you
88first obtain an s-latch on the global_latch, or simply use the Shard_latch_guard
89class which already combines the two for you.
90*/
92 explicit Shard_naked_latch_guard(ut::Location location,
93 Lock_mutex &shard_mutex);
94
95 public:
96 explicit Shard_naked_latch_guard(ut::Location location,
97 const table_id_t &table_id);
98
99 explicit Shard_naked_latch_guard(ut::Location location,
100 const page_id_t &page_id);
101
102 explicit Shard_naked_latch_guard(ut::Location location,
103 hash_table_t *hash_table, uint64_t cell_id);
104
106
107 private:
108 /** The mutex protecting the shard requested in constructor */
110};
111
112/**
113A RAII wrapper class which combines Global_shared_latch_guard and
114Shard_naked_latch_guard to s-latch the global lock_sys latch and latch the mutex
115protecting the specified shard for the duration of its scope.
116The order of initialization is important: we have to take shared global latch
117BEFORE we attempt to use hash function to compute correct shard and latch it. */
121
122 public:
123 explicit Shard_latch_guard(ut::Location location, const dict_table_t &table)
124 : m_global_shared_latch_guard{location},
125 m_shard_naked_latch_guard{location, table.id} {}
126
127 explicit Shard_latch_guard(ut::Location location, const page_id_t &page_id)
128 : m_global_shared_latch_guard{location},
129 m_shard_naked_latch_guard{location, page_id} {}
130};
131
132/**
133A RAII helper which latches the mutexes protecting specified shards for the
134duration of its scope.
135It makes sure to take the latches in correct order and handles the case where
136both pages are in the same shard correctly.
137You quite probably don't want to use this class, which only takes a shard's
138latch, without acquiring global_latch - which gives no protection from threads
139which latch only the global_latch exclusively to prevent any activity.
140You should use it in combination with Global_shared_latch_guard, so that you
141first obtain an s-latch on the global_latch, or simply use the
142Shard_latches_guard class which already combines the two for you.
143*/
145 explicit Shard_naked_latches_guard(Lock_mutex &shard_mutex_a,
146 Lock_mutex &shard_mutex_b);
147
148 public:
149 explicit Shard_naked_latches_guard(const buf_block_t &block_a,
150 const buf_block_t &block_b);
151
153
154 private:
155 /** The "smallest" of the two shards' mutexes in the latching order */
157 /** The "largest" of the two shards' mutexes in the latching order */
159 /** The ordering on shard mutexes used to avoid deadlocks */
160 static constexpr std::less<Lock_mutex *> MUTEX_ORDER{};
161};
162
163/**
164A RAII wrapper class which s-latches the global lock_sys shard, and mutexes
165protecting specified shards for the duration of its scope.
166It makes sure to take the latches in correct order and handles the case where
167both pages are in the same shard correctly.
168The order of initialization is important: we have to take shared global latch
169BEFORE we attempt to use hash function to compute correct shard and latch it.
170*/
172 public:
174 const buf_block_t &block_a,
175 const buf_block_t &block_b)
176 : m_global_shared_latch_guard{location},
177 m_shard_naked_latches_guard{block_a, block_b} {}
178
179 private:
182};
183
184} // namespace locksys
185
186#endif /* lock0guards_h */
Definition: hash0hash.h:375
A RAII helper which latches global_latch in exclusive mode during constructor, and unlatches it durin...
Definition: lock0guards.h:40
Global_exclusive_latch_guard(ut::Location location)
Definition: lock0guards.cc:38
~Global_exclusive_latch_guard()
Definition: lock0guards.cc:43
A RAII helper which tries to exclusively latch the global_lach in constructor and unlatches it,...
Definition: lock0guards.h:51
bool owns_lock() const noexcept
Checks if succeeded to latch the global_latch during construction.
Definition: lock0guards.h:58
bool m_owns_exclusive_global_latch
Did the constructor succeed to acquire exclusive global lock_sys latch?
Definition: lock0guards.h:62
~Global_exclusive_try_latch()
Definition: lock0guards.cc:54
Global_exclusive_try_latch(ut::Location location)
Definition: lock0guards.cc:49
A RAII helper which latches global_latch in shared mode during constructor, and unlatches it during d...
Definition: lock0guards.h:71
Global_shared_latch_guard(ut::Location location)
Definition: lock0guards.cc:94
bool is_x_blocked_by_us()
Checks if there is a thread requesting the global_latch in exclusive mode blocked by our thread.
Definition: lock0guards.cc:101
~Global_shared_latch_guard()
Definition: lock0guards.cc:98
A RAII wrapper class which combines Global_shared_latch_guard and Shard_naked_latch_guard to s-latch ...
Definition: lock0guards.h:118
Shard_latch_guard(ut::Location location, const page_id_t &page_id)
Definition: lock0guards.h:127
Shard_latch_guard(ut::Location location, const dict_table_t &table)
Definition: lock0guards.h:123
Global_shared_latch_guard m_global_shared_latch_guard
Definition: lock0guards.h:119
Shard_naked_latch_guard m_shard_naked_latch_guard
Definition: lock0guards.h:120
A RAII wrapper class which s-latches the global lock_sys shard, and mutexes protecting specified shar...
Definition: lock0guards.h:171
Shard_latches_guard(ut::Location location, const buf_block_t &block_a, const buf_block_t &block_b)
Definition: lock0guards.h:173
Global_shared_latch_guard m_global_shared_latch_guard
Definition: lock0guards.h:180
Shard_naked_latches_guard m_shard_naked_latches_guard
Definition: lock0guards.h:181
A RAII helper which latches the mutex protecting given shard during constructor, and unlatches it dur...
Definition: lock0guards.h:91
~Shard_naked_latch_guard()
Definition: lock0guards.cc:88
Lock_mutex & m_shard_mutex
The mutex protecting the shard requested in constructor.
Definition: lock0guards.h:109
Shard_naked_latch_guard(ut::Location location, Lock_mutex &shard_mutex)
Definition: lock0guards.cc:63
A RAII helper which latches the mutexes protecting specified shards for the duration of its scope.
Definition: lock0guards.h:144
~Shard_naked_latches_guard()
Definition: lock0guards.cc:124
static constexpr std::less< Lock_mutex * > MUTEX_ORDER
The ordering on shard mutexes used to avoid deadlocks.
Definition: lock0guards.h:160
Lock_mutex & m_shard_mutex_1
The "smallest" of the two shards' mutexes in the latching order.
Definition: lock0guards.h:156
Shard_naked_latches_guard(Lock_mutex &shard_mutex_a, Lock_mutex &shard_mutex_b)
Definition: lock0guards.cc:107
Lock_mutex & m_shard_mutex_2
The "largest" of the two shards' mutexes in the latching order.
Definition: lock0guards.h:158
Page identifier.
Definition: buf0types.h:207
A utility class which, if inherited from, prevents the descendant class from being copied,...
Definition: ut0class_life_cycle.h:41
ib_id_t table_id_t
Table or partition identifier (unique within an InnoDB instance).
Definition: dict0types.h:232
The transaction lock system.
ib_mutex_t Lock_mutex
Definition: lock0lock.h:1003
Definition: lock0guards.h:34
The buffer control block structure.
Definition: buf0buf.h:1690
Data structure for a database table.
Definition: dict0mem.h:1909
Definition: ut0core.h:33
Utilities related to class lifecycle.
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:510