diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2014-12-03 13:56:22 +0400 |
---|---|---|
committer | Sergey Vojtovich <svoj@mariadb.org> | 2014-12-03 13:56:22 +0400 |
commit | 037dcf25e94990e5a2f008f96e1813b7149b91ed (patch) | |
tree | 8193e6e323ca6b8fe87432a22983b8d07f712e81 | |
parent | 3014e137885b0293d1ed6834c45d53a675bbc622 (diff) | |
download | mariadb-git-bb-lf-iterator.tar.gz |
MDEV-6089 - MySQL WL#7305 "Improve MDL scalability by using lock-free hash"bb-lf-iterator
This is prerequisite for MDEV-6089. Added lf_hash_search_using_hash_value(),
which can reuse previously calculated hash value.
-rw-r--r-- | include/lf.h | 3 | ||||
-rw-r--r-- | mysys/lf_hash.c | 14 |
2 files changed, 14 insertions, 3 deletions
diff --git a/include/lf.h b/include/lf.h index 5ca777dd680..b776c152ee5 100644 --- a/include/lf.h +++ b/include/lf.h @@ -231,6 +231,9 @@ void lf_hash_init(LF_HASH *hash, uint element_size, uint flags, void lf_hash_destroy(LF_HASH *hash); int lf_hash_insert(LF_HASH *hash, LF_PINS *pins, const void *data); void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); +void *lf_hash_search_using_hash_value(LF_HASH *hash, LF_PINS *pins, + my_hash_value_type hash_value, + const void *key, uint keylen); int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen); int lf_hash_iterate(LF_HASH *hash, LF_PINS *pins, my_hash_walk_action action, void *argument); diff --git a/mysys/lf_hash.c b/mysys/lf_hash.c index 782ebc00f24..6a3659c20ac 100644 --- a/mysys/lf_hash.c +++ b/mysys/lf_hash.c @@ -467,12 +467,13 @@ int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen) NOTE see lsearch() for pin usage notes */ -void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen) +void *lf_hash_search_using_hash_value(LF_HASH *hash, LF_PINS *pins, + my_hash_value_type hashnr, + const void *key, uint keylen) { LF_SLIST * volatile *el, *found; - uint bucket, hashnr= calc_hash(hash, (uchar *)key, keylen); + uint bucket= hashnr % hash->size; - bucket= hashnr % hash->size; lf_rwlock_by_pins(pins); el= _lf_dynarray_lvalue(&hash->array, bucket); if (unlikely(!el)) @@ -521,6 +522,13 @@ int lf_hash_iterate(LF_HASH *hash, LF_PINS *pins, return res; } +void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen) +{ + return lf_hash_search_using_hash_value(hash, pins, + calc_hash(hash, (uchar*) key, keylen), + key, keylen); +} + static const uchar *dummy_key= (uchar*)""; /* |