瀏覽代碼

reject very large ops

Brian Gough 10 年之前
父節點
當前提交
b44a7b9aa6
共有 2 個文件被更改,包括 12 次插入 和 0 次删除
  1. 1 0
      services/track-changes/app.coffee
  2. 11 0
      services/track-changes/app/coffee/UpdatesManager.coffee

+ 1 - 0
services/track-changes/app.coffee

@@ -16,6 +16,7 @@ truncateFn = (updates) ->
 TrackChangesLogger.addSerializers {
 	rawUpdates: truncateFn
 	newUpdates: truncateFn
+	rawUpdate: truncateFn
 	lastUpdate: truncateFn
 }
 

+ 11 - 0
services/track-changes/app/coffee/UpdatesManager.coffee

@@ -47,6 +47,17 @@ module.exports = UpdatesManager =
 			if rawUpdates.length == 0
 				return callback()
 
+			# some old large ops in redis need to be rejected, they predate
+			# the size limit that now prevents them going through the system
+			REJECT_LARGE_OP_SIZE = 4 * 1024 * 1024
+			for rawUpdate in rawUpdates
+				opSizes = ((op.i?.length || op.d?.length) for op in rawUpdate?.op or [])
+				size = _.max opSizes
+				if size > REJECT_LARGE_OP_SIZE
+					error = new Error("dropped op exceeding maximum allowed size of #{REJECT_LARGE_OP_SIZE}")
+					logger.error err: error, doc_id: doc_id, project_id: project_id, size: size, rawUpdate: rawUpdate, "dropped op - too big"
+					rawUpdate.op = []
+
 			if (not lastCompressedUpdate?) or lastCompressedUpdate.pack? # handle pack append as a special case
 				UpdatesManager._updatePack project_id, doc_id, rawUpdates, temporary, lastCompressedUpdate, lastVersion, callback
 			else #use the existing op code