summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py87
-rw-r--r--nova/openstack/common/eventlet_backdoor.py2
-rw-r--r--tools/test-requires3
3 files changed, 39 insertions, 53 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 4a752d177..cc83ec4f5 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -4714,49 +4714,44 @@ def _ec2_instance_get_query(context, session=None):
@require_admin_context
-def task_log_get(context, task_name, period_beginning,
- period_ending, host, state=None, session=None):
+def _task_log_get_query(context, task_name, period_beginning,
+ period_ending, host=None, state=None, session=None):
query = model_query(context, models.TaskLog, session=session).\
filter_by(task_name=task_name).\
filter_by(period_beginning=period_beginning).\
- filter_by(period_ending=period_ending).\
- filter_by(host=host)
+ filter_by(period_ending=period_ending)
+ if host is not None:
+ query = query.filter_by(host=host)
if state is not None:
query = query.filter_by(state=state)
+ return query
+
- return query.first()
+@require_admin_context
+def task_log_get(context, task_name, period_beginning, period_ending, host,
+ state=None):
+ return _task_log_get_query(task_name, period_beginning, period_ending,
+ host, state).first()
@require_admin_context
-def task_log_get_all(context, task_name, period_beginning,
- period_ending, host=None, state=None, session=None):
- query = model_query(context, models.TaskLog, session=session).\
- filter_by(task_name=task_name).\
- filter_by(period_beginning=period_beginning).\
- filter_by(period_ending=period_ending)
- if host is not None:
- query = query.filter_by(host=host)
- if state is not None:
- query = query.filter_by(state=state)
- return query.all()
+def task_log_get_all(context, task_name, period_beginning, period_ending,
+ host=None, state=None):
+ return _task_log_get_query(task_name, period_beginning, period_ending,
+ host, state).all()
@require_admin_context
-def task_log_begin_task(context, task_name,
- period_beginning,
- period_ending,
- host,
- task_items=None,
- message=None,
- session=None):
- session = session or get_session()
+def task_log_begin_task(context, task_name, period_beginning, period_ending,
+ host, task_items=None, message=None):
+ # NOTE(boris-42): This method has a race condition and will be rewritten
+ # after bp/db-unique-keys implementation.
+ session = get_session()
with session.begin():
- task = task_log_get(context, task_name,
- period_beginning,
- period_ending,
- host,
- session=session)
- if task:
+ task_ref = _task_log_get_query(context, task_name, period_beginning,
+ period_ending, host, session=session).\
+ first()
+ if task_ref:
#It's already run(ning)!
raise exception.TaskAlreadyRunning(task_name=task_name, host=host)
task = models.TaskLog()
@@ -4770,30 +4765,20 @@ def task_log_begin_task(context, task_name,
if task_items:
task.task_items = task_items
task.save(session=session)
- return task
@require_admin_context
-def task_log_end_task(context, task_name,
- period_beginning,
- period_ending,
- host,
- errors,
- message=None,
- session=None):
- session = session or get_session()
+def task_log_end_task(context, task_name, period_beginning, period_ending,
+ host, errors, message=None):
+ values = dict(state="DONE", errors=errors)
+ if message:
+ values["message"] = message
+
+ session = get_session()
with session.begin():
- task = task_log_get(context, task_name,
- period_beginning,
- period_ending,
- host,
- session=session)
- if not task:
+ rows = _task_log_get_query(context, task_name, period_beginning,
+ period_ending, host, session=session).\
+ update(values)
+ if rows == 0:
#It's not running!
raise exception.TaskNotRunning(task_name=task_name, host=host)
- task.state = "DONE"
- if message:
- task.message = message
- task.errors = errors
- task.save(session=session)
- return task
diff --git a/nova/openstack/common/eventlet_backdoor.py b/nova/openstack/common/eventlet_backdoor.py
index f18e84f6d..118385427 100644
--- a/nova/openstack/common/eventlet_backdoor.py
+++ b/nova/openstack/common/eventlet_backdoor.py
@@ -46,7 +46,7 @@ def _find_objects(t):
def _print_greenthreads():
- for i, gt in enumerate(find_objects(greenlet.greenlet)):
+ for i, gt in enumerate(_find_objects(greenlet.greenlet)):
print i, gt
traceback.print_stack(gt.gr_frame)
print
diff --git a/tools/test-requires b/tools/test-requires
index 5f195d5c1..c691a6bca 100644
--- a/tools/test-requires
+++ b/tools/test-requires
@@ -12,4 +12,5 @@ pylint==0.25.2
python-subunit
sphinx>=1.1.2
testrepository>=0.0.13
-testtools>=0.9.22
+# testtools 0.9.25 is broken, change this when upstream is fixed (bug 1102400)
+testtools>=0.9.22,<=0.9.24