Skip to content

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"
}