private static bool MaximumTimeToLiveExpired(MiniClientAccessServerOrArrayCacheEntry entry) { return(DateTime.UtcNow.CompareTo(entry.MaximumTimeToExpire) > 0); }
private IADMiniClientAccessServerOrArray LookupOrFindMiniClientAccessServerOrArray(string serverKey, FindMiniClientAccessServerOrArrayCacheFailure serverLookup) { ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <string>(0L, "LookupOrFindMiniClientAccessServerOrArray({0})", serverKey); MiniClientAccessServerOrArrayCacheEntry miniClientAccessServerOrArrayCacheEntry = null; bool flag = false; bool flag2 = false; try { flag = this.m_rwLock.TryEnterReadLock(MiniClientAccessServerOrArrayLookupCache.CacheLockTimeout); if (flag) { bool flag3 = this.m_cache.TryGetValue(serverKey, out miniClientAccessServerOrArrayCacheEntry); bool flag4 = false; if (flag3) { flag4 = MiniClientAccessServerOrArrayLookupCache.ShouldExpireCacheEntry(miniClientAccessServerOrArrayCacheEntry); ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <string, MiniClientAccessServerOrArrayCacheEntry, bool>((long)this.GetHashCode(), "LookupOrFindMiniClientAccessServerOrArray( {0} ) was found in the cache: {1}, and shouldExpireEntry={2}", serverKey, miniClientAccessServerOrArrayCacheEntry, flag4); } if (!flag3 || flag4) { flag2 = true; MiniClientAccessServerOrArrayLookupCache.m_perfCounters.GetServerForDatabaseClientServerInformationCacheMisses.Increment(); } else { MiniClientAccessServerOrArrayLookupCache.m_perfCounters.GetServerForDatabaseClientServerInformationCacheHits.Increment(); } } else { MiniClientAccessServerOrArrayLookupCache.Tracer.TraceError((long)this.GetHashCode(), "Timeout waiting for the read lock in MiniClientAccessServerOrArrayLookupCache.LookupOrFindAdObject()"); flag2 = true; } } finally { if (flag) { this.m_rwLock.ExitReadLock(); } } if (flag2) { bool flag5 = false; IADMiniClientAccessServerOrArray updatedServer = null; try { InvokeWithTimeout.Invoke(delegate() { updatedServer = serverLookup(); }, this.m_adOperationTimeout); } catch (TimeoutException ex) { StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_ErrorActiveManagerClientADTimeout, serverKey, new object[] { serverKey, this.m_adOperationTimeout }); MiniClientAccessServerOrArrayLookupCache.Tracer.TraceError <string>((long)this.GetHashCode(), "Timeout on ad query: {0}", ex.Message); flag5 = true; } miniClientAccessServerOrArrayCacheEntry = new MiniClientAccessServerOrArrayCacheEntry(updatedServer, this.m_timeToLive, this.m_timeToNegativeLive, this.m_maximumTimeToLive); bool flag6 = false; try { flag6 = this.m_rwLock.TryEnterWriteLock(MiniClientAccessServerOrArrayLookupCache.CacheLockTimeout); if (flag6) { if (updatedServer == null && flag5) { MiniClientAccessServerOrArrayCacheEntry miniClientAccessServerOrArrayCacheEntry2 = null; bool flag7 = this.m_cache.TryGetValue(serverKey, out miniClientAccessServerOrArrayCacheEntry2); if (flag7 && !MiniClientAccessServerOrArrayLookupCache.MaximumTimeToLiveExpired(miniClientAccessServerOrArrayCacheEntry2)) { miniClientAccessServerOrArrayCacheEntry = miniClientAccessServerOrArrayCacheEntry2; ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <IADMiniClientAccessServerOrArray, MiniClientAccessServerOrArrayCacheEntry>((long)this.GetHashCode(), "New ad object was not found, but found possibly stale result '{0}' in the cache as {1}.", miniClientAccessServerOrArrayCacheEntry.MiniClientAccessServerOrArrayData, miniClientAccessServerOrArrayCacheEntry); } else { flag5 = false; } } if (!flag5) { this.m_cache[serverKey] = miniClientAccessServerOrArrayCacheEntry; ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <IADMiniClientAccessServerOrArray, MiniClientAccessServerOrArrayCacheEntry>((long)this.GetHashCode(), "Stored server '{0}' in the cache as {1}.", miniClientAccessServerOrArrayCacheEntry.MiniClientAccessServerOrArrayData, miniClientAccessServerOrArrayCacheEntry); } } else { MiniClientAccessServerOrArrayLookupCache.Tracer.TraceError((long)this.GetHashCode(), "Timeout waiting for write lock in MiniServerLookupCache.LookupOrFindAdObject()"); } } finally { if (flag6) { this.m_rwLock.ExitWriteLock(); } } } MiniClientAccessServerOrArrayLookupCache.m_perfCounters.GetServerForDatabaseClientServerInformationCacheEntries.RawValue = (long)this.m_cache.Count; return(miniClientAccessServerOrArrayCacheEntry.MiniClientAccessServerOrArrayData); }
private static bool ShouldExpireCacheEntry(MiniClientAccessServerOrArrayCacheEntry entry) { return(DateTime.UtcNow.CompareTo(entry.TimeToExpire) > 0); }