--- updateFallbackDirs.py.orig	2015-05-12 13:38:35.000000000 -0400
+++ updateFallbackDirs.py	2016-01-11 16:40:08.825490633 -0500
@@ -20,13 +20,14 @@
 #from bson import json_util
 
 import logging
-logging.basicConfig(level=logging.INFO)
+logging.basicConfig(level=logging.DEBUG)
 
 ONIONOO = 'https://onionoo.torproject.org/'
 
 ADDRESS_AND_PORT_STABLE_DAYS = 120
 # What time-weighted-fraction of these flags must FallbackDirs:
 # Equal or Exceed?
+MAX_AGE_DAYS = 120
 CUTOFF_RUNNING = .95
 CUTOFF_V2DIR = .95
 CUTOFF_GUARD = .95
@@ -350,9 +351,13 @@
         logging.warn('Inconsistent value count in %s document for %s'%(p, which,))
       for v in reversed(h['values']):
         if (this_ts <= newest):
+          agt1 = now - this_ts
+          agt2 = interval
+          agetmp1 = (agt1.microseconds + (agt1.seconds + agt1.days * 24 * 3600) * 10**6) / 10**6
+          agetmp2 = (agt2.microseconds + (agt2.seconds + agt2.days * 24 * 3600) * 10**6) / 10**6
           generic_history.append(
-            { 'age': (now - this_ts).total_seconds(),
-              'length': interval.total_seconds(),
+            { 'age': agetmp1,
+              'length': agetmp2,
               'value': v
             })
           newest = this_ts
@@ -365,16 +370,22 @@
     return generic_history
 
   @staticmethod
-  def _avg_generic_history(generic_history):
+  def _avg_generic_history(generic_history, max_age):
     a = []
     for i in generic_history:
+      if i['age'] > max_age:
+        continue
       w = i['length'] * math.pow(AGE_ALPHA, i['age']/(3600*24))
-      a.append( (i['value'] * w, w) )
+      if i['value'] is not None:
+        a.append( (i['value'] * w, w) )
 
     sv = math.fsum(map(lambda x: x[0], a))
     sw = math.fsum(map(lambda x: x[1], a))
-
-    return sv/sw
+    if sw == 0.0:
+      svw = 0.0
+    else:
+      svw = sv/sw
+    return svw
 
   def _add_generic_history(self, history):
     periods = r['read_history'].keys()
@@ -398,18 +409,19 @@
         logging.debug('No %s in flags for %s.'%(f, self._fpr,))
         return
 
+    MAX_AGE = MAX_AGE_DAYS * 24 * 3600
     running = self._extract_generic_history(uptime['flags']['Running'], '%s-Running'%(self._fpr,))
     guard = self._extract_generic_history(uptime['flags']['Guard'], '%s-Guard'%(self._fpr,))
     v2dir = self._extract_generic_history(uptime['flags']['V2Dir'], '%s-V2Dir'%(self._fpr,))
     if 'BadExit' in uptime['flags']:
       badexit = self._extract_generic_history(uptime['flags']['BadExit'], '%s-BadExit'%(self._fpr,))
 
-    self._running = self._avg_generic_history(running) / ONIONOO_SCALE_ONE
-    self._guard = self._avg_generic_history(guard) / ONIONOO_SCALE_ONE
-    self._v2dir = self._avg_generic_history(v2dir) / ONIONOO_SCALE_ONE
+    self._running = self._avg_generic_history(running, MAX_AGE) / ONIONOO_SCALE_ONE
+    self._guard = self._avg_generic_history(guard, MAX_AGE) / ONIONOO_SCALE_ONE
+    self._v2dir = self._avg_generic_history(v2dir, MAX_AGE) / ONIONOO_SCALE_ONE
     self._badexit = None
     if 'BadExit' in uptime['flags']:
-      self._badexit = self._avg_generic_history(badexit) / ONIONOO_SCALE_ONE
+      self._badexit = self._avg_generic_history(badexit, MAX_AGE) / ONIONOO_SCALE_ONE
 
   def is_candidate(self):
     if self._data['last_changed_address_or_port'] > self.CUTOFF_ADDRESS_AND_PORT_STABLE:
@@ -419,9 +431,6 @@
     if self._running < CUTOFF_RUNNING:
       logging.debug('%s not a candidate: running avg too low (%lf)', self._fpr, self._running)
       return False
-    if self._guard < CUTOFF_GUARD:
-      logging.debug('%s not a candidate: guard avg too low (%lf)', self._fpr, self._guard)
-      return False
     if self._v2dir < CUTOFF_V2DIR:
       logging.debug('%s not a candidate: v2dir avg too low (%lf)', self._fpr, self._v2dir)
       return False
@@ -431,6 +440,9 @@
     # if the relay doesn't report a version, also exclude the relay
     if not self._data.has_key('recommended_version') or not self._data['recommended_version']:
       return False
+    if self._guard < CUTOFF_GUARD:
+      logging.debug('%s not a candidate: guard avg too low (%lf)', self._fpr, self._guard)
+      return False
     return True
 
   @staticmethod
