Commit 56150278 authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

closes #5641, change cycle detection for evictor. It is not perfect, but...

closes #5641, change cycle detection for evictor. It is not perfect, but should be good enough. We are guaranteed to never keep spinning and spinning

git-svn-id: file:///svn/toku/tokudb@49505 c7de825b-a66e-492c-adef-691d508d4ae1
parent c944babd
...@@ -3618,12 +3618,8 @@ void evictor::run_eviction(){ ...@@ -3618,12 +3618,8 @@ void evictor::run_eviction(){
// These variables will help us detect if everything in the clock is currently being accessed. // These variables will help us detect if everything in the clock is currently being accessed.
// We must detect this case otherwise we will end up in an infinite loop below. // We must detect this case otherwise we will end up in an infinite loop below.
// //
CACHEKEY curr_cachekey;
curr_cachekey.b = INT64_MAX; // create initial value so compiler does not complain
FILENUM curr_filenum;
curr_filenum.fileid = UINT32_MAX; // create initial value so compiler does not complain
bool set_val = false;
bool exited_early = false; bool exited_early = false;
uint32_t num_pairs_examined_without_evicting = 0;
while (this->eviction_needed()) { while (this->eviction_needed()) {
if (m_num_sleepers > 0 && this->should_sleeping_clients_wakeup()) { if (m_num_sleepers > 0 && this->should_sleeping_clients_wakeup()) {
...@@ -3641,11 +3637,8 @@ void evictor::run_eviction(){ ...@@ -3641,11 +3637,8 @@ void evictor::run_eviction(){
exited_early = true; exited_early = true;
goto exit; goto exit;
} }
if (set_val && if (num_pairs_examined_without_evicting > m_pl->m_n_in_table) {
curr_in_clock->key.b == curr_cachekey.b && // we have a cycle where everything in the clock is in use
curr_in_clock->cachefile->filenum.fileid == curr_filenum.fileid)
{
// we have identified a cycle where everything in the clock is in use
// do not return an error // do not return an error
// just let memory be overfull // just let memory be overfull
m_pl->read_list_unlock(); m_pl->read_list_unlock();
...@@ -3655,12 +3648,11 @@ void evictor::run_eviction(){ ...@@ -3655,12 +3648,11 @@ void evictor::run_eviction(){
} }
bool eviction_run = run_eviction_on_pair(curr_in_clock); bool eviction_run = run_eviction_on_pair(curr_in_clock);
if (eviction_run) { if (eviction_run) {
set_val = false; // reset the count
num_pairs_examined_without_evicting = 0;
} }
else if (!set_val) { else {
set_val = true; num_pairs_examined_without_evicting++;
curr_cachekey = m_pl->m_clock_head->key;
curr_filenum = m_pl->m_clock_head->cachefile->filenum;
} }
// at this point, either curr_in_clock is still in the list because it has not been fully evicted, // at this point, either curr_in_clock is still in the list because it has not been fully evicted,
// and we need to move ct->m_clock_head over. Otherwise, curr_in_clock has been fully evicted // and we need to move ct->m_clock_head over. Otherwise, curr_in_clock has been fully evicted
......
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