[tor-commits] [ooni-probe/master] When generating a summary do so inside of a separate thread to avoid blocking the reactor thread

art at torproject.org art at torproject.org
Fri Oct 14 19:00:56 UTC 2016


commit 44478df607a7a5b3e3fbdb129651ad4c9a2b2729
Author: Arturo Filastò <arturo at filasto.net>
Date:   Fri Oct 7 20:13:38 2016 +0200

    When generating a summary do so inside of a separate thread to avoid blocking the reactor thread
---
 ooni/measurements.py  | 15 ++++++++++++---
 ooni/ui/web/server.py |  6 ++++--
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/ooni/measurements.py b/ooni/measurements.py
index 422fc55..46a447e 100644
--- a/ooni/measurements.py
+++ b/ooni/measurements.py
@@ -1,5 +1,7 @@
 import json
 
+from twisted.internet import defer
+from twisted.internet.threads import deferToThread
 from twisted.python.filepath import FilePath
 from ooni.utils import log, is_process_running
 from ooni.utils.files import directory_usage
@@ -56,6 +58,7 @@ def generate_summary(input_file, output_file):
 
     with open(output_file, "w") as fw:
         json.dump(results, fw)
+    return results
 
 class MeasurementNotFound(Exception):
     pass
@@ -103,21 +106,27 @@ def get_measurement(measurement_id, compute_size=False):
 
 
 def get_summary(measurement_id):
+    """
+    Returns a deferred that will fire with the content of the summary
+     or will errback with MeasurementInProgress if the measurement has not
+     yet finished running.
+    """
     measurement_path = FilePath(config.measurements_directory)
     measurement = measurement_path.child(measurement_id)
 
     if measurement.child("measurements.njson.progress").exists():
-        raise MeasurementInProgress
+        return defer.fail(MeasurementInProgress)
 
     summary = measurement.child("summary.json")
     if not summary.exists():
-        generate_summary(
+        return deferToThread(
+            generate_summary,
             measurement.child("measurements.njson").path,
             summary.path
         )
 
     with summary.open("r") as f:
-        return json.load(f)
+        return defer.succeed(json.load(f))
 
 
 def list_measurements(compute_size=False):
diff --git a/ooni/ui/web/server.py b/ooni/ui/web/server.py
index 385bf18..fa35af0 100644
--- a/ooni/ui/web/server.py
+++ b/ooni/ui/web/server.py
@@ -527,7 +527,9 @@ class WebUIAPI(object):
     @app.route('/api/measurement/<string:measurement_id>', methods=["GET"])
     @xsrf_protect(check=False)
     @requires_true(attrs=['_is_initialized'])
+    @defer.inlineCallbacks
     def api_measurement_summary(self, request, measurement_id):
+        log.warn("SUMMARY")
         try:
             measurement = get_measurement(measurement_id)
         except InsecurePath:
@@ -540,8 +542,8 @@ class WebUIAPI(object):
         if measurement['completed'] is False:
             raise WebUIError(400, "measurement in progress")
 
-        summary = get_summary(measurement_id)
-        return self.render_json(summary, request)
+        summary = yield get_summary(measurement_id)
+        defer.returnValue(self.render_json(summary, request))
 
     @app.route('/api/measurement/<string:measurement_id>', methods=["DELETE"])
     @xsrf_protect(check=True)





More information about the tor-commits mailing list