+2006-03-27 Erez Zadok <ezk@cs.sunysb.edu>
+
+ * doc/am-utils.texi, scripts/{amd.conf.5,amd.conf-sample}:
+ document new nfs_retransmit_counter_toplvl and
+ nfs_retry_interval_toplvl global amd.conf parameters.
+
+ * amd/conf.c (gopt_nfs_retransmit_counter_toplvl,
+ (gopt_nfs_retry_interval_toplvl): parse amd.conf
+ nfs_retransmit_counter_toplvl and nfs_retry_interval_toplvl global
+ parameters.
+
+ * amd/amfs_toplvl.c (amfs_toplvl_mount): support setting toplvl
+ timeo/retrans parameters for Amd's toplvl mounts, separately from
+ all other UDP or NFS mounts.
+
+ * amd/amd.h: define a new timeo/retrans parameter for toplvl
+ mounts.
+
2006-03-22 Erez Zadok <ezk@cs.sunysb.edu>
* minor new port: i386-pc-linux-suse10.1 (beta 8).
Support new mount options for type:=pcfs mounts: longname, nowin95,
shortname, user=N, group=N, mask=N, and dirmask=N.
+Two new amd.conf [global] parameters: nfs_retry_interval_toplvl and
+nfs_retransmit_counter_toplvl. They are similar to nfs_retry_interval and
+nfs_retransmit_counter, and allow you to set the "timeo" and "retrans" NFS
+mount parameters, respectively, but ONLY for Amd's top-level mounts (which
+are NFSv2/UDP currently). This is useful because on some systems you may
+wish to set these parameters differently than the OS default, so as to
+better tune Amd's responsiveness under heavy scheduler loads.
+
- minor new ports:
i386-pc-linux-fc5 (Fedora Core 5)
i386-pc-linux-suse10.1 (beta 8)
/* local domain */
gopt.sub_domain = NULL;
- /* reset NFS retransmit counter and retry interval */
+ /* reset NFS (and toplvl) retransmit counter and retry interval */
for (i=0; i<AMU_TYPE_MAX; ++i) {
- gopt.amfs_auto_retrans[i] = -1;
- gopt.amfs_auto_timeo[i] = -1;
+ gopt.amfs_auto_retrans[i] = -1; /* -1 means "never set before" */
+ gopt.amfs_auto_timeo[i] = -1; /* -1 means "never set before" */
}
/* cache duration */
char *debug_mtab_file; /* path for the mtab file during debug mode */
u_int flags; /* various CFM_* flags */
-#define AMU_TYPE_NONE -1 /* for amfs_auto_{retrans,timeo} */
-#define AMU_TYPE_UDP 0 /* for amfs_auto_{retrans,timeo} */
-#define AMU_TYPE_TCP 1 /* for amfs_auto_{retrans,timeo} */
-#define AMU_TYPE_MAX 2 /* for amfs_auto_{retrans,timeo} */
+#define AMU_TYPE_NONE -1 /* for amfs_auto_{timeo,retrans,toplvl} */
+#define AMU_TYPE_UDP 0 /* for amfs_auto_{timeo,retrans,toplvl} */
+#define AMU_TYPE_TCP 1 /* for amfs_auto_{timeo,retrans,toplvl} */
+ /*
+ * Note: toplvl is only UDP, but we want to separate it from regular
+ * NFS mounts which Amd makes, because the toplvl mount is a localhost
+ * mount for which different timeo/retrans parameters may be desired.
+ */
+#define AMU_TYPE_TOPLVL 2 /* for amfs_auto_{timeo,retrans,toplvl} */
+#define AMU_TYPE_MAX 3 /* for amfs_auto_{timeo,retrans,toplvl} */
int amfs_auto_retrans[AMU_TYPE_MAX]; /* NFS retransmit counter */
int amfs_auto_timeo[AMU_TYPE_MAX]; /* NFS retry interval */
amfs_toplvl_mount(am_node *mp, mntfs *mf)
{
struct stat stb;
- char opts[SIZEOF_OPTS], preopts[SIZEOF_OPTS];
+ char opts[SIZEOF_OPTS], preopts[SIZEOF_OPTS], toplvl_opts[40];
int error;
/*
xstrlcat(preopts, MNTTAB_OPT_IGNORE, sizeof(preopts));
xstrlcat(preopts, ",", sizeof(preopts));
#endif /* MNTTAB_OPT_IGNORE */
-#ifdef WANT_TIMEO_AND_RETRANS_ON_TOPLVL
- xsnprintf(opts, sizeof(opts), "%s%s,%s=%d,%s=%d,%s=%d,%s,map=%s",
- preopts,
- MNTTAB_OPT_RW,
- MNTTAB_OPT_PORT, nfs_port,
- /* note: TIMEO+RETRANS for toplvl are only "udp" currently */
- MNTTAB_OPT_TIMEO, gopt.amfs_auto_timeo[AMU_TYPE_UDP],
- MNTTAB_OPT_RETRANS, gopt.amfs_auto_retrans[AMU_TYPE_UDP],
- mf->mf_ops->fs_type, mf->mf_info);
-#else /* not WANT_TIMEO_AND_RETRANS_ON_TOPLVL */
+ /* write most of the initial options + preopts */
xsnprintf(opts, sizeof(opts), "%s%s,%s=%d,%s,map=%s",
preopts,
MNTTAB_OPT_RW,
MNTTAB_OPT_PORT, nfs_port,
mf->mf_ops->fs_type, mf->mf_info);
-#endif /* not WANT_TIMEO_AND_RETRANS_ON_TOPLVL */
+
+ /* process toplvl timeo/retrans options, if any */
+ if (gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL] > 0) {
+ xsnprintf(toplvl_opts, sizeof(toplvl_opts), ",%s=%d",
+ MNTTAB_OPT_TIMEO, gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL]);
+ xstrlcat(opts, toplvl_opts, sizeof(opts));
+ }
+ if (gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL] > 0) {
+ xsnprintf(toplvl_opts, sizeof(toplvl_opts), ",%s=%d",
+ MNTTAB_OPT_RETRANS, gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL]);
+ xstrlcat(opts, toplvl_opts, sizeof(opts));
+ }
+
#ifdef MNTTAB_OPT_NOAC
if (gopt.auto_attrcache == 0) {
xstrlcat(opts, ",", sizeof(opts));
static int gopt_nfs_allow_insecure_port(const char *val);
static int gopt_nfs_proto(const char *val);
static int gopt_nfs_retransmit_counter(const char *val);
-static int gopt_nfs_retransmit_counter_tcp(const char *val);
static int gopt_nfs_retransmit_counter_udp(const char *val);
+static int gopt_nfs_retransmit_counter_tcp(const char *val);
+static int gopt_nfs_retransmit_counter_toplvl(const char *val);
static int gopt_nfs_retry_interval(const char *val);
static int gopt_nfs_retry_interval_udp(const char *val);
static int gopt_nfs_retry_interval_tcp(const char *val);
+static int gopt_nfs_retry_interval_toplvl(const char *val);
static int gopt_nfs_vers(const char *val);
static int gopt_nis_domain(const char *val);
static int gopt_normalize_hostnames(const char *val);
{"nfs_retransmit_counter", gopt_nfs_retransmit_counter},
{"nfs_retransmit_counter_udp", gopt_nfs_retransmit_counter_udp},
{"nfs_retransmit_counter_tcp", gopt_nfs_retransmit_counter_tcp},
+ {"nfs_retransmit_counter_toplvl", gopt_nfs_retransmit_counter_toplvl},
{"nfs_retry_interval", gopt_nfs_retry_interval},
{"nfs_retry_interval_udp", gopt_nfs_retry_interval_udp},
{"nfs_retry_interval_tcp", gopt_nfs_retry_interval_tcp},
+ {"nfs_retry_interval_toplvl", gopt_nfs_retry_interval_toplvl},
{"nfs_vers", gopt_nfs_vers},
{"nis_domain", gopt_nis_domain},
{"normalize_hostnames", gopt_normalize_hostnames},
}
+static int
+gopt_nfs_retransmit_counter_toplvl(const char *val)
+{
+ gopt.amfs_auto_retrans[AMU_TYPE_TOPLVL] = atoi(val);
+ return 0;
+}
+
+
static int
gopt_nfs_retry_interval(const char *val)
{
}
+static int
+gopt_nfs_retry_interval_toplvl(const char *val)
+{
+ gopt.amfs_auto_timeo[AMU_TYPE_TOPLVL] = atoi(val);
+ return 0;
+}
+
+
static int
gopt_nfs_vers(const char *val)
{
break;
case 't':
- /* timeo.retrans */
+ /* timeo.retrans (also affects toplvl mounts) */
{
char *dot = strchr(optarg, '.');
int i;
if (gopt.cluster == NULL)
gopt.cluster = hostdomain;
- /* sanity checking, normalize values just in case */
+ /* sanity checking, normalize values just in case (toplvl too) */
for (i=0; i<AMU_TYPE_MAX; ++i) {
if (gopt.amfs_auto_timeo[i] == 0)
gopt.amfs_auto_timeo[i] = AMFS_AUTO_TIMEO;
* nfs_retransmit_counter Parameter::
* nfs_retransmit_counter_udp Parameter::
* nfs_retransmit_counter_tcp Parameter::
+* nfs_retransmit_counter_toplvl Parameter::
* nfs_retry_interval Parameter::
* nfs_retry_interval_udp Parameter::
* nfs_retry_interval_tcp Parameter::
+* nfs_retry_interval_toplvl Parameter::
* nfs_vers Parameter::
* nis_domain Parameter::
* normalize_hostnames Parameter::
@xref{nfs_retransmit_counter Parameter}.
@c ----------------------------------------------------------------
-@node nfs_retransmit_counter_tcp Parameter, nfs_retry_interval Parameter, nfs_retransmit_counter_udp Parameter, Global Parameters
+@node nfs_retransmit_counter_tcp Parameter, nfs_retransmit_counter_toplvl Parameter, nfs_retransmit_counter_udp Parameter, Global Parameters
@comment node-name, next, previous, up
@subsection @t{nfs_retransmit_counter_tcp} Parameter
@cindex nfs_retransmit_counter_tcp Parameter
@xref{nfs_retransmit_counter Parameter}.
@c ----------------------------------------------------------------
-@node nfs_retry_interval Parameter, nfs_retry_interval_udp Parameter, nfs_retransmit_counter_tcp Parameter, Global Parameters
+@node nfs_retransmit_counter_toplvl Parameter, nfs_retry_interval Parameter, nfs_retransmit_counter_tcp Parameter, Global Parameters
+@comment node-name, next, previous, up
+@subsection @t{nfs_retransmit_counter_toplvl} Parameter
+@cindex nfs_retransmit_counter_toplvl Parameter
+@cindex nfs_retransmit_counter Parameter
+@cindex UDP
+
+(type=numeric, default=11). Same as the @i{nfs_retransmit_counter}
+parameter, applied only for @i{Amd}'s top-level UDP mounts. On some
+systems it is useful to set this differently than the OS default, so
+as to better tune @i{Amd}'s responsiveness under heavy scheduler
+loads. @xref{nfs_retransmit_counter Parameter}.
+
+@c ----------------------------------------------------------------
+@node nfs_retry_interval Parameter, nfs_retry_interval_udp Parameter, nfs_retransmit_counter_toplvl Parameter, Global Parameters
@comment node-name, next, previous, up
@subsection @t{nfs_retry_interval} Parameter
@cindex nfs_retry_interval Parameter
@xref{nfs_retry_interval Parameter}.
@c ----------------------------------------------------------------
-@node nfs_retry_interval_tcp Parameter, nfs_vers Parameter, nfs_retry_interval_udp Parameter, Global Parameters
+@node nfs_retry_interval_tcp Parameter, nfs_retry_interval_toplvl Parameter, nfs_retry_interval_udp Parameter, Global Parameters
@comment node-name, next, previous, up
@subsection @t{nfs_retry_interval_tcp} Parameter
@cindex nfs_retry_interval_tcp Parameter
@xref{nfs_retry_interval Parameter}.
@c ----------------------------------------------------------------
-@node nfs_vers Parameter, nis_domain Parameter, nfs_retry_interval_tcp Parameter, Global Parameters
+@node nfs_retry_interval_toplvl Parameter, nfs_vers Parameter, nfs_retry_interval_tcp Parameter, Global Parameters
+@comment node-name, next, previous, up
+@subsection @t{nfs_retry_interval_toplvl} Parameter
+@cindex nfs_retry_interval_toplvl Parameter
+@cindex nfs_retry_interval Parameter
+@cindex UDP
+
+(type=numeric, default=8). Same as the @i{nfs_retry_interval}
+parameter, applied only for @i{Amd}'s top-level UDP mounts. On some
+systems it is useful to set this differently than the OS default, so
+as to better tune @i{Amd}'s responsiveness under heavy scheduler
+loads. @xref{nfs_retry_interval Parameter}.
+
+@c ----------------------------------------------------------------
+@node nfs_vers Parameter, nis_domain Parameter, nfs_retry_interval_toplvl Parameter, Global Parameters
@comment node-name, next, previous, up
@subsection @t{nfs_vers} Parameter
@cindex nfs_vers Parameter
nfs_retransmit_counter_udp = 22
nfs_retry_interval_tcp = 4
nfs_retransmit_counter_tcp = 5
+# These two are specific to Amd's top-level (NFSv2/udp) mounts
+# and they can also be set separately.
+nfs_retry_interval_toplvl = 6
+nfs_retransmit_counter_toplvl = 8
# NFS attribute cache value for Amd's automount points
# (some OSs use this parameter in units of seconds, and others in 0.1 seconds)
# See README.attrcache for important information about this parameter.
.B nfs_retransmit_counter
option, but for all TCP mounts only.
+.TP
+.BR nfs_retransmit_counter_toplvl " (numeric, default=11)"
+Same as the
+.B nfs_retransmit_counter
+option, but only for Amd's top-level UDP mounts.
+
.TP
.BR nfs_retry_interval " (numeric, default=8)"
Same as the
.B nfs_retry_interval
option, but for all TCP mounts only.
+.TP
+.BR nfs_retry_interval_toplvl " (numeric, default=8)"
+Same as the
+.B nfs_retry_interval
+option, but only for Amd's top-level UDP mounts.
+
.TP
.BR nfs_vers " (numeric, default to trying version 3 then 2)"
By default, Amd tries version 3 and then version 2. This option forces the