【发布时间】:2016-02-21 08:59:18
【问题描述】:
编辑:
基本上,我正在寻找一些关于如何理解我的 MongoDB 实例上正在运行的后台操作的提示,并可能在必要时减少/禁用它们,这样它们就不会干扰运行测试。我尝试了mongostat 和mongotop,但没有找到任何可以帮助我了解正在运行的后台操作以及启动它们的内容。 db.currentOp() 在我开始运行测试之前运行时始终返回一个空数组。
我在使用 node (mocha, cucumber) 开发时定期运行测试。从昨天开始,大约 25% 的时间服务器初始化尝试连接 mongodb 失败,并出现以下错误:
**Unhandled rejection MongoError: exception: cannot perform operation: a background operation is currently running for collection** somecollection
at Function.MongoError.create (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11)
at /somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:793:66
at bound (domain.js:254:14)
at runBound (domain.js:267:12)
at Callbacks.emit (.../node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:94:3)
at null.messageHandler (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:235:23)
at Socket.<anonymous> (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:294:20)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at Socket.Readable.push (_stream_readable.js:126:10)
at TCP.onread (net.js:538:20)
我们使用 pow-mongodb-fixtures 来清除数据库并在运行测试之前用一些基本数据填充它,这就是发生这种情况的地方。当这种情况开始发生时,AFAIK 并没有发生重大变化。我什至可以开始研究此错误的根源有什么想法吗?
【问题讨论】:
-
使用 db.currentOp() 检查正在运行的后台进程。在活动后台进程的情况下,您的客户端被配置为抛出此错误
-
这个命令总是返回一个空数组。可能当我运行它时,“后台操作”已经完成。不过,有时我需要运行 3 或 4 次才能克服此错误。
-
您可能使用
db.currentOp()走在正确的轨道上,但可能只是没有正确使用它。这篇文章更深入; Viewing and killing currently executing operations in MongoDB -
在运行测试之前我们 1. 清除整个数据库,然后 2. 插入一些基本文件。步骤 2 使用 mongoose 运行,因此它还添加了索引,但这仅在清除完成后才会发生。据我所知,这是清理失败。我可能是错的,错误可能来自确保索引的插入步骤(应该都已经存在的索引)。
-
@robocode,当我运行它时,db.currentOp() 再次返回一个空数组。您链接的文章假设您有一个需要一分钟或更长时间才能完成的操作,并且您有足够的时间进行调查。在我的情况下,这些后台操作似乎会运行一两秒钟然后停止,但经常是偶尔会干扰清除数据库。
标签: node.js mongodb mongodb-indexes