Ejemplo n.º 1
0
 private static bool MaximumTimeToLiveExpired(MiniClientAccessServerOrArrayCacheEntry entry)
 {
     return(DateTime.UtcNow.CompareTo(entry.MaximumTimeToExpire) > 0);
 }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
 private static bool ShouldExpireCacheEntry(MiniClientAccessServerOrArrayCacheEntry entry)
 {
     return(DateTime.UtcNow.CompareTo(entry.TimeToExpire) > 0);
 }