I was reading the code in __cursor_skip_prev and believe we are missing some read barriers there:
/*
* Find the first node up the search stack that does not move.
*
* The depth of the current item must be at least this level, since we
* see it in that many levels of the stack.
*
* !!! Watch these loops carefully: they all rely on the value of i,
* and the exit conditions to end up with the right values are
* non-trivial.
*/
ins = NULL; /* -Wconditional-uninitialized */
for (i = 0; i < WT_SKIP_MAXDEPTH - 1; i++)
if ((ins = PREV_INS(cbt, i + 1)) != current)
break;
/*
* Find a starting point for the new search. That is either at the non-moving node if we found a
* valid node, or the beginning of the next list down that is not the current node.
*
* Since it is the beginning of a list, and we know the current node is has a skip depth at
* least this high, any node we find must sort before the current node.
*/
if (ins == NULL || ins == current)
for (; i >= 0; i--) {
cbt->ins_stack[i] = NULL;
cbt->next_stack[i] = NULL;
ins = cbt->ins_head->head[i];
if (ins != NULL && ins != current)
break;
}
Here the compiler may choose to reread the ins variable.
else { /* Drop down a level */
cbt->ins_stack[i] = &ins->next[i];
cbt->next_stack[i] = ins->next[i];
--i;
}
We may read stale data here.
- is related to
-
WT-10461 Fix key out of order in skip list on weakly ordered architecture
-
- Closed
-