mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
Fix minor onnode bugs relating to local daemons.
Commit a0f5148ac749758e2dfbd6099e829c5bf1d900e6 caused a subtle regression. Due to the subtlety, this description is much longer than the 1 line patch that fixes it! The regression, where a process that invokes onnode is unexpectedly blocked, is only apparent if the following conditions are met: 1. $CTDB_NODES_SOCKETS is set; 2. The command passed to onnode attempts to background a process; and 3. onnode is run in certain types of subshell (e.g. foo=$(onnode ...)). In particular, when testing against local daemons (i.e. condition (1) is met), tests/simple/07_ctdb_process_exists.sh would fail (because it does both (2), (3)). The problem is caused by the use of file descriptor 3 in the code that allows separate filtering of stdout and stderr. A backgrounded process will have this descriptor open and the $(...) construct appears to wait for all file descriptors to be closed. This only happens with local daemons because SSH is replaced by a shell and file descriptor 3 leaks into that shell. It does not occur when SSH is used because the file descriptor does not leak into the remote shell where the process is backgrounded. The fix is simply to redirect file descriptor 3 to /dev/null in the fakessh function, which is used when $CTDB_NODES_SOCKETS is set. Also fixed is another minor bug when the -o option and $CTDB_NODES_SOCKETS are used in combination. The code uses the node name as a suffix for the output filename(s). Usually this is an IP address. However, when $CTDB_NODES_SOCKETS is in use the node name is the socket name, which might be a path several directories deep. Each output file is created via a simple redirection and this would fail if unexpected directories appear in the filename. 3 possible fixes were considered: 1. Replace all '/'s in the node name by '_'s. Nice and simple. 2. Use the basename of the node name. However, sockets may be in different directories but have the same basename. 3. Create all required directories before redirecting. This is a little more complex and probably doesn't meet the user's expectations. Option (1) is implemented here. Signed-off-by: Martin Schwenke <martin@meltin.net> (This used to be ctdb commit c97d56d93d9c1007a4e85affb19ed0c2d0e11b6d)
This commit is contained in:
parent
62871fbcd5
commit
4697829e7c
@ -241,13 +241,13 @@ get_nodes ()
|
||||
|
||||
fakessh ()
|
||||
{
|
||||
CTDB_SOCKET="$1" sh -c "$2"
|
||||
CTDB_SOCKET="$1" sh -c "$2" 3>/dev/null
|
||||
}
|
||||
|
||||
stdout_filter ()
|
||||
{
|
||||
if [ -n "$prefix" ] ; then
|
||||
cat >"${prefix}.${n}"
|
||||
cat >"${prefix}.${n//\//_}"
|
||||
elif $verbose && $parallel ; then
|
||||
sed -e "s@^@[$n] @"
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user