[tor-commits] [ooni-probe/master] Generate the filename for the report late on to avoid conflicts in measurement IDs

art at torproject.org art at torproject.org
Mon Sep 19 12:14:25 UTC 2016


commit 40b83a84265a24bd6777195b43a36edc8dc42640
Author: Arturo Filastò <arturo at filasto.net>
Date:   Tue Sep 6 22:05:15 2016 +0200

    Generate the filename for the report late on to avoid conflicts in measurement IDs
---
 ooni/deck/deck.py | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/ooni/deck/deck.py b/ooni/deck/deck.py
index e4c35c4..3fc10ab 100644
--- a/ooni/deck/deck.py
+++ b/ooni/deck/deck.py
@@ -1,4 +1,6 @@
 import os
+import uuid
+import errno
 from copy import deepcopy
 from string import Template
 
@@ -90,7 +92,6 @@ class NGDeck(object):
 
         self._measurement_path = FilePath(config.measurements_directory)
         self._tasks = []
-        self.task_ids = []
 
         if deck_path is not None:
             self.open(deck_path)
@@ -145,7 +146,6 @@ class NGDeck(object):
                     self.bouncer.backend_type == "onion"):
                 self.requires_tor = True
             self._tasks.append(deck_task)
-            self.task_ids.append(deck_task.id)
 
         if self.metadata.get('no_collector', False):
             self.no_collector = True
@@ -217,7 +217,10 @@ class NGDeck(object):
 
     def _run_ooni_task(self, task, director):
         net_test_loader = task.ooni["net_test_loader"]
-        test_details = task.ooni["test_details"]
+        # XXX-REFACTOR we do this so late to avoid the collision between the
+        #  same id and hence generating the same filename.
+        test_details = net_test_loader.getTestDetails()
+        task.id = generate_filename(test_details)
 
         measurement_id = None
         report_filename = task.output_path
@@ -228,9 +231,9 @@ class NGDeck(object):
             try:
                 measurement_dir.createDirectory()
             except OSError as ose:
-                # Ignore 'File Exists'
-                if ose.errno != 17:
-                    raise
+                if ose.errno == errno.EEXIST:
+                    raise Exception("Directory already exists, there is a "
+                                    "collision")
 
             report_filename = measurement_dir.child("measurements.njson.progress").path
             pid_file = measurement_dir.child("running.pid")
@@ -388,10 +391,9 @@ class DeckTask(object):
             )
             file_path = resolve_file_path(filename, self.cwd)
             input_file['test_options'][input_file['key']] = file_path
-        self.ooni['test_details'] = self.ooni['net_test_loader'].getTestDetails()
-        self.id = generate_filename(self.ooni['test_details'])
 
     def setup(self):
+        self.id = str(uuid.uuid4())
         return getattr(self, "_setup_"+self.type)()
 
     def _load(self, data):





More information about the tor-commits mailing list