summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-06-15 22:50:18 +0200
committerLudovic Courtès <ludo@gnu.org>2023-06-16 00:14:52 +0200
commit248cf06149b4f09bfca4a21710bc8e1bd47f6e61 (patch)
tree157fce9420ead0df70a95605031c9024ffd85f05 /guix
parent99a27d361e5e05173106a6e6939c7099101c510a (diff)
avahi: Resolve hosts for which name resolution fails.
This avoids attempts to connect to hosts that went off-line. This is particularly important for 'guix-daemon --discover', which would so far keep attempting to talk to LAN hosts after they vanished just because their mDNS record hasn't expired, leading to significant delays when fetching narinfos and substitutes. * guix/avahi.scm (avahi-browse-service-thread)[service-resolver-callback]: Add handler to RESOLVER-EVENT/FAILURE.
Diffstat (limited to 'guix')
-rw-r--r--guix/avahi.scm10
1 files changed, 9 insertions, 1 deletions
diff --git a/guix/avahi.scm b/guix/avahi.scm
index 132e42f268..cb0c85f9f4 100644
--- a/guix/avahi.scm
+++ b/guix/avahi.scm
@@ -137,7 +137,15 @@ when STOP-LOOP? procedure returns true."
(port port)
(txt txt))))
(hash-set! %known-hosts service-name service*)
- (proc 'new-service service*)))))
+ (proc 'new-service service*))))
+ ((eq? event resolver-event/failure)
+ ;; Failure to resolve the host associated with a service. This
+ ;; usually means that the mDNS record hasn't expired yet but that
+ ;; the host went off-line.
+ (let ((service (hash-ref %known-hosts service-name)))
+ (when service
+ (proc 'remove-service service)
+ (hash-remove! %known-hosts service-name)))))
(free-service-resolver! resolver))
(define (service-browser-callback browser interface protocol event