【发布时间】:2017-08-11 13:07:31
【问题描述】:
我有一个内置在 Node/Meteor 中的文件存储服务,它利用了 GridFS,它被复制到多个容器中。我目前试图找到的是,这段代码是否真的知道读/写一致性
db.command({
filemd5: someFileId,
root: 'fs'
}, function callback(err, results) {
...
})
我正在以块的形式上传文件,并且在将所有块合并到一个文件中之后执行该命令。而且我感觉它正在使用辅助成员(我有几个 md5 值是空文件 - d41d8cd98f00b204e9800998ecf8427e)。是否有任何文档或其他设置?
这 2 个参数是文档中描述的唯一选项。https://docs.mongodb.com/manual/reference/command/filemd5/
更新
合并块的确切代码在第 3 方包中:
cursor = files.find(
{
'metadata._Resumable.resumableIdentifier': file.metadata._Resumable.resumableIdentifier
length:
$ne: 0
},
{
fields:
length: 1
metadata: 1
sort:
'metadata._Resumable.resumableChunkNumber': 1
}
)
https://github.com/vsivsi/meteor-file-collection/blob/master/src/resumable_server.coffee#L26
然后是第 111-119 行,它首先执行 filemd5,然后对文件运行更新
@db.command md5Command, (err, results) ->
if err
lock.releaseLock()
return callback err
# Update the size and md5 to the file data
files.update { _id: fileId }, { $set: { length: file.metadata._Resumable.resumableTotalSize, md5: results.md5 }},
(err, res) =>
lock.releaseLock()
callback err
https://github.com/vsivsi/meteor-file-collection/blob/master/src/resumable_server.coffee#L111-L119
写完最后一个块后,cursor = files.find() 与所有合并的东西一起启动,因此如果读取首选项是secondaryPreferred,那么它们可能不在那里?是否应该将该代码重构为仅使用主要代码?
【问题讨论】:
-
你能详细说明你是如何上传和合并这些块的吗?您可以查看 mongo 日志或
files和chunks集合以获取完整的文档详细信息。现在,我会将文档和资料放在答案中。 -
@MasterAM 我已经包含了原始源代码(它是coffeescript,但应该看看那里运行的实际查询)
-
经过一番研究,它的行为似乎不像我预期的那样。我没有时间进行更深入的研究,因此我认为除了答案中的参考资料之外,我无法为您提供帮助。 admin 命令提供的 md5 似乎不是取自
files文档,而是在保存文件时可能存储在其他地方。 -
@MasterAM 谢谢!我将研究结果,看看问题是否仍然存在
标签: node.js mongodb meteor database-replication gridfs