mirror of https://github.com/voidlizard/hbs2
process-only-subscribed-reflogs
This commit is contained in:
parent
58d0e9d256
commit
93a3be5a1f
|
@ -17,6 +17,7 @@ import HBS2.Data.Types.Refs
|
||||||
|
|
||||||
import HBS2.System.Logger.Simple
|
import HBS2.System.Logger.Simple
|
||||||
|
|
||||||
|
import Control.Monad.Trans.Maybe
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Hashable hiding (Hashed)
|
import Data.Hashable hiding (Hashed)
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
|
@ -48,8 +49,13 @@ instance Pretty (AsBase58 (PubKey 'Sign s )) => Pretty (RefLogKey s) where
|
||||||
|
|
||||||
|
|
||||||
data RefLogRequest e =
|
data RefLogRequest e =
|
||||||
RefLogRequest (PubKey 'Sign (Encryption e))
|
RefLogRequest
|
||||||
| RefLogResponse (PubKey 'Sign (Encryption e)) (Hash HbSync)
|
{ refLog :: PubKey 'Sign (Encryption e)
|
||||||
|
}
|
||||||
|
| RefLogResponse
|
||||||
|
{ refLog :: PubKey 'Sign (Encryption e)
|
||||||
|
, refLogValue :: Hash HbSync
|
||||||
|
}
|
||||||
deriving stock (Generic)
|
deriving stock (Generic)
|
||||||
|
|
||||||
deriving instance
|
deriving instance
|
||||||
|
@ -148,6 +154,7 @@ data RefLogRequestI e m =
|
||||||
RefLogRequestI
|
RefLogRequestI
|
||||||
{ onRefLogRequest :: (Peer e, PubKey 'Sign (Encryption e)) -> m (Maybe (Hash HbSync))
|
{ onRefLogRequest :: (Peer e, PubKey 'Sign (Encryption e)) -> m (Maybe (Hash HbSync))
|
||||||
, onRefLogResponse :: (Peer e, PubKey 'Sign (Encryption e), Hash HbSync) -> m ()
|
, onRefLogResponse :: (Peer e, PubKey 'Sign (Encryption e), Hash HbSync) -> m ()
|
||||||
|
, isRefLogSubscribed :: PubKey 'Sign (Encryption e) -> m Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
refLogRequestProto :: forall e s m . ( MonadIO m
|
refLogRequestProto :: forall e s m . ( MonadIO m
|
||||||
|
@ -164,23 +171,22 @@ refLogRequestProto :: forall e s m . ( MonadIO m
|
||||||
=> RefLogRequestI e m -> RefLogRequest e -> m ()
|
=> RefLogRequestI e m -> RefLogRequest e -> m ()
|
||||||
|
|
||||||
refLogRequestProto adapter cmd = do
|
refLogRequestProto adapter cmd = do
|
||||||
|
|
||||||
p <- thatPeer proto
|
p <- thatPeer proto
|
||||||
auth <- find (KnownPeerKey p) id <&> isJust
|
|
||||||
|
|
||||||
when auth do
|
void $ runMaybeT do
|
||||||
|
|
||||||
-- FIXME: asap-only-accept-response-if-we-have-asked
|
guard =<< lift (find (KnownPeerKey p) id <&> isJust)
|
||||||
|
guard =<< lift (isRefLogSubscribed adapter (refLog cmd))
|
||||||
|
|
||||||
case cmd of
|
case cmd of
|
||||||
(RefLogRequest pk) -> do
|
(RefLogRequest pk) -> lift do
|
||||||
trace $ "got RefLogUpdateRequest for" <+> pretty (AsBase58 pk)
|
trace $ "got RefLogUpdateRequest for" <+> pretty (AsBase58 pk)
|
||||||
pip <- thatPeer proto
|
pip <- thatPeer proto
|
||||||
answ' <- onRefLogRequest adapter (pip,pk)
|
answ' <- onRefLogRequest adapter (pip,pk)
|
||||||
maybe1 answ' none $ \answ -> do
|
maybe1 answ' none $ \answ -> do
|
||||||
response (RefLogResponse @e pk answ)
|
response (RefLogResponse @e pk answ)
|
||||||
|
|
||||||
(RefLogResponse pk h) -> do
|
(RefLogResponse pk h) -> lift do
|
||||||
trace $ "got RefLogResponse for" <+> pretty (AsBase58 pk) <+> pretty h
|
trace $ "got RefLogResponse for" <+> pretty (AsBase58 pk) <+> pretty h
|
||||||
pip <- thatPeer proto
|
pip <- thatPeer proto
|
||||||
emit RefLogReqAnswerKey (RefLogReqAnswerData @e pk h)
|
emit RefLogReqAnswerKey (RefLogReqAnswerData @e pk h)
|
||||||
|
|
|
@ -778,7 +778,7 @@ runPeer opts = U.handle (\e -> myException e
|
||||||
runPeerM penv $ do
|
runPeerM penv $ do
|
||||||
adapter <- mkAdapter
|
adapter <- mkAdapter
|
||||||
|
|
||||||
reflogReqAdapter <- RefLog.mkRefLogRequestAdapter @e
|
reflogReqAdapter <- RefLog.mkRefLogRequestAdapter @e (SomeBrains brains)
|
||||||
|
|
||||||
let doDownload h = do
|
let doDownload h = do
|
||||||
pro <- isReflogProcessed @e brains h
|
pro <- isReflogProcessed @e brains h
|
||||||
|
|
|
@ -66,10 +66,11 @@ mkRefLogRequestAdapter :: forall e s m . ( MonadIO m
|
||||||
, Pretty (AsBase58 (PubKey 'Sign s))
|
, Pretty (AsBase58 (PubKey 'Sign s))
|
||||||
, s ~ Encryption e
|
, s ~ Encryption e
|
||||||
)
|
)
|
||||||
=> m (RefLogRequestI e (ResponseM e m ))
|
=> SomeBrains e -> m (RefLogRequestI e (ResponseM e m ))
|
||||||
mkRefLogRequestAdapter = do
|
mkRefLogRequestAdapter brains = do
|
||||||
sto <- getStorage
|
sto <- getStorage
|
||||||
pure $ RefLogRequestI (doOnRefLogRequest sto) dontHandle
|
pure $ RefLogRequestI (doOnRefLogRequest sto) dontHandle (isPolledRef @e brains)
|
||||||
|
|
||||||
|
|
||||||
-- FIXME: check-if-subscribed
|
-- FIXME: check-if-subscribed
|
||||||
-- не дергать диск для неизвестных ссылок
|
-- не дергать диск для неизвестных ссылок
|
||||||
|
@ -82,7 +83,8 @@ doOnRefLogRequest :: forall e s m . ( MonadIO m
|
||||||
)
|
)
|
||||||
=> AnyStorage -> (Peer e, PubKey 'Sign s) -> m (Maybe (Hash HbSync))
|
=> AnyStorage -> (Peer e, PubKey 'Sign s) -> m (Maybe (Hash HbSync))
|
||||||
|
|
||||||
doOnRefLogRequest sto (_,pk) = liftIO $ getRef sto (RefLogKey @s pk)
|
doOnRefLogRequest sto (_,pk) = do
|
||||||
|
liftIO $ getRef sto (RefLogKey @s pk)
|
||||||
|
|
||||||
|
|
||||||
data RefLogWorkerAdapter e =
|
data RefLogWorkerAdapter e =
|
||||||
|
@ -164,6 +166,7 @@ reflogWorker conf brains adapter = do
|
||||||
-- TODO: ASAP-start-only-one-instance-for-link-monitor
|
-- TODO: ASAP-start-only-one-instance-for-link-monitor
|
||||||
-- TODO: ASAP-dont-do-if-already-done
|
-- TODO: ASAP-dont-do-if-already-done
|
||||||
|
|
||||||
|
-- TODO: use-download-mon
|
||||||
here <- liftIO $ readTVarIO reflogMon <&> HashSet.member h
|
here <- liftIO $ readTVarIO reflogMon <&> HashSet.member h
|
||||||
unless here do
|
unless here do
|
||||||
liftIO $ atomically $ modifyTVar' reflogMon (HashSet.insert h)
|
liftIO $ atomically $ modifyTVar' reflogMon (HashSet.insert h)
|
||||||
|
|
Loading…
Reference in New Issue