I tried to fix this with nested transactions (on the Runs and WorkQueue tables) but that made SQLite unhappy. Calling db.session.flush() doesn't work either. I think the cause is the lockmode='update' when the run is selected.
2013-07-26 14:51:48.722 /api/request_run 500 2228ms 0kb Python-urllib/2.7
ELIDED - - [26/Jul/2013:14:51:48 -0700] "POST /api/request_run HTTP/1.1" 500 337 - "Python-urllib/2.7" "dpxdt-test.appspot.com" ms=2228 cpu_ms=0 cpm_usd=0.000038 pending_ms=439 app_engine_release=1.8.2 instance=00c61b117cbd5b476db0c7e6e5ed26da0cfd7e14
D 2013-07-26 14:51:46.956
Authenticated as API key=u'ELIDED'
I 2013-07-26 14:51:47.310
Created run: build_id=ELIDED, release_name=u'ELIDED', release_number=14, run_name='creator_step_2_of_3_websat_image_choice'
D 2013-07-26 14:51:47.448
Upload already exists: artifact_id='1fa68fa780103bb717005ebb58da61491ffd1d43'
I 2013-07-26 14:51:47.548
Enqueueing capture task='14316:ddacaeb20863e337ca4b7b7a60fd998d3b80ba62', baseline=False
D 2013-07-26 14:51:47.819
Upload already exists: artifact_id='f409f62c47f836df867e4ab32eaf2bbf31da75da'
I 2013-07-26 14:51:48.217
Enqueueing capture task='14316:2f75fb9ae9b71f328108309cd51ebf0ab94742b8:baseline', baseline=True
E 2013-07-26 14:51:48.491
Exception on /api/request_run [POST]
Traceback (most recent call last):
File "./lib/flask/app.py", line 1809, in wsgi_app
response = self.full_dispatch_request()
File "./lib/flask/app.py", line 1482, in full_dispatch_request
rv = self.handle_user_exception(e)
File "./lib/flask/app.py", line 1480, in full_dispatch_request
rv = self.dispatch_request()
File "./lib/flask/app.py", line 1466, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/base/data/home/apps/s~dpxdt-test/07-21-r01.368952019609286338/dpxdt/server/auth.py", line 331, in wrapped
return f(*args, **kwargs)
File "/base/data/home/apps/s~dpxdt-test/07-21-r01.368952019609286338/dpxdt/server/api.py", line 342, in request_run
db.session.commit()
File "./lib/sqlalchemy/orm/scoping.py", line 149, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "./lib/sqlalchemy/orm/session.py", line 721, in commit
self.transaction.commit()
File "./lib/sqlalchemy/orm/session.py", line 354, in commit
self._prepare_impl()
File "./lib/sqlalchemy/orm/session.py", line 334, in _prepare_impl
self.session.flush()
File "./lib/sqlalchemy/orm/session.py", line 1818, in flush
self._flush(objects)
File "./lib/sqlalchemy/orm/session.py", line 1936, in _flush
transaction.rollback(_capture_exception=True)
File "./lib/sqlalchemy/util/langhelpers.py", line 56, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "./lib/sqlalchemy/orm/session.py", line 1900, in _flush
flush_context.execute()
File "./lib/sqlalchemy/orm/unitofwork.py", line 372, in execute
rec.execute(self)
File "./lib/sqlalchemy/orm/unitofwork.py", line 525, in execute
uow
File "./lib/sqlalchemy/orm/persistence.py", line 64, in save_obj
table, insert)
File "./lib/sqlalchemy/orm/persistence.py", line 538, in _emit_insert_statements
execute(statement, multiparams)
File "./lib/sqlalchemy/engine/base.py", line 662, in execute
params)
File "./lib/sqlalchemy/engine/base.py", line 763, in _execute_clauseelement
compiled_sql, distilled_params
File "./lib/sqlalchemy/engine/base.py", line 876, in _execute_context
context)
File "./lib/sqlalchemy/engine/base.py", line 1020, in _handle_dbapi_exception
exc_info
File "./lib/sqlalchemy/util/compat.py", line 199, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "./lib/sqlalchemy/engine/base.py", line 869, in _execute_context
context)
File "./lib/sqlalchemy/engine/default.py", line 326, in do_execute
cursor.execute(statement, parameters)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py", line 566, in execute
self._DoExec(request)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py", line 446, in _DoExec
response = self._conn.MakeRequest('Exec', request)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py", line 940, in MakeRequest
response = self._MakeRetriableRequest(stub_method, request)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/storage/speckle/python/api/rdbms.py", line 969, in _MakeRetriableRequest
raise _ToDbApiException(sql_exception)
OperationalError: (OperationalError) (1213L, u'Deadlock found when trying to get lock; try restarting transaction') 'INSERT INTO work_queue (task_id, queue_name, live, eta, source, created, finished, lease_attempts, last_lease, last_owner, heartbeat, heartbeat_number, payload, content_type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' ('14316:2f75fb9ae9b71f328108309cd51ebf0ab94742b8:baseline', 'capture', 1, datetime.datetime(2013, 7, 26, 21, 51, 48, 451540), 'request_run', datetime.datetime(2013, 7, 26, 21, 51, 48, 452970), None, 0, None, None, None, None, '{"build_id": ELIDED, "config_sha1sum": "f409f62c47f836df867e4ab32eaf2bbf31da75da", "baseline": true, "run_name": "ELIDED", "url": "ELIDED", "release_name": "ELIDED", "release_number": 14}', 'application/json')