// Cleanup NARoutine cache after the statement completes. Remove entries // using LRU policy, if the cache has grown too large. The approach here is // somewhat different from NATableDB caching, which deletes entries from the // NATable cache if the statement was DDL that may have affected the table // definition. NATable caching also deletes tables from the cache at this // time for performance reasons. void NARoutineDB::resetAfterStatement() { // Delete 'dirty' NARoutine objects that were not deleted earlier // to save compile-time performance. if (routinesToDeleteAfterStatement_.entries()) { // Clear the list of tables to delete after statement routinesToDeleteAfterStatement_.clear(); } if (entries()) { // Reduce size of cache if it has grown too large. if (!enforceMemorySpaceConstraints()) cacheMetaData_ = FALSE; // Disable cache if there is a problem. // Reset statement level flags refreshCacheInThisStatement_=FALSE; // Clear 'accessed in current statement' flag for all cached NARoutines. NAHashDictionaryIterator<NARoutineDBKey,NARoutine> iter (*this); NARoutineDBKey *key; NARoutine *routine; iter.getNext(key,routine); while(key) { routine->getAccessedInCurStmt() = FALSE; iter.getNext(key,routine); } } }
// Find the NARoutine entry in the cache for 'key' or create it if not found. // 1. Check for entry in cache. // 2. If it doesn't exist, return. // 3. If it does exist, check to see if this is first time entry accessed. // 4. If so, check to see if entry is dirty (obsolete). // 5. If dirty, remove key and add to list to remove entry after statement // completes. // Note that BindWA is needed to be passed to this function so that we can // use it with getRedefTime() is necessary. NARoutine *NARoutineDB::get(BindWA *bindWA, const NARoutineDBKey *key) { // Check cache to see if a cached NARoutine object exists NARoutine *cachedNARoutine = NAKeyLookup<NARoutineDBKey,NARoutine>::get(key); /* 1 */ totalLookupsCount_++; // Statistics counter: number of lookups if (!cachedNARoutine || !cacheMetaData_) return NULL; /* 2 */ totalCacheHits_++; // Statistics counter: number of cache hits. // Record time that this NARoutine was obtained from cache for LRU. cachedNARoutine->setLastUsedTime(hs_getEpochTime()); cachedNARoutine->getAccessedInCurStmt() = TRUE; return cachedNARoutine; }