netwatch-notify: work around race condition

This used to crash every now and then with:

> script;error script error: no such item (4)

I guess this is caused by querying the dns cache just exactly when a
record expires. The chance is maximized: The script is started by
scheduler every minute, and the record's ttl is a multiple of a minute.

Let's query records that are not about to expire immediately, and
try again.
This commit is contained in:
Christian Hesse 2024-02-26 23:18:02 +01:00
parent c2f5272f18
commit 93bed1b081

View file

@ -80,14 +80,18 @@ $ScriptLock $0;
:do { :do {
:local Resolve [ :resolve ($HostInfo->"resolve") ]; :local Resolve [ :resolve ($HostInfo->"resolve") ];
:if ($Resolve != $HostVal->"host" && \ :if ($Resolve != $HostVal->"host" && \
[ :len [ /ip/dns/cache/find where name=($HostInfo->"resolve") data=[ :tostr ($HostVal->"host") ] ] ] = 0) do={ [ :len [ /ip/dns/cache/find where name=($HostInfo->"resolve") data=[ :tostr ($HostVal->"host") ] ttl>0s ] ] = 0) do={
$LogPrintExit2 info $0 ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ :delay 1500ms;
($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ :resolve ($HostInfo->"resolve");
$HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \ :if ([ :len [ /ip/dns/cache/find where name=($HostInfo->"resolve") data=[ :tostr ($HostVal->"host") ] ] ] = 0) do={
", updating.") false; $LogPrintExit2 info $0 ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \
/tool/netwatch/set host=$Resolve $Host; ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \
:set ($Metric->"resolve-failcnt") 0; $HostInfo->"name") "" ] . "' resolves to different address " . $Resolve . \
:set ($HostVal->"status") "unknown"; ", updating.") false;
/tool/netwatch/set host=$Resolve $Host;
:set ($Metric->"resolve-failcnt") 0;
:set ($HostVal->"status") "unknown";
}
} }
} on-error={ } on-error={
:set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1);