From 7bb90b6a513a1d9f951c4883928945f02e814144 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sun, 1 Mar 2020 16:31:32 +0100 Subject: [PATCH] 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. --- borg/_hashindex.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/borg/_hashindex.c b/borg/_hashindex.c index 7a05c170e..894c76927 100644 --- a/borg/_hashindex.c +++ b/borg/_hashindex.c @@ -449,6 +449,16 @@ hashindex_set(HashIndex *index, const void *key, const void *value) if(!hashindex_resize(index, index->num_buckets)) { 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 = 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);