Skip to content

Commit a7adc2c

Browse files
committed
Allocate Transaction_state_tracker statically
One less new/delete per connection. Part of MDEV-14984 - regression in connect performance
1 parent 47bd06d commit a7adc2c

File tree

6 files changed

+94
-126
lines changed

6 files changed

+94
-126
lines changed

sql/lock.cc

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,11 @@ static void track_table_access(THD *thd, TABLE **tables, size_t count)
252252
{
253253
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
254254
{
255-
Transaction_state_tracker *tst= (Transaction_state_tracker *)
256-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER);
257-
258255
while (count--)
259256
{
260-
TABLE *t= tables[count];
261-
262-
if (t)
263-
tst->add_trx_state(thd, t->reginfo.lock_type,
264-
t->file->has_transaction_manager());
257+
if (TABLE *t= tables[count])
258+
thd->session_tracker.transaction_info.add_trx_state(thd,
259+
t->reginfo.lock_type, t->file->has_transaction_manager());
265260
}
266261
}
267262
}

sql/session_tracker.cc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,7 @@ Session_tracker::Session_tracker()
13451345
m_trackers[SESSION_SYSVARS_TRACKER]= 0;
13461346
m_trackers[CURRENT_SCHEMA_TRACKER]= &current_schema;
13471347
m_trackers[SESSION_STATE_CHANGE_TRACKER]= &state_change;
1348-
m_trackers[TRANSACTION_INFO_TRACKER]= 0;
1348+
m_trackers[TRANSACTION_INFO_TRACKER]= &transaction_info;
13491349
}
13501350

13511351

@@ -1367,8 +1367,6 @@ void Session_tracker::enable(THD *thd)
13671367
deinit();
13681368
m_trackers[SESSION_SYSVARS_TRACKER]=
13691369
new (std::nothrow) Session_sysvars_tracker();
1370-
m_trackers[TRANSACTION_INFO_TRACKER]=
1371-
new (std::nothrow) Transaction_state_tracker;
13721370

13731371
for (int i= 0; i < SESSION_TRACKER_END; i++)
13741372
m_trackers[i]->enable(thd);

sql/session_tracker.h

Lines changed: 71 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -154,65 +154,6 @@ class Session_state_change_tracker: public State_tracker
154154
};
155155

156156

157-
/**
158-
Session_tracker
159-
160-
This class holds an object each for all tracker classes and provides
161-
methods necessary for systematic detection and generation of session
162-
state change information.
163-
*/
164-
165-
class Session_tracker
166-
{
167-
State_tracker *m_trackers[SESSION_TRACKER_END];
168-
169-
/* The following two functions are private to disable copying. */
170-
Session_tracker(Session_tracker const &other)
171-
{
172-
DBUG_ASSERT(FALSE);
173-
}
174-
Session_tracker& operator= (Session_tracker const &rhs)
175-
{
176-
DBUG_ASSERT(FALSE);
177-
return *this;
178-
}
179-
180-
public:
181-
Current_schema_tracker current_schema;
182-
Session_state_change_tracker state_change;
183-
184-
Session_tracker();
185-
~Session_tracker() { deinit(); }
186-
187-
/* trick to make happy memory accounting system */
188-
void deinit()
189-
{
190-
delete m_trackers[SESSION_SYSVARS_TRACKER];
191-
m_trackers[SESSION_SYSVARS_TRACKER]= 0;
192-
delete m_trackers[TRANSACTION_INFO_TRACKER];
193-
m_trackers[TRANSACTION_INFO_TRACKER]= 0;
194-
}
195-
196-
void enable(THD *thd);
197-
198-
/** Returns the pointer to the tracker object for the specified tracker. */
199-
inline State_tracker *get_tracker(enum_session_tracker tracker) const
200-
{
201-
return m_trackers[tracker];
202-
}
203-
204-
inline void mark_as_changed(THD *thd, enum enum_session_tracker tracker,
205-
LEX_CSTRING *data)
206-
{
207-
if (m_trackers[tracker]->is_enabled())
208-
m_trackers[tracker]->mark_as_changed(thd, data);
209-
}
210-
211-
212-
void store(THD *thd, String *main_buf);
213-
};
214-
215-
216157
/*
217158
Transaction_state_tracker
218159
*/
@@ -277,12 +218,17 @@ class Transaction_state_tracker : public State_tracker
277218
/** Helper function: turn table info into table access flag */
278219
enum_tx_state calc_trx_state(THD *thd, thr_lock_type l, bool has_trx);
279220
public:
280-
/** Constructor */
281-
Transaction_state_tracker(): tx_changed(TX_CHG_NONE),
282-
tx_curr_state(TX_EMPTY),
283-
tx_reported_state(TX_EMPTY),
284-
tx_read_flags(TX_READ_INHERIT),
285-
tx_isol_level(TX_ISOL_INHERIT) {}
221+
222+
bool enable(THD *thd)
223+
{
224+
m_enabled= false;
225+
tx_changed= TX_CHG_NONE;
226+
tx_curr_state= TX_EMPTY;
227+
tx_reported_state= TX_EMPTY;
228+
tx_read_flags= TX_READ_INHERIT;
229+
tx_isol_level= TX_ISOL_INHERIT;
230+
return State_tracker::enable(thd);
231+
}
286232

287233
bool update(THD *thd, set_var *var);
288234
bool store(THD *thd, String *buf);
@@ -332,12 +278,69 @@ class Transaction_state_tracker : public State_tracker
332278

333279
#define TRANSACT_TRACKER(X) \
334280
do { if (thd->variables.session_track_transaction_info > TX_TRACK_NONE) \
335-
{((Transaction_state_tracker *) \
336-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER)) \
337-
->X; } } while(0)
281+
thd->session_tracker.transaction_info.X; } while(0)
338282
#define SESSION_TRACKER_CHANGED(A,B,C) \
339283
thd->session_tracker.mark_as_changed(A,B,C)
340284

285+
286+
/**
287+
Session_tracker
288+
289+
This class holds an object each for all tracker classes and provides
290+
methods necessary for systematic detection and generation of session
291+
state change information.
292+
*/
293+
294+
class Session_tracker
295+
{
296+
State_tracker *m_trackers[SESSION_TRACKER_END];
297+
298+
/* The following two functions are private to disable copying. */
299+
Session_tracker(Session_tracker const &other)
300+
{
301+
DBUG_ASSERT(FALSE);
302+
}
303+
Session_tracker& operator= (Session_tracker const &rhs)
304+
{
305+
DBUG_ASSERT(FALSE);
306+
return *this;
307+
}
308+
309+
public:
310+
Current_schema_tracker current_schema;
311+
Session_state_change_tracker state_change;
312+
Transaction_state_tracker transaction_info;
313+
314+
Session_tracker();
315+
~Session_tracker() { deinit(); }
316+
317+
/* trick to make happy memory accounting system */
318+
void deinit()
319+
{
320+
delete m_trackers[SESSION_SYSVARS_TRACKER];
321+
m_trackers[SESSION_SYSVARS_TRACKER]= 0;
322+
}
323+
324+
void enable(THD *thd);
325+
326+
/** Returns the pointer to the tracker object for the specified tracker. */
327+
inline State_tracker *get_tracker(enum_session_tracker tracker) const
328+
{
329+
return m_trackers[tracker];
330+
}
331+
332+
inline void mark_as_changed(THD *thd, enum enum_session_tracker tracker,
333+
LEX_CSTRING *data)
334+
{
335+
if (m_trackers[tracker]->is_enabled())
336+
m_trackers[tracker]->mark_as_changed(thd, data);
337+
}
338+
339+
340+
void store(THD *thd, String *main_buf);
341+
};
342+
343+
341344
int session_tracker_init();
342345
#else
343346

sql/sys_vars.cc

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3743,14 +3743,12 @@ bool Sys_var_tx_read_only::session_update(THD *thd, set_var *var)
37433743
#ifndef EMBEDDED_LIBRARY
37443744
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
37453745
{
3746-
Transaction_state_tracker *tst= (Transaction_state_tracker *)
3747-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER);
3748-
37493746
if (var->type == OPT_DEFAULT)
3750-
tst->set_read_flags(thd,
3747+
thd->session_tracker.transaction_info.set_read_flags(thd,
37513748
thd->tx_read_only ? TX_READ_ONLY : TX_READ_WRITE);
37523749
else
3753-
tst->set_read_flags(thd, TX_READ_INHERIT);
3750+
thd->session_tracker.transaction_info.set_read_flags(thd,
3751+
TX_READ_INHERIT);
37543752
}
37553753
#endif //EMBEDDED_LIBRARY
37563754
}
@@ -6145,8 +6143,7 @@ static bool update_session_track_tx_info(sys_var *self, THD *thd,
61456143
enum_var_type type)
61466144
{
61476145
DBUG_ENTER("update_session_track_tx_info");
6148-
DBUG_RETURN(thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER)->
6149-
update(thd, NULL));
6146+
DBUG_RETURN(thd->session_tracker.transaction_info.update(thd, NULL));
61506147
}
61516148

61526149
static const char *session_track_transaction_info_names[]=

sql/sys_vars.ic

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,14 +2219,6 @@ public:
22192219
return TRUE;
22202220
if (var->type == OPT_DEFAULT || !thd->in_active_multi_stmt_transaction())
22212221
{
2222-
#ifndef EMBEDDED_LIBRARY
2223-
Transaction_state_tracker *tst= NULL;
2224-
2225-
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
2226-
tst= (Transaction_state_tracker *)
2227-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER);
2228-
#endif //EMBEDDED_LIBRARY
2229-
22302222
thd->tx_isolation= (enum_tx_isolation) var->save_result.ulonglong_value;
22312223

22322224
#ifndef EMBEDDED_LIBRARY
@@ -2250,13 +2242,11 @@ public:
22502242
DBUG_ASSERT(0);
22512243
return TRUE;
22522244
}
2253-
if (tst)
2254-
tst->set_isol_level(thd, l);
2255-
}
2256-
else if (tst)
2257-
{
2258-
tst->set_isol_level(thd, TX_ISOL_INHERIT);
2245+
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
2246+
thd->session_tracker.transaction_info.set_isol_level(thd, l);
22592247
}
2248+
else if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
2249+
thd->session_tracker.transaction_info.set_isol_level(thd, TX_ISOL_INHERIT);
22602250
#endif //EMBEDDED_LIBRARY
22612251
}
22622252
return FALSE;

sql/transaction.cc

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@
3232
static void trans_track_end_trx(THD *thd)
3333
{
3434
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
35-
{
36-
((Transaction_state_tracker *)
37-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER))->end_trx(thd);
38-
}
35+
thd->session_tracker.transaction_info.end_trx(thd);
3936
}
4037
#else
4138
#define trans_track_end_trx(A) do{}while(0)
@@ -51,11 +48,8 @@ void trans_reset_one_shot_chistics(THD *thd)
5148
#ifndef EMBEDDED_LIBRARY
5249
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
5350
{
54-
Transaction_state_tracker *tst= (Transaction_state_tracker *)
55-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER);
56-
57-
tst->set_read_flags(thd, TX_READ_INHERIT);
58-
tst->set_isol_level(thd, TX_ISOL_INHERIT);
51+
thd->session_tracker.transaction_info.set_read_flags(thd, TX_READ_INHERIT);
52+
thd->session_tracker.transaction_info.set_isol_level(thd, TX_ISOL_INHERIT);
5953
}
6054
#endif //EMBEDDED_LIBRARY
6155
thd->tx_isolation= (enum_tx_isolation) thd->variables.tx_isolation;
@@ -162,20 +156,11 @@ static bool xa_trans_force_rollback(THD *thd)
162156
bool trans_begin(THD *thd, uint flags)
163157
{
164158
int res= FALSE;
165-
#ifndef EMBEDDED_LIBRARY
166-
Transaction_state_tracker *tst= NULL;
167-
#endif //EMBEDDED_LIBRARY
168159
DBUG_ENTER("trans_begin");
169160

170161
if (trans_check(thd))
171162
DBUG_RETURN(TRUE);
172163

173-
#ifndef EMBEDDED_LIBRARY
174-
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
175-
tst= (Transaction_state_tracker *)
176-
thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER);
177-
#endif //EMBEDDED_LIBRARY
178-
179164
thd->locked_tables_list.unlock_locked_tables(thd);
180165

181166
DBUG_ASSERT(!thd->locked_tables_mode);
@@ -221,8 +206,8 @@ bool trans_begin(THD *thd, uint flags)
221206
{
222207
thd->tx_read_only= true;
223208
#ifndef EMBEDDED_LIBRARY
224-
if (tst)
225-
tst->set_read_flags(thd, TX_READ_ONLY);
209+
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
210+
thd->session_tracker.transaction_info.set_read_flags(thd, TX_READ_ONLY);
226211
#endif //EMBEDDED_LIBRARY
227212
}
228213
else if (flags & MYSQL_START_TRANS_OPT_READ_WRITE)
@@ -246,8 +231,8 @@ bool trans_begin(THD *thd, uint flags)
246231
just from the session's default.
247232
*/
248233
#ifndef EMBEDDED_LIBRARY
249-
if (tst)
250-
tst->set_read_flags(thd, TX_READ_WRITE);
234+
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
235+
thd->session_tracker.transaction_info.set_read_flags(thd, TX_READ_WRITE);
251236
#endif //EMBEDDED_LIBRARY
252237
}
253238

@@ -264,16 +249,16 @@ bool trans_begin(THD *thd, uint flags)
264249
DBUG_PRINT("info", ("setting SERVER_STATUS_IN_TRANS"));
265250

266251
#ifndef EMBEDDED_LIBRARY
267-
if (tst)
268-
tst->add_trx_state(thd, TX_EXPLICIT);
252+
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
253+
thd->session_tracker.transaction_info.add_trx_state(thd, TX_EXPLICIT);
269254
#endif //EMBEDDED_LIBRARY
270255

271256
/* ha_start_consistent_snapshot() relies on OPTION_BEGIN flag set. */
272257
if (flags & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
273258
{
274259
#ifndef EMBEDDED_LIBRARY
275-
if (tst)
276-
tst->add_trx_state(thd, TX_WITH_SNAPSHOT);
260+
if (thd->variables.session_track_transaction_info > TX_TRACK_NONE)
261+
thd->session_tracker.transaction_info.add_trx_state(thd, TX_WITH_SNAPSHOT);
277262
#endif //EMBEDDED_LIBRARY
278263
res= ha_start_consistent_snapshot(thd);
279264
}

0 commit comments

Comments
 (0)