]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix some issues with the scheduler configuration options
authorNick Mathewson <nickm@torproject.org>
Fri, 28 Nov 2014 03:51:13 +0000 (22:51 -0500)
committerNick Mathewson <nickm@torproject.org>
Fri, 28 Nov 2014 03:51:13 +0000 (22:51 -0500)
1) Set them to the values that (according to Rob) avoided performance
   regressions.  This means that the scheduler won't get much exercise
   until we implement KIST or something like it.

2) Rename the options to end with a __, since I think they might be
   going away, and nobody should mess with them.

3) Use the correct types for the option variables. MEMUNIT needs to be a
   uint64_t; UINT needs to be (I know, I know!) an int.

4) Validate the values in options_validate(); do the switch in
   options_act(). This way, setting the option to an invalid value on
   a running Tor will get backed out.

src/or/config.c
src/or/or.h

index ced4288f00aa236202ddc0a5fb593f1147930bb4..28f1df06631522709d83586ce447c1e94ab0e804 100644 (file)
@@ -369,9 +369,9 @@ static config_var_t option_vars_[] = {
   V(ServerDNSSearchDomains,      BOOL,     "0"),
   V(ServerDNSTestAddresses,      CSV,
       "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"),
-  V(SchedulerLowWaterMark,       MEMUNIT,  "16 kB"),
-  V(SchedulerHighWaterMark,      MEMUNIT,  "32 kB"),
-  V(SchedulerMaxFlushCells,      UINT,     "16"),
+  V(SchedulerLowWaterMark__,     MEMUNIT,  "100 MB"),
+  V(SchedulerHighWaterMark__,    MEMUNIT,  "101 MB"),
+  V(SchedulerMaxFlushCells__,    UINT,     "1000"),
   V(ShutdownWaitLength,          INTERVAL, "30 seconds"),
   V(SocksListenAddress,          LINELIST, NULL),
   V(SocksPolicy,                 LINELIST, NULL),
@@ -1539,23 +1539,10 @@ options_act(const or_options_t *old_options)
   }
 
   /* Set up scheduler thresholds */
-  if (options->SchedulerLowWaterMark > 0 &&
-      options->SchedulerHighWaterMark > options->SchedulerLowWaterMark) {
-    scheduler_set_watermarks(options->SchedulerLowWaterMark,
-                             options->SchedulerHighWaterMark,
-                             (options->SchedulerMaxFlushCells > 0) ?
-                              options->SchedulerMaxFlushCells : 16);
-  } else {
-    if (options->SchedulerLowWaterMark == 0) {
-      log_warn(LD_GENERAL, "Bad SchedulerLowWaterMark option");
-    }
-
-    if (options->SchedulerHighWaterMark <= options->SchedulerLowWaterMark) {
-      log_warn(LD_GENERAL, "Bad SchedulerHighWaterMark option");
-    }
-
-    return -1;
-  }
+  scheduler_set_watermarks((uint32_t)options->SchedulerLowWaterMark__,
+                           (uint32_t)options->SchedulerHighWaterMark__,
+                           (options->SchedulerMaxFlushCells__ > 0) ?
+                           options->SchedulerMaxFlushCells__ : 1000);
 
   /* Set up accounting */
   if (accounting_parse_options(options, 0)<0) {
@@ -2654,6 +2641,17 @@ options_validate(or_options_t *old_options, or_options_t *options,
     routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeNodes);
   }
 
+  if (options->SchedulerLowWaterMark__ == 0 ||
+      options->SchedulerLowWaterMark__ > UINT32_MAX) {
+    log_warn(LD_GENERAL, "Bad SchedulerLowWaterMark__ option");
+    return -1;
+  } else if (options->SchedulerHighWaterMark__ <=
+             options->SchedulerLowWaterMark__ ||
+             options->SchedulerHighWaterMark__ > UINT32_MAX) {
+    log_warn(LD_GENERAL, "Bad SchedulerHighWaterMark option");
+    return -1;
+  }
+
   if (options->NodeFamilies) {
     options->NodeFamilySets = smartlist_new();
     for (cl = options->NodeFamilies; cl; cl = cl->next) {
index ccb29ee7dfda64e515f83c4fac7050fccfd49ddc..0de37452bd639b90199ed8e5eb1f1c56aa4e7c77 100644 (file)
@@ -4251,15 +4251,15 @@ typedef struct {
   /** Low-water mark for global scheduler - start sending when estimated
    * queued size falls below this threshold.
    */
-  uint32_t SchedulerLowWaterMark;
+  uint64_t SchedulerLowWaterMark__;
   /** High-water mark for global scheduler - stop sending when estimated
    * queued size exceeds this threshold.
    */
-  uint32_t SchedulerHighWaterMark;
+  uint64_t SchedulerHighWaterMark__;
   /** Flush size for global scheduler - flush this many cells at a time
    * when sending.
    */
-  unsigned int SchedulerMaxFlushCells;
+  int SchedulerMaxFlushCells__;
 } or_options_t;
 
 /** Persistent state for an onion router, as saved to disk. */