[tor-commits] [ooni-probe/master] Make how we keep track of successful reports more robust.

art at torproject.org art at torproject.org
Tue Apr 30 13:01:45 UTC 2013


commit 056a24b84505d1d3f2602bc5ae55e8eea9edafba
Author: Arturo Filastò <art at fuffa.org>
Date:   Mon Apr 29 13:42:01 2013 +0200

    Make how we keep track of successful reports more robust.
---
 ooni/reporter.py |   12 ++++++------
 ooni/tasks.py    |   19 +++++++++++++++++++
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/ooni/reporter.py b/ooni/reporter.py
index b04b46b..732d516 100644
--- a/ooni/reporter.py
+++ b/ooni/reporter.py
@@ -34,7 +34,7 @@ from ooni.utils.net import BodyReceiver, StringProducer, userAgents
 
 from ooni import config
 
-from ooni.tasks import ReportEntry, TaskTimedOut
+from ooni.tasks import ReportEntry, TaskTimedOut, ReportTracker
 
 class ReporterException(Exception):
     pass
@@ -429,13 +429,13 @@ class Report(object):
             been written or errbacks when no more reporters
         """
         all_written = defer.Deferred()
-        self._report_write_completed = []
+        report_tracker = ReportTracker(self.reporters)
 
         for reporter in self.reporters[:]:
-            def report_completed(result):
-                self._report_write_completed.append(result)
-                if len(self.reporters) == len(self._report_write_completed):
-                    all_written.callback(self._report_write_completed)
+            def report_completed(task):
+                report_tracker.completed()
+                if report_tracker.finished():
+                    all_written.callback(report_tracker)
 
             report_entry_task = ReportEntry(reporter, measurement)
             self.reportEntryManager.schedule(report_entry_task)
diff --git a/ooni/tasks.py b/ooni/tasks.py
index 59a908d..428fdbf 100644
--- a/ooni/tasks.py
+++ b/ooni/tasks.py
@@ -129,6 +129,25 @@ class Measurement(TaskWithTimeout):
         d = self.netTestMethod()
         return d
 
+class ReportTracker(object):
+    def __init__(self, reporters):
+        self.report_completed = 0
+        self.reporters = reporters
+
+    def finished(self):
+        """
+        Returns true if all the tasks are done. False if not.
+        """
+        if self.report_completed == len(self.reporters):
+            return True
+        return False
+
+    def completed(self):
+        """
+        Called when a new report is completed.
+        """
+        self.report_completed += 1
+
 class ReportEntry(TaskWithTimeout):
     timeout = config.advanced.reporting_timeout
 





More information about the tor-commits mailing list