[ARVADOS] updated: 84cc9874760687a061dc489f5a19db66cb06108e

git at public.curoverse.com git at public.curoverse.com
Fri Aug 7 18:37:04 EDT 2015


Summary of changes:
 apps/workbench/app/models/arvados_base.rb          |   4 +
 apps/workbench/app/models/user.rb                  |   3 +
 .../application/_delete_object_button.html.erb     |   2 +-
 .../views/application/_show_home_button.html.erb   |   3 +
 .../app/views/application/_show_recent.html.erb    |  18 +--
 .../controllers/application_controller_test.rb     |  41 ++++++
 doc/install/install-api-server.html.textile.liquid |   4 +-
 ...nstall-manual-prerequisites.html.textile.liquid |  11 +-
 sdk/python/arvados/__init__.py                     |  82 ++++++++----
 sdk/python/arvados/arvfile.py                      |   4 +-
 sdk/python/arvados/commands/arv_copy.py            |  36 +++---
 sdk/python/arvados/keep.py                         |   5 +-
 sdk/python/arvados/retry.py                        |   3 +-
 sdk/python/tests/test_retry.py                     |   6 +-
 sdk/python/tests/test_websockets.py                | 137 ++++++++++-----------
 services/api/test/fixtures/humans.yml              |   1 +
 16 files changed, 219 insertions(+), 141 deletions(-)
 create mode 100644 apps/workbench/app/views/application/_show_home_button.html.erb
 create mode 100644 services/api/test/fixtures/humans.yml

       via  84cc9874760687a061dc489f5a19db66cb06108e (commit)
       via  7d04c8989b082aa32bcc0d9812950e8503fafd64 (commit)
       via  f8098830e4aa4623b82dc7e81531497ae2f48f07 (commit)
       via  9209660a3bd951c3945bce0da2fa9195cb002e44 (commit)
       via  0988acb472849dc08d576ee40493e70bde2132ca (commit)
       via  f46b05c041684ced4cf438ae6cade577156f81a5 (commit)
       via  fc851b249ea25a40a1fb392906705142113ac5b9 (commit)
       via  d2d7138c84a55ef87937cdaefd9c58a66916d76f (commit)
       via  8fe01fcc1b88a49f1f7eff14d0435e3ac0649721 (commit)
       via  8089b2f5c97b1db9bd826a1b6488f1b060830def (commit)
       via  97f16e9b6ce0095a40b68781238550d066a15261 (commit)
       via  43338e77fc9ac255511395d8a8b1ae4bb8c98577 (commit)
       via  bbf7272aa2b831102c47fc93f8966ec32e918205 (commit)
       via  03d5c4df2f33c5bb2117c45869808fa018e855f1 (commit)
       via  261fe4c689858952b19991e0055eda669ab144af (commit)
       via  427d9052d59ca7819acba9fb2e5f381d3e44a53e (commit)
       via  c8bea0c6dd47a9b9a7a892602d9869177d4c231f (commit)
       via  93e0931ea059355ffc26add1303a52f13d2964c9 (commit)
       via  467b636f7d1b34f7695f55af972ae90132fc8063 (commit)
       via  75eaaaa74a4a7ec6821008fe93dbee598ee24dee (commit)
      from  4b096c9ab1a9a457b2df2ac7309b340268741665 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 84cc9874760687a061dc489f5a19db66cb06108e
Author: Bryan Cosca <bcosc at curoverse.com>
Date:   Fri Aug 7 18:36:53 2015 -0400

    Added RetryLoop to current_task, current_job, and task_set_output with logging and retrying, and waiting 1 second between retries. Also added __init__ method to the jobclass(?) to deal with num_retries and put them in execute. Waiting for verification to see if that works, or moving to the RetryLoop model.

diff --git a/sdk/python/arvados/__init__.py b/sdk/python/arvados/__init__.py
index 1245b5a..b7b2c15 100644
--- a/sdk/python/arvados/__init__.py
+++ b/sdk/python/arvados/__init__.py
@@ -20,6 +20,7 @@ import threading
 
 from .api import api, http_cache
 from .retry import retry_method
+from retry import RetryLoop
 from collection import CollectionReader, CollectionWriter, ResumableCollectionWriter
 from keep import *
 from stream import *
@@ -39,26 +40,43 @@ logger.setLevel(logging.DEBUG if config.get('ARVADOS_DEBUG')
                 else logging.WARNING)
 
 @retry_method
-def task_set_output(self,s,num_retries=5):
-    api('v1').job_tasks().update(uuid=self['uuid'],
-                                 body={
-            'output':s,
-            'success':True,
-            'progress':1.0
-            }).execute()
+def task_set_output(self,s):
+    output_retry_loop = RetryLoop(num_retries=5, backoff_start=1)
+    for tries_left in output_retry_loop:
+	try:
+	    api('v1').job_tasks().update(uuid=self['uuid'],
+        	                         body={
+            					'output':s,
+				            	'success':True,
+				            	'progress':1.0
+			                 	}).execute()
+	except TemporaryError as error:
+	    logger.debug("Error in task_set_output api call: {} ({} tries left)".format(error,tries_left))
+	else:
+	    output_retry_loop.save_result(result)
+    if output_retry_loop.success():
+	return output_retry_loop.last_result()	    
 
 _current_task = None
 @retry_method
-def current_task(num_retries=5):
+def current_task():
     global _current_task
     if _current_task:
         return _current_task
-    t = api('v1').job_tasks().get(uuid=os.environ['TASK_UUID']).execute()
-    t = UserDict.UserDict(t)
-    t.set_output = types.MethodType(task_set_output, t)
-    t.tmpdir = os.environ['TASK_WORK']
-    _current_task = t
-    return t
+    current_task_retry_loop = RetryLoop(num_retries=5, backoff_start=1)
+    for tries_left in current_task_retry_loop:
+	try:
+	    t = api('v1').job_tasks().get(uuid=os.environ['TASK_UUID']).execute()
+	except TemporaryError as error:
+	    logger.debug("Error in current_task api call: {} ({} tries left)".format(error,tries_left))
+	else:
+	    current_task_retry_loop.save_result(result)
+    if current_task_retry_loop.success():
+        t = UserDict.UserDict(t)
+        t.set_output = types.MethodType(task_set_output, t)
+        t.tmpdir = os.environ['TASK_WORK']
+        _current_task = t
+        return t
 
 _current_job = None
 @retry_method
@@ -66,11 +84,19 @@ def current_job(num_retries=5):
     global _current_job
     if _current_job:
         return _current_job
-    t = api('v1').jobs().get(uuid=os.environ['JOB_UUID']).execute()
-    t = UserDict.UserDict(t)
-    t.tmpdir = os.environ['JOB_WORK']
-    _current_job = t
-    return t
+    current_job_retry_loop = RetryLoop(num_retries=5, backoff_start=1)
+    for tries_left in current_job_retry_loop:
+	try:
+	    t = api('v1').jobs().get(uuid=os.environ['JOB_UUID']).execute()
+	except TemporaryError as error:
+	    logger.debug("Error in current_job api call: {} ({} tries left)".format(error,tries_left))
+	else:
+	    current_job_retry_loop.save_result(result)
+    if current_job_retry_loop.success():
+        t = UserDict.UserDict(t)
+        t.tmpdir = os.environ['JOB_WORK']
+        _current_job = t
+        return t
 
 def getjobparam(*args):
     return current_job()['script_parameters'].get(*args)
@@ -87,11 +113,12 @@ class JobTask(object):
 
 class job_setup:
     @retry_method
-    def _add_task(self, num_retries=5):
-        return
+    def __init__(self, num_retries=5):
+        self.num_retries = num_retries
 
+    @retry_method
     @staticmethod
-    def one_task_per_input_file(if_sequence=0, and_end_task=True, input_as_path=False, api_client=None):
+    def one_task_per_input_file(if_sequence=0, and_end_task=True, input_as_path=False, api_client=None, num_retries=None):
         if if_sequence != current_task()['sequence']:
             return
 
@@ -115,15 +142,16 @@ class job_setup:
                         'input':task_input
                         }
                     }
-                api_client.job_tasks().create(body=new_task_attrs).execute()._add_task()
+                api_client.job_tasks().create(body=new_task_attrs).execute(num_retries)
         if and_end_task:
             api_client.job_tasks().update(uuid=current_task()['uuid'],
                                        body={'success':True}
-                                       ).execute()._add_task()
+                                       ).execute(num_retries)
             exit(0)
 
+    @retry_method
     @staticmethod
-    def one_task_per_input_stream(if_sequence=0, and_end_task=True):
+    def one_task_per_input_stream(if_sequence=0, and_end_task=True, num_retries=None):
         if if_sequence != current_task()['sequence']:
             return
         job_input = current_job()['script_parameters']['input']
@@ -138,9 +166,9 @@ class job_setup:
                     'input':task_input
                     }
                 }
-            api('v1').job_tasks().create(body=new_task_attrs).execute()._add_task()
+            api('v1').job_tasks().create(body=new_task_attrs).execute(num_retries)
         if and_end_task:
             api('v1').job_tasks().update(uuid=current_task()['uuid'],
                                        body={'success':True}
-                                       ).execute()._add_task()
+                                       ).execute(num_retries)
             exit(0)

commit 7d04c8989b082aa32bcc0d9812950e8503fafd64
Merge: 4b096c9 f809883
Author: Bryan Cosca <bcosc at curoverse.com>
Date:   Fri Aug 7 14:28:49 2015 -0400

    Merge branch '6844-py-mem-leak' of git.curoverse.com:arvados into 6600-pysdk-api-retries
    
    Get memory-leak fix


-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list