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); }
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); }
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); }
private bool IsCopyStatusReadThroughNeeded(CopyStatusServerCachedEntry cachedStatus) { return(cachedStatus == null || cachedStatus.ForceRefresh || cachedStatus.CreateTimeUtc < DateTime.UtcNow - ReplicaInstanceContainer.CopyStatusCacheTTL); }