<!--- Provide a general summary of the issue in the Title above -->

## Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->

Expect `_local` prefixed docs not to end up in the normal versioned doc tree.

## Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected 
behavior -->
<!--- If suggesting a change/improvement, explain the difference from current 
behavior -->

If using `_bulk_docs` and `"new_edits":false` it is possible to write a 
`_local` prefixed doc into the normal doc tree. Once it is there it is not 
possible to read or delete the document via normal means. The document is 
included in `_changes` `_all_docs` and replications. It also plays havoc with 
the dashboard where it is visible in the document list, but the document cannot 
be deleted nor can the content be retrieved.

## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->

I wasn't able to reproduce when using the default `"new_edits":true`, so 
perhaps whatever checks are made for `_local` docs there could be extended to 
the `"new_edits": false case.

## Steps to Reproduce (for bugs)
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant -->
1. Create DB
    `curl -XPUT http://localhost:5984/test` -->
    `{"ok":true}`
1. Write `_local/test` doc with a `_rev`
    `curl -XPOST -HContent-Type:application/json 
http://localhost:5984/test/_bulk_docs -d 
'{"new_edits":false,"docs":[{"_id":"_local/test","_rev":"1-abcdef","hello":"world"}]}'`
 -->
    `[]`
1. Try to `GET` the `_local/test` doc
    `curl http://localhost:5984/test/_local/test` -->
   `{"error":"not_found","reason":"missing"}`
1. Try to `GET` the `_local/test` doc via `_all_docs`
    `curl 
'http://localhost:5984/test/_all_docs?key="_local/test"&include_docs=true'` -->
    `{"total_rows":1,"offset":0,"rows":[
{"id":"_local/test","key":"_local/test","value":{"rev":"1-abcdef"},"doc":{"_id":"_local/test","_rev":"1-abcdef","hello":"world"}}
]}`
1. Try to delete the `_local/test` doc
    `curl -XDELETE http://localhost:5984/test/_local/test` -->
    `{"error":"not_found","reason":"missing"}`
1. Try to delete via `_bulk_docs` and `_deleted` flag
    `curl -XPOST -HContent-Type:application/json 
http://localhost:5984/test/_bulk_docs -d 
'{"docs":[{"_id":"_local/test","_rev":"1-abcdef","_deleted":true}]}` -->
    `[{"id":"_local/test","error":"unknown_error","reason":"undefined"}]`
1. Try to delete via `_bulk_docs` and `_deleted` flag with `"new_edits":false`
    `curl -XPOST -HContent-Type:application/json 
http://localhost:5984/test/_bulk_docs -d '{"new_edits":false, 
"docs":[{"_id":"_local/test","_rev":"1-abcdef","_deleted":true}]}` -->
    `[{"id":"_local/test","error":"unknown_error","reason":"undefined"}]`

## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in 
the real world -->

A user wrote a document with a [`_local` prefixed `_id` and a `_rev` into a 
local datastore in our sync-android 
library](https://github.com/cloudant/sync-android/issues/589). Once that was in 
the local store it made it into our replication path and was written to the 
server via `_bulk_docs` with `"new_edits":false` (as all docs that need 
replicating do).

Clearly we could make some improvements to sync-android in terms of 
documentation or preventing the insertion of a doc with `_local` prefix and a 
rev into its local database, but I think there is a genuine issue that needs 
resolving in CouchDB as well in that the server side `_bulk_docs` API has 
similar problems in allowing a `_local` prefixed doc to be written into the 
wrong part of a database, especially because it creates a document that is not 
removable via the normal HTTP APIs.

## Your Environment
<!--- Include as many relevant details about the environment you experienced 
the bug in -->
* Version used: 2.2.0 (I've also reproduced on 1.7.2)
* Browser Name and version: Firefox 60.2.1 (for dashboard)
* Operating System and version (desktop or mobile): Docker `couchdb` image (but 
reproducible in other envs)
* Link to your project: https://github.com/cloudant/sync-android


[ Full content available at: https://github.com/apache/couchdb/issues/1628 ]
This message was relayed via gitbox.apache.org for [email protected]

Reply via email to