commit 63f046df60767bae1a2ec31e67346c4ebb6769f8
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Mar 21 03:10:43 2014 +0000
Use the new idiom throughout code
---
lib/bridgedb/Bridges.py | 66 +++++++--------
lib/bridgedb/Bucket.py | 104 +++++++++++------------
lib/bridgedb/Dist.py | 115 ++++++++++++-------------
lib/bridgedb/Stability.py | 204 ++++++++++++++++++++++-----------------------
lib/bridgedb/Tests.py | 4 +-
5 files changed, 247 insertions(+), 246 deletions(-)
diff --git a/lib/bridgedb/Bridges.py b/lib/bridgedb/Bridges.py
index 2fb784a..bfe1316 100644
--- a/lib/bridgedb/Bridges.py
+++ b/lib/bridgedb/Bridges.py
@@ -308,38 +308,38 @@ class Bridge(object):
A bridge is 'familiar' if 1/8 of all active bridges have appeared
more recently than it, or if it has been around for a Weighted Time of 8 days.
"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).familiar
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).familiar
@property
def wfu(self):
"""Weighted Fractional Uptime"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).weightedFractionalUptime
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).weightedFractionalUptime
@property
def weightedTime(self):
"""Weighted Time"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).weightedTime
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).weightedTime
@property
def wmtbac(self):
"""Weighted Mean Time Between Address Change"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).wmtbac
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).wmtbac
@property
def tosa(self):
"""the Time On Same Address (TOSA)"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).tosa
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).tosa
@property
def weightedUptime(self):
"""Weighted Uptime"""
- db = bridgedb.Storage.getDB()
- return db.getBridgeHistory(self.fingerprint).weightedUptime
+ with bridgedb.Storage.getDB() as db:
+ return db.getBridgeHistory(self.fingerprint).weightedUptime
def getDescriptorDigests(desc):
"""Return the SHA-1 hash hexdigests of all descriptor descs
@@ -1122,19 +1122,19 @@ class UnallocatedHolder(BridgeHolder):
self.fingerprints = []
def dumpAssignments(self, f, description=""):
- db = bridgedb.Storage.getDB()
- allBridges = db.getAllBridges()
- for bridge in allBridges:
- if bridge.hex_key not in self.fingerprints:
- continue
- dist = bridge.distributor
- desc = [ description ]
- if dist.startswith(bridgedb.Bucket.PSEUDO_DISTRI_PREFIX):
- dist = dist.replace(bridgedb.Bucket.PSEUDO_DISTRI_PREFIX, "")
- desc.append("bucket=%s" % dist)
- elif dist != "unallocated":
- continue
- f.write("%s %s\n" % (bridge.hex_key, " ".join(desc).strip()))
+ with bridgedb.Storage.getDB() as db:
+ allBridges = db.getAllBridges()
+ for bridge in allBridges:
+ if bridge.hex_key not in self.fingerprints:
+ continue
+ dist = bridge.distributor
+ desc = [ description ]
+ if dist.startswith(bridgedb.Bucket.PSEUDO_DISTRI_PREFIX):
+ dist = dist.replace(bridgedb.Bucket.PSEUDO_DISTRI_PREFIX, "")
+ desc.append("bucket=%s" % dist)
+ elif dist != "unallocated":
+ continue
+ f.write("%s %s\n" % (bridge.hex_key, " ".join(desc).strip()))
class BridgeSplitter(BridgeHolder):
"""A BridgeHolder that splits incoming bridges up based on an hmac,
@@ -1186,7 +1186,6 @@ class BridgeSplitter(BridgeHolder):
def insert(self, bridge):
assert self.rings
- db = bridgedb.Storage.getDB()
for s in self.statsHolders:
s.insert(bridge)
@@ -1205,16 +1204,17 @@ class BridgeSplitter(BridgeHolder):
validRings = self.rings + self.pseudoRings
- ringname = db.insertBridgeAndGetRing(bridge, ringname, time.time(),
+ with bridgedb.Storage.getDB() as db:
+ ringname = db.insertBridgeAndGetRing(bridge, ringname, time.time(),
validRings)
- db.commit()
+ db.commit()
- # Pseudo distributors are always held in the "unallocated" ring
- if ringname in self.pseudoRings:
- ringname = "unallocated"
+ # Pseudo distributors are always held in the "unallocated" ring
+ if ringname in self.pseudoRings:
+ ringname = "unallocated"
- ring = self.ringsByName.get(ringname)
- ring.insert(bridge)
+ ring = self.ringsByName.get(ringname)
+ ring.insert(bridge)
def dumpAssignments(self, f, description=""):
for name,ring in self.ringsByName.iteritems():
diff --git a/lib/bridgedb/Bucket.py b/lib/bridgedb/Bucket.py
index 0038146..416c1ea 100644
--- a/lib/bridgedb/Bucket.py
+++ b/lib/bridgedb/Bucket.py
@@ -109,22 +109,18 @@ class BucketManager:
self.unallocatedList = []
self.unallocated_available = False
self.distributor_prefix = PSEUDO_DISTRI_PREFIX
- self.db = bridgedb.Storage.Database(self.cfg.DB_FILE+".sqlite",
- self.cfg.DB_FILE)
-
- def __del__(self):
- self.db.close()
def addToUnallocatedList(self, hex_key):
"""Add a bridge by hex_key into the unallocated pool
"""
- try:
- self.db.updateDistributorForHexKey("unallocated", hex_key)
- except:
- self.db.rollback()
- raise
- else:
- self.db.commit()
+ with bridgedb.Storage.getDB() as db:
+ try:
+ db.updateDistributorForHexKey("unallocated", hex_key)
+ except:
+ db.rollback()
+ raise
+ else:
+ db.commit()
self.unallocatedList.append(hex_key)
self.unallocated_available = True
@@ -144,17 +140,18 @@ class BucketManager:
# Mark pseudo-allocators in the database as such
allocator_name = bucket.name
#print "KEY: %d NAME: %s" % (hex_key, allocator_name)
- try:
- self.db.updateDistributorForHexKey(allocator_name, hex_key)
- except:
- self.db.rollback()
- # Ok, this seems useless, but for consistancy's sake, we'll
- # re-assign the bridge from this missed db update attempt to the
- # unallocated list. Remember? We pop()'d it before.
- self.addToUnallocatedList(hex_key)
- raise
- else:
- self.db.commit()
+ with bridgedb.Storage.getDB() as db:
+ try:
+ db.updateDistributorForHexKey(allocator_name, hex_key)
+ except:
+ db.rollback()
+ # Ok, this seems useless, but for consistancy's sake, we'll
+ # re-assign the bridge from this missed db update attempt to the
+ # unallocated list. Remember? We pop()'d it before.
+ self.addToUnallocatedList(hex_key)
+ raise
+ else:
+ db.commit()
bucket.allocated += 1
if len(self.unallocatedList) < 1:
self.unallocated_available = False
@@ -171,7 +168,8 @@ class BucketManager:
self.bucketList.append(d)
# Loop through all bridges and sort out distributors
- allBridges = self.db.getAllBridges()
+ with bridgedb.Storage.getDB() as db:
+ allBridges = db.getAllBridges()
for bridge in allBridges:
if bridge.distributor == "unallocated":
self.addToUnallocatedList(bridge.hex_key)
@@ -215,38 +213,40 @@ class BucketManager:
logging.debug("Dumping bridge assignments to file: %r" % filename)
# get the bridge histories and sort by Time On Same Address
bridgeHistories = []
- for b in bridges:
- bh = self.db.getBridgeHistory(b.hex_key)
- if bh: bridgeHistories.append(bh)
- bridgeHistories.sort(lambda x,y: cmp(x.weightedFractionalUptime,
- y.weightedFractionalUptime))
-
- # for a bridge, get the list of countries it might not work in
- blocklist = dict()
- if getattr(self.cfg, "COUNTRY_BLOCK_FILE", None) is not None:
- f = open(self.cfg.COUNTRY_BLOCK_FILE, 'r')
- for ID,address,portlist,countries in bridgedb.Bridges.parseCountryBlockFile(f):
- blocklist[toHex(ID)] = countries
- f.close()
-
- try:
- f = open(filename, 'w')
- for bh in bridgeHistories:
- days = bh.tosa / long(60*60*24)
- line = "%s:%s\t(%d %s)" % \
- (bh.ip, bh.port, days, _("""days at this address"""))
- if str(bh.fingerprint) in blocklist.keys():
- line = line + "\t%s: (%s)" % (_("""(Might be blocked)"""),
- ",".join(blocklist[bh.fingerprint]),)
- f.write(line + '\n')
- f.close()
- except IOError:
- print "I/O error: %s" % filename
+ with bridgedb.Storage.getDB() as db:
+ for b in bridges:
+ bh = db.getBridgeHistory(b.hex_key)
+ if bh: bridgeHistories.append(bh)
+ bridgeHistories.sort(lambda x,y: cmp(x.weightedFractionalUptime,
+ y.weightedFractionalUptime))
+
+ # for a bridge, get the list of countries it might not work in
+ blocklist = dict()
+ if getattr(self.cfg, "COUNTRY_BLOCK_FILE", None) is not None:
+ f = open(self.cfg.COUNTRY_BLOCK_FILE, 'r')
+ for ID,address,portlist,countries in bridgedb.Bridges.parseCountryBlockFile(f):
+ blocklist[toHex(ID)] = countries
+ f.close()
+
+ try:
+ f = open(filename, 'w')
+ for bh in bridgeHistories:
+ days = bh.tosa / long(60*60*24)
+ line = "%s:%s\t(%d %s)" % \
+ (bh.ip, bh.port, days, _("""days at this address"""))
+ if str(bh.fingerprint) in blocklist.keys():
+ line = line + "\t%s: (%s)" % (_("""(Might be blocked)"""),
+ ",".join(blocklist[bh.fingerprint]),)
+ f.write(line + '\n')
+ f.close()
+ except IOError:
+ print "I/O error: %s" % filename
def dumpBridges(self):
"""Dump all known file distributors to files, sort by distributor
"""
- allBridges = self.db.getAllBridges()
+ with bridgedb.Storage.getDB() as db:
+ allBridges = db.getAllBridges()
bridgeDict = {}
# Sort returned bridges by distributor
for bridge in allBridges:
diff --git a/lib/bridgedb/Dist.py b/lib/bridgedb/Dist.py
index dddc84b..3bfb2d8 100644
--- a/lib/bridgedb/Dist.py
+++ b/lib/bridgedb/Dist.py
@@ -474,58 +474,59 @@ class EmailBasedDistributor(Distributor):
if emailaddress is None:
return [] #XXXX raise an exception.
- db = bridgedb.Storage.getDB()
- wasWarned = db.getWarnedEmail(emailaddress)
- lastSaw = db.getEmailTime(emailaddress)
-
- logging.info("Attempting to return for %d bridges for %s..."
- % (N, Util.logSafely(emailaddress)))
-
- if lastSaw is not None and lastSaw + MAX_EMAIL_RATE >= now:
- logging.info("Client %s sent duplicate request within %d seconds."
- % (Util.logSafely(emailaddress), MAX_EMAIL_RATE))
- if wasWarned:
- logging.info(
- "Client was already warned about duplicate requests.")
- raise IgnoreEmail("Client was warned",
- Util.logSafely(emailaddress))
+ with bridgedb.Storage.getDB() as db:
+ wasWarned = db.getWarnedEmail(emailaddress)
+ lastSaw = db.getEmailTime(emailaddress)
+
+ logging.info("Attempting to return for %d bridges for %s..."
+ % (N, Util.logSafely(emailaddress)))
+
+ if lastSaw is not None and lastSaw + MAX_EMAIL_RATE >= now:
+ logging.info("Client %s sent duplicate request within %d seconds."
+ % (Util.logSafely(emailaddress), MAX_EMAIL_RATE))
+ if wasWarned:
+ logging.info(
+ "Client was already warned about duplicate requests.")
+ raise IgnoreEmail("Client was warned",
+ Util.logSafely(emailaddress))
+ else:
+ logging.info("Sending duplicate request warning to %s..."
+ % Util.logSafely(emailaddress))
+ db.setWarnedEmail(emailaddress, True, now)
+ db.commit()
+
+ raise TooSoonEmail("Too many emails; wait till later", emailaddress)
+
+ # warning period is over
+ elif wasWarned:
+ db.setWarnedEmail(emailaddress, False)
+
+ pos = self.emailHmac("<%s>%s" % (epoch, emailaddress))
+
+ ring = None
+ ruleset = frozenset(bridgeFilterRules)
+ if ruleset in self.splitter.filterRings.keys():
+ logging.debug("Cache hit %s" % ruleset)
+ _, ring = self.splitter.filterRings[ruleset]
else:
- logging.info("Sending duplicate request warning to %s..."
- % Util.logSafely(emailaddress))
- db.setWarnedEmail(emailaddress, True, now)
- db.commit()
-
- raise TooSoonEmail("Too many emails; wait till later", emailaddress)
-
- # warning period is over
- elif wasWarned:
- db.setWarnedEmail(emailaddress, False)
-
- pos = self.emailHmac("<%s>%s" % (epoch, emailaddress))
-
- ring = None
- ruleset = frozenset(bridgeFilterRules)
- if ruleset in self.splitter.filterRings.keys():
- logging.debug("Cache hit %s" % ruleset)
- _, ring = self.splitter.filterRings[ruleset]
- else:
- # cache miss, add new ring
- logging.debug("Cache miss %s" % ruleset)
+ # cache miss, add new ring
+ logging.debug("Cache miss %s" % ruleset)
- # add new ring
- key1 = getHMAC(self.splitter.key, "Order-Bridges-In-Ring")
- ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
- # debug log: cache miss
- self.splitter.addRing(ring, ruleset,
- filterBridgesByRules(bridgeFilterRules),
- populate_from=self.splitter.bridges)
+ # add new ring
+ key1 = getHMAC(self.splitter.key,
+ "Order-Bridges-In-Ring")
+ ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
+ # debug log: cache miss
+ self.splitter.addRing(ring, ruleset,
+ filterBridgesByRules(bridgeFilterRules),
+ populate_from=self.splitter.bridges)
- numBridgesToReturn = getNumBridgesPerAnswer(ring,
- max_bridges_per_answer=N)
- result = ring.getBridges(pos, numBridgesToReturn)
+ numBridgesToReturn = getNumBridgesPerAnswer(ring,
+ max_bridges_per_answer=N)
+ result = ring.getBridges(pos, numBridgesToReturn)
- db.setEmailTime(emailaddress, now)
- db.commit()
+ db.setEmailTime(emailaddress, now)
+ db.commit()
return result
@@ -533,15 +534,15 @@ class EmailBasedDistributor(Distributor):
return len(self.splitter)
def cleanDatabase(self):
- db = bridgedb.Storage.getDB()
- try:
- db.cleanEmailedBridges(time.time()-MAX_EMAIL_RATE)
- db.cleanWarnedEmails(time.time()-MAX_EMAIL_RATE)
- except:
- db.rollback()
- raise
- else:
- db.commit()
+ with bridgedb.Storage.getDB() as db:
+ try:
+ db.cleanEmailedBridges(time.time()-MAX_EMAIL_RATE)
+ db.cleanWarnedEmails(time.time()-MAX_EMAIL_RATE)
+ except:
+ db.rollback()
+ raise
+ else:
+ db.commit()
def dumpAssignments(self, f, description=""):
self.splitter.dumpAssignments(f, description)
diff --git a/lib/bridgedb/Stability.py b/lib/bridgedb/Stability.py
index 5cd7e8e..4c3777d 100644
--- a/lib/bridgedb/Stability.py
+++ b/lib/bridgedb/Stability.py
@@ -111,14 +111,14 @@ class BridgeHistory(object):
# return True if self.weightedTime is greater than the weightedTime
# of the > bottom 1/8 all bridges, sorted by weightedTime
- db = bridgedb.Storage.getDB()
- allWeightedTimes = [ bh.weightedTime for bh in db.getAllBridgeHistory()]
- numBridges = len(allWeightedTimes)
- logging.debug("Got %d weightedTimes", numBridges)
- allWeightedTimes.sort()
- if self.weightedTime >= allWeightedTimes[numBridges/8]:
- return True
- return False
+ with bridgedb.Storage.getDB() as db:
+ allWeightedTimes = [ bh.weightedTime for bh in db.getAllBridgeHistory()]
+ numBridges = len(allWeightedTimes)
+ logging.debug("Got %d weightedTimes", numBridges)
+ allWeightedTimes.sort()
+ if self.weightedTime >= allWeightedTimes[numBridges/8]:
+ return True
+ return False
@property
def wmtbac(self):
@@ -134,104 +134,104 @@ class BridgeHistory(object):
return totalRunlength / totalWeights
def addOrUpdateBridgeHistory(bridge, timestamp):
- db = bridgedb.Storage.getDB()
- bhe = db.getBridgeHistory(bridge.fingerprint)
- if not bhe:
- # This is the first status, assume 60 minutes.
- secondsSinceLastStatusPublication = long(60*60)
- lastSeenWithDifferentAddressAndPort = timestamp * long(1000)
- lastSeenWithThisAddressAndPort = timestamp * long(1000)
-
- bhe = BridgeHistory(
- bridge.fingerprint, bridge.ip, bridge.orport,
- 0,#weightedUptime
- 0,#weightedTime
- 0,#weightedRunLength
- 0,# totalRunWeights
- lastSeenWithDifferentAddressAndPort, # first timestamnp
- lastSeenWithThisAddressAndPort,
- 0,#lastDiscountedHistoryValues,
- 0,#lastUpdatedWeightedTime
- )
- # first time we have seen this descriptor
- db.updateIntoBridgeHistory(bhe)
- # Calculate the seconds since the last parsed status. If this is
- # the first status or we haven't seen a status for more than 60
- # minutes, assume 60 minutes.
- statusPublicationMillis = long(timestamp * 1000)
- if (statusPublicationMillis - bhe.lastSeenWithThisAddressAndPort) > 60*60*1000:
- secondsSinceLastStatusPublication = long(60*60)
- logging.debug("Capping secondsSinceLastStatusPublication to 1 hour")
- # otherwise, roll with it
- else:
- secondsSinceLastStatusPublication = \
- (statusPublicationMillis - bhe.lastSeenWithThisAddressAndPort)/1000
- if secondsSinceLastStatusPublication <= 0 and bhe.weightedTime > 0:
- # old descriptor, bail
- logging.warn("Received old descriptor for bridge %s with timestamp %d",
- bhe.fingerprint, statusPublicationMillis/1000)
- return bhe
+ with bridgedb.Storage.getDB() as db:
+ bhe = db.getBridgeHistory(bridge.fingerprint)
+ if not bhe:
+ # This is the first status, assume 60 minutes.
+ secondsSinceLastStatusPublication = long(60*60)
+ lastSeenWithDifferentAddressAndPort = timestamp * long(1000)
+ lastSeenWithThisAddressAndPort = timestamp * long(1000)
- # iterate over all known bridges and apply weighting factor
- discountAndPruneBridgeHistories(statusPublicationMillis)
+ bhe = BridgeHistory(
+ bridge.fingerprint, bridge.ip, bridge.orport,
+ 0,#weightedUptime
+ 0,#weightedTime
+ 0,#weightedRunLength
+ 0,# totalRunWeights
+ lastSeenWithDifferentAddressAndPort, # first timestamnp
+ lastSeenWithThisAddressAndPort,
+ 0,#lastDiscountedHistoryValues,
+ 0,#lastUpdatedWeightedTime
+ )
+ # first time we have seen this descriptor
+ db.updateIntoBridgeHistory(bhe)
+ # Calculate the seconds since the last parsed status. If this is
+ # the first status or we haven't seen a status for more than 60
+ # minutes, assume 60 minutes.
+ statusPublicationMillis = long(timestamp * 1000)
+ if (statusPublicationMillis - bhe.lastSeenWithThisAddressAndPort) > 60*60*1000:
+ secondsSinceLastStatusPublication = long(60*60)
+ logging.debug("Capping secondsSinceLastStatusPublication to 1 hour")
+ # otherwise, roll with it
+ else:
+ secondsSinceLastStatusPublication = \
+ (statusPublicationMillis - bhe.lastSeenWithThisAddressAndPort)/1000
+ if secondsSinceLastStatusPublication <= 0 and bhe.weightedTime > 0:
+ # old descriptor, bail
+ logging.warn("Received old descriptor for bridge %s with timestamp %d",
+ bhe.fingerprint, statusPublicationMillis/1000)
+ return bhe
- # Update the weighted times of bridges
- updateWeightedTime(statusPublicationMillis)
-
- # For Running Bridges only:
- # compare the stored history against the descriptor and see if the
- # bridge has changed its address or port
- bhe = db.getBridgeHistory(bridge.fingerprint)
-
- if not bridge.running:
- logging.info("%s is not running" % bridge.fingerprint)
- return bhe
-
- # Parse the descriptor and see if the address or port changed
- # If so, store the weighted run time
- if bridge.orport != bhe.port or bridge.ip != bhe.ip:
- bhe.totalRunWeights += 1.0;
- bhe.weightedRunLength += bhe.tosa
- bhe.lastSeenWithDifferentAddressAndPort =\
- bhe.lastSeenWithThisAddressAndPort
-
- # Regardless of whether the bridge is new, kept or changed
- # its address and port, raise its WFU times and note its
- # current address and port, and that we saw it using them.
- bhe.weightedUptime += secondsSinceLastStatusPublication
- bhe.lastSeenWithThisAddressAndPort = statusPublicationMillis
- bhe.ip = str(bridge.ip)
- bhe.port = bridge.orport
- return db.updateIntoBridgeHistory(bhe)
+ # iterate over all known bridges and apply weighting factor
+ discountAndPruneBridgeHistories(statusPublicationMillis)
+
+ # Update the weighted times of bridges
+ updateWeightedTime(statusPublicationMillis)
+
+ # For Running Bridges only:
+ # compare the stored history against the descriptor and see if the
+ # bridge has changed its address or port
+ bhe = db.getBridgeHistory(bridge.fingerprint)
+
+ if not bridge.running:
+ logging.info("%s is not running" % bridge.fingerprint)
+ return bhe
+
+ # Parse the descriptor and see if the address or port changed
+ # If so, store the weighted run time
+ if bridge.orport != bhe.port or bridge.ip != bhe.ip:
+ bhe.totalRunWeights += 1.0;
+ bhe.weightedRunLength += bhe.tosa
+ bhe.lastSeenWithDifferentAddressAndPort =\
+ bhe.lastSeenWithThisAddressAndPort
+
+ # Regardless of whether the bridge is new, kept or changed
+ # its address and port, raise its WFU times and note its
+ # current address and port, and that we saw it using them.
+ bhe.weightedUptime += secondsSinceLastStatusPublication
+ bhe.lastSeenWithThisAddressAndPort = statusPublicationMillis
+ bhe.ip = str(bridge.ip)
+ bhe.port = bridge.orport
+ return db.updateIntoBridgeHistory(bhe)
def discountAndPruneBridgeHistories(discountUntilMillis):
- db = bridgedb.Storage.getDB()
- bhToRemove = []
- bhToUpdate = []
-
- for bh in db.getAllBridgeHistory():
- # discount previous values by factor of 0.95 every 12 hours
- bh.discountWeightedFractionalUptimeAndWeightedTime(discountUntilMillis)
- # give the thing at least 24 hours before pruning it
- if bh.weightedFractionalUptime < 1 and bh.weightedTime > 60*60*24:
- logging.debug("Removing bridge from history: %s" % bh.fingerprint)
- bhToRemove.append(bh.fingerprint)
- else:
- bhToUpdate.append(bh)
-
- for k in bhToUpdate: db.updateIntoBridgeHistory(k)
- for k in bhToRemove: db.delBridgeHistory(k)
+ with bridgedb.Storage.getDB() as db:
+ bhToRemove = []
+ bhToUpdate = []
+
+ for bh in db.getAllBridgeHistory():
+ # discount previous values by factor of 0.95 every 12 hours
+ bh.discountWeightedFractionalUptimeAndWeightedTime(discountUntilMillis)
+ # give the thing at least 24 hours before pruning it
+ if bh.weightedFractionalUptime < 1 and bh.weightedTime > 60*60*24:
+ logging.debug("Removing bridge from history: %s" % bh.fingerprint)
+ bhToRemove.append(bh.fingerprint)
+ else:
+ bhToUpdate.append(bh)
+
+ for k in bhToUpdate: db.updateIntoBridgeHistory(k)
+ for k in bhToRemove: db.delBridgeHistory(k)
def updateWeightedTime(statusPublicationMillis):
bhToUpdate = []
- db = bridgedb.Storage.getDB()
- for bh in db.getBridgesLastUpdatedBefore(statusPublicationMillis):
- interval = (statusPublicationMillis - bh.lastUpdatedWeightedTime)/1000
- if interval > 0:
- bh.weightedTime += min(3600,interval) # cap to 1hr
- bh.lastUpdatedWeightedTime = statusPublicationMillis
- #db.updateIntoBridgeHistory(bh)
- bhToUpdate.append(bh)
-
- for bh in bhToUpdate:
- db.updateIntoBridgeHistory(bh)
+ with bridgedb.Storage.getDB() as db:
+ for bh in db.getBridgesLastUpdatedBefore(statusPublicationMillis):
+ interval = (statusPublicationMillis - bh.lastUpdatedWeightedTime)/1000
+ if interval > 0:
+ bh.weightedTime += min(3600,interval) # cap to 1hr
+ bh.lastUpdatedWeightedTime = statusPublicationMillis
+ #db.updateIntoBridgeHistory(bh)
+ bhToUpdate.append(bh)
+
+ for bh in bhToUpdate:
+ db.updateIntoBridgeHistory(bh)
diff --git a/lib/bridgedb/Tests.py b/lib/bridgedb/Tests.py
index 378f1ae..72dfe5e 100644
--- a/lib/bridgedb/Tests.py
+++ b/lib/bridgedb/Tests.py
@@ -206,7 +206,7 @@ class EmailBridgeDistTests(unittest.TestCase):
def setUp(self):
self.fd, self.fname = tempfile.mkstemp()
self.db = bridgedb.Storage.Database(self.fname)
- bridgedb.Storage.setGlobalDB(self.db)
+ bridgedb.Storage.setDB(self.db)
self.cur = self.db._conn.cursor()
def tearDown(self):
@@ -672,7 +672,7 @@ class BridgeStabilityTests(unittest.TestCase):
def setUp(self):
self.fd, self.fname = tempfile.mkstemp()
self.db = bridgedb.Storage.Database(self.fname)
- bridgedb.Storage.setGlobalDB(self.db)
+ bridgedb.Storage.setDB(self.db)
self.cur = self.db._conn.cursor()
def tearDown(self):