From c3aab9193bb2a25daba9650b13c3314294c1e3e9 Mon Sep 17 00:00:00 2001
From: osmala <ossi.laine@utu.fi>
Date: Tue, 26 Jan 2021 17:28:16 +0200
Subject: [PATCH] Flush writes between every row when generating big CSV export
 file

---
 app/experiment/views.py | 14 +++-----------
 app/utils.py            |  9 +++++----
 2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/app/experiment/views.py b/app/experiment/views.py
index 4506e74..3bf8aeb 100644
--- a/app/experiment/views.py
+++ b/app/experiment/views.py
@@ -1062,25 +1062,17 @@ def start_download_csv():
 def download_csv(meta):
     exp_id = meta["exp_id"]
 
-
-    # error handling
-    '''
-    if isinstance(data, Exception):
-        emit('timeout', {'exc': str(data)})
-        return
-    '''
-
     # create temporary file
     fd, path = mkstemp()
-    with os.fdopen(fd, 'w') as tmp:
-
+    with os.fdopen(fd, 'w', buffering=1) as tmp:
         if generate_csv(exp_id, tmp):
-
             # return path and filename to front so user can start downloading
             filename = "experiment_{}_{}".format(
                 exp_id, date.today().strftime("%Y-%m-%d"))
             path = path.split('/')[-1]
             emit('file_ready', {'path': path, 'filename': filename})
+        else:
+            emit('timeout', {'exc': 'job failed'})
 
 
 @socketio.on('end', namespace="/download_csv")
diff --git a/app/utils.py b/app/utils.py
index 36c1e32..9fc8802 100644
--- a/app/utils.py
+++ b/app/utils.py
@@ -166,12 +166,12 @@ def generate_csv(exp_id, file_handle):
                 emit('progress', {'done': nth, 'from': len_participants})
                 data = future.result()
                 file_handle.write(data + '\n')
+                # to ensure that all internal buffers associated with fd are written to disk
+                file_handle.flush()
             except Exception as exc:
                 print('generated an exception: {}'.format(exc))
-                emit('timeout', {'exc': str(data)})
-                return False
+                # return False
     
-    # file_handle.flush()
     return True
 
 
@@ -263,7 +263,8 @@ def generate_answer_row(participant, pages, questions, embody_questions):
                 answers_list.append(json.dumps(coordinates_to_bitmap))
 
             except ValueError as err:
-                app.logger(err)
+                print(err)
+                #app.logger(err)
 
         answer_row += ';'.join(answers_list) if embody_answers else \
             len(embody_questions) * len(pages) * ';'
-- 
GitLab