Просмотр исходного кода

gracefully handle updates marked as broken

set update.broken == true to allow the user to view history without a
crash
Brian Gough 11 лет назад
Родитель
Сommit
ad144371d0

+ 9 - 1
services/track-changes/app/coffee/DiffManager.coffee

@@ -14,7 +14,11 @@ module.exports = DiffManager =
 	getDiff: (project_id, doc_id, fromVersion, toVersion, callback = (error, diff) ->) ->
 		logger.log project_id: project_id, doc_id: doc_id, from: fromVersion, to: toVersion, "getting diff"
 		DiffManager.getDocumentBeforeVersion project_id, doc_id, fromVersion, (error, startingContent, updates) ->
-			return callback(error) if error?
+			if error?
+				if error.message == "broken-history"
+					return callback(null, "history unavailable")
+				else
+					return callback(error)
 
 			updatesToApply = []
 			for update in updates.slice().reverse()
@@ -33,6 +37,10 @@ module.exports = DiffManager =
 		DiffManager.getLatestDocAndUpdates project_id, doc_id, version, null, (error, content, version, updates) ->
 			return callback(error) if error?
 
+			# bail out if we hit a broken update
+			for u in updates when u.broken
+				return callback new Error "broken-history"
+
 			lastUpdate = updates[0]
 			if lastUpdate? and lastUpdate.v != version - 1
 				return callback new Error("latest update version, #{lastUpdate.v}, does not match doc version, #{version}")

+ 3 - 0
services/track-changes/app/coffee/MongoManager.coffee

@@ -33,6 +33,9 @@ module.exports = MongoManager =
 					# we want to force a new update, but ensure that it is
 					# consistent with the version of the existing one in S3
 					return callback null, null, update.v
+				else if update.broken
+					# the update is marked as broken so we will force a new op
+					return callback null, null
 				else
 					MongoManager.deleteCompressedUpdate update._id, (error) ->
 						return callback(error) if error?