public bool GetQuarantineInfoContext(Guid resourceGuid, TimeSpan quarantineExpiryWindow, out QuarantineInfoContext quarantineInfoContext) { ArgumentValidator.ThrowIfEmpty("resourceGuid", resourceGuid); quarantineInfoContext = null; bool result; try { string text = resourceGuid.ToString(); using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(string.Format(RegistryCrashRepository.resourceSubKeyFromRoot, this.poisonRegistryEntryLocation, text), RegistryKeyPermissionCheck.ReadWriteSubTree)) { DateTime quarantineStartTime; if (registryKey != null && this.GetQuarantineStartTime(registryKey, text, quarantineExpiryWindow, out quarantineStartTime)) { quarantineInfoContext = new QuarantineInfoContext(quarantineStartTime); return(true); } } result = false; } catch (UnauthorizedAccessException ex) { StoreDriverSubmission.LogEvent(MSExchangeStoreDriverSubmissionEventLogConstants.Tuple_PoisonMessageLoadFailedRegistryAccessDenied, null, new object[] { ex.Message }); throw new CrashRepositoryAccessException(Strings.PoisonMessageRegistryAccessFailed, ex); } return(result); }
public bool PersistQuarantineInfo(Guid resourceGuid, QuarantineInfoContext quarantineInfoContext, bool overrideExisting = false) { ArgumentValidator.ThrowIfEmpty("resourceGuid", resourceGuid); ArgumentValidator.ThrowIfNull("quarantineInfoContext", quarantineInfoContext); try { using (RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(this.poisonRegistryEntryLocation + "\\" + resourceGuid.ToString())) { if (registryKey.GetValue("QuarantineStart") == null || overrideExisting) { registryKey.SetValue("QuarantineStart", quarantineInfoContext.QuarantineStartTime); return(true); } } } catch (UnauthorizedAccessException ex) { StoreDriverSubmission.LogEvent(MSExchangeStoreDriverSubmissionEventLogConstants.Tuple_PoisonMessageSaveFailedRegistryAccessDenied, null, new object[] { ex.Message }); throw new CrashRepositoryAccessException(Strings.PoisonMessageRegistryAccessFailed, ex); } return(false); }
public void CheckAndQuarantine(Guid resourceGuid, SortedSet<DateTime> crashTimes) { if (!this.loaded) { return; } ArgumentValidator.ThrowIfEmpty("resourceGuid", resourceGuid); ArgumentValidator.ThrowIfNull("dateTimes", crashTimes); if (this.resourceQuarantineData.ContainsKey(resourceGuid)) { return; } if (crashTimes.Count == 0) { return; } int num = 0; foreach (DateTime dateTime in crashTimes) { if (!StoreDriverUtils.CheckIfDateTimeExceedsThreshold(dateTime, DateTime.UtcNow, this.quarantineCrashCountWindow)) { num++; } } if (num >= this.quarantineCrashCountThreshold) { QuarantineInfoContext quarantineInfoContext = new QuarantineInfoContext(DateTime.UtcNow); if (this.crashRepository.PersistQuarantineInfo(resourceGuid, quarantineInfoContext, false)) { this.AddQuarantineDataToDictionary(resourceGuid, quarantineInfoContext); this.LogResourceQuarantineInfoOnCrimsonChannel(resourceGuid); } } }
public bool IsResourceQuarantined(Guid resourceId, out QuarantineInfoContext quarantineInfoContext, out TimeSpan quarantineRemainingTime) { quarantineInfoContext = null; quarantineRemainingTime = this.quarantineSpan; this.resourceProtector.EnterReadLock(); try { if (!this.loaded) { return false; } ArgumentValidator.ThrowIfEmpty("resourceId", resourceId); if (this.resourceQuarantineData.ContainsKey(resourceId)) { quarantineInfoContext = this.resourceQuarantineData[resourceId]; DateTime utcNow = DateTime.UtcNow; if (!StoreDriverUtils.CheckIfDateTimeExceedsThreshold(this.resourceQuarantineData[resourceId].QuarantineStartTime, utcNow, this.quarantineSpan)) { quarantineRemainingTime = this.quarantineSpan - utcNow.Subtract(this.resourceQuarantineData[resourceId].QuarantineStartTime); return true; } } } finally { this.resourceProtector.ExitReadLock(); } return false; }
protected void AddQuarantineDataToDictionary(Guid resourceGuid, QuarantineInfoContext quarantineInfoContext) { if (this.resourceQuarantineData.ContainsKey(resourceGuid)) { this.resourceQuarantineData[resourceGuid] = quarantineInfoContext; return; } this.resourceQuarantineData.Add(resourceGuid, quarantineInfoContext); }