Commit b007ef01 authored by Leif Walsh's avatar Leif Walsh Committed by Yoni Fogel

refs #5696 possible fix for drd issues, and for what seems like a typo condition


git-svn-id: file:///svn/toku/tokudb@50158 c7de825b-a66e-492c-adef-691d508d4ae1
parent 09ff3e9c
...@@ -2983,7 +2983,7 @@ int cleaner::run_cleaner(void) { ...@@ -2983,7 +2983,7 @@ int cleaner::run_cleaner(void) {
break; break;
} }
// here we select a PAIR for cleaning // here we select a PAIR for cleaning
// look at some number of PAIRS, and // look at some number of PAIRS, and
// pick what we think is the best one for cleaning // pick what we think is the best one for cleaning
//***** IMPORTANT ****** //***** IMPORTANT ******
// we MUST not pick a PAIR whose rating is 0. We have // we MUST not pick a PAIR whose rating is 0. We have
...@@ -3002,8 +3002,17 @@ int cleaner::run_cleaner(void) { ...@@ -3002,8 +3002,17 @@ int cleaner::run_cleaner(void) {
// Advance the cleaner head. // Advance the cleaner head.
long score = 0; long score = 0;
// only bother with this pair if it has no current users // only bother with this pair if it has no current users
if (m_pl->m_cleaner_head->value_rwlock.users() > 0) { if (m_pl->m_cleaner_head->value_rwlock.users() == 0) {
// cleaner_thread_rate_pair will read this. The
// contract is that to look at p->attr, you need
// either the pair's value_rwlock write-locked, or you
// need the pair_lock *and* the pair's value_rwlock
// read-locked. Here we know nobody else has it
// write-locked so it's safe, but DRD seems not to
// understand that.
TOKU_DRD_IGNORE_VAR(m_pl->m_cleaner_head->attr.cache_pressure_size);
score = cleaner_thread_rate_pair(m_pl->m_cleaner_head); score = cleaner_thread_rate_pair(m_pl->m_cleaner_head);
TOKU_DRD_STOP_IGNORING_VAR(m_pl->m_cleaner_head->attr.cache_pressure_size);
if (score > best_score) { if (score > best_score) {
best_score = score; best_score = score;
best_pair = m_pl->m_cleaner_head; best_pair = m_pl->m_cleaner_head;
...@@ -3019,10 +3028,13 @@ int cleaner::run_cleaner(void) { ...@@ -3019,10 +3028,13 @@ int cleaner::run_cleaner(void) {
else { else {
n_seen++; n_seen++;
long score = 0; long score = 0;
// See above
TOKU_DRD_IGNORE_VAR(m_pl->m_cleaner_head->attr.cache_pressure_size);
score = cleaner_thread_rate_pair(m_pl->m_cleaner_head); score = cleaner_thread_rate_pair(m_pl->m_cleaner_head);
TOKU_DRD_STOP_IGNORING_VAR(m_pl->m_cleaner_head->attr.cache_pressure_size);
if (score > best_score) { if (score > best_score) {
best_score = score; best_score = score;
// Since we found a new best pair, we need to // Since we found a new best pair, we need to
// free the old best pair. // free the old best pair.
if (best_pair) { if (best_pair) {
pair_unlock(best_pair); pair_unlock(best_pair);
...@@ -3037,9 +3049,9 @@ int cleaner::run_cleaner(void) { ...@@ -3037,9 +3049,9 @@ int cleaner::run_cleaner(void) {
m_pl->m_cleaner_head = m_pl->m_cleaner_head->clock_next; m_pl->m_cleaner_head = m_pl->m_cleaner_head->clock_next;
} while (m_pl->m_cleaner_head != first_pair && n_seen < CLEANER_N_TO_CHECK); } while (m_pl->m_cleaner_head != first_pair && n_seen < CLEANER_N_TO_CHECK);
m_pl->read_list_unlock(); m_pl->read_list_unlock();
// //
// at this point, if we have found a PAIR for cleaning, // at this point, if we have found a PAIR for cleaning,
// that is, best_pair != NULL, we do the clean // that is, best_pair != NULL, we do the clean
// //
// if best_pair !=NULL, then best_pair->mutex is held // if best_pair !=NULL, then best_pair->mutex is held
...@@ -3070,12 +3082,11 @@ int cleaner::run_cleaner(void) { ...@@ -3070,12 +3082,11 @@ int cleaner::run_cleaner(void) {
} }
bool cleaner_callback_called = false; bool cleaner_callback_called = false;
// it's theoretically possible that after writing a PAIR for checkpoint, the // it's theoretically possible that after writing a PAIR for checkpoint, the
// PAIR's heuristic tells us nothing needs to be done. It is not possible // PAIR's heuristic tells us nothing needs to be done. It is not possible
// in Dr. Noga, but unit tests verify this behavior works properly. // in Dr. Noga, but unit tests verify this behavior works properly.
if (cleaner_thread_rate_pair(best_pair) > 0) if (cleaner_thread_rate_pair(best_pair) > 0) {
{
r = best_pair->cleaner_callback(best_pair->value_data, r = best_pair->cleaner_callback(best_pair->value_data,
best_pair->key, best_pair->key,
best_pair->fullhash, best_pair->fullhash,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment