From 50396e0ba2d39e4e403179927619538c6f97d7df Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Wed, 8 Feb 2017 23:21:36 +0700 Subject: [PATCH 1/2] Broker.Server: debug trade sink --- src/ATrade/Broker/Server.hs | 9 ++++++--- src/ATrade/Types.hs | 8 ++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ATrade/Broker/Server.hs b/src/ATrade/Broker/Server.hs index 8830b43..d49858e 100644 --- a/src/ATrade/Broker/Server.hs +++ b/src/ATrade/Broker/Server.hs @@ -109,11 +109,12 @@ tradeSinkHandler :: Context -> IORef BrokerServerState -> T.Text -> IO () tradeSinkHandler c state tradeSinkEp = when (tradeSinkEp /= "") $ whileM_ (not <$> wasKilled) $ withSocket c Dealer (\sock -> do + debugM "Broker.Server" "Connecting trade sink socket" chan <- tradeSink <$> readIORef state connect sock $ T.unpack tradeSinkEp - timeoutMv <- newEmptyMVar + timeoutMv <- newIORef False threadDelay 1000000 - whileM_ (andM [not <$> wasKilled, isNothing <$> tryReadMVar timeoutMv]) $ do + whileM_ (andM [not <$> wasKilled, readIORef timeoutMv]) $ do maybeTrade <- tryReadChan chan case maybeTrade of Just trade -> sendMulti sock $ B.empty :| [encodeTrade trade] @@ -123,7 +124,9 @@ tradeSinkHandler c state tradeSinkEp = when (tradeSinkEp /= "") $ events <- poll 5000 [Sock sock [In] Nothing] if not . L.null . L.head $ events then void . receive $ sock -- anything will do - else putMVar timeoutMv ()) + else do + writeIORef timeoutMv True + warningM "Broker.Server" "Trade sink timeout") where wasKilled = fmap killMvar (readIORef state) >>= fmap isJust . tryReadMVar diff --git a/src/ATrade/Types.hs b/src/ATrade/Types.hs index 596469d..d33c89f 100644 --- a/src/ATrade/Types.hs +++ b/src/ATrade/Types.hs @@ -376,3 +376,11 @@ defaultClientSecurityParams = ClientSecurityParams { cspServerCertificate = Nothing } +data TickerInfo = TickerInfo { + tiTicker :: TickerId, + tiClass :: T.Text, + tiBase :: Maybe TickerId, + tiLotSize :: Integer, + tiTickSize :: Decimal +} deriving (Show, Eq) + From 80e0dd52afaf320bc984e96d4ccfbd229893995d Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Wed, 8 Feb 2017 23:30:58 +0700 Subject: [PATCH 2/2] Broker.Server: handle exceptions --- src/ATrade/Broker/Server.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ATrade/Broker/Server.hs b/src/ATrade/Broker/Server.hs index d49858e..dd5b0a3 100644 --- a/src/ATrade/Broker/Server.hs +++ b/src/ATrade/Broker/Server.hs @@ -108,7 +108,11 @@ notificationCallback state n = do tradeSinkHandler :: Context -> IORef BrokerServerState -> T.Text -> IO () tradeSinkHandler c state tradeSinkEp = when (tradeSinkEp /= "") $ whileM_ (not <$> wasKilled) $ - withSocket c Dealer (\sock -> do + handle (\e -> do + warningM "Broker.Server" $ "Trade sink: exception: " ++ (show (e :: SomeException)) ++ "; isZMQ: " ++ show (isZMQError e) + when (isZMQError e) $ do + debugM "Broker.Server" "Rethrowing exception" + throwIO e) $ withSocket c Dealer (\sock -> do debugM "Broker.Server" "Connecting trade sink socket" chan <- tradeSink <$> readIORef state connect sock $ T.unpack tradeSinkEp @@ -129,6 +133,7 @@ tradeSinkHandler c state tradeSinkEp = when (tradeSinkEp /= "") $ warningM "Broker.Server" "Trade sink timeout") where + isZMQError e = "ZMQError" `L.isPrefixOf` show e wasKilled = fmap killMvar (readIORef state) >>= fmap isJust . tryReadMVar encodeTrade :: Trade -> B.ByteString encodeTrade = BL.toStrict . encode . convertTrade