send sockets have zero linger, sync object now serves as heartbeat, components die on error, all components error on heartbeat timeout

This commit is contained in:
fawce
2012-02-14 00:35:26 -05:00
parent 21afa42f3a
commit 2aecfc0010
7 changed files with 277 additions and 139 deletions
+21 -15
View File
@@ -25,32 +25,38 @@ class TestClient(object):
qutil.LOGGER.info("connecting to {address}".format(address=self.address))
self.data_feed.connect(self.address)
self.sync.confirm()
self.sync.open()
self.poller = zmq.Poller()
self.poller.register(self.data_feed, zmq.POLLIN)
qutil.LOGGER.info("Starting the client loop")
prev_dt = None
while True:
msg = self.data_feed.recv()
if(msg == "DONE"):
qutil.LOGGER.info("DONE!")
break
self.received_count += 1
event = json.loads(msg)
if(prev_dt != None):
if(not event['dt'] >= prev_dt):
raise Exception("Message out of order: {date} after {prev}".format(date=event['dt'], prev=prev_dt))
while self.sync.confirm():
socks = dict(self.poller.poll(2000)) #timeout after 2 seconds.
if self.data_feed in socks and socks[self.data_feed] == zmq.POLLIN:
msg = self.data_feed.recv()
if(msg == "DONE"):
qutil.LOGGER.info("DONE!")
break
self.received_count += 1
event = json.loads(msg)
if(prev_dt != None):
if(not event['dt'] >= prev_dt):
raise Exception("Message out of order: {date} after {prev}".format(date=event['dt'], prev=prev_dt))
prev_dt = event['dt']
if(self.received_count % 100 == 0):
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
prev_dt = event['dt']
if(self.received_count % 100 == 0):
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
except:
self.error = True
qutil.LOGGER.exception("Error in test client.")
qutil.LOGGER.exception("**********************Error in test client.")
finally:
self.data_feed.close()
self.sync.close()
self.context.term()
self.utest.assertEqual(self.expected_msg_count, self.received_count,
+26 -1
View File
@@ -5,11 +5,13 @@ Test suite for the messaging infrastructure of QSim.
import unittest2 as unittest
import multiprocessing
import time
from qsim.core import Simulator
from qsim.core import Simulator, DataFeed
from qsim.transforms.technical import MovingAverage
from qsim.sources import RandomEquityTrades
import qsim.util as qutil
import qsim.messaging as qmsg
from qsim.test.client import TestClient
@@ -56,3 +58,26 @@ class MessagingTestCase(unittest.TestCase):
self.assertEqual(sim.feed.data_buffer.pending_messages(), 0, "The feed should be drained of all messages.")
def test_zerror_in_feed(self):
ret1 = RandomEquityTrades(133, "ret1", 400)
ret2 = RandomEquityTrades(134, "ret2", 400)
sources = {"ret1":ret1, "ret2":ret2}
mavg1 = MovingAverage("mavg1", 30)
mavg2 = MovingAverage("mavg2", 60)
transforms = {"mavg1":mavg1, "mavg2":mavg2}
client = TestClient(self, expected_msg_count=0)
sim = Simulator(sources, transforms, client)
sim.feed = DataFeedErr(sources.keys(), sim.data_address, sim.feed_address, qmsg.Sync(sim, "DataFeedErrorGenerator"))
sim.simulate()
class DataFeedErr(DataFeed):
"""Helper class for testing, simulates exceptions inside the DataFeed"""
def __init__(self, source_list, data_address, feed_address, sync):
DataFeed.__init__(self, source_list, data_address, feed_address, sync)
def handle_all(self):
#time.sleep(1000)
raise Exception("simulated error in data feed from test helper")