xmpp reconnection
If it managed to run for 5 minutes, reconnect immediately. Otherwise, wait 5 minutes before reconnecting.
This commit is contained in:
parent
64992b4251
commit
9fc8257392
2 changed files with 26 additions and 11 deletions
|
@ -17,11 +17,13 @@ import Assistant.DaemonStatus
|
||||||
import Assistant.Pushes
|
import Assistant.Pushes
|
||||||
import Assistant.Sync
|
import Assistant.Sync
|
||||||
import qualified Remote
|
import qualified Remote
|
||||||
|
import Utility.ThreadScheduler
|
||||||
|
|
||||||
import Network.Protocol.XMPP
|
import Network.Protocol.XMPP
|
||||||
import Control.Concurrent
|
import Control.Concurrent
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
import qualified Git.Branch
|
import qualified Git.Branch
|
||||||
|
import Data.Time.Clock
|
||||||
|
|
||||||
thisThread :: ThreadName
|
thisThread :: ThreadName
|
||||||
thisThread = "PushNotifier"
|
thisThread = "PushNotifier"
|
||||||
|
@ -31,14 +33,27 @@ pushNotifierThread st dstatus pushnotifier = NamedThread thisThread $ do
|
||||||
v <- runThreadState st $ getXMPPCreds
|
v <- runThreadState st $ getXMPPCreds
|
||||||
case v of
|
case v of
|
||||||
Nothing -> return () -- no creds? exit thread
|
Nothing -> return () -- no creds? exit thread
|
||||||
Just c -> void $ connectXMPP c $ \jid -> do
|
Just c -> loop c =<< getCurrentTime
|
||||||
|
where
|
||||||
|
loop c starttime = do
|
||||||
|
void $ connectXMPP c $ \jid -> do
|
||||||
fulljid <- bindJID jid
|
fulljid <- bindJID jid
|
||||||
liftIO $ debug thisThread ["XMPP connected", show fulljid]
|
liftIO $ debug thisThread ["XMPP connected", show fulljid]
|
||||||
s <- getSession
|
s <- getSession
|
||||||
_ <- liftIO $ forkIO $ void $ runXMPP s $
|
_ <- liftIO $ forkIO $ void $ runXMPP s $
|
||||||
receivenotifications
|
receivenotifications
|
||||||
sendnotifications
|
sendnotifications
|
||||||
where
|
now <- getCurrentTime
|
||||||
|
if diffUTCTime now starttime > 300
|
||||||
|
then do
|
||||||
|
debug thisThread ["XMPP connection lost; reconnecting"]
|
||||||
|
loop c now
|
||||||
|
else do
|
||||||
|
debug thisThread ["XMPP connection failed; will retry"]
|
||||||
|
threadDelaySeconds (Seconds 300)
|
||||||
|
loop c =<< getCurrentTime
|
||||||
|
|
||||||
|
|
||||||
sendnotifications = forever $ do
|
sendnotifications = forever $ do
|
||||||
us <- liftIO $ waitPush pushnotifier
|
us <- liftIO $ waitPush pushnotifier
|
||||||
let payload = [extendedAway, encodePushNotification us]
|
let payload = [extendedAway, encodePushNotification us]
|
||||||
|
|
|
@ -4,20 +4,20 @@ who share a repository, that is stored in the [[cloud]].
|
||||||
|
|
||||||
### TODO
|
### TODO
|
||||||
|
|
||||||
* Track down segfault when the XMPP library is starting up a client connection.
|
|
||||||
* test with big servers, eg google chat
|
|
||||||
* Prevent idle disconnection. Probably means sending or receiving pings,
|
* Prevent idle disconnection. Probably means sending or receiving pings,
|
||||||
but would prefer to avoid eg pinging every 60 seconds as some clients do.
|
but would prefer to avoid eg pinging every 60 seconds as some clients do.
|
||||||
|
* Make the NetWatcher restart the XMPP connection when there's a new default
|
||||||
|
route. Currently, if moving networks, it needs to go through a TCP timeout.
|
||||||
* Make the git-annex clients invisible, so a user can use their regular
|
* Make the git-annex clients invisible, so a user can use their regular
|
||||||
account without always seeming to be present when git-annex is logged in.
|
account without always seeming to be present when git-annex is logged in.
|
||||||
See <http://xmpp.org/extensions/xep-0126.html>
|
See <http://xmpp.org/extensions/xep-0126.html>
|
||||||
* webapp configuration
|
* (re)start PushNotifier when webapp is used to change XMPP config.
|
||||||
* After pulling from a remote, may need to scan for transfers, which
|
* After pulling from a remote, may need to scan for transfers, which
|
||||||
could involve other remotes (ie, S3). Since the remote client is not able to
|
could involve other remotes (ie, S3). Since the remote client is not able to
|
||||||
talk to us directly, it won't be able to upload any new files to us.
|
talk to us directly, it won't be able to upload any new files to us.
|
||||||
Need a fast way to find new files, and get them transferring. The expensive
|
Need a fast way to find new files, and get them transferring. The expensive
|
||||||
transfer scan may be needed to get fully in sync, but is too expensive to
|
transfer scan may be needed to get fully in sync, but is too expensive to
|
||||||
run every time this happens.
|
run every time this happens. Send transfer notifications using XMPP?
|
||||||
|
|
||||||
## design goals
|
## design goals
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue