Purge doc with conflicted revisions
Chang Hua Guo edited this page Jan 3, 2017
·
2 revisions
#Purge doc with more revisions - conflict ##create a document with conflict revisions
a. create source db and a doc apple
macgch:couchdb chguo$ curl -X PUT foo:bar@127.0.0.1:15984/source
{"ok":true}
macgch:couchdb chguo$ curl -X POST foo:bar@127.0.0.1:15984/source -H "Content-Type: application/json" -d @apple.json
{"ok":true,"id":"apple","rev":"1-db30a6971ffbf55b1a009c79d1643e06"}
b. create target db and a doc apple
curl -X PUT foo:bar@127.0.0.1:15984/target
{"ok":true}
macgch:couchdb chguo$ curl -X POST foo:bar@127.0.0.1:15984/target -H "Content-Type: application/json" -d @green_apple.json
{"ok":true,"id":"apple","rev":"1-70ebc7eb3238d0c27ae556306a3da588"}
macgch:couchdb chguo$ curl -X POST foo:bar@127.0.0.1:15984/target -H "Content-Type: application/json" -d @search.json
{"ok":true,"id":"_design/search","rev":"1-8a4ac7cb2445eb8c75271fd7bb84441c"}
c. replicate
macgch:couchdb chguo$ curl -X POST foo:bar@127.0.0.1:15984/_replicate -H "Content-Type: application/json" -d @replicate.json
{"ok":true,"session_id":"8bbdbd506d74c0719e7632153ac9da34","source_last_seq":"1-g1AAAABLeJzLYWBgYMxgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkMeC8N_IMjKYE5kzAUKsSenmVsmpRhjasgCAKulEts","replication_id_version":3,"history":[{"session_id":"8bbdbd506d74c0719e7632153ac9da34","start_time":"Tue, 03 Jan 2017 08:33:59 GMT","end_time":"Tue, 03 Jan 2017 08:33:59 GMT","start_last_seq":0,"end_last_seq":"1-g1AAAABLeJzLYWBgYMxgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkMeC8N_IMjKYE5kzAUKsSenmVsmpRhjasgCAKulEts","recorded_seq":"1-g1AAAABLeJzLYWBgYMxgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkMeC8N_IMjKYE5kzAUKsSenmVsmpRhjasgCAKulEts","missing_checked":1,"missing_found":1,"docs_read":1,"docs_written":1,"doc_write_failures":0}]}
d. check the conflict doc
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/apple?conflicts=true
{"_id":"apple","_rev":"1-db30a6971ffbf55b1a009c79d1643e06","color":"red","size":"1","_conflicts":["1-70ebc7eb3238d0c27ae556306a3da588"]}
##Search it first
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:red"
{"total_rows":1,"bookmark":"g2wAAAABaANkAA9ub2RlMUAxMjcuMC4wLjFsAAAAAmEAbgQA_____2poAkY_8AAAAAAAAGEBag","rows":[{"id":"apple","order":[1.0,1],"fields":{}}]}
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:green"
{"total_rows":0,"bookmark":"g2o","rows":[]}
1
red doc and 0
green doc, the red doc win.
##Purge
(node1@127.0.0.1)1> DBFullName = <<"shards/00000000-ffffffff/target.1483432139">>.
<<"shards/00000000-ffffffff/target.1483432139">>
(node1@127.0.0.1)2> {ok, Db} = couch_db:open_int(DBFullName, []).
{ok,{db,<<"shards/00000000-ffffffff/target.1483432139">>,
"/Users/chguo/Documents/git/couchdb/dev/lib/node1/data/shards/00000000-ffffffff/target.1483432139.couch",
{couch_bt_engine,{st,"/Users/chguo/Documents/git/couchdb/dev/lib/node1/data/shards/00000000-ffffffff/target.1483432139.couch",
<0.24038.0>,#Ref<0.0.0.198714>,
[before_header,after_header,on_file_open],
{db_header,6,3,0,
{8462,{2,0,{size_info,415,526}},206},
{8668,2,208},
{8876,[],478},
0,nil,163,1000,<<"ac6cf26238ad"...>>,
[{'node1@127.0.0.1',...}],
0,1000,...},
false,
{btree,<0.24038.0>,
{8462,{2,0,{size_info,415,526}},206},
#Fun<couch_bt_engine.id_tree_split.1>,
#Fun<couch_bt_engine.id_tree_join.2>,undefined,
#Fun<couch_bt_engine.id_tree_reduce.2>,snappy},
{btree,<0.24038.0>,
{8668,2,208},
#Fun<couch_bt_engine.seq_tree_split.1>,
#Fun<couch_bt_engine.seq_tree_join.2>,undefined,
#Fun<couch_bt_engine.seq_tree_reduce.2>,snappy},
{btree,<0.24038.0>,
{8876,[],478},
#Fun<couch_bt_engine.local_tree_split.1>,
#Fun<couch_bt_engine.local_tree_join.2>,undefined,nil,
snappy},
snappy,
{btree,<0.24038.0>,nil,undefined,undefined,undefined,
#Fun<couch_bt_engine.purge_tree_reduce.2>,snappy}}},
<0.24037.0>,nil,3,<<"1483432139358419">>,
{user_ctx,null,[],undefined},
[],[],nil,nil,nil,
[{engine,<<"couch">>},
{placement,undefined},
{q,"1"},
{n,"1"},
{default_security_object,[]}],
undefined}}
(node1@127.0.0.1)3> FDI = couch_db:get_full_doc_info(Db, <<"apple">>).
{full_doc_info,<<"apple">>,3,false,
[{1,
{<<112,235,199,235,50,56,208,194,122,229,86,48,106,61,165,
136>>,
{leaf,false,172,1,{size_info,84,121},[]},
[]}},
{1,
{<<219,48,166,151,31,251,245,91,26,0,156,121,209,100,62,6>>,
{leaf,false,8379,3,{size_info,83,120},[]},
[]}}],
{size_info,167,241},
[]}
(node1@127.0.0.1)4> rd(doc_info, {id = <<"">>, high_seq = 0, revs = []}).
doc_info
(node1@127.0.0.1)5> rd(rev_info, {rev, seq =0, deleted = false, body_sp = nil}).
rev_info
(node1@127.0.0.1)6> #doc_info{ revs = [#rev_info{rev = Rev1} | _] } = couch_doc:to_doc_info(FDI).
#doc_info{id = <<"apple">>,high_seq = 3,
revs = [#rev_info{rev = {1,
<<219,48,166,151,31,251,245,91,26,0,156,121,209,100,62,6>>},
seq = 3,deleted = false,body_sp = 8379},
#rev_info{rev = {1,
<<112,235,199,235,50,56,208,194,122,229,86,48,106,61,165,
136>>},
seq = 1,deleted = false,body_sp = 172}]}
(node1@127.0.0.1)7> {ok, {_, [{ok, _}]}} = couch_db:purge_docs(Db, [{<<"apple">>, [Rev1]}]).
{ok,{1,
[{ok,[{1,
<<219,48,166,151,31,251,245,91,26,0,156,121,209,100,
62,6>>}]}]}}
##Search it again
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:red"
{"total_rows":0,"bookmark":"g2o","rows":[]}
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:green"
{"total_rows":1,"bookmark":"g2wAAAABaANkAA9ub2RlMUAxMjcuMC4wLjFsAAAAAmEAbgQA_____2poAkY_9nzJAAAAAGECag","rows":[{"id":"apple","order":[1.4054651260375977,2],"fields":{}}]}
0
red doc and 1
green doc, the red doc is purged and the green doc win.
##Purge again
Act similar with Purge
.
......
(node1@127.0.0.1)7> {ok, {_, [{ok, _}]}} = couch_db:purge_docs(Db, [{<<"apple">>, [Rev1]}]).
{ok,{2,
[{ok,[{1,
<<112,235,199,235,50,56,208,194,122,229,86,48,106,
61,165,136>>}]}]}}
##Search it third time
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:red"
{"total_rows":0,"bookmark":"g2o","rows":[]}
macgch:couchdb chguo$ curl -X GET foo:bar@127.0.0.1:15984/target/_design/search/_search/index?q="color:green"
{"total_rows":0,"bookmark":"g2o","rows":[]}
0
red doc and 0
green doc, all the revisions are purged.
##files apple.json
{
"_id":"apple",
"color":"red",
"size":"1"
}
green_apple.json
{
"_id":"apple",
"color":"green",
"size":"1"
}
search.json
{
"_id":"_design/search",
"views":{},
"language":"javascript",
"indexes":{
"index":{
"analyzer":"standard",
"index":"function (doc) {\n index(\"default\", doc._id);\n if(doc.color) {\n index(\"color\", doc.color);\n }\n if(doc.size) {\n index(\"size\", doc.size);\n }\n}\n"
}
}
}
replicate.json
{
"_id": "replicate1",
"source": "http://127.0.0.1:15984/source",
"target": "http://127.0.0.1:15984/target"
}