CouchDB阻止冲突复制

时间:2014-06-23 07:43:45

标签: couchdb replication conflict merge-conflict-resolution

我希望能够阻止“推送”。如果存在任何冲突,则从用户的本地实例(其中有许多用户)到中央CouchDB实例(或复制) - 基本上从Git或Mercurial复制功能,其中用户必须解决他们的冲突在推送到中央服务器之前进行本地复制(因此服务器可以保持'清理')。

据我所知,有两种选择;阻止用户在发生冲突时提交(虽然我没有实际完成复制就看不到任何方法),或者完成复制,查看是否存在任何冲突,然后删除推送的复制(和相关文件)如果存在冲突(尽管如果在重新删除文档之前完成拉取,这也可能导致不良行为,并且效率有点低)。

所以最好把它烧掉,理想情况下,如果发生冲突,我希望复制回滚,并通知我发生了冲突(我不在乎冲突的性质,因为那时我可以启动一个拉取请求复制来复制本地数据库上的中央数据库。)

有没有办法实现我错过的任何一种方法?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用validate_doc_update函数实现此目的。 AFAIK您可以访问新文档中的_conflicts属性以检查是否存在一些冲突。但我以前从未尝试过这个。

也许这样的功能可行:

function(newDoc, oldDoc, userCtx, secObj) {
  if (newDoc._conflicts && newDoc._conflicts.length) {
    throw({forbidden: 'Your change would cause conflicts. Try resolving the conflicts locally before replicating.'});
  }
}

只需确保此validate_doc_update函数仅存在于中央数据库的设计文档中,否则用户将无法“拉”"他们的本地数据库发生了相互冲突的变化。

如果有效,请告诉我!

答案 1 :(得分:0)

虽然它可能不是最好的解决方案,但我做了一些更复杂的事情;

  1. 向中央数据库发出复制请求,将复制ID指定为[RequestingMacAddress]。[Guid]。
  2. 当向中央数据库发出复制推送请求时,我使用自定义视图(使用相同的MAC地址)检查最后一个拉取请求ID(在中央数据库上)。
  3. 我按降序拉_changes,并确保DB上的最新更改是上面指定的[RequestingMacAddress]。[GUID],或者是另一个pull请求(到另一台机器),并且没有任务当前处于活动状态(例如,推送复制正在从另一台计算机进行)。
  4. 如果一切顺利 - 允许推送复制继续,否则输出错误。
  5. 如果有的话,会留意任何更好的解决方案。