コード例 #1
0
        internal RpcDatabaseCopyStatus2 GetCopyStatus(RpcGetDatabaseCopyStatusFlags2 flags)
        {
            if ((flags & RpcGetDatabaseCopyStatusFlags2.ReadThrough) == RpcGetDatabaseCopyStatusFlags2.None)
            {
                return(this.GetCachedCopyStatus(flags));
            }
            RpcDatabaseCopyStatus2      copyStatusWithTimeout       = this.GetCopyStatusWithTimeout(flags);
            CopyStatusServerCachedEntry copyStatusServerCachedEntry = this.UpdateCachedCopyStatus(copyStatusWithTimeout);

            return(copyStatusServerCachedEntry.CopyStatus);
        }
コード例 #2
0
        private CopyStatusServerCachedEntry UpdateCachedCopyStatus(RpcDatabaseCopyStatus2 status)
        {
            CopyStatusServerCachedEntry copyStatusServerCachedEntry = new CopyStatusServerCachedEntry(status);
            CopyStatusServerCachedEntry cachedStatus;

            lock (this.m_statusCacheLocker)
            {
                if (CopyStatusHelper.CheckCopyStatusNewer(copyStatusServerCachedEntry, this.m_cachedStatus))
                {
                    this.m_cachedStatus = copyStatusServerCachedEntry;
                }
                cachedStatus = this.m_cachedStatus;
            }
            return(cachedStatus);
        }
コード例 #3
0
        private RpcDatabaseCopyStatus2 GetCachedCopyStatus(RpcGetDatabaseCopyStatusFlags2 flags)
        {
            CopyStatusServerCachedEntry copyStatusServerCachedEntry = this.m_cachedStatus;

            if (this.IsCopyStatusReadThroughNeeded(copyStatusServerCachedEntry))
            {
                TimeSpan copyStatusServerTimeout = ReplicaInstanceContainer.CopyStatusServerTimeout;
                bool     flag = Monitor.TryEnter(this.m_statusCallLocker);
                try
                {
                    if (!flag)
                    {
                        ManualOneShotEvent.Result result = this.m_firstCachedStatusCallCompleted.WaitOne(copyStatusServerTimeout);
                        if (result != ManualOneShotEvent.Result.Success)
                        {
                            throw new ReplayServiceRpcCopyStatusTimeoutException(this.ReplicaInstance.Configuration.DisplayName, (int)copyStatusServerTimeout.TotalSeconds);
                        }
                        lock (this.m_statusCacheLocker)
                        {
                            copyStatusServerCachedEntry = this.m_cachedStatus;
                            if (copyStatusServerCachedEntry == null)
                            {
                                throw new ReplayServiceRpcCopyStatusTimeoutException(this.ReplicaInstance.Configuration.DisplayName, (int)copyStatusServerTimeout.TotalSeconds);
                            }
                            if (copyStatusServerCachedEntry.CreateTimeUtc < DateTime.UtcNow - ReplicaInstanceContainer.CopyStatusStaleTimeout)
                            {
                                Exception ex = new ReplayServiceRpcCopyStatusTimeoutException(this.ReplicaInstance.Configuration.DisplayName, (int)ReplicaInstanceContainer.CopyStatusStaleTimeout.TotalSeconds);
                                copyStatusServerCachedEntry.CopyStatus.CopyStatus        = CopyStatusEnum.Failed;
                                copyStatusServerCachedEntry.CopyStatus.ErrorMessage      = ex.Message;
                                copyStatusServerCachedEntry.CopyStatus.ExtendedErrorInfo = new ExtendedErrorInfo(ex);
                            }
                            return(copyStatusServerCachedEntry.CopyStatus);
                        }
                    }
                    copyStatusServerCachedEntry = this.m_cachedStatus;
                    if (this.IsCopyStatusReadThroughNeeded(copyStatusServerCachedEntry))
                    {
                        try
                        {
                            ExTraceGlobals.ReplayServiceRpcTracer.TraceDebug <string, Guid>((long)this.GetHashCode(), "GetCachedCopyStatus() for DB '{0}' ({1}): Cache TTL expired or force refresh requested.", this.ReplicaInstance.Configuration.DisplayName, this.ReplicaInstance.Configuration.IdentityGuid);
                            RpcDatabaseCopyStatus2 copyStatusWithTimeout = this.GetCopyStatusWithTimeout(flags);
                            copyStatusServerCachedEntry = this.UpdateCachedCopyStatus(copyStatusWithTimeout);
                        }
                        catch (TimeoutException arg)
                        {
                            ExTraceGlobals.ReplayServiceRpcTracer.TraceError <string, TimeoutException>((long)this.GetHashCode(), "GetCachedCopyStatus() Timeout for DB '{0}': {1}", this.ReplicaInstance.Configuration.DisplayName, arg);
                            throw new ReplayServiceRpcCopyStatusTimeoutException(this.ReplicaInstance.Configuration.DisplayName, (int)copyStatusServerTimeout.TotalSeconds);
                        }
                        finally
                        {
                            this.m_firstCachedStatusCallCompleted.Set();
                        }
                    }
                }
                finally
                {
                    if (flag)
                    {
                        Monitor.Exit(this.m_statusCallLocker);
                    }
                }
            }
            return(copyStatusServerCachedEntry.CopyStatus);
        }
コード例 #4
0
 private bool IsCopyStatusReadThroughNeeded(CopyStatusServerCachedEntry cachedStatus)
 {
     return(cachedStatus == null || cachedStatus.ForceRefresh || cachedStatus.CreateTimeUtc < DateTime.UtcNow - ReplicaInstanceContainer.CopyStatusCacheTTL);
 }