Browse Source

mwan3: fix race condition on mwan3 restart

This adjustment of the locks fixes the race condition when a mwan3
hotplug script and a mwan3 command are running at the same time.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
lilik-openwrt-22.03
Florian Eckert 4 years ago
parent
commit
2dac1bcdc9
4 changed files with 47 additions and 16 deletions
  1. +9
    -5
      net/mwan3/files/etc/hotplug.d/iface/15-mwan3
  2. +8
    -3
      net/mwan3/files/etc/hotplug.d/iface/16-mwan3
  3. +14
    -2
      net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user
  4. +16
    -6
      net/mwan3/files/usr/sbin/mwan3

+ 9
- 5
net/mwan3/files/etc/hotplug.d/iface/15-mwan3 View File

@ -12,19 +12,24 @@ if [ "$ACTION" == "ifup" ]; then
[ -n "$DEVICE" ] || exit 3 [ -n "$DEVICE" ] || exit 3
fi fi
mwan3_lock "$ACTION" "$INTERFACE"
config_load mwan3 config_load mwan3
config_get_bool enabled globals 'enabled' '0' config_get_bool enabled globals 'enabled' '0'
[ ${enabled} -gt 0 ] || exit 0
[ ${enabled} -gt 0 ] || {
mwan3_unlock "$ACTION" "$INTERFACE"
exit 0
}
mwan3_lock "$ACTION" "$INTERFACE"
mwan3_init mwan3_init
mwan3_set_connected_iptables mwan3_set_connected_iptables
mwan3_set_custom_ipset mwan3_set_custom_ipset
mwan3_unlock "$ACTION" "$INTERFACE"
config_get enabled $INTERFACE enabled 0 config_get enabled $INTERFACE enabled 0
config_get initial_state $INTERFACE initial_state "online" config_get initial_state $INTERFACE initial_state "online"
[ "$enabled" == "1" ] || exit 0
[ "${enabled}" == "1" ] || {
mwan3_unlock "$ACTION" "$INTERFACE"
exit 0
}
if [ "$ACTION" == "ifup" ]; then if [ "$ACTION" == "ifup" ]; then
config_get family $INTERFACE family ipv4 config_get family $INTERFACE family ipv4
@ -58,7 +63,6 @@ else
running=1 running=1
fi fi
mwan3_lock "$ACTION" "$INTERFACE"
$LOG notice "Execute "$ACTION" event on interface $INTERFACE (${DEVICE:-unknown})" $LOG notice "Execute "$ACTION" event on interface $INTERFACE (${DEVICE:-unknown})"
case "$ACTION" in case "$ACTION" in


+ 8
- 3
net/mwan3/files/etc/hotplug.d/iface/16-mwan3 View File

@ -4,14 +4,17 @@
. /lib/functions/network.sh . /lib/functions/network.sh
. /lib/mwan3/mwan3.sh . /lib/mwan3/mwan3.sh
mwan3_lock "$ACTION" "mwan3rtmon"
config_load mwan3 config_load mwan3
config_get_bool enabled globals 'enabled' '0' config_get_bool enabled globals 'enabled' '0'
[ ${enabled} -gt 0 ] || exit 0
[ ${enabled} -gt 0 ] || {
mwan3_unlock "$ACTION" "mwan3rtmon"
exit 0
}
if [ "$ACTION" == "ifup" ]; then if [ "$ACTION" == "ifup" ]; then
mwan3_lock "$ACTION" "mwan3rtmon"
mwan3_rtmon mwan3_rtmon
mwan3_unlock "$ACTION" "mwan3rtmon"
fi fi
config_get enabled $INTERFACE enabled 0 config_get enabled $INTERFACE enabled 0
@ -19,4 +22,6 @@ config_get enabled $INTERFACE enabled 0
mwan3_flush_conntrack "$INTERFACE" "$ACTION" mwan3_flush_conntrack "$INTERFACE" "$ACTION"
} }
mwan3_unlock "$ACTION" "mwan3rtmon"
exit 0 exit 0

+ 14
- 2
net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user View File

@ -2,13 +2,25 @@
[ -f "/etc/mwan3.user" ] && { [ -f "/etc/mwan3.user" ] && {
. /lib/functions.sh . /lib/functions.sh
. /lib/mwan3/mwan3.sh
mwan3_lock "$ACTION" "user"
config_load mwan3 config_load mwan3
config_get_bool enabled globals 'enabled' '0' config_get_bool enabled globals 'enabled' '0'
[ ${enabled} -gt 0 ] || exit 0
[ ${enabled} -gt 0 ] || {
mwan3_unlock "$ACTION" "user"
exit 0
}
config_get enabled "$INTERFACE" enabled 0 config_get enabled "$INTERFACE" enabled 0
[ "${enabled}" = "1" ] || exit 0
[ "${enabled}" = "1" ] || {
mwan3_unlock "$ACTION" "user"
exit 0
}
mwan3_unlock "$ACTION" "user"
env -i ACTION="$ACTION" INTERFACE="$INTERFACE" DEVICE="$DEVICE" \ env -i ACTION="$ACTION" INTERFACE="$INTERFACE" DEVICE="$DEVICE" \
/bin/sh /etc/mwan3.user /bin/sh /etc/mwan3.user
} }


+ 16
- 6
net/mwan3/files/usr/sbin/mwan3 View File

@ -45,30 +45,39 @@ ifup()
{ {
local device enabled up l3_device status local device enabled up l3_device status
mwan3_lock "command" "mwan3"
config_load mwan3 config_load mwan3
config_get_bool enabled globals 'enabled' 0 config_get_bool enabled globals 'enabled' 0
[ ${enabled} -gt 0 ] || { [ ${enabled} -gt 0 ] || {
echo "The service mwan3 is global disabled." echo "The service mwan3 is global disabled."
echo "Please execute \"/etc/init.d/mwan3 start\" first." echo "Please execute \"/etc/init.d/mwan3 start\" first."
mwan3_unlock "command" "mwan3"
exit 1 exit 1
} }
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
echo "Expecting interface. Usage: mwan3 ifup <interface>"
mwan3_unlock "command" "mwan3"
exit 0
fi fi
if [ -n "$2" ]; then if [ -n "$2" ]; then
echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
echo "Too many arguments. Usage: mwan3 ifup <interface>"
mwan3_unlock "command" "mwan3"
exit 0
fi fi
config_get enabled "$1" enabled 0
mwan3_unlock "command" "mwan3"
status=$(ubus -S call network.interface.$1 status) status=$(ubus -S call network.interface.$1 status)
[ -n "$status" ] && { [ -n "$status" ] && {
json_load "$status" json_load "$status"
json_get_vars up l3_device json_get_vars up l3_device
} }
config_get enabled "$1" enabled 0
if [ "$up" = "1" ] \ if [ "$up" = "1" ] \
&& [ -n "$l3_device" ] \ && [ -n "$l3_device" ] \
&& [ "$enabled" = "1" ]; then && [ "$enabled" = "1" ]; then
@ -130,7 +139,9 @@ start()
{ {
local enabled local enabled
mwan3_lock "command" "mwan3"
uci_toggle_state mwan3 globals enabled "1" uci_toggle_state mwan3 globals enabled "1"
mwan3_unlock "command" "mwan3"
config_load mwan3 config_load mwan3
config_foreach ifup interface config_foreach ifup interface
@ -141,6 +152,7 @@ stop()
local ipset route rule table IP IPT pid local ipset route rule table IP IPT pid
mwan3_lock "command" "mwan3" mwan3_lock "command" "mwan3"
uci_toggle_state mwan3 globals enabled "0"
for pid in $(pgrep -f "mwan3rtmon"); do for pid in $(pgrep -f "mwan3rtmon"); do
kill -TERM "$pid" > /dev/null 2>&1 kill -TERM "$pid" > /dev/null 2>&1
@ -200,8 +212,6 @@ stop()
mwan3_lock_clean mwan3_lock_clean
rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR
uci_toggle_state mwan3 globals enabled "0"
} }
restart() { restart() {


Loading…
Cancel
Save