config: let 13.per_ip_routing use a flock for generate_auto_link_local()
authorStefan Metzmacher <metze@samba.org>
Fri, 26 Feb 2010 11:41:21 +0000 (12:41 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 18 Mar 2010 10:57:16 +0000 (11:57 +0100)
metze

config/events.d/13.per_ip_routing

index e85ba66e52c20c30b02c95ad36e4faed60ed11f9..6b51b05662b14b39bd842e3f6d397ebf4107618c 100755 (executable)
@@ -185,19 +185,51 @@ generate_auto_link_local()
 
        local _line="$_ip $_netip/$_maskbits"
 
-       local _config=`cat $CTDB_PER_IP_ROUTING_CONF 2>/dev/null`
+       local _lockfile="$CTDB_PER_IP_ROUTING_CONF.lock"
+       local _script="$CTDB_PER_IP_ROUTING_CONF.$$.sh"
+
+       echo "#!/bin/sh" > $_script
+       echo "#" >> $_script
+       echo "" >> $_script
+       echo "_config=\`cat $CTDB_PER_IP_ROUTING_CONF 2>/dev/null\`" >> $_script
+       echo "_exact=\`echo -n \"\$_config\" | grep \"^$_line\$\" | wc -l | xargs\`" >> $_script
+       echo "" >> $_script
+
+       echo "test x\"\$_exact\" = x\"1\" && {" >> $_script
+       echo "    exit 0;" >> $_script
+       echo "}" >> $_script
+       echo "" >> $_script
+
+       echo "_tmp=\"$CTDB_PER_IP_ROUTING_CONF.$$.tmp\"" >> $_script
+       echo "echo -n \"\$_config\" | grep -v \"^$_ip \" | cat > \$_tmp || {" >> $_script
+       echo "    echo \"echo -n \\\"\$_config\\\" | grep -v \\\"^$_ip \\\" > \$_tmp - failed\"" >> $_script
+       echo "    exit 1;" >> $_script
+       echo "}" >> $_script
+       echo "echo \"$_line\" >> \$_tmp || {" >> $_script
+       echo "    echo \"echo \\\"$_line\\\" >> \$_tmp - failed\"" >> $_script
+       echo "    exit 1;" >> $_script
+       echo "}" >> $_script
+       echo "" >> $_script
+
+       echo "mv \$_tmp $CTDB_PER_IP_ROUTING_CONF || {" >> $_script
+       echo "    echo \"mv \$_tmp $CTDB_PER_IP_ROUTING_CONF - failed\"" >> $_script
+       echo "    exit 1;" >> $_script
+       echo "}" >> $_script
+       echo "" >> $_script
+
+       echo "echo \"Added '$_line' to $CTDB_PER_IP_ROUTING_CONF\"">> $_script
+       echo "exit 0" >> $_script
 
-       local _exact=`echo -n "$_config" | grep "^$line$" | wc -l | xargs`
+       chmod +x $_script
 
-       test x"$_exact" = x"1" && {
-               return 0;
+       test -f $_lockfile || {
+               touch $_lockfile
        }
 
-       local _tmp="$CTDB_PER_IP_ROUTING_CONF.$$.tmp"
-       echo -n "$_config" | grep -v "^$_ip " > $_tmp
-       echo "$_line" >> $_tmp
-
-       mv $_tmp $CTDB_PER_IP_ROUTING_CONF
+       flock --timeout 30 $_lockfile $_script
+       ret=$?
+       rm $_script
+       return $ret
 }
 
 generate_per_ip_routing()