@cryptotaxi247 / netdata-1 / commits / 4c3c0ad33

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