         # so the only thing we do here is fail-fast.
         throw err if err
 
-# Enqueues the given content for conversion if we're processing old content and
-# this content hasn't been processed yet. Returns the content always.
-#
-# TODO: This is open to race conditions of multiple enqueues and thus workers.
-# We should ideally synchronize access, but we should also be robust to worker
-# failures or timeouts in that case, e.g. with a queue visibility timeout.
-#
-enqueueIfNeeded = (content) ->
-    if config.PROCESS_OLD_CONTENT and not content.ready
-        enqueueForConversion content
+    content._markActive _
+
+# TEMP: Enqueues the given content for conversion if we're processing old
+# content and this one hasn't been processed yet -- including not failed yet.
+# Returns the content always.
+enqueueIfNeeded = (_, content) ->
+    if config.PROCESS_OLD_CONTENT and not (content.ready or content.failed)
+        enqueueForConversion content, _
+
     content
 
 

                readFile (getFilePathForId id), _

        if json
            enqueueIfNeeded new Content JSON.parse json
        else
            null


            FS.symlink urlToIdPath, urlPath, _

        # Either way now:
        enqueueForConversion content, _

        content
