Display a warning when concurrency is enabled but ssh connection caching is not enabled or won't work due to a crippled filesystem

A warning message is unsatisfying. But erroring out is too hard a failure,
especially since it may well work fine if the user has enabled passwordless
ssh.

I did think about falling back to one ssh connection at a time in this
case, but it would have needed a rework of every ssh call, which
seems far overboard for such a niche problem. There's no single place where
git-annex runs ssh, so no one place that it could block a concurrent call
on a semaphore. And, even if it did fall back to one ssh connection at a
time, it seems to me that doing so without warning the user about the
problem just invites bug reports like "git-annex is ignoring my -J2 and
only doing one download at a time". So a warning is needed, and I suppose
is good enough.
This commit is contained in:
Joey Hess 2020-01-23 12:35:46 -04:00
parent 81b06588a1
commit 5c3636037b
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 66 additions and 7 deletions

View file

@ -1,6 +1,6 @@
{- git-annex ssh interface, with connection caching
-
- Copyright 2012-2017 Joey Hess <id@joeyh.name>
- Copyright 2012-2020 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
@ -100,11 +100,44 @@ consumeStdinParams NoConsumeStdin = [Param "-n"]
sshCachingInfo :: (SshHost, Maybe Integer) -> Annex (Maybe FilePath, [CommandParam])
sshCachingInfo (host, port) = go =<< sshCacheDir
where
go Nothing = return (Nothing, [])
go (Just dir) =
liftIO (bestSocketPath $ dir </> hostport2socket host port) >>= return . \case
Nothing -> (Nothing, [])
Just socketfile -> (Just socketfile, sshConnectionCachingParams socketfile)
-- No connection caching with concurrency is not a good
-- combination, so warn the user.
go Nothing = do
Annex.getState Annex.concurrency >>= \case
NonConcurrent -> return ()
Concurrent {} -> warnnocaching
ConcurrentPerCpu -> warnnocaching
return (Nothing, [])
warnnocaching = do
warning nocachingwarning
ifM (fromMaybe True . annexSshCaching <$> Annex.getGitConfig)
( whenM crippledFileSystem $
warning crippledfswarning
, warning enablecachingwarning
)
nocachingwarning = unwords
[ "You have enabled concurrency, but ssh connection caching"
, "is not enabled. This may result in multiple ssh processes"
, "prompting for passwords at the same time."
]
crippledfswarning = unwords
[ "This repository is on a crippled filesystem, so unix named"
, "pipes probably don't work, and ssh connection caching"
, "relies on those. One workaround is to set"
, sshSocketDirEnv
, "to point to a directory on a non-crippled filesystem."
, "(Or, disable concurrency.)"
]
enablecachingwarning =
"Enable annex.sshcaching (or disable concurrency) to avoid this problem."
{- Given an absolute path to use for a socket file,
- returns whichever is shorter of that or the relative path to the same
@ -133,9 +166,11 @@ sshConnectionCachingParams socketfile =
, Param "-o", Param "ControlPersist=yes"
]
sshSocketDirEnv :: String
sshSocketDirEnv = "GIT_ANNEX_SSH_SOCKET_DIR"
{- ssh connection caching creates sockets, so will not work on a
- crippled filesystem. A GIT_ANNEX_TMP_DIR can be provided to use
- a different filesystem. -}
- crippled filesystem. -}
sshCacheDir :: Annex (Maybe FilePath)
sshCacheDir
| BuildInfo.sshconnectioncaching =
@ -148,7 +183,7 @@ sshCacheDir
)
| otherwise = return Nothing
where
gettmpdir = liftIO $ getEnv "GIT_ANNEX_TMP_DIR"
gettmpdir = liftIO $ getEnv sshSocketDirEnv
usetmpdir tmpdir = liftIO $ catchMaybeIO $ do
let socktmp = tmpdir </> "ssh"
createDirectoryIfMissing True socktmp

View file

@ -19,6 +19,8 @@ git-annex (7.20191231) UNRELEASED; urgency=medium
uuid configured.
* Support git remotes that need http basic auth to be accessed,
using git credential to get the password.
* Display a warning when concurrency is enabled but ssh connection caching
is not enabled or won't work due to a crippled filesystem.
-- Joey Hess <id@joeyh.name> Wed, 01 Jan 2020 12:51:40 -0400

View file

@ -63,3 +63,4 @@ get R042/R042-2013-08-16/R042-2013-08-16-CSC01a.ncs get R042/R042-2013-08-16/R04
[[!meta author=yoh]]
[[!tag projects/datalad]]
> warning added; [[done]] --[[Joey]]

View file

@ -0,0 +1,21 @@
[[!comment format=mdwn
username="joey"
subject="""comment 4"""
date="2020-01-23T15:51:46Z"
content="""
I notice that debug output has no BatchMode=true in any ssh call. But
the version of git-annex you show always runs ssh with that when
-J is used, unless sshcaching is disabled.
More evidence that sshcaching is disabled in your transcript is that when
it does run ssh, it does not pass -S.
I think the repository must be on a crippled filesystem, on which
git-annex can't do ssh connection caching, because the filesystem
does not support unix sockets. (Or it potentially could be crippled in some
other way.) So it ignores the annex.sshcaching setting.
You could work around this by setting the (undocumented)
GIT_ANNEX_TMP_DIR to some temporary directory on a non-crippled filesystem.
I'm going to add a warning message in this situation.
"""]]

View file

@ -212,8 +212,8 @@ case "$os" in
useproot=1
# Store ssh connection caching sockets outside of sdcard.
GIT_ANNEX_TMP_DIR="$TMPDIR"
export GIT_ANNEX_TMP_DIR
GIT_ANNEX_SSH_SOCKET_DIR="$TMPDIR"
export GIT_ANNEX_SSH_SOCKET_DIR
GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH MANPATH LOCPATH"
export GIT_ANNEX_STANDLONE_ENV