public IEnumerable <QueryDeadLockInfo> ReadDeadLockEvents(string file) { var parser = new DeadLockParser(); foreach (XmlRow row in ReadEventData(file)) { QueryDeadLockInfo info; try { var parsedInfo = parser.Parse(row.XML); var queryAText = parsedInfo.data.value.deadlock.processlist.First()?.inputbuf; var queryBText = parsedInfo.data.value.deadlock.processlist.Last()?.inputbuf; info = new QueryDeadLockInfo { TimeStamp = parsedInfo.timestamp, QueryA = queryAText.ExtractLocksSqlText(), QueryB = queryBText.ExtractLocksSqlText() }; var objects = parsedInfo.data.value.deadlock.resourcelist? .SelectNodes("//@objectname")?.OfType <XmlNode>().ToList(); if (objects != null) { info.ObjectAName = objects.FirstOrDefault()?.InnerText; info.ObjectBName = objects.LastOrDefault()?.InnerText; } } catch (Exception e) { _logger.LogError(new EventId(1), e, "Error while parsing deadlocks xml record: {0}", row.XML); continue; } yield return(info); } }
public void RegisterDeadLock(QueryDeadLockInfo lockInfo) { if (lockInfo.TimeStamp <= _lastDeadLockDate.Value) { return; } Guid blockedTextId = _queryTextStoringService.GetOrCreate(lockInfo.QueryA, "DeadLocks"); Guid blockerTextId = _queryTextStoringService.GetOrCreate(lockInfo.QueryB, "DeadLocks"); var deadLocksInfo = _dateRepository.CreateInfoRecord <DeadLockInfoRecord>(lockInfo.TimeStamp); deadLocksInfo.QueryAId = blockedTextId; deadLocksInfo.QueryBId = blockerTextId; _pendingDeadLocksInfo.Add(deadLocksInfo); }