summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Assistant/DaemonStatus.hs13
-rw-r--r--Assistant/Threads/TransferWatcher.hs7
-rw-r--r--Assistant/Threads/Transferrer.hs43
-rw-r--r--Assistant/WebApp/DashBoard.hs11
4 files changed, 40 insertions, 34 deletions
diff --git a/Assistant/DaemonStatus.hs b/Assistant/DaemonStatus.hs
index 230d2ed37..fae51ea61 100644
--- a/Assistant/DaemonStatus.hs
+++ b/Assistant/DaemonStatus.hs
@@ -183,12 +183,17 @@ adjustTransfersSTM dstatus a = do
s <- takeTMVar dstatus
putTMVar dstatus $ s { currentTransfers = a (currentTransfers s) }
-{- Variant that does send notifications. -}
-adjustTransfers :: DaemonStatusHandle -> (TransferMap -> TransferMap) -> IO ()
-adjustTransfers dstatus a =
+{- Updates a transfer's info. Preserves any transferTid value, which is not
+ - written to disk. -}
+updateTransferInfo :: DaemonStatusHandle -> Transfer -> TransferInfo -> IO ()
+updateTransferInfo dstatus t info =
notifyTransfer dstatus `after` modifyDaemonStatus_ dstatus go
where
- go s = s { currentTransfers = a (currentTransfers s) }
+ go s = s { currentTransfers = update (currentTransfers s) }
+ update m = M.insertWith' merge t info m
+ merge new old = case transferTid old of
+ Nothing -> new
+ Just _ -> new { transferTid = transferTid old }
{- Removes a transfer from the map, and returns its info. -}
removeTransfer :: DaemonStatusHandle -> Transfer -> IO (Maybe TransferInfo)
diff --git a/Assistant/Threads/TransferWatcher.hs b/Assistant/Threads/TransferWatcher.hs
index 447ff2264..66c916990 100644
--- a/Assistant/Threads/TransferWatcher.hs
+++ b/Assistant/Threads/TransferWatcher.hs
@@ -14,8 +14,6 @@ import Logs.Transfer
import Utility.DirWatcher
import Utility.Types.DirWatcher
-import Data.Map as M
-
thisThread :: ThreadName
thisThread = "TransferWatcher"
@@ -63,10 +61,7 @@ onAdd st dstatus file _ = case parseTransferFile file of
[ "transfer starting:"
, show t
]
- adjustTransfers dstatus $
- M.insertWith' merge t info
- -- preseve transferTid, which is not written to disk
- merge new old = new { transferTid = transferTid old }
+ updateTransferInfo dstatus t info
{- Called when a transfer information file is removed. -}
onDel :: Handler
diff --git a/Assistant/Threads/Transferrer.hs b/Assistant/Threads/Transferrer.hs
index 6391d7189..c349acf44 100644
--- a/Assistant/Threads/Transferrer.hs
+++ b/Assistant/Threads/Transferrer.hs
@@ -18,9 +18,7 @@ import Logs.Location
import Annex.Content
import qualified Remote
-import Data.Time.Clock.POSIX
-import Data.Time.Clock
-import qualified Data.Map as M
+import System.Process (create_group)
thisThread :: ThreadName
thisThread = "Transferrer"
@@ -70,12 +68,12 @@ shouldTransfer t info
where
key = transferKey t
-{- A sepeate git-annex process is forked off to run a transfer.
- - This allows killing the process if the user decides to cancel the
- - transfer.
+{- A sepeate git-annex process is forked off to run a transfer,
+ - running in its own process group. This allows killing it and all its
+ - children if the user decides to cancel the transfer.
-
- A thread is forked off to run the process, and the thread
- - occupys one of the transfer slots. If all slots are in use, this will
+ - occupies one of the transfer slots. If all slots are in use, this will
- block until one becomes available. The thread's id is also recorded in
- the transfer info; the thread will also be killed when a transfer is
- stopped, to avoid it displaying any alert about the transfer having
@@ -87,24 +85,27 @@ transferThread dstatus slots t info = case (transferRemote info, associatedFile
(Just remote, Just file) -> do
tid <- inTransferSlot slots $
transferprocess remote file
- now <- getCurrentTime
- adjustTransfers dstatus $
- M.insertWith' const t info
- { startedTime = Just $ utcTimeToPOSIXSeconds now
- , transferTid = Just tid
- }
+ updateTransferInfo dstatus t $ info { transferTid = Just tid }
where
direction = transferDirection t
isdownload = direction == Download
transferprocess remote file = void $ do
- ok <- boolSystem "git-annex"
- [ Param "copy"
- , Param "--fast"
- , Param $ if isdownload then "--from" else "--to"
- , Param $ Remote.name remote
- , File file
- ]
+ (_, _, _, pid)
+ <- createProcess (proc command $ toCommand params)
+ { create_group = True }
+ status <- waitForProcess pid
addAlert dstatus $
- makeAlertFiller ok $
+ makeAlertFiller (status == ExitSuccess) $
transferFileAlert direction file
+ where
+ command = "git-annex"
+ params =
+ [ Param "copy"
+ , Param "--fast"
+ , Param $ if isdownload
+ then "--from"
+ else "--to"
+ , Param $ Remote.name remote
+ , File file
+ ]
diff --git a/Assistant/WebApp/DashBoard.hs b/Assistant/WebApp/DashBoard.hs
index a04861ed6..e2245bf6c 100644
--- a/Assistant/WebApp/DashBoard.hs
+++ b/Assistant/WebApp/DashBoard.hs
@@ -29,7 +29,8 @@ import Yesod
import Text.Hamlet
import qualified Data.Map as M
import Control.Concurrent
-import System.Posix.Signals (signalProcess, sigTERM, sigKILL)
+import System.Posix.Signals (signalProcessGroup, sigTERM, sigKILL)
+import System.Posix.Process (getProcessGroupIDOf)
{- A display of currently running and queued transfers.
-
@@ -180,7 +181,11 @@ cancelTransfer t = do
maybe noop killThread $ transferTid info
maybe noop killproc $ transferPid info
removeTransfer (daemonStatus webapp) t
+ {- In order to stop helper processes like rsync,
+ - kill the whole process group of the process running the
+ - transfer. -}
killproc pid = do
- void $ tryIO $ signalProcess sigTERM pid
+ g <- getProcessGroupIDOf pid
+ void $ tryIO $ signalProcessGroup sigTERM g
threadDelay 100000 -- 0.1 second grace period
- void $ tryIO $ signalProcess sigKILL pid
+ void $ tryIO $ signalProcessGroup sigKILL g