public void propagatePublishWork(PropagatedPublishMessage msg) { log(string.Format("[propagatePublish] Received event '{0}'", msg)); if (_orderingPolicy == OrderingPolicy.fifo) { //FIFO lock (_fifostructs) { int index = _fifostructs.FindIndex(item => item._publhisherURI == msg.publisherURI); if (index < 0) { // element does not exists _fifostructs.Add(new FIFOstruct(msg.publisherURI, 0)); //getIndex Now index = _fifostructs.FindIndex(item => item._publhisherURI == msg.publisherURI); } var fifo = _fifostructs[index]; //TODO Verify duplicates fifo.listOfmessages.Add(msg); fifo.listOfmessages.OrderBy(item => item.seqnum).ToList(); //DEBUG ListOfMessages foreach (PublishMessage _msg in fifo.listOfmessages) { log(string.Format("[ListOfMessage] seqnum: '{0}' '{1}'", fifo._seq_num, _msg)); } foreach (PublishMessage _msg in fifo.listOfmessages.ToList()) { if (_msg.seqnum == fifo._seq_num) { //Prepare to send the msg to interested sites deliver(_msg); propagatingRouting(new PropagatedPublishMessage(_msg, msg.origin_site)); //Message sent , increment seq_num and delete delivered message fifo._seq_num++; fifo.listOfmessages.Remove(_msg); } else break; } } } else { deliver(msg); propagatingRouting(msg); } }
private void routing(PublishMessage msg) { PropagatedPublishMessage pmsg = new PropagatedPublishMessage(msg, _site); pmsg.origin_site = _site; seq++; Console.WriteLine(seq); if (_routingPolicy == RoutingPolicy.flooding) { lock (_childSites) { foreach (var s in _childSites) { lock (s) { foreach (var broker in s.brokers) { // TODO broker.getURI() is slow, we should use a cache log(string.Format("[Flooding Routing] sent event '{0}' to '{1}'", msg, broker.getURI())); PropagatePublishDelegate d = new PropagatePublishDelegate(broker.propagatePublish); d.BeginInvoke(pmsg, null, null); if (_loggingLevel == LoggingLevel.full) c.reportEvent(EventType.BroEvent, getURI(), msg.publisherURI, msg.topic, msg.seqnum); } } } } } else // routing policy is filtering { List<string> sentSites = new List<string>(); lock (_topicSites) { foreach (var subscribedTopic in _topicSites.Keys) { if (!equivalentTopic(msg.topic, subscribedTopic)) continue; foreach (var site_name in _topicSites[subscribedTopic]) { if (sentSites.Contains(site_name)) continue; var site = _nameToSite[site_name]; //translate seq_num of the message to send to child_sites if (_orderingPolicy == OrderingPolicy.fifo) { lock (_siteToFifoStruct) { if (!_siteToFifoStruct.ContainsKey(site_name)) { _siteToFifoStruct.Add(site_name, new List<FIFOstruct>()); } int index = _siteToFifoStruct[site_name].FindIndex(item => item._publhisherURI == pmsg.publisherURI); if (index < 0) { // element does not exists _siteToFifoStruct[site_name].Add(new FIFOstruct(msg.publisherURI, 0)); //getIndex Now index = _siteToFifoStruct[site_name].FindIndex(item => item._publhisherURI == pmsg.publisherURI); } var fifo = _siteToFifoStruct[site_name][index]; //create a new message for each site interested sites with possibly a different seqnum PropagatedPublishMessage local_pmsg = new PropagatedPublishMessage(msg, _site); local_pmsg.origin_site = _site; local_pmsg.seqnum = fifo._seq_num; fifo.listOfmessages.Add(local_pmsg); fifo._seq_num++; //It's not necessary to register the message in the listOfmessages because the message is imediately sent //But you could have to do that way with an assync approach } } lock (site) { foreach (var broker in site.brokers) { // using broker.getURI() increases network traffic if (_orderingPolicy == OrderingPolicy.fifo) { int index = _siteToFifoStruct[site_name].FindIndex(item => item._publhisherURI == pmsg.publisherURI); if (index >= 0) { foreach (PropagatedPublishMessage _pmsg in _siteToFifoStruct[site.name][index].listOfmessages.ToList()) { PropagatePublishDelegate d = new PropagatePublishDelegate(broker.propagatePublish); log(string.Format("[filtering routing] sent event '{0}' to '{1}'", _pmsg, broker.getURI())); d.BeginInvoke(_pmsg, null, null); if (_loggingLevel == LoggingLevel.full) c.reportEvent(EventType.BroEvent, getURI(), _pmsg.publisherURI, _pmsg.topic, msg.seqnum); _siteToFifoStruct[site.name][index].listOfmessages.Remove(_pmsg); } } } else { PropagatePublishDelegate d = new PropagatePublishDelegate(broker.propagatePublish); log(string.Format("[filtering routing] sent event '{0}' to '{1}'", pmsg, broker.getURI())); d.BeginInvoke(pmsg, null, null); if (_loggingLevel == LoggingLevel.full) c.reportEvent(EventType.BroEvent, getURI(), pmsg.publisherURI, pmsg.topic, msg.seqnum); } } } } } } } // send to parent site brokers // always send publish to parent, doesnt matter if interested in topic lock (_parentSiteLock) { if (_parentSite != null) { foreach (Broker broker in _parentSite.brokers) { // TODO broker.getURI() is slow, we should use a cache PropagatePublishDelegate d = new PropagatePublishDelegate(broker.propagatePublish); log(string.Format("[Routing] sent event '{0}' to parent broker '{1}'", pmsg, broker.getURI())); d.BeginInvoke(pmsg, null, null); if (_loggingLevel == LoggingLevel.full) c.reportEvent(EventType.BroEvent, getURI(), pmsg.publisherURI, pmsg.topic, msg.seqnum); } } } }
public void propagatePublish(PropagatedPublishMessage msg) { bool freezed = false; lock (_freezedLock) { if (_freezed) { freezed = true; log(string.Format("[propagatePublish] freezed")); _freezedPropagatedPublishMessages.Add(msg); } } if (!freezed) { propagatePublishWork(msg); } }