On 18 Dec 2025, at 11:46, Ilya Maximets wrote:
> A python counterpart of the following commit:
>
> 0b29edb5cbdc ("dns-resolve: Do not treat never accessed responses as
> expired.")
>
> The same issue exists in the python code where we may never connect
> to a remote server if our DNS TTL is lower than the backoff interval.
>
> Fix it in the same way as we did in C implementation - allow using
> the entry if it was never used after requesting for up to 5 minutes,
> as this is not really caching, but a "transaction in progress" type
> of situation.
>
> More details in the commit message for the C version.
Thanks for also fixing this part. Two nits that can be fixed on commit.
//Eelco
Acked-by: Eelco Chaudron <[email protected]>
> Signed-off-by: Ilya Maximets <[email protected]>
> ---
> python/ovs/dns_resolve.py | 29 ++++++++++++++++++++++++-----
> 1 file changed, 24 insertions(+), 5 deletions(-)
>
> diff --git a/python/ovs/dns_resolve.py b/python/ovs/dns_resolve.py
> index 41546ad5c..d38e8a658 100644
> --- a/python/ovs/dns_resolve.py
> +++ b/python/ovs/dns_resolve.py
> @@ -29,12 +29,15 @@ import ovs.vlog
>
> vlog = ovs.vlog.Vlog("dns_resolve")
>
> +RESOLVE_UNUSED_TIMEOUT = 300 # Seconds.
> +
>
> class ReqState(enum.Enum):
> INVALID = 0
> PENDING = 1
> - GOOD = 2
> - ERROR = 3
> + GOOD_UNUSED = 2
> + GOOD = 4
> + ERROR = 5
Any reason skipping 3?
>
> class DNSRequest:
> @@ -48,11 +51,27 @@ class DNSRequest:
>
> @property
> def expired(self):
> - return time.time() > self.time + self.ttl
> + ttl = self.ttl
> + # When we just sent a request, but didn't look at the response yet,
> + # it's not caching, but a "transaction in progress" situation, so we
> + # can use the response even with TTL of 0 and more than 1 second
> + # passed. Allow such values to be accessed for at least
> + # RESOLVE_UNUSED_TIMEOUT seconds without considering them stale.
> + # This is necessary in case of large backoff intervals on connections
> + # or if the process is doing some other work not looking at the
> + # response for longer than TTL. */
It still has a C-style end of comment.
> + if self.state == ReqState.GOOD_UNUSED:
> + ttl = max(ttl, RESOLVE_UNUSED_TIMEOUT)
> + # Not a "transaction in progress" anymore, normal caching rules
> + # should apply from this point forward.
> + self.state = ReqState.GOOD
> +
> + return time.time() > self.time + ttl
>
> @property
> def is_valid(self):
> - return self.state == ReqState.GOOD and not self.expired
> + return (self.state in [ReqState.GOOD_UNUSED, ReqState.GOOD]
> + and not self.expired)
>
> def __str__(self):
> return (f"DNSRequest(name={self.name}, state={self.state}, "
> @@ -184,7 +203,7 @@ class DNSResolver:
> # _callback causes a segfault. So just grab and store what we
> need.
> req.result = str(ip)
> req.ttl = result.ttl
> - req.state = ReqState.GOOD
> + req.state = ReqState.GOOD_UNUSED
> req.time = time.time()
> except (ValueError, StopIteration):
> req.state = ReqState.ERROR
> --
> 2.52.0
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev