From: Neil Brown Date: Mon, 21 Jul 2008 01:11:20 +0000 (+1000) Subject: sm-notify: perform DNS lookup in the background. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=25b8aab2899c953ff6156db28af062881d49d0fe;p=nfs-utils.git sm-notify: perform DNS lookup in the background. If an NFS server has no network connectivity when it reboots, it will block in sm-notify waiting for DNS lookup for a potentially large number of hosts. This is not helpful and just annoys the sysadmin. So do the DNS lookup in the backgrounded phase of sm-notify, before sending off the NOTIFY requests. If hostname lookup fails, just drop that host. Signed-off-by: NeilBrown --- diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c index bb67c37..407c578 100644 --- a/utils/statd/sm-notify.c +++ b/utils/statd/sm-notify.c @@ -76,7 +76,7 @@ static int log_syslog = 0; static unsigned int nsm_get_state(int); static void notify(void); -static void notify_host(int, struct nsm_host *); +static int notify_host(int, struct nsm_host *); static void recv_reply(int); static void backup_hosts(const char *, const char *); static void get_hosts(const char *); @@ -286,7 +286,13 @@ notify(void) hp = hosts; hosts = hp->next; - notify_host(sock, hp); + if (notify_host(sock, hp) < 0) { + unlink(hp->path); + free(hp->name); + free(hp->path); + free(hp); + continue; + } /* Set the timeout for this call, using an exponential timeout strategy */ @@ -316,9 +322,10 @@ notify(void) } /* - * Send notification to a single host + * Send notification to a single host. + * Return negative if we should give up on this host. */ -void +int notify_host(int sock, struct nsm_host *host) { static unsigned int xid = 0; @@ -331,6 +338,17 @@ notify_host(int sock, struct nsm_host *host) if (!host->xid) host->xid = xid++; + if (host->ai == NULL) { + host->ai = host_lookup(AF_UNSPEC, host->name); + if (host->ai == NULL) { + nsm_log(LOG_WARNING, + "%s doesn't seem to be a valid address," + " skipped", + host->name); + return -1; + } + } + memset(msgbuf, 0, sizeof(msgbuf)); p = msgbuf; *p++ = htonl(host->xid); @@ -395,6 +413,8 @@ notify_host(int sock, struct nsm_host *host) len = (p - msgbuf) << 2; sendto(sock, msgbuf, len, 0, (struct sockaddr *) &dest, sizeof(dest)); + + return 0; } /* @@ -504,7 +524,7 @@ backup_hosts(const char *dirname, const char *bakname) } /* - * Get all entries from sm.bak and convert them to host names + * Get all entries from sm.bak and convert them to host entries */ static void get_hosts(const char *dirname) @@ -532,15 +552,6 @@ get_hosts(const char *dirname) if (stat(path, &stb) < 0) continue; - host->ai = host_lookup(AF_UNSPEC, de->d_name); - if (! host->ai) { - nsm_log(LOG_WARNING, - "%s doesn't seem to be a valid address, skipped", - de->d_name); - unlink(path); - continue; - } - host->last_used = stb.st_mtime; host->timeout = NSM_TIMEOUT; host->path = strdup(path);