1

我在使用 couchdb 复制时遇到了这个问题:我正在使用带有此设置文档的复制器数据库:

{
   "_id": "source_to_target",
   "_rev": "1-2a6510e28c2cc7caf0d58a85d705d2b8",
   "source": "http://xxxx:xxxx@localhost:5984/sourcedb",
   "target": "targetdb",
   "create_target": true,
   "continuous": true,
   "filter": "sourcedb/repl_filter",
   "query_params": {
       "someproperty": "somevalue"
   },
   "user_ctx": {
       "name": "someadmin",
       "roles": [
           "_admin"
       ]
   }
}

问题是过滤器功能被忽略了。我确信这是正确的,因为如果我调用:

curl -X GET "http://localhost:5984/sourcedb/_changes?filter=sourcedb/repl_filter&someproperty=somevalue&feed=continuous&style=all_docs&since=0"

结果被正确过滤。

我执行如下测试:

我完全擦除了目标数据库。然后我删除上面的复制并从头开始重新创建它。一旦上面显示的复制文档被提交,复制就会开始,而不是过滤的文档,目标数据库获取所有文档,这构成了我的问题。日志提示了原因:

[Fri, 20 Jul 2012 17:43:38 GMT] [info] [<0.5860.17>] Replication records differ. Scanning histories to find a common ancestor.
[Fri, 20 Jul 2012 17:43:38 GMT] [info] [<0.5860.17>] no common ancestry -- performing full replication

,这让我摸不着头脑,因为我在开始复制之前完全擦除了目标数据库,为什么要使用尚未创建的数据库搜索常见的祖先?显然我错过了一些东西,但我无法弄清楚。有什么建议么?

4

1 回答 1

2

好的,这是解决方案:

正如 smathy 建议的那样,尝试使用新名称的另一个新目标数据库是可行的。所以这让我在日志中搜索得更好一些,我发现虽然我在每次测试中都删除了复制文档,但在这些删除中的某个地方,其中一个未能删除其继续启动并运行的底层复制过程。所以这个僵尸,让我觉得新的没用。事实上,他们工作,过滤掉所有的文档,但僵尸复制继续进行完全复制。

很难在日志中区分实际上总是有 2 个复制在运行,因为僵尸执行完全复制并在日志中附加了很多内容,而普通的几乎没有附加任何内容,因为它过滤掉了所有文档,这让我很感兴趣只有一个,忽略过滤器功能。我应该更仔细地看。

无论如何,由于我总是通过擦除/插入复制文档来开始在蒲团中的复制,并且我从未从命令行或任何其他方式开始复制,我认为删除复制文档并不能保证取消底层复制过程。我将对此进行更多搜索。

于 2012-07-21T08:52:55.190 回答