facets: do not corrupt the index when doubling the hashtable (#16171)
do not corrupt the index when doubling the hashtable
Costa Tsaousis committed
Oct 12, 2023 at 12:55 UTC
4c3c0ad33020630182257ee3c655f6a089266c26
1 file changed
+9
-8
libnetdata/facets/facets.c
+9
-8
@@ -374,7 +374,7 @@ static inline FACET_VALUE *FACET_VALUE_GET_FROM_INDEX(FACET_KEY *k, FACETS_HASH
374
static void FACET_VALUES_HASHTABLE_DOUBLE(FACET_KEY *k) {
375
// increase the hashtable size
376
freez(k->values.hashtable);
377
- k->values.size *= 4;
377
+ k->values.size *= 2;
378
k->values.hashtable = callocz(k->values.size, sizeof(FACET_VALUE *));
379
for(FACET_VALUE *v = k->values.ll ; v ;v = v->next) {
380
FACET_VALUE **v_ptr = facets_values_hashtable_slot(k, v->hash);
@@ -518,7 +518,7 @@ static inline void FACETS_KEYS_INDEX_DESTROY(FACETS *facets) {
518
}
519
520
static inline FACET_KEY **facets_keys_hashtable_slot(FACETS *facets, FACETS_HASH hash) {
521
- size_t slot = hash % FACETS_KEYS_HASHTABLE_ENTRIES;
521
+ size_t slot = hash % facets->keys.size;
522
FACET_KEY **k = &facets->keys.hashtable[slot];
523
524
while(*k && (*k)->hash != hash)
@@ -530,7 +530,7 @@ static inline FACET_KEY **facets_keys_hashtable_slot(FACETS *facets, FACETS_HASH
530
static void FACET_KEYS_HASHTABLE_DOUBLE(FACETS *facets) {
531
// increase the hashtable size
532
freez(facets->keys.hashtable);
533
- facets->keys.size *= 4;
533
+ facets->keys.size *= 2;
534
facets->keys.hashtable = callocz(facets->keys.size, sizeof(FACET_KEY *));
535
for(FACET_KEY *k = facets->keys.ll ; k ; k = k->next) {
536
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
619
DOUBLE_LINKED_LIST_APPEND_ITEM_UNSAFE(facets->keys.ll, k, prev, next);
620
facets->keys.count++;
621
622
- if(facets->keys.count > facets->keys.size / 2)
623
- FACET_KEYS_HASHTABLE_DOUBLE(facets);
624
-
622
return k;
623
}
624
@@ -632,8 +629,12 @@ static inline FACET_KEY *FACETS_KEY_ADD_TO_INDEX(FACETS *facets, FACETS_HASH has
629
630
if(unlikely(!(*k_ptr))) {
631
// we have to add it
635
- *k_ptr = FACETS_KEY_CREATE(facets, hash, name, name_length, options);
636
- return (*k_ptr);
632
+ FACET_KEY *k = *k_ptr = FACETS_KEY_CREATE(facets, hash, name, name_length, options);
633
+
634
+ if(facets->keys.count > facets->keys.size / 2)
635
+ FACET_KEYS_HASHTABLE_DOUBLE(facets);
636
+
637
+ return k;
638
}
639
640
// already in the index