worker thread for processing incoming posts in background, started together with web server
This commit is contained in:
parent
736815ea83
commit
3b65757406
|
@ -9,6 +9,7 @@
|
||||||
module Hash2Pub.PostService where
|
module Hash2Pub.PostService where
|
||||||
|
|
||||||
import Control.Concurrent
|
import Control.Concurrent
|
||||||
|
import Control.Concurrent.Async
|
||||||
import Control.Concurrent.STM
|
import Control.Concurrent.STM
|
||||||
import Control.Concurrent.STM.TChan
|
import Control.Concurrent.STM.TChan
|
||||||
import Control.Concurrent.STM.TQueue
|
import Control.Concurrent.STM.TQueue
|
||||||
|
@ -83,7 +84,14 @@ instance DHT d => Service PostService d where
|
||||||
}
|
}
|
||||||
port' = fromIntegral port
|
port' = fromIntegral port
|
||||||
warpSettings = Warp.setPort port' . Warp.setHost (fromString host) $ Warp.defaultSettings
|
warpSettings = Warp.setPort port' . Warp.setHost (fromString host) $ Warp.defaultSettings
|
||||||
servThreadID <- forkIO $ Warp.runSettings warpSettings $ postServiceApplication thisService
|
-- Run 'concurrently_' from another thread to be able to return the
|
||||||
|
-- 'PostService'.
|
||||||
|
-- Terminating that parent thread will make all child threads terminate as well.
|
||||||
|
servThreadID <- forkIO $
|
||||||
|
concurrently_
|
||||||
|
-- web server
|
||||||
|
(Warp.runSettings warpSettings $ postServiceApplication thisService)
|
||||||
|
(processIncomingPosts thisService)
|
||||||
-- update thread ID after fork
|
-- update thread ID after fork
|
||||||
atomically $ writeTVar threadVar servThreadID
|
atomically $ writeTVar threadVar servThreadID
|
||||||
pure thisService
|
pure thisService
|
||||||
|
@ -175,3 +183,21 @@ tagUnsubscribe serv hashtag origin = pure $ "Here be a dragon unsubscription fro
|
||||||
-- TODO: figure out how this overlapping stuff actually works https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#instance-overlap
|
-- TODO: figure out how this overlapping stuff actually works https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#instance-overlap
|
||||||
instance {-# OVERLAPPABLE #-} Show a => MimeRender PlainText a where
|
instance {-# OVERLAPPABLE #-} Show a => MimeRender PlainText a where
|
||||||
mimeRender _ = BSU.fromString . show
|
mimeRender _ = BSU.fromString . show
|
||||||
|
|
||||||
|
|
||||||
|
-- ====== worker threads ======
|
||||||
|
|
||||||
|
-- | process the pending relays of incoming posts from the internal queue:
|
||||||
|
-- Look up responsible relay node for given hashtag and forward post to it
|
||||||
|
processIncomingPosts :: DHT d => PostService d -> IO ()
|
||||||
|
processIncomingPosts serv = forever $ do
|
||||||
|
-- blocks until available
|
||||||
|
-- TODO: process multiple in parallel
|
||||||
|
(t, pID, pC) <- atomically . readTQueue $ relayInQueue serv
|
||||||
|
lookupRes <- lookupKey (baseDHT serv) (Txt.unpack t)
|
||||||
|
case lookupRes of
|
||||||
|
-- no vserver active => wait and retry
|
||||||
|
Nothing -> threadDelay $ 10 * 10^6
|
||||||
|
Just (responsibleHost, responsiblePort) -> do
|
||||||
|
-- TODO: do actual HTTP requests
|
||||||
|
pure ()
|
||||||
|
|
Loading…
Reference in a new issue