mirror of https://github.com/voidlizard/hbs2
ping rtt measurement
This commit is contained in:
parent
60e420f668
commit
fd7b0e31d5
|
@ -1,2 +1,2 @@
|
||||||
|
|
||||||
(fixme-set "workflow" "wip" "G6tN6bWuhi")
|
(fixme-set "workflow" "test" "FkbL6CVp5Q")
|
|
@ -44,13 +44,22 @@ newtype instance SessionKey e (KnownPeer e) =
|
||||||
KnownPeerKey (Peer e)
|
KnownPeerKey (Peer e)
|
||||||
deriving stock (Generic,Typeable)
|
deriving stock (Generic,Typeable)
|
||||||
|
|
||||||
|
data PeerPingData e =
|
||||||
|
PeerPingData
|
||||||
|
{ _peerPingNonce :: PingNonce
|
||||||
|
, _peerPingSent :: TimeSpec
|
||||||
|
}
|
||||||
|
deriving stock (Generic,Typeable)
|
||||||
|
|
||||||
|
makeLenses 'PeerPingData
|
||||||
|
|
||||||
type instance SessionData e (KnownPeer e) = PeerData e
|
type instance SessionData e (KnownPeer e) = PeerData e
|
||||||
|
|
||||||
newtype instance SessionKey e (PeerHandshake e) =
|
newtype instance SessionKey e (PeerHandshake e) =
|
||||||
PeerHandshakeKey (PingNonce, Peer e)
|
PeerHandshakeKey (PingNonce, Peer e)
|
||||||
deriving stock (Generic, Typeable)
|
deriving stock (Generic, Typeable)
|
||||||
|
|
||||||
type instance SessionData e (PeerHandshake e) = PingNonce
|
type instance SessionData e (PeerHandshake e) = PeerPingData e
|
||||||
|
|
||||||
|
|
||||||
-- FIXME: enormous-request-amount-during-handshake-2
|
-- FIXME: enormous-request-amount-during-handshake-2
|
||||||
|
@ -71,9 +80,17 @@ sendPing :: forall e m . ( MonadIO m
|
||||||
|
|
||||||
sendPing pip = do
|
sendPing pip = do
|
||||||
nonce <- newNonce @(PeerHandshake e)
|
nonce <- newNonce @(PeerHandshake e)
|
||||||
update nonce (PeerHandshakeKey (nonce,pip)) id
|
tt <- liftIO $ getTimeCoarse
|
||||||
|
let pdd = PeerPingData nonce tt
|
||||||
|
update pdd (PeerHandshakeKey (nonce,pip)) id
|
||||||
request pip (PeerPing @e nonce)
|
request pip (PeerPing @e nonce)
|
||||||
|
|
||||||
|
newtype PeerHandshakeAdapter e m =
|
||||||
|
PeerHandshakeAdapter
|
||||||
|
{ onPeerRTT :: (Peer e, Integer) -> m ()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
peerHandShakeProto :: forall e m . ( MonadIO m
|
peerHandShakeProto :: forall e m . ( MonadIO m
|
||||||
, Response e (PeerHandshake e) m
|
, Response e (PeerHandshake e) m
|
||||||
, Request e (PeerHandshake e) m
|
, Request e (PeerHandshake e) m
|
||||||
|
@ -88,9 +105,10 @@ peerHandShakeProto :: forall e m . ( MonadIO m
|
||||||
, EventEmitter e (PeerHandshake e) m
|
, EventEmitter e (PeerHandshake e) m
|
||||||
, EventEmitter e (ConcretePeer e) m
|
, EventEmitter e (ConcretePeer e) m
|
||||||
)
|
)
|
||||||
=> PeerHandshake e -> m ()
|
=> PeerHandshakeAdapter e m
|
||||||
|
-> PeerHandshake e -> m ()
|
||||||
|
|
||||||
peerHandShakeProto =
|
peerHandShakeProto adapter =
|
||||||
\case
|
\case
|
||||||
PeerPing nonce -> do
|
PeerPing nonce -> do
|
||||||
pip <- thatPeer proto
|
pip <- thatPeer proto
|
||||||
|
@ -117,7 +135,7 @@ peerHandShakeProto =
|
||||||
|
|
||||||
se' <- find @e (PeerHandshakeKey (nonce0,pip)) id
|
se' <- find @e (PeerHandshakeKey (nonce0,pip)) id
|
||||||
|
|
||||||
maybe1 se' (pure ()) $ \nonce -> do
|
maybe1 se' (pure ()) $ \(PeerPingData nonce t0) -> do
|
||||||
|
|
||||||
let pk = view peerSignKey d
|
let pk = view peerSignKey d
|
||||||
|
|
||||||
|
@ -125,6 +143,11 @@ peerHandShakeProto =
|
||||||
|
|
||||||
when signed $ do
|
when signed $ do
|
||||||
|
|
||||||
|
now <- liftIO getTimeCoarse
|
||||||
|
let rtt = toNanoSecs $ now - t0
|
||||||
|
|
||||||
|
onPeerRTT adapter (pip,rtt)
|
||||||
|
|
||||||
expire (PeerHandshakeKey (nonce0,pip))
|
expire (PeerHandshakeKey (nonce0,pip))
|
||||||
|
|
||||||
-- FIXME: check if peer is blacklisted
|
-- FIXME: check if peer is blacklisted
|
||||||
|
|
|
@ -490,12 +490,15 @@ blockDownloadLoop env0 = do
|
||||||
errors <- liftIO $ readTVarIO (view peerErrorsPerSec pinfo)
|
errors <- liftIO $ readTVarIO (view peerErrorsPerSec pinfo)
|
||||||
downFails <- liftIO $ readTVarIO (view peerDownloadFail pinfo)
|
downFails <- liftIO $ readTVarIO (view peerDownloadFail pinfo)
|
||||||
down <- liftIO $ readTVarIO (view peerDownloadedBlk pinfo)
|
down <- liftIO $ readTVarIO (view peerDownloadedBlk pinfo)
|
||||||
useful <- liftIO $ readTVarIO (view peerUsefulness pinfo)
|
rtt <- liftIO $ readTVarIO (view peerRTT pinfo) <&> fmap realToFrac
|
||||||
|
|
||||||
|
let rttMs = (/1e6) <$> rtt <&> floor
|
||||||
|
|
||||||
notice $ "peer" <+> pretty p <+> "burst:" <+> pretty burst
|
notice $ "peer" <+> pretty p <+> "burst:" <+> pretty burst
|
||||||
<+> "burst-max:" <+> pretty buM
|
<+> "burst-max:" <+> pretty buM
|
||||||
<+> "errors:" <+> pretty (downFails + errors)
|
<+> "errors:" <+> pretty (downFails + errors)
|
||||||
<+> "down:" <+> pretty down
|
<+> "down:" <+> pretty down
|
||||||
<+> "useful:" <+> pretty useful
|
<+> "rtt:" <+> pretty rttMs <> "ms"
|
||||||
pure ()
|
pure ()
|
||||||
|
|
||||||
void $ liftIO $ async $ forever $ withPeerM e $ withDownload env0 do
|
void $ liftIO $ async $ forever $ withPeerM e $ withDownload env0 do
|
||||||
|
|
|
@ -52,6 +52,7 @@ data PeerInfo e =
|
||||||
, _peerDownloadedBlk :: TVar Int
|
, _peerDownloadedBlk :: TVar Int
|
||||||
, _peerDownloadFail :: TVar Int
|
, _peerDownloadFail :: TVar Int
|
||||||
, _peerUsefulness :: TVar Double
|
, _peerUsefulness :: TVar Double
|
||||||
|
, _peerRTT :: TVar (Maybe Integer) -- ^ nanosec
|
||||||
}
|
}
|
||||||
deriving stock (Generic,Typeable)
|
deriving stock (Generic,Typeable)
|
||||||
|
|
||||||
|
@ -73,6 +74,7 @@ newPeerInfo = liftIO do
|
||||||
<*> newTVarIO 0
|
<*> newTVarIO 0
|
||||||
<*> newTVarIO 0
|
<*> newTVarIO 0
|
||||||
<*> newTVarIO 0
|
<*> newTVarIO 0
|
||||||
|
<*> newTVarIO Nothing
|
||||||
|
|
||||||
type instance SessionData e (PeerInfo e) = PeerInfo e
|
type instance SessionData e (PeerInfo e) = PeerInfo e
|
||||||
|
|
||||||
|
|
|
@ -544,6 +544,7 @@ runPeer opts = Exception.handle myException $ do
|
||||||
reflogAdapter <- RefLog.mkAdapter
|
reflogAdapter <- RefLog.mkAdapter
|
||||||
reflogReqAdapter <- RefLog.mkRefLogRequestAdapter @e
|
reflogReqAdapter <- RefLog.mkRefLogRequestAdapter @e
|
||||||
|
|
||||||
|
|
||||||
let doDownload h = do
|
let doDownload h = do
|
||||||
withPeerM penv $ withDownload denv (addDownload mzero h)
|
withPeerM penv $ withDownload denv (addDownload mzero h)
|
||||||
|
|
||||||
|
@ -557,6 +558,13 @@ runPeer opts = Exception.handle myException $ do
|
||||||
, RefLog.reflogFetch = doFetchRef
|
, RefLog.reflogFetch = doFetchRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let doUpdateRtt (p,rttNew) = withPeerM penv $ void $ runMaybeT do
|
||||||
|
def <- newPeerInfo
|
||||||
|
tv <- lift $ fetch True def (PeerInfoKey p) (view peerRTT)
|
||||||
|
void $ liftIO $ atomically $ writeTVar tv (Just rttNew)
|
||||||
|
|
||||||
|
let hshakeAdapter = PeerHandshakeAdapter doUpdateRtt
|
||||||
|
|
||||||
env <- ask
|
env <- ask
|
||||||
|
|
||||||
pnonce <- peerNonce @e
|
pnonce <- peerNonce @e
|
||||||
|
@ -758,7 +766,7 @@ runPeer opts = Exception.handle myException $ do
|
||||||
[ makeResponse (blockSizeProto blk dontHandle onNoBlock)
|
[ makeResponse (blockSizeProto blk dontHandle onNoBlock)
|
||||||
, makeResponse (blockChunksProto adapter)
|
, makeResponse (blockChunksProto adapter)
|
||||||
, makeResponse blockAnnounceProto
|
, makeResponse blockAnnounceProto
|
||||||
, makeResponse (withCredentials pc . peerHandShakeProto)
|
, makeResponse (withCredentials pc . peerHandShakeProto hshakeAdapter)
|
||||||
, makeResponse peerExchangeProto
|
, makeResponse peerExchangeProto
|
||||||
, makeResponse (refLogUpdateProto reflogAdapter)
|
, makeResponse (refLogUpdateProto reflogAdapter)
|
||||||
, makeResponse (refLogRequestProto reflogReqAdapter)
|
, makeResponse (refLogRequestProto reflogReqAdapter)
|
||||||
|
|
Loading…
Reference in New Issue