Browse Source

fix bug in hashindex_set on resize, fixes #4829

the problem was that after a resize that was triggered by too few
empty buckets, the rebuilt new hash table had entries at different
positions than before, but the idx where to SET the entry was not
recomputed afterwards.
Thomas Waldmann 5 years ago
parent
commit
fa63150e14
1 changed files with 10 additions and 0 deletions
  1. 10 0
      src/borg/_hashindex.c

+ 10 - 0
src/borg/_hashindex.c

@@ -586,6 +586,16 @@ hashindex_set(HashIndex *index, const unsigned char *key, const unsigned char *v
                 if(!hashindex_resize(index, index->num_buckets)) {
                 if(!hashindex_resize(index, index->num_buckets)) {
                     return 0;
                     return 0;
                 }
                 }
+                /* we have just built a fresh hashtable and removed all tombstones,
+                 * so we only have EMPTY or USED buckets, but no DELETED ones any more.
+                 */
+                idx = start_idx = hashindex_index(index, key);
+                while(!BUCKET_IS_EMPTY(index, idx)) {
+                    idx++;
+                    if (idx >= index->num_buckets){
+                        idx -= index->num_buckets;
+                    }
+                }
             }
             }
         }
         }
         ptr = BUCKET_ADDR(index, idx);
         ptr = BUCKET_ADDR(index, idx);