Eventscript functions: optimise ctdb_check_tcp_ports() and add debug.
authorMartin Schwenke <martin@meltin.net>
Tue, 5 Jul 2011 01:32:06 +0000 (11:32 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Mon, 11 Jul 2011 08:02:32 +0000 (18:02 +1000)
ctdb_check_tcp_ports() runs "netstat -a -t -n" in a loop for each
port.  There are 2 problems with this:

* Netstat is run on each loop iteration when it need only be run once.

* The -a option is used to list all connections but the function only
  cares about the listening ports.  There may be many thousands of
  non-listening ports to grep through.

This changes ctdb_check_tcp_ports() to run netstat with the -l option
instead of the -a option.  It also only runs netstat once before the
main loop.

When a port is found to not be listening the output of the netstat
command is now dumped to help with debugging.

Signed-off-by: Martin Schwenke <martin@meltin.net>
config/functions

index 6c44fb8d871e9abcd7819de575d4b442fd416125..567191de0d836b9de7953bc8a205a872172152f3 100755 (executable)
@@ -191,15 +191,26 @@ ctdb_check_directories() {
 # check a set of tcp ports
 # usage: ctdb_check_tcp_ports <ports...>
 ######################################################
-ctdb_check_tcp_ports() {
+ctdb_check_tcp_ports()
+{
+    _cmd='netstat -l -t -n'
+    _ns=$($_cmd)
+    for _p ; do  # process each function argument (port)
+       for _a in '0\.0\.0\.0' '::' ; do
+           _pat="[[:space:]]${_a}:${_p}[[:space:]]+[^[:space:]]+[[:space:]]+LISTEN"
+           if echo "$_ns" | grep -E -q "$_pat" ; then
+               # We matched the port, so process next port
+               continue 2
+           fi
+       done
 
-    for p ; do
-       if ! netstat -a -t -n | grep -q "0\.0\.0\.0:$p .*LISTEN" ; then
-            if ! netstat -a -t -n | grep -q ":::$p .*LISTEN" ; then
-               echo "ERROR: $service_name tcp port $p is not responding"
-               return 1
-            fi
-       fi
+       # We didn't match the port, so flag an error, print some debug
+       cat <<EOF
+ERROR: $service_name tcp port $_p is not responding
+$_cmd shows this output:
+$_ns
+EOF
+       return 1
     done
 }