[PATCH] fix issues with the standard model control pipe.
Ralph Böhme
slow at samba.org
Sun Sep 17 23:23:14 UTC 2017
On Thu, Sep 14, 2017 at 05:31:54AM +0000, Gary Lockyer via samba-technical wrote:
> Fix issues with the ownership of the writable end of the control pipe in
> the standard process model. Which resulted in child processes not
> detecting that the samba daemon master process had not terminated.
afaict this is not a problem in the standard process model, is it? There we
correctly close the writable end of the pipe directly after forking the task
services. When I look at the open pipe fds with lsof I only see it open in the
main samba process:
6959 ? Ss 0:00 samba: root process
6960 ? S 0:00 \_ samba: task[s3fs_parent]
6962 ? S 0:00 | \_ samba: tfork waiter process
6964 ? Ss 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
6983 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
6984 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
6985 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
6961 ? S 0:00 \_ samba: task[dcesrv]
6963 ? S 0:00 \_ samba: task[nbtd]
6965 ? S 0:00 \_ samba: task wrepl server_id[6965]
6966 ? S 0:00 \_ samba: task[ldapsrv]
6967 ? S 0:00 \_ samba: task[cldapd]
6968 ? S 0:00 \_ samba: task[kdc]
6969 ? S 0:00 \_ samba: task[dreplsrv]
6970 ? S 0:00 \_ samba: task[winbindd_parent]
6974 ? S 0:00 | \_ samba: tfork waiter process
6976 ? Ss 0:00 | \_ /home/slow/git/samba/scratch/bin/winbindd -D --option=server role check:inhibit=yes --foreground
6986 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/winbindd -D --option=server role check:inhibit=yes --foreground
6971 ? S 0:00 \_ samba: task[ntp_signd]
6972 ? S 0:00 \_ samba: task[kccsrv]
6973 ? S 0:00 \_ samba: task[dnsupdate]
6977 ? S 0:00 \_ samba: task[dns]
A debug line told me that the pipe fd in 6959 is fd 25:
standard_model_init: pid [6959] pipe fd [25]
$ sudo lsof -p 6959 | grep FIFO | grep 25w
samba 6959 root 25w FIFO 0,8 0t0 86037 pipe
$ sudo lsof | grep FIFO | grep samba | grep 86037
samba 6959 root 24r FIFO 0,8 0t0 86037 pipe
samba 6959 root 25w FIFO 0,8 0t0 86037 pipe
samba 6960 root 24r FIFO 0,8 0t0 86037 pipe
samba 6961 root 24r FIFO 0,8 0t0 86037 pipe
samba 6963 root 24r FIFO 0,8 0t0 86037 pipe
samba 6965 root 24r FIFO 0,8 0t0 86037 pipe
samba 6966 root 24r FIFO 0,8 0t0 86037 pipe
samba 6967 root 24r FIFO 0,8 0t0 86037 pipe
samba 6968 root 24r FIFO 0,8 0t0 86037 pipe
samba 6969 root 24r FIFO 0,8 0t0 86037 pipe
samba 6970 root 24r FIFO 0,8 0t0 86037 pipe
samba 6971 root 24r FIFO 0,8 0t0 86037 pipe
samba 6972 root 24r FIFO 0,8 0t0 86037 pipe
samba 6973 root 24r FIFO 0,8 0t0 86037 pipe
samba 6977 root 24r FIFO 0,8 0t0 86037 pipe
So generally, only with process model single we can end up inheriting the
writable pipe fd, correct?
Can we avoid the call to tfork() by using pthread_atfork() if available and only
falling back to tfork() if not? Calling tfork() makes for a hard to understand
process hierarchy, so we may want to avoid it if possible:
9310 ? Ss 0:00 samba: root process
9311 ? S 0:00 \_ samba: tfork waiter process
9312 ? S 0:00 | \_ samba: tfork waiter process
9313 ? S 0:00 \_ samba: task[s3fs_parent]
9315 ? S 0:00 | \_ samba: tfork waiter process
9317 ? Ss 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
9337 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
9338 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
9339 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/smbd -D --option=server role check:inhibit=yes --foreground
9314 ? S 0:00 \_ samba: task[dcesrv]
9316 ? S 0:00 \_ samba: task[nbtd]
9318 ? S 0:00 \_ samba: task wrepl server_id[9318]
9319 ? S 0:01 \_ samba: task[ldapsrv]
9320 ? S 0:00 \_ samba: task[cldapd]
9321 ? S 0:00 \_ samba: task[kdc]
9322 ? S 0:00 \_ samba: task[dreplsrv]
9323 ? S 0:00 \_ samba: task[winbindd_parent]
9326 ? S 0:00 | \_ samba: tfork waiter process
9329 ? Ss 0:00 | \_ /home/slow/git/samba/scratch/bin/winbindd -D --option=server role check:inhibit=yes --foreground
9336 ? S 0:00 | \_ /home/slow/git/samba/scratch/bin/winbindd -D --option=server role check:inhibit=yes --foreground
9324 ? S 0:00 \_ samba: task[ntp_signd]
9325 ? S 0:00 \_ samba: task[kccsrv]
9327 ? S 0:00 \_ samba: task[dnsupdate]
9328 ? S 0:00 \_ samba: task[dns]
Processes 9311 and 9312 are introduced by the addtional tfork() and could be
avoided if we have pthread support. Also, for reasons I don't understand yet,
all the task processes not children of 9312 but 9310.
Cheerio!
-slow
More information about the samba-technical
mailing list