No problem, I will apply this patch and post the results to you this morning.
Thanks, --- James T. Richardson, Jr. [EMAIL PROTECTED] eXcellence in IS Solutions, Inc. 713-862-9200 x226 Making IT Work for You HPC & Enterprise IT Solutions • HPC Application Acceleration • Cluster Design, Deploy, Manage, Train • Linux/Windows Integration • Remote Management, Backup, Anti-Spam/Virus • Network Assessments, Design • Security Audits, Design • Datacenter Design, Relocation • Messaging and Collaboration -----Original Message----- From: Ian Kent [mailto:[EMAIL PROTECTED] Sent: Thursday, December 27, 2007 1:08 AM To: James Richardson Cc: Jeff Moyer; [email protected] Subject: RE: [autofs] Slow mounts when using large round robin sets On Wed, 2007-12-26 at 16:15 -0600, James Richardson wrote: > Dec 26 16:00:02 myhost automount[3060]: add_host_addrs:885: > gethostbyname_r large-rr > > Dec 26 16:00:02 myhost automount[3060]: add_host_addrs:901: add host > address ÀTm·ÈTm·ÐTm·ØTm·àTm·èTm·ðTm·øTm· I obviously have a mistake in the patch but I still need to know what's going on so could you try again with this patch please. --- diff --git a/include/rpc_subs.h b/include/rpc_subs.h index 3292e01..14b459f 100644 --- a/include/rpc_subs.h +++ b/include/rpc_subs.h @@ -46,6 +46,7 @@ struct conn_info { const char *host; + const char *addr; unsigned short port; unsigned long program; unsigned long version; @@ -61,7 +62,7 @@ int rpc_udp_getclient(struct conn_info *, unsigned int, unsigned int); void rpc_destroy_udp_client(struct conn_info *); int rpc_tcp_getclient(struct conn_info *, unsigned int, unsigned int); void rpc_destroy_tcp_client(struct conn_info *); -int rpc_portmap_getclient(struct conn_info *, const char *, const char *, unsigned int); +int rpc_portmap_getclient(struct conn_info *, const char *, const char *, const char *, unsigned int); unsigned short rpc_portmap_getport(struct conn_info *, struct pmap *); int rpc_ping_proto(struct conn_info *); int rpc_ping(const char *, long, long, unsigned int); diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c index 5797639..cc632a4 100644 --- a/lib/rpc_subs.c +++ b/lib/rpc_subs.c @@ -66,6 +66,7 @@ static CLIENT *create_udp_client(struct conn_info *info) struct hostent *php = &hp; struct hostent *result; char buf[HOST_ENT_BUF_SIZE]; + const char *haddr; size_t len; if (info->proto->p_proto != IPPROTO_UDP) @@ -86,11 +87,13 @@ static CLIENT *create_udp_client(struct conn_info *info) memset(&raddr, 0, sizeof(raddr)); raddr.sin_family = AF_INET; - if (inet_aton(info->host, &raddr.sin_addr)) + haddr = info->addr ? info->addr : info->host; + if (inet_aton(haddr, &raddr.sin_addr)) goto got_addr; memset(&hp, 0, sizeof(struct hostent)); + logerr("gethostbyname_r %s", info->host); ret = gethostbyname_r(info->host, php, buf, HOST_ENT_BUF_SIZE, &result, &ghn_errno); if (ret || !result) { @@ -276,6 +279,7 @@ static CLIENT *create_tcp_client(struct conn_info *info) struct hostent *php = &hp; struct hostent *result; char buf[HOST_ENT_BUF_SIZE]; + const char *haddr; int ret; if (info->proto->p_proto != IPPROTO_TCP) @@ -295,11 +299,13 @@ static CLIENT *create_tcp_client(struct conn_info *info) memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; - if (inet_aton(info->host, &addr.sin_addr)) + haddr = info->addr ? info->addr : info->host; + if (inet_aton(haddr, &addr.sin_addr)) goto got_addr; memset(&hp, 0, sizeof(struct hostent)); + logerr("gethostbyname_r %s", info->host); ret = gethostbyname_r(info->host, php, buf, HOST_ENT_BUF_SIZE, &result, &ghn_errno); if (ret || !result) { @@ -407,7 +413,7 @@ void rpc_destroy_tcp_client(struct conn_info *info) } int rpc_portmap_getclient(struct conn_info *info, - const char *host, const char *proto, + const char *host, const char *addr, const char *proto, unsigned int option) { struct protoent *pe_proto; @@ -418,6 +424,7 @@ int rpc_portmap_getclient(struct conn_info *info, return 0; info->host = host; + info->addr = addr; info->program = PMAPPROG; info->port = PMAPPORT; info->version = PMAPVERS; @@ -462,6 +469,7 @@ unsigned short rpc_portmap_getport(struct conn_info *info, struct pmap *parms) client = info->client; else { pmap_info.host = info->host; + pmap_info.addr = info->addr; pmap_info.port = PMAPPORT; pmap_info.program = PMAPPROG; pmap_info.version = PMAPVERS; @@ -589,6 +597,7 @@ static unsigned int __rpc_ping(const char *host, struct pmap parms; info.host = host; + info.addr = NULL; info.program = NFS_PROGRAM; info.version = version; info.send_sz = 0; @@ -769,6 +778,7 @@ exports rpc_get_exports(const char *host, long seconds, long micros, unsigned in int status; info.host = host; + info.addr = NULL; info.program = MOUNTPROG; info.version = MOUNTVERS; info.send_sz = 0; diff --git a/modules/replicated.c b/modules/replicated.c index 90b2925..daa4531 100644 --- a/modules/replicated.c +++ b/modules/replicated.c @@ -437,7 +437,7 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host, v3_ver: if (!have_port_opt) { status = rpc_portmap_getclient(pm_info, - host->name, proto, RPC_CLOSE_DEFAULT); + host->name, host->addr, proto, RPC_CLOSE_DEFAULT); if (!status) goto done_ver; } @@ -551,6 +551,7 @@ static int get_vers_and_cost(unsigned logopt, struct host *host, timeout = RPC_TIMEOUT * 8; rpc_info.host = host->name; + rpc_info.addr = host->addr; rpc_info.program = NFS_PROGRAM; rpc_info.timeout.tv_sec = timeout; rpc_info.close_option = RPC_CLOSE_DEFAULT; @@ -606,6 +607,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, timeout = RPC_TIMEOUT * 8; rpc_info.host = host->name; + rpc_info.addr = host->addr; rpc_info.program = NFS_PROGRAM; rpc_info.timeout.tv_sec = timeout; rpc_info.close_option = RPC_CLOSE_DEFAULT; @@ -652,7 +654,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, return 0; } else { int ret = rpc_portmap_getclient(&pm_info, - host->name, proto, RPC_CLOSE_DEFAULT); + host->name, host->addr, proto, RPC_CLOSE_DEFAULT); if (!ret) return 0; @@ -880,6 +882,7 @@ static int add_host_addrs(struct host **list, const char *host, unsigned int wei memset(buf, 0, MAX_IFC_BUF); memset(&he, 0, sizeof(struct hostent)); + logerr("gethostbyname_r %s", host); ret = gethostbyname_r(host, phe, buf, MAX_IFC_BUF, &result, &ghn_errno); if (ret || !result) { @@ -895,6 +898,7 @@ static int add_host_addrs(struct host **list, const char *host, unsigned int wei if (prx == PROXIMITY_ERROR) return 0; + logerr("add host %s address %s", host, *haddr); if (!(new = new_host(host, *haddr, prx, weight))) return 0; NOTICE: This message may contain privileged or otherwise confidential information. If you are not the intended recipient, please immediately advise the sender by reply email and delete the message and any attachments without using, copying or disclosing the contents. _______________________________________________ autofs mailing list [email protected] http://linux.kernel.org/mailman/listinfo/autofs
