示例#1
0
        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);
        }
示例#2
0
 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);
		}