Skip to content

Commit

Permalink
ck_rhs: Get the right probe to restore on memory failure.
Browse files Browse the repository at this point in the history
In ck_rhs_put_robin_hood(), on memory failure, restore the right probe
for each descriptor. Descriptor at index 1 will want the probe at index
0, descriptor at index 2 will want the probe at index 1, etc, etc. And
always store the last descriptor slot, so that we know where to put the
last probe.
  • Loading branch information
cognet committed Mar 13, 2024
1 parent 872522a commit 53d8e34
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/ck_rhs.c
Original file line number Diff line number Diff line change
Expand Up @@ -915,6 +915,7 @@ ck_rhs_put_robin_hood(struct ck_rhs *hs,
void *key;
long prevs[CK_RHS_MAX_RH];
int prev_probes[CK_RHS_MAX_RH];
long last_slot = -1;
unsigned int prevs_nb = 0;
unsigned int i;

Expand All @@ -940,10 +941,12 @@ ck_rhs_put_robin_hood(struct ck_rhs *hs,
desc->in_rh = false;

for (i = 0; i < prevs_nb; i++) {

ck_rhs_set_probes(map, prevs[i], prev_probes[i]);
if (i > 0)
ck_rhs_set_probes(map, prevs[i], prev_probes[i - 1]);
ck_rhs_unset_rh(map, prevs[i]);
}
if (last_slot != -1)
ck_rhs_set_probes(map, last_slot, prev_probes[prevs_nb - 1]);

return -1;
}
Expand All @@ -955,6 +958,8 @@ ck_rhs_put_robin_hood(struct ck_rhs *hs,
desc = ck_rhs_desc(map, first);
int old_probes = desc->probes;

last_slot = first;

desc->probes = n_probes;
h = ck_rhs_get_first_offset(map, first, n_probes);
ck_rhs_map_bound_set(map, h, n_probes);
Expand Down

0 comments on commit 53d8e34

Please sign in to comment.