Fixed bug that was slowing down bootstrapping (bad edge selection in _reevaluate()).
diff --git a/infocalypse/requestingbundles.py b/infocalypse/requestingbundles.py
--- a/infocalypse/requestingbundles.py
+++ b/infocalypse/requestingbundles.py
@@ -657,7 +657,7 @@ class RequestingBundles(RetryingRequestL
if not self.parent.ctx.graph.is_redundant(edge):
return False
- pending, current, next, finished = self._known_edges()
+ pending, current, next, finished, dummy = self._known_edges()
# Must include finished! REDFLAG: re-examine other cases.
all_edges = pending.union(current).union(next).union(finished)
alternate_edge = (edge[0], edge[1], int(not edge[2]))
@@ -810,18 +810,18 @@ class RequestingBundles(RetryingRequestL
# "All paths %i -> %i" % (index + 1, latest))
# Find all extant edges.
- pending, current, next, finished = self._known_edges()
- all_edges = pending.union(current).union(next).union(finished)
+ pending, current, next, finished, never_run = self._known_edges()
+ # Ignore edges which have never been run.
+ self._remove_unrun(never_run)
+ all_edges = pending.union(current).union(next).union(finished) \
+ - never_run
#print "sets:", pending, current, next, finished
#print "finished_candidates: ", self.finished_candidates
if None in all_edges:
all_edges.remove(None)
assert not None in all_edges
- # BUG: What if an existing edge would be better?
- # i.e. how do you know to queue the new edges after
- # the better existing ones?
- # Is this just a problem with edges queued before graph?
+
# Find the edges we need to update.
first, second = get_update_edges(graph, index, redundancy, True,
all_edges)
@@ -868,7 +868,6 @@ class RequestingBundles(RetryingRequestL
chk = self.parent.ctx.graph.get_chk(edge)
candidate = [chk,
0, single_block, edge, None, None, False]
-
candidate_list.insert(0, candidate)
def _remove_old_candidates(self):
@@ -943,11 +942,54 @@ class RequestingBundles(RetryingRequestL
pending, currently scheduled, scheduled next or already
finished. """
- return (set([candidate[3] for candidate in
- self.pending_candidates()]),
- set([candidate[3] for candidate in self.current_candidates]),
- set([candidate[3] for candidate in self.next_candidates]),
- set([candidate[3] for candidate in self.finished_candidates]))
+ never_run = set([])
+
+ pending = set([candidate[3] for candidate in
+ self.pending_candidates()
+ if not candidate[3] is None])
+
+ current = set([])
+ for candidate in self.current_candidates:
+ if candidate[3] is None:
+ continue
+ current.add(candidate[3])
+ if candidate[1] <= 0:
+ never_run.add(candidate[3])
+
+ next = set([])
+ for candidate in self.next_candidates:
+ if candidate[3] is None:
+ continue
+ next.add(candidate[3])
+ if candidate[1] <= 0:
+ never_run.add(candidate[3])
+
+ finished = set([])
+ for candidate in self.finished_candidates:
+ if candidate[3] is None:
+ continue
+ finished.add(candidate[3])
+ #if candidate[1] <= 0:
+ # print "Finished candidate never ran???", candidate[3]
+
+ return (pending, current, next, finished, never_run)
+
+ def _remove_unrun(self, never_run):
+ """ INTERNAL: Remove edges that have never been run from the
+ current and next queues. """
+ never_run = never_run.copy()
+ for queue in (self.current_candidates, self.next_candidates):
+ for candidate in queue[:]:
+ if candidate[3] in never_run:
+ queue.remove(candidate)
+ never_run.remove(candidate[3])
+ assert len(never_run) == 0
+
+# return (set([candidate[3] for candidate in
+# self.pending_candidates()]),
+# set([candidate[3] for candidate in self.current_candidates]),
+# set([candidate[3] for candidate in self.next_candidates]),
+# set([candidate[3] for candidate in self.finished_candidates]))
############################################################