Skip to content

Commit b368e36

Browse files
author
Steinar H. Gunderson
committed
Bug #25997748: MIGRATE FROM HASH TO STD::UNORDERED_MAP [patch 6, noclose]
More conversions from HASH, a bit all over (authentication, stored procedures, session tracker). Change-Id: Id6c616ab4cedd41ac4e27d9b314a3da19c5a84e2
1 parent ac129b8 commit b368e36

16 files changed

+188
-215
lines changed

mysql-test/r/deprecate_eof.result

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ SELECT f1();
170170
f1()
171171
6
172172
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
173-
-- character_set_connection
174-
-- utf8mb4
175173
-- character_set_client
176174
-- utf8mb4
175+
-- character_set_connection
176+
-- utf8mb4
177177
-- character_set_results
178178
-- big5
179179

@@ -185,10 +185,10 @@ SELECT * FROM v1;
185185
f1()
186186
6
187187
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
188-
-- character_set_connection
189-
-- utf8mb4
190188
-- character_set_client
191189
-- utf8mb4
190+
-- character_set_connection
191+
-- utf8mb4
192192
-- character_set_results
193193
-- big5
194194

@@ -243,10 +243,10 @@ SELECT f4();
243243
f4()
244244
1
245245
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
246-
-- character_set_connection
247-
-- utf8mb4
248246
-- character_set_client
249247
-- utf8mb4
248+
-- character_set_connection
249+
-- utf8mb4
250250
-- character_set_results
251251
-- utf8
252252

mysql-test/r/session_tracker.result

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ SELECT @@session.character_set_client, @@session.character_set_results, @@sessio
2727
utf8mb4 utf8mb4 utf8mb4
2828
SET NAMES 'utf8';
2929
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
30-
-- character_set_connection
31-
-- utf8
3230
-- character_set_client
3331
-- utf8
32+
-- character_set_connection
33+
-- utf8
3434
-- character_set_results
3535
-- utf8
3636

@@ -39,10 +39,10 @@ SELECT @@session.character_set_client, @@session.character_set_results, @@sessio
3939
utf8 utf8 utf8
4040
SET NAMES 'big5';
4141
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
42-
-- character_set_connection
43-
-- big5
4442
-- character_set_client
4543
-- big5
44+
-- character_set_connection
45+
-- big5
4646
-- character_set_results
4747
-- big5
4848

@@ -279,21 +279,21 @@ SET @@session.tx_isolation='READ-COMMITTED';
279279
END;|
280280
CALL my_proc;
281281
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
282-
-- tx_isolation
283-
-- READ-COMMITTED
284282
-- autocommit
285283
-- OFF
286284
-- time_zone
287285
-- -06:00
286+
-- tx_isolation
287+
-- READ-COMMITTED
288288

289289
CALL my_proc;
290290
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
291-
-- tx_isolation
292-
-- READ-COMMITTED
293291
-- autocommit
294292
-- OFF
295293
-- time_zone
296294
-- -06:00
295+
-- tx_isolation
296+
-- READ-COMMITTED
297297

298298
DROP PROCEDURE my_proc;
299299
# Testing with unknown/invalid system variables.
@@ -509,10 +509,10 @@ SET @@session.session_track_state_change=ON;
509509
expect 1
510510
SET NAMES 'utf8';
511511
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
512-
-- character_set_connection
513-
-- utf8
514512
-- character_set_client
515513
-- utf8
514+
-- character_set_connection
515+
-- utf8
516516
-- character_set_results
517517
-- utf8
518518

@@ -523,10 +523,10 @@ SET @@session.session_track_state_change=OFF;
523523
# Change system variable
524524
SET NAMES 'utf8';
525525
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
526-
-- character_set_connection
527-
-- utf8
528526
-- character_set_client
529527
-- utf8
528+
-- character_set_connection
529+
-- utf8
530530
-- character_set_results
531531
-- utf8
532532

plugin/rewriter/rewriter.cc

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,36 +38,30 @@ using rules_table_service::Cursor;
3838
using Mysql::Nullable;
3939
namespace messages = rewriter_messages;
4040

41-
/**
42-
@file rewriter.cc
43-
Implementation of the Rewriter class's member functions.
44-
*/
45-
41+
namespace {
4642

47-
/** Functions used in the hash */
48-
static const uchar *get_rule_hash_code(const uchar *entry, size_t *length)
43+
std::string hash_key_from_digest(const uchar *digest)
4944
{
50-
const Rule *rule= pointer_cast<const Rule*>(entry);
51-
*length= PARSER_SERVICE_DIGEST_LENGTH;
52-
const uchar *digest= pointer_cast<const uchar*>(rule->digest_buffer());
53-
return digest;
45+
return std::string(pointer_cast<const char *>(digest),
46+
PARSER_SERVICE_DIGEST_LENGTH);
5447
}
5548

49+
} // namespace
5650

57-
static void free_rule(void *entry) { delete pointer_cast<Rule*>(entry); }
51+
/**
52+
@file rewriter.cc
53+
Implementation of the Rewriter class's member functions.
54+
*/
5855

5956

6057
Rewriter::Rewriter()
6158
{
62-
my_hash_init(&m_digests, &my_charset_bin, 10,
63-
PARSER_SERVICE_DIGEST_LENGTH,
64-
get_rule_hash_code,
65-
free_rule, 0,
66-
PSI_INSTRUMENT_ME);
6759
}
6860

6961

70-
Rewriter::~Rewriter() { my_hash_free(&m_digests); }
62+
Rewriter::~Rewriter()
63+
{
64+
}
7165

7266

7367
bool Rewriter::load_rule(MYSQL_THD thd, Persisted_rule *diskrule)
@@ -79,7 +73,8 @@ bool Rewriter::load_rule(MYSQL_THD thd, Persisted_rule *diskrule)
7973
switch (load_status)
8074
{
8175
case Rule::OK:
82-
my_hash_insert(&m_digests, pointer_cast<uchar*>(memrule_ptr.release()));
76+
m_digests.emplace(hash_key_from_digest(memrule_ptr->digest_buffer()),
77+
std::move(memrule_ptr));
8378
diskrule->message= Nullable<string>();
8479
diskrule->pattern_digest= services::print_digest(memrule->digest_buffer());
8580
diskrule->normalized_pattern= memrule->normalized_pattern();
@@ -139,7 +134,7 @@ void Rewriter::do_refresh(MYSQL_THD session_thd)
139134
m_refresh_status= REWRITER_ERROR_TABLE_MALFORMED;
140135
DBUG_VOID_RETURN;
141136
}
142-
my_hash_reset(&m_digests);
137+
m_digests.clear();
143138

144139
for (; c != rules_table_service::end(); ++c)
145140
{
@@ -209,24 +204,19 @@ Rewriter::Load_status Rewriter::refresh(MYSQL_THD thd)
209204

210205
Rewrite_result Rewriter::rewrite_query(MYSQL_THD thd, const uchar *key)
211206
{
212-
HASH_SEARCH_STATE state;
213207
Rewrite_result result;
214208

215-
Rule *rule= pointer_cast<Rule*>(my_hash_first(&m_digests, key,
216-
PARSER_SERVICE_DIGEST_LENGTH,
217-
&state));
218-
while (rule != NULL)
209+
auto it_range= m_digests.equal_range(hash_key_from_digest(key));
210+
for (auto it= it_range.first; it != it_range.second; ++it)
219211
{
212+
Rule *rule= it->second.get();
220213
result.digest_matched= true;
221214
if (rule->matches(thd))
222215
{
223216
result= rule->create_new_query(thd);
224217
if (result.was_rewritten)
225218
return result;
226219
}
227-
rule= pointer_cast<Rule*>(my_hash_next(&m_digests, key,
228-
PARSER_SERVICE_DIGEST_LENGTH,
229-
&state));
230220
}
231221

232222
result.was_rewritten= false;

plugin/rewriter/rewriter.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
#include "my_config.h"
2020

21-
#include <hash.h>
21+
#include <memory>
22+
#include <string>
2223

24+
#include "map_helpers.h"
2325
#include "my_inttypes.h"
2426
#include "rule.h"
2527

@@ -58,7 +60,7 @@ class Rewriter {
5860
that fail to load, this number will be lower than the number of rows in
5961
the database.
6062
*/
61-
int get_number_loaded_rules() const { return m_digests.records; }
63+
int get_number_loaded_rules() const { return m_digests.size(); }
6264

6365
~Rewriter();
6466

@@ -86,7 +88,8 @@ class Rewriter {
8688
Rewriter::Load_status m_refresh_status;
8789

8890
/// The in-memory rules hash table.
89-
HASH m_digests;
91+
malloc_unordered_multimap<std::string, std::unique_ptr<Rule>>
92+
m_digests{PSI_INSTRUMENT_ME};
9093

9194
/// Loads the rule retrieved from the database in the hash table.
9295
bool load_rule(MYSQL_THD thd, Persisted_rule *diskrule);

0 commit comments

Comments
 (0)