summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2023-10-12 12:55:25 +0300
committerGitHub <noreply@github.com>2023-10-12 12:55:25 +0300
commit4c3c0ad33020630182257ee3c655f6a089266c26 (patch)
tree7c3102b4471716c9494dfbb1a1c65cd22add2866
parent756046a30559bf3d99b3ae0bbb3bd2d3e1f64277 (diff)
facets: do not corrupt the index when doubling the hashtable (#16171)
do not corrupt the index when doubling the hashtable
-rw-r--r--libnetdata/facets/facets.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/libnetdata/facets/facets.c b/libnetdata/facets/facets.c
index 01ae4e6160..77ecb3e4ff 100644
--- a/libnetdata/facets/facets.c
+++ b/libnetdata/facets/facets.c
@@ -374,7 +374,7 @@ static inline FACET_VALUE *FACET_VALUE_GET_FROM_INDEX(FACET_KEY *k, FACETS_HASH
static void FACET_VALUES_HASHTABLE_DOUBLE(FACET_KEY *k) {
// increase the hashtable size
freez(k->values.hashtable);
- k->values.size *= 4;
+ k->values.size *= 2;
k->values.hashtable = callocz(k->values.size, sizeof(FACET_VALUE *));
for(FACET_VALUE *v = k->values.ll ; v ;v = v->next) {
FACET_VALUE **v_ptr = facets_values_hashtable_slot(k, v->hash);
@@ -518,7 +518,7 @@ static inline void FACETS_KEYS_INDEX_DESTROY(FACETS *facets) {
}
static inline FACET_KEY **facets_keys_hashtable_slot(FACETS *facets, FACETS_HASH hash) {
- size_t slot = hash % FACETS_KEYS_HASHTABLE_ENTRIES;
+ size_t slot = hash % facets->keys.size;
FACET_KEY **k = &facets->keys.hashtable[slot];
while(*k && (*k)->hash != hash)
@@ -530,7 +530,7 @@ static inline FACET_KEY **facets_keys_hashtable_slot(FACETS *facets, FACETS_HASH
static void FACET_KEYS_HASHTABLE_DOUBLE(FACETS *facets) {
// increase the hashtable size
freez(facets->keys.hashtable);
- facets->keys.size *= 4;
+ facets->keys.size *= 2;
facets->keys.hashtable = callocz(facets->keys.size, sizeof(FACET_KEY *));
for(FACET_KEY *k = facets->keys.ll ; k ; k = k->next) {
FACET_KEY **k_ptr = facets_keys_hashtable_slot(facets, k->hash);
@@ -619,9 +619,6 @@ static inline FACET_KEY *FACETS_KEY_CREATE(FACETS *facets, FACETS_HASH hash, con
DOUBLE_LINKED_LIST_APPEND_ITEM_UNSAFE(facets->keys.ll, k, prev, next);
facets->keys.count++;
- if(facets->keys.count > facets->keys.size / 2)
- FACET_KEYS_HASHTABLE_DOUBLE(facets);
-
return k;
}
@@ -632,8 +629,12 @@ static inline FACET_KEY *FACETS_KEY_ADD_TO_INDEX(FACETS *facets, FACETS_HASH has
if(unlikely(!(*k_ptr))) {
// we have to add it
- *k_ptr = FACETS_KEY_CREATE(facets, hash, name, name_length, options);
- return (*k_ptr);
+ FACET_KEY *k = *k_ptr = FACETS_KEY_CREATE(facets, hash, name, name_length, options);
+
+ if(facets->keys.count > facets->keys.size / 2)
+ FACET_KEYS_HASHTABLE_DOUBLE(facets);
+
+ return k;
}
// already in the index