cluster: RHEL48 - rgmanager: Kill correct PIDs during force_unmount

Lon Hohberger lon at fedoraproject.org
Mon Apr 5 14:23:28 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=04d4b4acc681f8af1a467ffac077e5898ad19592
Commit:        04d4b4acc681f8af1a467ffac077e5898ad19592
Parent:        23ac11b4d1ee465ab8cf377008740156ca1ebc25
Author:        Shane Bradley <sbradley at redhat.com>
AuthorDate:    Mon Feb 15 16:16:55 2010 -0500
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Mon Apr 5 09:55:35 2010 -0400

rgmanager: Kill correct PIDs during force_unmount

When stopping a service that contains a filesystem resource that is
managed by fs.sh, on a stop operation it can kill a process that is
not located on that mount point.

There was a couple of scenarios that would kill a process that was
not on that mount point when it was stopped:

These processes should not have been killed:
 $ less /tmp/media/demo1/tmp.txt
 $ less /tmp/test\ /media/demo1/tmp.txt

These processes was and should have been killed:
 $ less /media/demo1/tmp.txt

Resolves: rhbz#555901 rhbz#572248

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/resources/fs.sh |   27 ++++++++++++++-------------
 1 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/rgmanager/src/resources/fs.sh b/rgmanager/src/resources/fs.sh
index 5b3a3bc..46a5189 100755
--- a/rgmanager/src/resources/fs.sh
+++ b/rgmanager/src/resources/fs.sh
@@ -690,6 +690,7 @@ killMountProcesses()
 	typeset have_lsof=""
 	typeset have_fuser=""
 	typeset try
+	typeset command pid user line
 
 	if [ $# -ne 1 ]; then
 		ocf_log err \
@@ -726,30 +727,30 @@ killMountProcesses()
 			#
 			# Use lsof to free up mount point
 			#
-	    		while read command pid user
+			while read line
 			do
-				if [ -z "$pid" ]; then
+				path=$(echo $line | awk '{for (i=9;i<NF+1;i++) {printf "%s ",$i};}')
+				#if [ -z $(echo $path | grep -E "$mp(/| |$)") ]
+				if [ -z $(echo $path | grep -E "^$mp/.*") ]; then
 					continue
 				fi
-
+				command=$(echo $line | awk '{print $1}')
+				pid=$(echo $line | awk '{print $2}')
+				user=$(echo $line | awk '{print $3}')
 				if [ $try -eq 1 ]; then
-					ocf_log warn \
-			 	  "killing process $pid ($user $command $mp)"
+					ocf_log warn "killing process $pid ($user $command $mp)"
 				elif [ $try -eq 3 ]; then
-					ocf_log crit \
-		    		  "Could not clean up mountpoint $mp"
-				ret=$FAIL
+					ocf_log crit "Could not clean up mountpoint $mp"
+					ret=$FAIL
 				fi
-
 				if [ $try -gt 1 ]; then
 					kill -9 $pid
 				else
 					kill -TERM $pid
 				fi
-			done < <(lsof -bn 2>/dev/null | \
-			    grep -E "$mp(/.*|)\$" | \
-			    awk '{print $1,$2,$3}' | \
-			    sort -u -k 1,3)
+			done< <(lsof -bn 2>/dev/null | \
+				grep -E " $mp(/| |$)" | \
+				sort -u -k 1,3) 
 		elif [ -n "$have_fuser" ]; then
 			#
 			# Use fuser to free up mount point


More information about the cluster-commits mailing list