ucsb-cs / submit

Repository for tracking issues, suggestions with the submit.cs system
https://ucsb-cs.github.io/submit/
BSD 2-Clause "Simplified" License
9 stars 5 forks source link

Handle race condition IntegrityError in fetch_or_create #11

Closed bboe closed 7 years ago

bboe commented 9 years ago

Exception handling around: https://github.com/ucsb-cs-education/nudibranch/blob/f71022d1d683d69f8c6b670ef7bdfe9542875baa/nudibranch/models.py#L157

In the event an integrity error had been raised, simply refetch the object.

The other fetch_or_create function in models.py should probably also be looked at and handled.

2014-11-20 22:41:43,600 http://submit.cs.ucsb.edu/file/9cd0a010349fb354cc7c8d5d16447a6ac1406977/_
Traceback (most recent call last):
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid_exclog-0.7-py2.7.egg/pyramid_exclog/__init__.py", line 111, in exclog_tween
    return handler(request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/router.py", line 163, in handle_request
    response = view_callable(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 596, in __call__
    return view(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 329, in attr_view
    return view(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 305, in predicate_wrapper
    return view(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 245, in _secured_view
    return view(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 355, in rendered_view
    result = view(context, request)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/config/views.py", line 501, in _requestonly_view
    response = view(request)
  File "build/bdist.linux-i686/egg/pyramid_addons/validation.py", line 62, in wrapped
    return function(request, **validated_params)
  File "./nudibranch/views.py", line 213, in file_create
    file_ = File.fetch_or_create(data, base_path, sha1sum=sha1sum)
  File "./nudibranch/models.py", line 157, in fetch_or_create
    Session.flush()
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1879, in flush
    self._flush(objects)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1997, in _flush
    transaction.rollback(_capture_exception=True)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 57, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1961, in _flush
    flush_context.execute()
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 370, in execute
    rec.execute(self)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 523, in execute
    uow
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 64, in save_obj
    mapper, table, insert)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 594, in _emit_insert_statements
    execute(statement, params)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 717, in execute
    return meth(self, multiparams, params)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 317, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 814, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 927, in _execute_context
    context)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1076, in _handle_dbapi_exception
    exc_info
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 185, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 920, in _execute_context
    context)
  File "/local/pyramid_apps/nudibranch/venv/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 425, in do_execute
    cursor.execute(statement, parameters)
IntegrityError: (IntegrityError) duplicate key value violates unique constraint "file_sha1_key"
 'INSERT INTO file (created_at, lines, sha1, size) VALUES (now(), %(lines)s, %(sha1)s, %(size)s) RETURNING file.id' {'sha1': u'9cd0a010349fb354cc7c8d5d16447a6ac1406977', 'lines': 6141, 'size': 1985873}
bboe commented 7 years ago

Not likely to be addressed.