fix: use file lock
This commit is contained in:
@@ -40,17 +40,36 @@ if ($vhid !== $primary_vhid) {
|
||||
$ifkey = 'wan';
|
||||
// Determine whether WAN interface is currently enabled
|
||||
$ifkey_enabled = !empty($config['interfaces'][$ifkey]['enable']) ? true : false;
|
||||
// Lock file to prevent interface flapping
|
||||
$lock_file = '/tmp/carp_wan_disable_lock';
|
||||
$lock_default_age = 5;
|
||||
$lock_max_age = 10;
|
||||
|
||||
// MASTER event
|
||||
if ($type === "MASTER") {
|
||||
// Enable WAN only if it's currently disabled
|
||||
if (!$ifkey_enabled) {
|
||||
// Check if lock file is present
|
||||
if (file_exists($lock_file)) {
|
||||
$lock_age = time() - (int)file_get_contents($lock_file);
|
||||
if ($lock_age < $lock_max_age) {
|
||||
log_msg("CARP event: WAN disable lock present ({$lock_age}s old), waiting...");
|
||||
$elapsed = 0;
|
||||
while (file_exists($lock_file) && $elapsed < 5000) {
|
||||
usleep(500000);
|
||||
$elapsed += 500;
|
||||
}
|
||||
} else {
|
||||
log_msg("CARP event: removing stale WAN disable lock.");
|
||||
@unlink($lock_file);
|
||||
}
|
||||
}
|
||||
log_msg("CARP event: switching to '$type', enabling interface '$ifkey'.", LOG_WARNING);
|
||||
$config['interfaces'][$ifkey]['enable'] = '1';
|
||||
write_config("enable interface '$ifkey' due CARP event '$type'", false);
|
||||
interface_configure(false, $ifkey, false, false);
|
||||
} else {
|
||||
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
|
||||
log_msg("CARP event: already 'MASTER' for interface '$ifkey', nothing to do.");
|
||||
}
|
||||
|
||||
// BACKUP event
|
||||
@@ -61,6 +80,10 @@ if ($type === "MASTER") {
|
||||
unset($config['interfaces'][$ifkey]['enable']);
|
||||
write_config("disable interface '$ifkey' due CARP event '$type'", false);
|
||||
interface_configure(false, $ifkey, false, false);
|
||||
// Create lock file
|
||||
file_put_contents($lock_file, time());
|
||||
sleep($lock_default_age);
|
||||
@unlink($lock_file);
|
||||
} else {
|
||||
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user