From 033b96dfa9918781eb3374ca7de92e1f3f8e9393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Wed, 27 Jul 2011 18:19:17 +0200 Subject: [PATCH] Bug #721: Make the PoolSQL cache be aware that an invalid cached object may have the same name as a non-cached valid object. --- src/pool/PoolSQL.cc | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/pool/PoolSQL.cc b/src/pool/PoolSQL.cc index 6575e06f9d..061bc67208 100644 --- a/src/pool/PoolSQL.cc +++ b/src/pool/PoolSQL.cc @@ -185,6 +185,11 @@ PoolObjectSQL * PoolSQL::get( if ( olock == true ) { objectsql->lock(); + + if ( objectsql->isValid() == false ) + { + objectsql = 0; + } } } @@ -246,19 +251,17 @@ PoolObjectSQL * PoolSQL::get(const string& name, int ouid, bool olock) index = name_pool.find(key(name,ouid)); - if ( index != name_pool.end() ) + if ( index != name_pool.end() && index->second->isValid() == true ) { - if ( index->second->isValid() == false ) - { - objectsql = 0; - } - else - { - objectsql = index->second; + objectsql = index->second; - if ( olock == true ) + if ( olock == true ) + { + objectsql->lock(); + + if ( objectsql->isValid() == false ) { - objectsql->lock(); + objectsql = 0; } } @@ -281,6 +284,19 @@ PoolObjectSQL * PoolSQL::get(const string& name, int ouid, bool olock) return 0; } + if ( index != name_pool.end() && index->second->isValid() == false ) + { + index->second->lock(); + + PoolObjectSQL * tmp_ptr = index->second; + string tmp_okey = key(tmp_ptr->name,tmp_ptr->uid); + + pool.erase(tmp_ptr->oid); + name_pool.erase(tmp_okey); + + delete tmp_ptr; + } + string okey = key(objectsql->name,objectsql->uid); pool.insert(make_pair(objectsql->oid, objectsql)); @@ -323,7 +339,7 @@ void PoolSQL::replace() if ( index == pool.end()) { oid_queue.pop(); - break; + continue; } rc = pthread_mutex_trylock(&(index->second->mutex));