.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _replication/conflicts:

==============================
Replication and conflict model
==============================

Let's take the following example to illustrate replication and conflict
handling.

- Alice has a document containing Bob's business card;
- She synchronizes it between her desktop PC and her laptop;
- On the desktop PC, she updates Bob's E-mail address;
  Without syncing again, she updates Bob's mobile number on the laptop;
- Then she replicates the two to each other again.

So on the desktop the document has Bob's new E-mail address and his old mobile
number, and on the laptop it has his old E-mail address and his new mobile
number.

The question is, what happens to these conflicting updated documents?

CouchDB replication
===================

CouchDB works with JSON documents inside databases. Replication of databases
takes place over HTTP, and can be either a "pull" or a "push", but is
unidirectional. So the easiest way to perform a full sync is to do a "push"
followed by a "pull" (or vice versa).

So, Alice creates v1 and sync it. She updates to v2a on one side and v2b on the
other, and then replicates. What happens?

The answer is simple: both versions exist on both sides!

.. code-block:: text

      DESKTOP                          LAPTOP
    +---------+
    | /db/bob |                                     INITIAL
    |   v1    |                                     CREATION
    +---------+

    +---------+                      +---------+
    | /db/bob |  ----------------->  | /db/bob |     PUSH
    |   v1    |                      |   v1    |
    +---------+                      +---------+

    +---------+                      +---------+  INDEPENDENT
    | /db/bob |                      | /db/bob |     LOCAL
    |   v2a   |                      |   v2b   |     EDITS
    +---------+                      +---------+

    +---------+                      +---------+
    | /db/bob |  ----------------->  | /db/bob |     PUSH
    |   v2a   |                      |   v2a   |
    +---------+                      |   v2b   |
                                     +---------+

    +---------+                      +---------+
    | /db/bob |  <-----------------  | /db/bob |     PULL
    |   v2a   |                      |   v2a   |
    |   v2b   |                      |   v2b   |
    +---------+                      +---------+

After all, this is not a file system, so there's no restriction that only one
document can exist with the name /db/bob. These are just "conflicting" revisions
under the same name.

Because the changes are always replicated, the data is safe. Both machines have
identical copies of both documents, so failure of a hard drive on either side
won't lose any of the changes.

Another thing to notice is that peers do not have to be configured or tracked.
You can do regular replications to peers, or you can do one-off, ad-hoc pushes
or pulls. After the replication has taken place, there is no record kept of
which peer any particular document or revision came from.

So the question now is: what happens when you try to read /db/bob? By default,
CouchDB picks one arbitrary revision as the "winner", using a deterministic
algorithm so that the same choice will be made on all peers. The same happens
with views: the deterministically-chosen winner is the only revision fed into
your map function.

Let's say that the winner is v2a. On the desktop, if Alice reads the document
she'll see v2a, which is what she saved there. But on the laptop, after
replication, she'll also see only v2a. It could look as if the changes she made
there have been lost - but of course they have not, they have just been hidden
away as a conflicting revision. But eventually she'll need these changes merged
into Bob's business card, otherwise they will effectively have been lost.

Any sensible business-card application will, at minimum, have to present the
conflicting versions to Alice and allow her to create a new version
incorporating information from them all. Ideally it would merge the updates
itself.

Conflict avoidance
==================

When working on a single node, CouchDB will avoid creating conflicting revisions
by returning a :statuscode:`409` error. This is because, when you
PUT a new version of a document, you must give the ``_rev`` of the previous
version. If that ``_rev`` has already been superseded, the update is rejected
with a  :statuscode:`409` response.

So imagine two users on the same node are fetching Bob's business card, updating
it concurrently, and writing it back:

.. code-block:: text

    USER1    ----------->  GET /db/bob
             <-----------  {"_rev":"1-aaa", ...}

    USER2    ----------->  GET /db/bob
             <-----------  {"_rev":"1-aaa", ...}

    USER1    ----------->  PUT /db/bob?rev=1-aaa
             <-----------  {"_rev":"2-bbb", ...}

    USER2    ----------->  PUT /db/bob?rev=1-aaa
             <-----------  409 Conflict  (not saved)

User2's changes are rejected, so it's up to the app to fetch /db/bob again,
and either:

#. apply the same changes as were applied to the earlier revision, and submit
   a new PUT
#. redisplay the document so the user has to edit it again
#. just overwrite it with the document being saved before (which is not
   advisable, as user1's changes will be silently lost)

So when working in this mode, your application still has to be able to handle
these conflicts and have a suitable retry strategy, but these conflicts never
end up inside the database itself.

Revision tree
=============

When you update a document in CouchDB, it keeps a list of the previous
revisions. In the case where conflicting updates are introduced, this history
branches into a tree, where the current conflicting revisions for this document
form the tips (leaf nodes) of this tree:

.. code-block:: text

      ,--> r2a
    r1 --> r2b
      `--> r2c

Each branch can then extend its history - for example if you read revision r2b
and then PUT with ?rev=r2b then you will make a new revision along that
particular branch.

.. code-block:: text

      ,--> r2a -> r3a -> r4a
    r1 --> r2b -> r3b
      `--> r2c -> r3c

Here, (r4a, r3b, r3c) are the set of conflicting revisions. The way you resolve
a conflict is to delete the leaf nodes along the other branches. So when you
combine (r4a+r3b+r3c) into a single merged document, you would replace r4a and
delete r3b and r3c.

.. code-block:: text

      ,--> r2a -> r3a -> r4a -> r5a
    r1 --> r2b -> r3b -> (r4b deleted)
      `--> r2c -> r3c -> (r4c deleted)

Note that r4b and r4c still exist as leaf nodes in the history tree, but as
deleted docs. You can retrieve them but they will be marked ``"_deleted":true``.

When you compact a database, the bodies of all the non-leaf documents are
discarded. However, the list of historical _revs is retained, for the benefit of
later conflict resolution in case you meet any old replicas of the database at
some time in future. There is "revision pruning" to stop this getting
arbitrarily large.

Working with conflicting documents
==================================

The basic :get:`/{db}/{docid}` operation will not show you any
information about conflicts. You see only the deterministically-chosen winner,
and get no indication as to whether other conflicting revisions exist or not:

.. code-block:: javascript

    {
        "_id":"test",
        "_rev":"2-b91bb807b4685080c6a651115ff558f5",
        "hello":"bar"
    }

If you do ``GET /db/test?conflicts=true``, and the document is in a conflict
state, then you will get the winner plus a _conflicts member containing an array
of the revs of the other, conflicting revision(s). You can then fetch them
individually using subsequent ``GET /db/test?rev=xxxx`` operations:

.. code-block:: javascript

    {
        "_id":"test",
        "_rev":"2-b91bb807b4685080c6a651115ff558f5",
        "hello":"bar",
        "_conflicts":[
            "2-65db2a11b5172bf928e3bcf59f728970",
            "2-5bc3c6319edf62d4c624277fdd0ae191"
        ]
    }

If you do ``GET /db/test?open_revs=all`` then you will get all the leaf nodes of
the revision tree. This will give you all the current conflicts, but will also
give you leaf nodes which have been deleted (i.e. parts of the conflict history
which have since been resolved). You can remove these by filtering out documents
with ``"_deleted":true``:

.. code-block:: javascript

    [
        {"ok":{"_id":"test","_rev":"2-5bc3c6319edf62d4c624277fdd0ae191","hello":"foo"}},
        {"ok":{"_id":"test","_rev":"2-65db2a11b5172bf928e3bcf59f728970","hello":"baz"}},
        {"ok":{"_id":"test","_rev":"2-b91bb807b4685080c6a651115ff558f5","hello":"bar"}}
    ]

The ``"ok"`` tag is an artifact of ``open_revs``, which also lets you list
explicit revisions as a JSON array, e.g. ``open_revs=[rev1,rev2,rev3]``. In this
form, it would be possible to request a revision which is now missing, because
the database has been compacted.

.. note::
    The order of revisions returned by ``open_revs=all`` is **NOT** related to
    the deterministic "winning" algorithm. In the above example, the winning
    revision is 2-b91b... and happens to be returned last, but in other cases it
    can be returned in a different position.

Once you have retrieved all the conflicting revisions, your application can then
choose to display them all to the user. Or it could attempt to merge them, write
back the merged version, and delete the conflicting versions - that is, to
resolve the conflict permanently.

As described above, you need to update one revision and delete all the
conflicting revisions explicitly. This can be done using a single `POST` to
``_bulk_docs``, setting ``"_deleted":true`` on those revisions you wish to
delete.

Multiple document API
=====================

Finding conflicted documents with Mango
---------------------------------------

.. versionadded:: 2.2.0

CouchDB's :ref:`Mango system <api/db/_find>` allows easy querying of
documents with conflicts, returning the full body of each document as well.

Here's how to use it to find all conflicts in a database:

.. code-block:: bash

    $ curl -X POST http://127.0.0.1/dbname/_find \
        -d '{"selector": {"_conflicts": { "$exists": true}}, "conflicts": true}' \
        -Hcontent-type:application/json

.. code-block:: javascript

    {"docs": [
    {"_id":"doc","_rev":"1-3975759ccff3842adf690a5c10caee42","a":2,"_conflicts":["1-23202479633c2b380f79507a776743d5"]}
    ],
    "bookmark": "g1AAAABheJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYozA1kgKQ6YVA5QkBFMgKSVDHWNjI0MjEzMLc2MjZONkowtDNLMLU0NzBPNzc3MTYxTTLOysgCY2ReV"}

The ``bookmark`` value can be used to navigate through additional pages of
results if necessary. Mango by default only returns 25 results per request.

If you expect to run this query often, be sure to create a Mango secondary
index to speed the query:

.. code-block:: bash

    $ curl -X POST http://127.0.0.1/dbname/_index \
        -d '{"index":{"fields": ["_conflicts"]}}' \
        -Hcontent-type:application/json

Of course, the selector can be enhanced to filter documents on additional
keys in the document. Be sure to add those keys to your secondary index as
well, or a full database scan will be triggered.

Finding conflicted documents using the ``_all_docs`` index
----------------------------------------------------------

You can fetch multiple documents at once using ``include_docs=true`` on a view.
However, a ``conflicts=true`` request is ignored; the "doc" part of the value
never includes a ``_conflicts`` member. Hence you would need to do another query
to determine for each document whether it is in a conflicting state:

.. code-block:: bash

    $ curl 'http://127.0.0.1:5984/conflict_test/_all_docs?include_docs=true&conflicts=true'

.. code-block:: javascript

    {
        "total_rows":1,
        "offset":0,
        "rows":[
            {
                "id":"test",
                "key":"test",
                "value":{"rev":"2-b91bb807b4685080c6a651115ff558f5"},
                "doc":{
                    "_id":"test",
                    "_rev":"2-b91bb807b4685080c6a651115ff558f5",
                    "hello":"bar"
                }
            }
        ]
    }

.. code-block:: bash

    $ curl 'http://127.0.0.1:5984/conflict_test/test?conflicts=true'

.. code-block:: javascript

    {
        "_id":"test",
        "_rev":"2-b91bb807b4685080c6a651115ff558f5",
        "hello":"bar",
        "_conflicts":[
            "2-65db2a11b5172bf928e3bcf59f728970",
            "2-5bc3c6319edf62d4c624277fdd0ae191"
        ]
    }

View map functions
==================

Views only get the winning revision of a document. However they do also get a
``_conflicts`` member if there are any conflicting revisions. This means you can
write a view whose job is specifically to locate documents with conflicts.
Here is a simple map function which achieves this:

.. code-block:: javascript

    function(doc) {
        if (doc._conflicts) {
            emit(null, [doc._rev].concat(doc._conflicts));
        }
    }

which gives the following output:

.. code-block:: javascript

    {
        "total_rows":1,
        "offset":0,
        "rows":[
            {
                "id":"test",
                "key":null,
                "value":[
                    "2-b91bb807b4685080c6a651115ff558f5",
                    "2-65db2a11b5172bf928e3bcf59f728970",
                    "2-5bc3c6319edf62d4c624277fdd0ae191"
                ]
            }
        ]
    }

If you do this, you can have a separate "sweep" process which periodically scans
your database, looks for documents which have conflicts, fetches the conflicting
revisions, and resolves them.

Whilst this keeps the main application simple, the problem with this approach is
that there will be a window between a conflict being introduced and it being
resolved. From a user's viewpoint, this may appear that the document they just
saved successfully may suddenly lose their changes, only to be resurrected some
time later. This may or may not be acceptable.

Also, it's easy to forget to start the sweeper, or not to implement it properly,
and this will introduce odd behaviour which will be hard to track down.

CouchDB's "winning" revision algorithm may mean that information drops out of a
view until a conflict has been resolved. Consider Bob's business card again;
suppose Alice has a view which emits mobile numbers, so that her telephony
application can display the caller's name based on caller ID. If there are
conflicting documents with Bob's old and new mobile numbers, and they happen to
be resolved in favour of Bob's old number, then the view won't be able to
recognise his new one. In this particular case, the application might have
preferred to put information from both the conflicting documents into the view,
but this currently isn't possible.

Suggested algorithm to fetch a document with conflict resolution:

#. Get document via ``GET docid?conflicts=true`` request
#. For each member in the ``_conflicts`` array call ``GET docid?rev=xxx``.
   If any errors occur at this stage, restart from step 1.
   (There could be a race where someone else has already resolved this conflict
   and deleted that rev)
#. Perform application-specific merging
#. Write ``_bulk_docs`` with an update to the first rev and deletes of the other
   revs.

This could either be done on every read (in which case you could replace all
calls to GET in your application with calls to a library which does the above),
or as part of your sweeper code.

And here is an example of this in Ruby using the low-level `RestClient`_:

.. _RestClient: https://rubygems.org/gems/rest-client

.. code-block:: ruby

    require 'rubygems'
    require 'rest_client'
    require 'json'
    DB="http://127.0.0.1:5984/conflict_test"

    # Write multiple documents
    def writem(docs)
        JSON.parse(RestClient.post("#{DB}/_bulk_docs", {
            "docs" => docs,
        }.to_json))
    end

    # Write one document, return the rev
    def write1(doc, id=nil, rev=nil)
        doc['_id'] = id if id
        doc['_rev'] = rev if rev
        writem([doc]).first['rev']
    end

    # Read a document, return *all* revs
    def read1(id)
        retries = 0
        loop do
            # FIXME: escape id
            res = [JSON.parse(RestClient.get("#{DB}/#{id}?conflicts=true"))]
            if revs = res.first.delete('_conflicts')
                begin
                    revs.each do |rev|
                        res << JSON.parse(RestClient.get("#{DB}/#{id}?rev=#{rev}"))
                    end
                rescue
                    retries += 1
                    raise if retries >= 5
                    next
                end
            end
            return res
        end
    end

    # Create DB
    RestClient.delete DB rescue nil
    RestClient.put DB, {}.to_json

    # Write a document
    rev1 = write1({"hello"=>"xxx"},"test")
    p read1("test")

    # Make three conflicting versions
    write1({"hello"=>"foo"},"test",rev1)
    write1({"hello"=>"bar"},"test",rev1)
    write1({"hello"=>"baz"},"test",rev1)

    res = read1("test")
    p res

    # Now let's replace these three with one
    res.first['hello'] = "foo+bar+baz"
    res.each_with_index do |r,i|
        unless i == 0
            r.replace({'_id'=>r['_id'], '_rev'=>r['_rev'], '_deleted'=>true})
        end
    end
    writem(res)

    p read1("test")

An application written this way never has to deal with a ``PUT 409``, and is
automatically multi-master capable.

You can see that it's straightforward enough when you know what you're doing.
It's just that CouchDB doesn't currently provide a convenient HTTP API for
"fetch all conflicting revisions", nor "PUT to supersede these N revisions", so
you need to wrap these yourself. At the time of writing, there are no known
client-side libraries which provide support for this.

Merging and revision history
============================

Actually performing the merge is an application-specific function. It depends
on the structure of your data. Sometimes it will be easy: e.g. if a document
contains a list which is only ever appended to, then you can perform a union of
the two list versions.

Some merge strategies look at the changes made to an object, compared to its
previous version. This is how Git's merge function works.

For example, to merge Bob's business card versions v2a and v2b, you could look
at the differences between v1 and v2b, and then apply these changes to v2a as
well.

With CouchDB, you can sometimes get hold of old revisions of a document.
For example, if you fetch ``/db/bob?rev=v2b&revs_info=true`` you'll get a list
of the previous revision ids which ended up with revision v2b. Doing the same
for v2a you can find their common ancestor revision. However if the database
has been compacted, the content of that document revision will have been lost.
``revs_info`` will still show that v1 was an ancestor, but report it as
"missing"::

    BEFORE COMPACTION           AFTER COMPACTION

         ,-> v2a                     v2a
       v1
         `-> v2b                     v2b

So if you want to work with diffs, the recommended way is to store those diffs
within the new revision itself. That is: when you replace v1 with v2a, include
an extra field or attachment in v2a which says which fields were changed from
v1 to v2a. This unfortunately does mean additional book-keeping for your
application.

Comparison with other replicating data stores
=============================================

The same issues arise with other replicating systems, so it can be instructive
to look at these and see how they compare with CouchDB. Please feel free to add
other examples.

Unison
------

`Unison`_ is a bi-directional file synchronisation tool. In this case, the
business card would be a file, say `bob.vcf`.

.. _Unison: http://www.cis.upenn.edu/~bcpierce/unison/

When you run unison, changes propagate both ways. If a file has changed on one
side but not the other, the new replaces the old. Unison maintains a local state
file so that it knows whether a file has changed since the last successful
replication.

In our example it has changed on both sides. Only one file called `bob.vcf`
can exist within the file system. Unison solves the problem by simply ducking
out: the user can choose to replace the remote version with the local version,
or vice versa (both of which would lose data), but the default action is to
leave both sides unchanged.

From Alice's point of view, at least this is a simple solution. Whenever she's
on the desktop she'll see the version she last edited on the desktop, and
whenever she's on the laptop she'll see the version she last edited there.

But because no replication has actually taken place, the data is not protected.
If her laptop hard drive dies, she'll lose all her changes made on the laptop;
ditto if her desktop hard drive dies.

It's up to her to copy across one of the versions manually (under a different
filename), merge the two, and then finally push the merged version to the other
side.

Note also that the original file (version v1) has been lost at this point.
So it's not going to be known from inspection alone whether v2a or v2b has the
most up-to-date E-mail address for Bob, or which version has the most up-to-date
mobile number. Alice has to remember which one she entered last.

Git
---

`Git`_ is a well-known distributed source control system. Like Unison, Git deals
with files. However, Git considers the state of a whole set of files as a single
object, the "tree". Whenever you save an update, you create a "commit" which
points to both the updated tree and the previous commit(s), which in turn point
to the previous tree(s). You therefore have a full history of all the states of
the files. This history forms a branch, and a pointer is kept to the tip of the
branch, from which you can work backwards to any previous state. The "pointer"
is an SHA1 hash of the tip commit.

.. _Git: http://git-scm.com/

If you are replicating with one or more peers, a separate branch is made for
each of those peers. For example, you might have::

    main               -- my local branch
    remotes/foo/main   -- branch on peer 'foo'
    remotes/bar/main   -- branch on peer 'bar'

In the regular workflow, replication is a "pull", importing changes from
a remote peer into the local repository. A "pull" does two things: first "fetch"
the state of the peer into the remote tracking branch for that peer; and then
attempt to "merge" those changes into the local branch.

Now let's consider the business card. Alice has created a Git repo containing
``bob.vcf``, and cloned it across to the other machine. The branches look like
this, where ``AAAAAAAA`` is the SHA1 of the commit::

    ---------- desktop ----------           ---------- laptop ----------
    main: AAAAAAAA                        main: AAAAAAAA
    remotes/laptop/main: AAAAAAAA         remotes/desktop/main: AAAAAAAA

Now she makes a change on the desktop, and commits it into the desktop repo;
then she makes a different change on the laptop, and commits it into the laptop
repo::

    ---------- desktop ----------           ---------- laptop ----------
    main: BBBBBBBB                        main: CCCCCCCC
    remotes/laptop/main: AAAAAAAA         remotes/desktop/main: AAAAAAAA

Now on the desktop she does ``git pull laptop``. First, the remote objects
are copied across into the local repo and the remote tracking branch is
updated::

    ---------- desktop ----------           ---------- laptop ----------
    main: BBBBBBBB                        main: CCCCCCCC
    remotes/laptop/main: CCCCCCCC         remotes/desktop/main: AAAAAAAA

.. note::
    The repo still contains AAAAAAAA because commits BBBBBBBB and CCCCCCCC
    point to it.

Then Git will attempt to merge the changes in. Knowing that
the parent commit to ``CCCCCCCC`` is ``AAAAAAAA``, it takes a diff between
``AAAAAAAA`` and ``CCCCCCCC`` and tries to apply it to ``BBBBBBBB``.

If this is successful, then you'll get a new version with a merge commit::

    ---------- desktop ----------           ---------- laptop ----------
    main: DDDDDDDD                        main: CCCCCCCC
    remotes/laptop/main: CCCCCCCC         remotes/desktop/main: AAAAAAAA

Then Alice has to logon to the laptop and run ``git pull desktop``. A similar
process occurs. The remote tracking branch is updated::

    ---------- desktop ----------           ---------- laptop ----------
    main: DDDDDDDD                        main: CCCCCCCC
    remotes/laptop/main: CCCCCCCC         remotes/desktop/main: DDDDDDDD

Then a merge takes place. This is a special case: ``CCCCCCCC`` is one of the
parent commits of ``DDDDDDDD``, so the laptop can `fast forward` update from
``CCCCCCCC`` to ``DDDDDDDD`` directly without having to do any complex merging.
This leaves the final state as::

    ---------- desktop ----------           ---------- laptop ----------
    main: DDDDDDDD                        main: DDDDDDDD
    remotes/laptop/main: CCCCCCCC         remotes/desktop/main: DDDDDDDD

Now this is all and good, but you may wonder how this is relevant when thinking
about CouchDB.

First, note what happens in the case when the merge algorithm fails.
The changes are still propagated from the remote repo into the local one, and
are available in the remote tracking branch. So, unlike Unison, you know the
data is protected. It's just that the local working copy may fail to update, or
may diverge from the remote version. It's up to you to create and commit the
combined version yourself, but you are guaranteed to have all the history you
might need to do this.

Note that while it is possible to build new merge algorithms into Git,
the standard ones are focused on line-based changes to source code. They don't
work well for XML or JSON if it's presented without any line breaks.

The other interesting consideration is multiple peers. In this case you have
multiple remote tracking branches, some of which may match your local branch,
some of which may be behind you, and some of which may be ahead of you
(i.e. contain changes that you haven't yet merged)::

    main: AAAAAAAA
    remotes/foo/main: BBBBBBBB
    remotes/bar/main: CCCCCCCC
    remotes/baz/main: AAAAAAAA

Note that each peer is explicitly tracked, and therefore has to be explicitly
created. If a peer becomes stale or is no longer needed, it's up to you to
remove it from your configuration and delete the remote tracking branch.
This is different from CouchDB, which doesn't keep any peer state in the
database.

Another difference between CouchDB and Git is that it maintains all history
back to time
zero - Git compaction keeps diffs between all those versions in order to reduce
size, but CouchDB discards them. If you are constantly updating a document,
the size of a Git repo would grow forever. It is possible (with some effort)
to use "history rewriting" to make Git forget commits earlier than a particular
one.

.. _replication/conflicts/git:

What is the CouchDB replication protocol? Is it like Git?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

:Author: Jason Smith
:Date: 2011-01-29
:Source: `StackOverflow <http://stackoverflow.com/questions/4766391/what-is-the-couchdb-replication-protocol-is-it-like-git>`_

**Key points**

**If you know Git, then you know how Couch replication works.** Replicating is
*very* similar to pushing or pulling with distributed source managers like Git.

**CouchDB replication does not have its own protocol.** A replicator simply
connects to two DBs as a client, then reads from one and writes to the other.
Push replication is reading the local data and updating the remote DB;
pull replication is vice versa.

* **Fun fact 1**: The replicator is actually an independent Erlang application,
  in its own process. It connects to both couches, then reads records from one
  and writes them to the other.
* **Fun fact 2**: CouchDB has no way of knowing who is a normal client and who
  is a replicator (let alone whether the replication is push or pull).
  It all looks like client connections. Some of them read records. Some of them
  write records.

**Everything flows from the data model**

The replication algorithm is trivial, uninteresting. A trained monkey could
design it. It's simple because the cleverness is the data model, which has these
useful characteristics:

#. Every record in CouchDB is completely independent of all others. That sucks
   if you want to do a JOIN or a transaction, but it's awesome if you want to
   write a replicator. Just figure out how to replicate one record, and then
   repeat that for each record.
#. Like Git, records have a linked-list revision history. A record's revision ID
   is the checksum of its own data. Subsequent revision IDs are checksums of:
   the new data, plus the revision ID of the previous.

#. In addition to application data (``{"name": "Jason", "awesome": true}``),
   every record stores the evolutionary time line of all previous revision IDs
   leading up to itself.

   - Exercise: Take a moment of quiet reflection. Consider any two different
     records, A and B. If A's revision ID appears in B's time line, then B
     definitely evolved from A. Now consider Git's fast-forward merges.
     Do you hear that? That is the sound of your mind being blown.

#. Git isn't really a linear list. It has forks, when one parent has multiple
   children. CouchDB has that too.

   - Exercise: Compare two different records, A and B. A's revision ID does not
     appear in B's time line; however, one revision ID, C, is in both A's and
     B's time line. Thus A didn't evolve from B. B didn't evolve from A. But
     rather, A and B have a common ancestor C. In Git, that is a "fork." In
     CouchDB, it's a "conflict."

   - In Git, if both children go on to develop their time lines independently,
     that's cool. Forks totally support that.
   - In CouchDB, if both children go on to develop their time lines
     independently, that cool too. Conflicts totally support that.
   - **Fun fact 3**: CouchDB "conflicts" do not correspond to Git "conflicts."
     A Couch conflict is a divergent revision history, what Git calls a "fork."
     For this reason the CouchDB community pronounces "conflict" with a silent
     `n`: "co-flicked."

#. Git also has merges, when one child has multiple parents. CouchDB *sort* of
   has that too.

   - **In the data model, there is no merge.** The client simply marks one
     time line as deleted and continues to work with the only extant time line.
   - **In the application, it feels like a merge.** Typically, the client merges
     the *data* from each time line in an application-specific way.
     Then it writes the new data to the time line. In Git, this is like copying
     and pasting the changes from branch A into branch B, then committing to
     branch B and deleting branch A. The data was merged, but there was no
     `git merge`.
   - These behaviors are different because, in Git, the time line itself is
     important; but in CouchDB, the data is important and the time line is
     incidental—it's just there to support replication. That is one reason why
     CouchDB's built-in revisioning is inappropriate for storing revision data
     like a wiki page.

**Final notes**

At least one sentence in this writeup (possibly this one) is complete BS.
