Отфильтрованная репликация CouchDB: измените doc_id после первой полной репликации - PullRequest
4 голосов
/ 16 ноября 2011

Реестр NPM (менеджер пакетов узлов) использует CouchDB для хранения метаинформации и архивных пакетов в экземпляре CouchDB по адресу http://registry.npmjs.org/registry .. Я использую следующий документ репликации (CouchDB 1.1.0) для репликации подмножествареестр моего корпоративного CouchDB:

{ "_id": "fetch-npm-registry", "doc_ids": [ "coffee-script", "nodeunit" ], "source": "http://couchdb.mycompany.com:5984/registry", "target": "registry", }

[Кстати, CouchApp обрабатывает это в https://github.com/isaacs/npmjs.org (также с полными инструкциями по установке)].

Если я хочу добавить еще одну зависимость в один из моих пакетов, моя наивная мысль заключалась в том, чтобы я просто изменил список doc_ids (скажем, на ["coffee-script", "nodeunit", "npm"]) и снова начал репликацию.

This однако не работает : репликация немедленно завершается, и пакет, который я хотел добавить к репликации (в данном случае "npm"), отсутствует.

[Обходной путь, известный мне, заключается вудалите целевую базу данных, повторите репликацию и - поскольку я также использую этот локальный реестр для публикации своих проприетарных пакетов - повторно опубликую мои локальные пакеты. вздох ]


Поправка 18.11.2011

Вот то, что я думаю, что происходит (совсем не эксперт по внутренним компонентам CouchDB, но, возможно,в этом есть доля правды):

После первой успешной репликации CouchDB сохраняет последний (самый высокий?) Идентификатор последовательности самого последнего документа, который он реплицировал, в скрытом документе в базе данных (Когда-то я знал, как получить доступ к ним, указатели приветствуются).Затем, когда я изменяю doc_ids, эта кэшированная информация о последней успешной репликации (идентификатор последовательности) не аннулируется (или не очищается).Затем, когда ему велят повторить репликацию с той же базой данных, он сравнивает идентификаторы последовательностей и решает, что все в порядке.

Ответы [ 2 ]

1 голос
/ 04 марта 2013

1) http://registry.npmjs.org/registry не является базой данных реестра, но http://registry.npmjs.org является.

2)

{"_id": "fetch-npm-registry", "doc_ids ": [" coffee-script "," nodeunit "]," source ":" http://couchdb.mycompany.com:5984/registry", "target": "registry",}

Вы уверены, что хотитекопия с http://couchdb.mycompany.com:5984/registry, а не http://registry.npmjs.org?

0 голосов
/ 18 ноября 2011

Я попробовал это с Couchbase Single Server 2.0 Developer Preview 5. Там это работает. Моя команда curl была (но занимает довольно много минут):

curl -X POST 'http://localhost:5984/_replicate' -H 'Content-Type: application/json' -d '{"doc_ids": [ "coffee-script", "nodeunit", "npm" ], "source": "http://registry.npmjs.org:5984/registry", "target": "registry", "create_target": true}

Он основан на некоторой версии магистрали Apache COuchDB.

Не могли бы вы попробовать это с Apache CouchDB 1.1.1. Я помню, что была ошибка репликатора с пустыми идентификаторами (и в репозитории npm есть такой документ), которая была исправлена.

Ура, Volker

...