- use_hostname_for_mounts shouldn't prevent selection among replicas.

- fix monotonic_elapse.
- Makefiles.rules: remove 'samples' from SUBDIRS.
This commit is contained in:
Ian Kent 2018-02-05 12:32:24 +08:00
parent 47e7470d27
commit a2613263d4
4 changed files with 356 additions and 0 deletions

View File

@ -0,0 +1,66 @@
autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS
From: NeilBrown <neilb@suse.com>
The rules in Makefile make it quite clear that
'samples' is not expected to be part of SUBDIRS.
e.g.
- The rule for "clean" handles both $(SUBDIRS) *and* samples.
- There are separate "install" and "install_samples" targets.
However SUBDIRS does contain 'samples'. This means that
a simple "make; make install" will over-write your configuration files.
So remove 'samples' from SUBDIRS. Note that it has been removed in
the past, but then got added back again.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
Makefile.rules | 2 +-
autofs.spec | 6 ++++++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 313730b1..1e5ec15b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapsed.
+- Makefiles.rules: remove 'samples' from SUBDIRS.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.rules b/Makefile.rules
index 2bfa043c..4deab3b9 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,7 +3,7 @@
#
# Root directory contents
-SUBDIRS = lib daemon modules man samples
+SUBDIRS = lib daemon modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
diff --git a/autofs.spec b/autofs.spec
index 6da0655d..57d8db46 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs
install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs
+install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master
+install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc
+install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
+install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
+install -m 644 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf
+
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

View File

@ -0,0 +1,49 @@
autofs-5.1.4 - fix monotonic_elapsed
From: NeilBrown <neilb@suse.com>
When automount probes multiple hosts to find the one which
responds most quickly, it currently ignores the nanoseconds.
This often makes the cost "0", which makes weights ineffective.
The cause is that monotonic_elapsed() casts tv_nsec to a
double *after* dividing by 1 billion, rather than before.
With this change, weights become effective for choosing
between hosts which respond in under one second.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/rpc_subs.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 104fca90..313730b1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5
- add error handling for ext_mount_add().
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
+- fix monotonic_elapsed.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 73097c9d..60ede9f8 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end)
double t1, t2;
t1 = (double) start.tv_sec +
- (double) (start.tv_nsec/(1000*1000*1000));
+ ((double) start.tv_nsec/(1000*1000*1000));
t2 = (double) end.tv_sec +
- (double) (end.tv_nsec/(1000*1000*1000));
+ ((double) end.tv_nsec/(1000*1000*1000));
return t2 - t1;
}

View File

@ -0,0 +1,226 @@
autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas
From: NeilBrown <neilb@suse.com>
If several replicas have been specified for a mount point,
and use_hostname_for_mount is set to "yes", the selection
between these replicas is currently disabled and the last in
the list is always chosen.
There is little point selecting between different addresses
for the one host in this case, but it is still worth
selecting between different hosts, particularly if different
weights have been specified.
This patch restores the "prune_host_list()" functionality
when use_hostname_for_mount is set, and modifies it slightly
so that only on IP address for any host:/path entry in the
config file is willl be successfully probed. After a
success, further addresses from the same entry are skipped.
This is achieved by tracking an entry number ("ent_num") for
each 'struct host'.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/replicated.h | 3 ++-
modules/mount_nfs.c | 2 +-
modules/replicated.c | 35 ++++++++++++++++++++---------------
4 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 2d5d5b1f..104fca90 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5
- fix error return in do_nfs_mount().
- add error handling for ext_mount_add().
- account for recent libnsl changes.
+- use_hostname_for_mounts shouldn't prevent selection among replicas.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/include/replicated.h b/include/replicated.h
index 69ab7800..0f482d21 100644
--- a/include/replicated.h
+++ b/include/replicated.h
@@ -57,6 +57,7 @@
struct host {
char *name;
+ int ent_num;
struct sockaddr *addr;
size_t addr_len;
unsigned int rr;
@@ -70,7 +71,7 @@ struct host {
};
void seed_random(void);
-struct host *new_host(const char *, struct sockaddr *, size_t,
+struct host *new_host(const char *, int, struct sockaddr *, size_t,
unsigned int, unsigned int, unsigned int);
void free_host_list(struct host **);
int parse_location(unsigned, struct host **, const char *, unsigned int);
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index 77166544..4cf0cd27 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
(vers & NFS4_VERS_MASK) != 0 &&
!(vers & UDP6_REQUESTED)) {
unsigned int v4_probe_ok = 0;
- struct host *tmp = new_host(hosts->name,
+ struct host *tmp = new_host(hosts->name, 0,
hosts->addr, hosts->addr_len,
hosts->proximity,
hosts->weight, hosts->options);
diff --git a/modules/replicated.c b/modules/replicated.c
index 3ac4c70f..f7b83236 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -83,7 +83,7 @@ void seed_random(void)
return;
}
-struct host *new_host(const char *name,
+struct host *new_host(const char *name, int ent_num,
struct sockaddr *addr, size_t addr_len,
unsigned int proximity, unsigned int weight,
unsigned int options)
@@ -116,6 +116,7 @@ struct host *new_host(const char *name,
memset(new, 0, sizeof(struct host));
new->name = tmp1;
+ new->ent_num = ent_num;
new->addr_len = addr_len;
new->addr = tmp2;
new->proximity = proximity;
@@ -714,7 +715,7 @@ done:
int prune_host_list(unsigned logopt, struct host **list,
unsigned int vers, int port)
{
- struct host *this, *last, *first;
+ struct host *this, *last, *first, *prev;
struct host *new = NULL;
unsigned int proximity, selected_version = 0;
unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count;
@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list,
if (!*list)
return 0;
- /* If we're using the host name then there's no point probing
- * avialability and respose time.
- */
- if (defaults_use_hostname_for_mounts())
- return 1;
-
/* Use closest hosts to choose NFS version */
first = *list;
@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list,
first = last;
this = first;
+ prev = NULL;
while (this) {
struct host *next = this->next;
if (!this->name) {
remove_host(list, this);
add_host(&new, this);
+ } else if (defaults_use_hostname_for_mounts() && prev &&
+ prev->ent_num == this->ent_num) {
+ /* When we use the hostname to mount, there is no
+ * point in probing every address it has, just one is
+ * enough. Skip the rest.
+ */
} else {
status = get_supported_ver_and_cost(logopt, this,
selected_version, port);
@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list,
this->version = selected_version;
remove_host(list, this);
add_host(&new, this);
+ prev = this;
}
}
this = next;
@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list,
}
static int add_new_host(struct host **list,
- const char *host, unsigned int weight,
+ const char *host, int ent_num, unsigned int weight,
struct addrinfo *host_addr,
unsigned int rr, unsigned int options)
{
@@ -940,7 +943,7 @@ static int add_new_host(struct host **list,
else
return 0;
- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options);
+ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options);
if (!new)
return 0;
@@ -953,7 +956,7 @@ static int add_new_host(struct host **list,
return 1;
}
-static int add_host_addrs(struct host **list, const char *host,
+static int add_host_addrs(struct host **list, const char *host, int ent_num,
unsigned int weight, unsigned int options)
{
struct addrinfo hints, *ni, *this;
@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host,
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, 0, options);
+ ret = add_new_host(list, host, ent_num, weight, this, 0, options);
if (!ret)
break;
this = this->ai_next;
@@ -1027,7 +1030,7 @@ try_name:
rr++;
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, rr, options);
+ ret = add_new_host(list, host, ent_num, weight, this, rr, options);
if (!ret)
break;
this = this->ai_next;
@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts,
{
char *str, *p, *delim;
unsigned int empty = 1;
+ int ent_num = 1;
if (!list)
return 0;
@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts,
}
if (p != delim) {
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
if (empty) {
p = next;
continue;
@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts,
*delim = '\0';
next = delim + 1;
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
p = next;
continue;
}
@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts,
return 0;
}
+ ent_num++;
p = next;
}

View File

@ -23,6 +23,9 @@ Patch7: autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch
Patch8: autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch
Patch9: autofs-5.1.4-add-error-handling-for-ext_mount_add.patch
Patch10: autofs-5.1.4-account-for-libnsl-changes.patch
Patch11: autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch
Patch12: autofs-5.1.4-fix-monotonic_elapsed.patch
Patch13: autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@ -94,6 +97,9 @@ echo %{version}-%{release} > .version
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%build
LDFLAGS=-Wl,-z,now
@ -129,6 +135,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT%{_initrddir}/autofs
install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs
install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master
install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc
install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf
%clean
rm -rf $RPM_BUILD_ROOT
@ -190,6 +202,9 @@ fi
* Mon Feb 5 2018 Ian Kent <ikent@redhat.com> - 1:5.1.4-7
- add error handling for ext_mount_add().
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapse.
- Makefiles.rules: remove 'samples' from SUBDIRS.
* Thu Feb 1 2018 Ian Kent <ikent@redhat.com> - 1:5.1.4-6
- dont use array for path when not necessary.