private void PruneNeighborCallback(IPeerNeighbor peer) { lock (this.ThisLock) { if (this.Neighbors.Count <= 1) { return; } if (System.ServiceModel.DiagnosticUtility.ShouldTraceWarning) { string message = System.ServiceModel.SR.GetString("PeerThrottlePruning", new object[] { this.config.MeshId }); PeerThrottleTraceRecord extendedData = new PeerThrottleTraceRecord(this.config.MeshId, message); TraceUtility.TraceEvent(TraceEventType.Warning, 0x4004f, System.ServiceModel.SR.GetString("TraceCodePeerFlooderReceiveMessageQuotaExceeded"), extendedData, this, null); } } try { peer.Abort(PeerCloseReason.NodeTooSlow, PeerCloseInitiator.LocalNode); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } if (PeerFlooderBase <TFloodContract, TLinkContract> .CloseNeighborIfKnownException(this.neighborManager, exception, peer) != null) { throw; } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } }
public override void ProcessLinkUtility(IPeerNeighbor neighbor, UtilityInfo utilityInfo) { if (!PeerNeighborStateHelper.IsConnected(neighbor.State)) { neighbor.Abort(PeerCloseReason.InvalidNeighbor, PeerCloseInitiator.LocalNode); } else { try { UtilityExtension.ProcessLinkUtility(neighbor, utilityInfo); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } if (PeerFlooderBase <Message, UtilityInfo> .CloseNeighborIfKnownException(base.neighborManager, exception, neighbor) != null) { throw; } DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } } }
protected IAsyncResult BeginSendHelper(IPeerNeighbor neighbor, TimeSpan timeout, Message message, FloodAsyncResult fresult) { IAsyncResult result = null; IAsyncResult result2; bool flag = false; try { UtilityExtension.OnMessageSent(neighbor); result = neighbor.BeginSend(message, timeout, Fx.ThunkCallback(new AsyncCallback(fresult.OnSendComplete)), message); fresult.AddResult(result, neighbor); if (result.CompletedSynchronously) { neighbor.EndSend(result); UtilityExtension.OnEndSend(neighbor, fresult); } result2 = result; } catch (Exception exception) { if (Fx.IsFatal(exception)) { flag = true; throw; } if (PeerFlooderBase <TFloodContract, TLinkContract> .CloseNeighborIfKnownException(this.neighborManager, exception, neighbor) != null) { fresult.MarkEnd(false); throw; } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); result2 = null; } finally { if (((result == null) || result.CompletedSynchronously) && !flag) { message.Close(); } } return(result2); }
public virtual IAsyncResult OnFloodedMessage(IPeerNeighbor neighbor, TFloodContract floodInfo, AsyncCallback callback, object state) { bool useful = false; MessageBuffer messageBuffer = null; Message message = null; int index = 0; ulong maxValue = ulong.MaxValue; MessageHeader hopHeader = null; bool flag2 = false; PeerMessageProperty property = null; IAsyncResult result = null; try { property = (PeerMessageProperty)floodInfo.Properties["PeerProperty"]; if (!property.MessageVerified) { if (property.CacheMiss > 2) { UtilityExtension.ReportCacheMiss(neighbor, property.CacheMiss); } result = new CompletedAsyncResult(callback, state); } else { useful = true; messageBuffer = floodInfo.CreateBufferedCopy((int)this.config.MaxReceivedMessageSize); message = messageBuffer.CreateMessage(); Uri peerVia = property.PeerVia; Uri peerTo = property.PeerTo; message.Headers.To = message.Properties.Via = peerVia; index = this.UpdateHopCount(message, out hopHeader, out maxValue); PeerMessagePropagation localAndRemote = PeerMessagePropagation.LocalAndRemote; if (property.SkipLocalChannels) { localAndRemote = PeerMessagePropagation.Remote; } else if (this.messageHandler.HasMessagePropagation) { using (Message message2 = messageBuffer.CreateMessage()) { localAndRemote = this.messageHandler.DetermineMessagePropagation(message2, PeerMessageOrigination.Remote); } } if (((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None) && (maxValue == 0L)) { localAndRemote &= ~PeerMessagePropagation.Remote; } if ((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None) { result = this.BeginFloodReceivedMessage(neighbor, messageBuffer, PeerTransportConstants.ForwardTimeout, callback, state, index, hopHeader); } else { result = new CompletedAsyncResult(callback, state); } if ((localAndRemote & PeerMessagePropagation.Local) != PeerMessagePropagation.None) { this.messageHandler.HandleIncomingMessage(messageBuffer, localAndRemote, index, hopHeader, peerVia, peerTo); } } UtilityExtension.UpdateLinkUtility(neighbor, useful); } catch (Exception exception) { if (Fx.IsFatal(exception)) { flag2 = true; throw; } if (PeerFlooderBase <TFloodContract, TLinkContract> .CloseNeighborIfKnownException(this.neighborManager, exception, neighbor) != null) { throw; } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } finally { if (!flag2) { if (message != null) { message.Close(); } if (messageBuffer != null) { messageBuffer.Close(); } } } return(result); }
internal void OnSendComplete(IAsyncResult result) { bool flag = false; IPeerNeighbor neighbor = null; bool flag2 = false; if (!this.isCompleted) { Message asyncState = (Message)result.AsyncState; lock (this.ThisLock) { if (this.isCompleted) { return; } if (!this.results.TryGetValue(result, out neighbor)) { if (this.doneAdding) { throw Fx.AssertAndThrow("IAsyncResult is un-accounted for."); } this.pending.Add(result); return; } this.results.Remove(result); try { if (!result.CompletedSynchronously) { neighbor.EndSend(result); this.offNode = true; UtilityExtension.OnEndSend(neighbor, this); } } catch (Exception exception) { if (Fx.IsFatal(exception)) { flag2 = true; throw; } Exception exception2 = PeerFlooderBase <Message, UtilityInfo> .CloseNeighborIfKnownException(this.pnm, exception, neighbor); if (((exception2 != null) && this.doneAdding) && !this.shouldCallComplete) { throw; } if (this.exception == null) { this.exception = exception2; } DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } finally { if (((asyncState != null) && !result.CompletedSynchronously) && !flag2) { asyncState.Close(); } } if (((this.results.Count == 0) && this.doneAdding) && this.shouldCallComplete) { this.isCompleted = true; flag = true; } } if (flag && this.shouldCallComplete) { this.CompleteOp(false); } } }