mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 06:44:16 +01:00
refs #5672 use a valgrind suppression to ignore the race on the clock
git-svn-id: file:///svn/toku/tokudb@50717 c7de825b-a66e-492c-adef-691d508d4ae1
This commit is contained in:
parent
d26168d697
commit
c653563d3e
3 changed files with 19 additions and 10 deletions
|
@ -270,17 +270,11 @@ struct ftnode {
|
|||
// that have a read lock on an internal node may try to touch the clock
|
||||
// simultaneously
|
||||
//
|
||||
#define BP_TOUCH_CLOCK(node, i) do { \
|
||||
TOKU_VALGRIND_HG_DISABLE_CHECKING(&(node)->bp[i].clock_count, sizeof (node)->bp[i].clock_count); \
|
||||
TOKU_DRD_IGNORE_VAR((node)->bp[i].clock_count); \
|
||||
(node)->bp[i].clock_count = 1; \
|
||||
TOKU_DRD_STOP_IGNORING_VAR((node)->bp[i].clock_count); \
|
||||
TOKU_VALGRIND_HG_ENABLE_CHECKING(&(node)->bp[i].clock_count, sizeof (node)->bp[i].clock_count); \
|
||||
} while (0)
|
||||
#define BP_TOUCH_CLOCK(node, i) ((node)->bp[i].clock_count = 1)
|
||||
#define BP_SWEEP_CLOCK(node, i) ((node)->bp[i].clock_count = 0)
|
||||
#define BP_SHOULD_EVICT(node, i) ((node)->bp[i].clock_count == 0)
|
||||
// not crazy about having these two here, one is for the case where we create new
|
||||
// nodes, such as in splits and creating new roots, and the other is for when
|
||||
// nodes, such as in splits and creating new roots, and the other is for when
|
||||
// we are deserializing a node and not all bp's are touched
|
||||
#define BP_INIT_TOUCHED_CLOCK(node, i) ((node)->bp[i].clock_count = 1)
|
||||
#define BP_INIT_UNTOUCHED_CLOCK(node, i) ((node)->bp[i].clock_count = 0)
|
||||
|
|
12
ft/ft-ops.cc
12
ft/ft-ops.cc
|
@ -1038,6 +1038,14 @@ exit:
|
|||
return 0;
|
||||
}
|
||||
|
||||
// We touch the clock while holding a read lock.
|
||||
// DRD reports a race but we want to ignore it.
|
||||
// Using a valgrind suppressions file is better than the DRD_IGNORE_VAR macro because it's more targeted.
|
||||
// We need a function to have something a drd suppression can reference
|
||||
// see src/tests/drd.suppressions (unsafe_touch_clock)
|
||||
static inline void unsafe_touch_clock(FTNODE node, int i) {
|
||||
BP_TOUCH_CLOCK(node, i);
|
||||
}
|
||||
|
||||
// Callback that states if a partial fetch of the node is necessary
|
||||
// Currently, this function is responsible for the following things:
|
||||
|
@ -1067,7 +1075,7 @@ bool toku_ftnode_pf_req_callback(void* ftnode_pv, void* read_extraargs) {
|
|||
else if (bfe->type == ftnode_fetch_all) {
|
||||
retval = false;
|
||||
for (int i = 0; i < node->n_children; i++) {
|
||||
BP_TOUCH_CLOCK(node,i);
|
||||
unsafe_touch_clock(node,i);
|
||||
// if we find a partition that is not available,
|
||||
// then a partial fetch is required because
|
||||
// the entire node must be made available
|
||||
|
@ -1090,7 +1098,7 @@ bool toku_ftnode_pf_req_callback(void* ftnode_pv, void* read_extraargs) {
|
|||
node,
|
||||
bfe->search
|
||||
);
|
||||
BP_TOUCH_CLOCK(node,bfe->child_to_read);
|
||||
unsafe_touch_clock(node,bfe->child_to_read);
|
||||
// child we want to read is not available, must set retval to true
|
||||
retval = (BP_STATE(node, bfe->child_to_read) != PT_AVAIL);
|
||||
}
|
||||
|
|
|
@ -77,3 +77,10 @@
|
|||
...
|
||||
fun:random
|
||||
}
|
||||
|
||||
{
|
||||
unsafe_touch_clock
|
||||
drd:ConflictingAccess
|
||||
fun:_ZL18unsafe_touch_clockP6ftnodei
|
||||
...
|
||||
}
|
Loading…
Add table
Reference in a new issue