Как вы можете симулировать конфликт в CouchDB без использования репликации? - PullRequest
1 голос
/ 29 сентября 2011

Я хотел бы написать модульный тест для моего приложения, который имитирует конфликт во время репликации.Есть ли способ симулировать конфликт, используя только одну базу данных и сервер CouchDB?

Ответы [ 3 ]

5 голосов
/ 30 сентября 2011

Я полагаю, вы хотите получить документ, содержащий конфликт в вашей базе данных, а не 409 Conflict response?

Итак, создайте документ в базе данных с известным _id:

$ curl http://localhost:5984/scratch/foo -X PUT -H "Content-Type: application/json" -d '{}'
{"ok":true,"id":"foo","rev":"1-967a00dff5e02add41819138abb3284d"}

Затем используйте API массовых документов с опцией all_or_nothing: true, чтобы обновить тот же документ преднамеренно неверно или без _rev, добавив некоторые другие атрибуты документа для хорошей меры:

$ curl http://localhost:5984/scratch/_bulk_docs -X POST -H "Content-Type: application/json" -d '{"all_or_nothing": true, "docs": [{"_id": "foo", "abc": 123}]}'
[{"id":"foo","rev":"1-15c813a2b4b312c6915821b01a1986c5"}]

У вас должен возникнуть конфликт в документе:

$ curl http://localhost:5984/scratch/foo?conflicts=true
{"_id":"foo","_rev":"1-967a00dff5e02add41819138abb3284d","_conflicts":["1-15c813a2b4b312c6915821b01a1986c5"]}

Вы также можете выполнить обычный запрос с ?new_edits=false как , описанный коммиттером CouchDB Рэндаллом Лидсом .

$ curl http://localhost:5984/scratch?new_edits=false -X POST -H "Content-Type: application/json" -d '{"_id": "foo", "abc": 123}'
1 голос
/ 30 сентября 2011

Погуглил дальше после того, как задал вопрос, и похоже, что ответом является использование режима all-or-nothing API массовых документов.

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

Посмотрите ближе к концу страницы.

0 голосов
/ 30 сентября 2011

Просто опубликуйте два документа с одинаковым атрибутом _id. Это создает конфликт, поскольку 2-й документ не будет содержать правильный атрибут _rev. Помните, что вам нужно включать в каждый последующий пост последний атрибут _rev, чтобы CouchDB знал, что вы в курсе.

Кроме того, вы можете создать две базы данных на одном сервере и выполнять репликацию между ними.

...