2011-11-16 3 views
4

Le registre NPM (node ​​package manager) utilise CouchDB pour stocker les méta-informations et les archives de packages sur une instance CouchDB à http://registry.npmjs.org/registry .. J'utilise le document de réplication suivant (CouchDB 1.1.0) pour répliquer un sous-ensemble du registre à mon CouchDB d'entreprise:Réplication filtrée CouchDB: Modifier doc_id après la première réplication complète

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

[BTW, la manipulation est à ce couchapp https://github.com/isaacs/npmjs.org (également avec des instructions d'installation complètes)]. Si je veux ajouter une autre dépendance à un de mes paquets, ma pensée naïve était que je viens de modifier la liste doc_ids (disons, à ["coffee-script", "nodeunit", "npm"]) et redémarrer la réplication.

Ce ne fonctionne pas cependant: La réplication est terminée immédiatement et le paquet que je voulais ajouter à la réplication (dans ce cas "npm") est manquante.

[La solution de contournement que je connais est de supprimer la base de données cible, de la répliquer à nouveau et - parce que j'utilise également ce registre local pour publier mes packages propriétaires - republier mes paquets locaux. soupir]


Amendement 18.11.2011

Voici ce que je pense ce qui se passe (pas du tout un expert en internals CouchDB, mais peut-être il y a une certaine vérité à elle):

Après la première réplication réussie, CouchDB stocke le dernier (plus haut?) ID de séquence du dernier document qu'il a répliqué dans un document caché dans la base de données (j'ai déjà su y accéder, les pointeurs sont les bienvenus). Ensuite, lorsque je change le doc_ids cette information mise en cache sur la dernière réplication réussie (l'ID de séquence) n'est pas invalidée (ou effacée). Ensuite, quand il est dit de répliquer à nouveau avec la même base de données, il compare les ID de séquence et décide que tout va bien.

+0

Avez-vous [vérifié les conflits] (http://guide.couchdb.org/draft/conflicts.html#working)? –

+0

Non, mais il ne devrait pas y en avoir. Je n'ai pas poussé (comme dans 'npm publish') ma propre version de npm en attendant. J'ai quelques paquets qui sont le contenu original (mes propriétaires) et le reste devrait être répliqué d'en amont. Ces deux ensembles de packages sont disjoints. – peritus

+0

Ensuite, vérifiez les autorisations. Les rapports d'erreurs lors de la réplication sont faibles ... vérifiez également les journaux. Quelques informations supplémentaires seraient utiles: version CouchDB; compilé ou emballé; quel OS? –

Répondre

0

Je l'ai essayé avec Couchbase Single Server 2.0 Developer Preview 5. Là ça marche. Ma commande était boucle (mais prend tout à fait quelques minutes):

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} 

Il est basé sur une version du tronc Apache CouchDB.

Pourriez-vous s'il vous plaît essayer avec Apache CouchDB 1.1.1. Je me souviens qu'il y avait un bogue de réplicateur avec des ID vides (et le référentiel npm a un tel document), qui a été corrigé.

Cheers, Volker

1

1) http://registry.npmjs.org/registry n'est pas base de registre, mais http://registry.npmjs.org est.

2)

{ "_id": "fetch-NPM-registre", "doc_ids": [ "café-script", "nodeunit"], "source": "http://couchdb.mycompany.com:5984/registry", "cible": "registre",}

Etes-vous sûr que vous répliquez de http://couchdb.mycompany.com:5984/registry et non http://registry.npmjs.org?