void InternalCCache::cleanup() { #ifdef _DEBUG saml::NDC ndc("cleanup()"); #endif int rerun_timer = 0; int timeout_life = 0; Mutex* mutex = Mutex::create(); // Load our configuration details... const XMLCh* tag=m_root->getAttributeNS(NULL,cleanupInterval); if (tag && *tag) rerun_timer = XMLString::parseInt(tag); tag=m_root->getAttributeNS(NULL,cacheTimeout); if (tag && *tag) timeout_life = XMLString::parseInt(tag); if (rerun_timer <= 0) rerun_timer = 300; // rerun every 5 minutes if (timeout_life <= 0) timeout_life = 28800; // timeout after 8 hours mutex->lock(); log->info("Cleanup thread started... Run every %d secs; timeout after %d secs", rerun_timer, timeout_life); while (shutdown == false) { shutdown_wait->timedwait(mutex,rerun_timer); if (shutdown == true) break; log->debug("Cleanup thread running..."); // Ok, let's run through the cleanup process and clean out // really old sessions. This is a two-pass process. The // first pass is done holding a read-lock while we iterate over // the database. The second pass doesn't need a lock because // the 'deletes' will lock the database. // Pass 1: iterate over the map and find all entries that have not been // used in X hours vector<string> stale_keys; time_t stale = time(NULL) - timeout_life; lock->rdlock(); for (map<string,InternalCCacheEntry*>::iterator i=m_hashtable.begin(); i != m_hashtable.end(); i++) { // If the last access was BEFORE the stale timeout... i->second->lock(); time_t last=i->second->lastAccess(); i->second->unlock(); if (last < stale) stale_keys.push_back(i->first); } lock->unlock(); log->info("deleting %d old items.", stale_keys.size()); // Pass 2: walk through the list of stale entries and remove them from // the database for (vector<string>::iterator j = stale_keys.begin(); j != stale_keys.end(); j++) { remove (j->c_str()); // Transaction Logging STConfig& stc=static_cast<STConfig&>(ShibTargetConfig::getConfig()); stc.getTransactionLog().infoStream() << "Purged expired session from memory (ID: " << j->c_str() << ")"; stc.releaseTransactionLog(); } } log->info("Cleanup thread finished."); mutex->unlock(); delete mutex; Thread::exit(NULL); }