* doc/am-utils.texi, scripts/{amd.conf.5,amd.conf-sample}:
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 28 Mar 2006 16:19:30 +0000 (16:19 +0000)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 28 Mar 2006 16:19:30 +0000 (16:19 +0000)
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.

ChangeLog
NEWS
amd/amd.c
amd/amd.h
amd/amfs_toplvl.c
amd/conf.c
amd/get_args.c
doc/am-utils.texi
scripts/amd.conf-sample
scripts/amd.conf.5

index 8698261afa135c29440f777a994cd16c59256eed..292bb4d3e649f385ad1bcd197ccb99e6817ca4df 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+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).
diff --git a/NEWS b/NEWS
index bac67891aade082dcd435cec7d8f66807d014f7f..4b4de7046b6efe1035260ebaef66b0524209c0bb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,14 @@
 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)
index 6ce3da3fd2c0fdc239dbb813606505f87ffe3e56..905bfff021ab6b4075bfcc0db69a966cf5d24e47 100644 (file)
--- a/amd/amd.c
+++ b/amd/amd.c
@@ -289,10 +289,10 @@ init_global_options(void)
   /* 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 */
index 926bb679a2079a966a799e4635b08a767c9fcc47..1f090cdabb3932234b2c5054291907a50e023373 100644 (file)
--- a/amd/amd.h
+++ b/amd/amd.h
@@ -281,10 +281,16 @@ struct amu_global_options {
   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 */
 
index 5bc943474b1bef55d4f2c7b6e66174b65378727b..1b968f197f554ae3fa786a75f8c6eeb0f173c3a3 100644 (file)
@@ -170,7 +170,7 @@ int
 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;
 
   /*
@@ -208,22 +208,25 @@ amfs_toplvl_mount(am_node *mp, mntfs *mf)
     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));
index 86d361fe5d951267ed28caced9b01103df24c921..7b002a68f458f13bd5ef602e656d12c45b7ed045 100644 (file)
@@ -111,11 +111,13 @@ static int gopt_preferred_amq_port(const char *val);
 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);
@@ -194,9 +196,11 @@ static struct _func_map glob_functable[] = {
   {"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},
@@ -881,6 +885,14 @@ gopt_nfs_retransmit_counter_tcp(const char *val)
 }
 
 
+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)
 {
@@ -908,6 +920,14 @@ gopt_nfs_retry_interval_tcp(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)
 {
index e2208d8c5de48e27ffb65d244dd518e1c9a4442f..578d64ecc3788cd7fb7ff7e1b5653d4677debb83 100644 (file)
@@ -229,7 +229,7 @@ get_args(int argc, char *argv[])
       break;
 
     case 't':
-      /* timeo.retrans */
+      /* timeo.retrans (also affects toplvl mounts) */
       {
        char *dot = strchr(optarg, '.');
        int i;
@@ -411,7 +411,7 @@ get_args(int argc, char *argv[])
     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;
index e1baa40abf2dbc8e37b293c2111ac7723e3de697..7cb31c890c1de944d5fb5967b824c60979ed9eb6 100644 (file)
@@ -4378,9 +4378,11 @@ The following parameters are applicable to the @samp{[global]} section only.
 * 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::
@@ -4864,7 +4866,7 @@ parameter, but applied globally only to UDP mounts.
 @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
@@ -4876,7 +4878,21 @@ parameter, but applied globally only to TCP mounts.
 @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
@@ -4906,7 +4922,7 @@ parameter, but applied globally only to UDP mounts.
 @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
@@ -4918,7 +4934,21 @@ parameter, but applied globally only to TCP mounts.
 @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
index f753069ea6cdfbf35ea7857a96be73ea3bdbfa11..76ff7c2fc0fa85ddb014977cd1184d08d0f55d43 100644 (file)
@@ -49,6 +49,10 @@ nfs_retry_interval_udp =     16
 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.
index 3b79e7677f3a99df5931475da14c20d137fc6eae..76c38c7de00c96bba568538ff1ea3ef85cac45d6 100644 (file)
@@ -486,6 +486,12 @@ Same as the
 .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
@@ -518,6 +524,12 @@ 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