Skip to contentSkip to conversation

Fix problems caused by rpc.statd being unresponsive.

PATCH In review NeilBrown 2 participants 4 messages Dec 17, 2015 – Jan 16, 2016

Subsystems (2)
lore
Share & tools
lore

NeilBrown

author
#0 lore raw

cover Fix problems caused by rpc.statd being unresponsive.

If rpc.statd is temporarily unresponsive (e.g. because DNS service is slow) it can cause mount attempts to fail inappropriately or can cause multiple rpc.statd processes to be running on the one machine.

These patches address those problems.

---

NeilBrown (2):
mount.nfs: trust the exit status of "start_statd".
start-statd: don't run multiple rpc.statds on the one host.

 utils/mount/network.c   |    6 +++++-
 utils/statd/start-statd |    8 ++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

--
Signature

author
#1 lore raw

PATCH 1/2 mount.nfs: trust the exit status of "start_statd".

If DNS service is particularly slow, nfs_probe_statd() can fail even though rpc.statd is actually running. This happens because rpc.statd is single threaded and could be waiting longer for DNS than nfs_probe_statd() will wait for it.

This causes problems when mount.nfs uses nfs_probe_statd() to see if statd is running, as is needed for NFSv3.

Currently in these circumstances there are two possible outcomes. 1/ if systemd is in use, it will be told to start rpc-statd, which
is already running so no change.
mount.nfs will try pinging rpc.statd a few more times and could eventually give up and fail the mount.
While slow DNS may well result in slow service, it shouldn't cause a mount attempt to fail.

2/ if systemd is not in use, a new rpc.statd will be started. This
can (and has) lead to a large number of rpc.statd processes running on the one machine.

This patch addresses the first scenario. If START_STATD is run and exits with a success status, mount.nfs assumes statd is running and allows the mount to succeed. A separate patch will address the other scenario.

---
 utils/mount/network.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
utils/mount/network.c +5 -1
index 8a9bf1476d51..7240ca7bcdc4 100644
@@ -794,6 +794,7 @@ int start_statd(void)
 	if (stat(START_STATD, &stb) == 0) {
 		if (S_ISREG(stb.st_mode) && (stb.st_mode & S_IXUSR)) {
 			int cnt = STATD_TIMEOUT * 10;
+			int status = 0;
 			const struct timespec ts = {
 				.tv_sec = 0,
 				.tv_nsec = 100000000,
@@ -808,7 +809,10 @@ int start_statd(void)
 						progname, strerror(errno));
 				break;
 			default: /* parent */
-				waitpid(pid, NULL,0);
+				if (waitpid(pid, &status,0) == pid &&
+				    status == 0)
+					/* assume it worked */
+					return 1;
 				break;
 			}
 			while (1) {
author
#2 lore raw

PATCH 2/2 start-statd: don't run multiple rpc.statds on the one host.

In reply to NeilBrown

If rpc.statd is running but slow to respond, mount.nfs will run "start-statd" which might start a new statd. This is not a good ideas as can result in lots of rpc.statds.

So inf start-statd check the pid file and if rpc.statd seems to be running, exit with success.

(also "cd /" before running rpc.statd, just in case).

---
 utils/statd/start-statd |    8 ++++++++
 1 file changed, 8 insertions(+)
utils/statd/start-statd +8 -0
index 14369e515cb2..19e6eb21d044 100755
@@ -6,11 +6,19 @@
 # site.
 PATH="/sbin:/usr/sbin:/bin:/usr/bin"
 
+if [ -s /var/run/rpc.statd.pid ] &&
+       [ 1`cat /var/run/rpc.statd.pid` -gt 1 ] &&
+       kill -0 `cat /var/run/rpc.statd.pid` > /dev/null 2>&1
+then
+    # statd already running - must have been slow to respond.
+    exit 0
+fi
 # First try systemd if it's installed.
 if [ -d /run/systemd/system ]; then
     # Quit only if the call worked.
     systemctl start rpc-statd.service && exit
 fi
 
+cd /
 # Fall back to launching it ourselves.
 exec rpc.statd --no-notify
#3 lore raw
In reply to NeilBrown
Quoted 11 lines · NeilBrown

If rpc.statd is temporarily unresponsive (e.g. because DNS service is slow) it can cause mount attempts to fail inappropriately or can cause multiple rpc.statd processes to be running on the one machine.

These patches address those problems.

---

NeilBrown (2):
mount.nfs: trust the exit status of "start_statd".
start-statd: don't run multiple rpc.statds on the one host.

Both patches committed.... again.. thank you!

steved

Quoted 14 lines

 utils/mount/network.c   |    6 +++++-
 utils/statd/start-statd |    8 ++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

--
Signature

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html