diff options
-rw-r--r-- | mediagoblin/db/mongo/util.py | 11 | ||||
-rw-r--r-- | mediagoblin/db/util.py | 3 | ||||
-rw-r--r-- | mediagoblin/processing.py | 18 |
3 files changed, 22 insertions, 10 deletions
diff --git a/mediagoblin/db/mongo/util.py b/mediagoblin/db/mongo/util.py index 4daf616a..89348d98 100644 --- a/mediagoblin/db/mongo/util.py +++ b/mediagoblin/db/mongo/util.py @@ -290,3 +290,14 @@ class MigrationManager(object): self.set_current_migration(migration_number) if post_callback: post_callback(migration_number, migration_func) + + +########################## +# Random utility functions +########################## + + +def atomic_update(table, query_dict, update_values): + table.collection.update( + query_dict, + {"$set": update_values}) diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 1fc949a6..c48c4ba6 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -22,4 +22,5 @@ except ImportError: if use_sql: from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING else: - from mediagoblin.db.mongo.util import ObjectId, InvalidId, DESCENDING + from mediagoblin.db.mongo.util import \ + ObjectId, InvalidId, DESCENDING, atomic_update diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py index a07de869..1c84c557 100644 --- a/mediagoblin/processing.py +++ b/mediagoblin/processing.py @@ -18,7 +18,7 @@ import logging from celery.task import Task -from mediagoblin.db.util import ObjectId +from mediagoblin.db.util import ObjectId, atomic_update from mediagoblin import mg_globals as mgg from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ @@ -108,22 +108,22 @@ def mark_entry_failed(entry_id, exc): if isinstance(exc, BaseProcessingFail): # Looks like yes, so record information about that failure and any # metadata the user might have supplied. - mgg.database['media_entries'].update( + atomic_update(mgg.database.MediaEntry, {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': exc.exception_path, - u'fail_metadata': exc.metadata}}) + {u'state': u'failed', + u'fail_error': exc.exception_path, + u'fail_metadata': exc.metadata}) else: _log.warn("No idea what happened here, but it failed: %r", exc) # Looks like no, so just mark it as failed and don't record a # failure_error (we'll assume it wasn't handled) and don't record # metadata (in fact overwrite it if somehow it had previous info # here) - mgg.database['media_entries'].update( + atomic_update(mgg.database.MediaEntry, {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': None, - u'fail_metadata': {}}}) + {u'state': u'failed', + u'fail_error': None, + u'fail_metadata': {}}) class BaseProcessingFail(Exception): |