On Mar 5, 2009, at 7:24 AM, Jan Lehnardt wrote:


On 5 Mar 2009, at 07:31, Paul Davis wrote:

On Wed, Mar 4, 2009 at 8:34 PM, Adam Kocoloski <[email protected] > wrote:
Hi folks, we've been running into a problem where multiple replications with the same source and target are running simultaneously. This introduces quite a lot of unnecessary network traffic and causes real problems with update collisions on the local replication history documents. If replicator A updates the source doc and replicator B updates the target doc, subsequent
replications will decide that a full replication is necessary.

I have some ideas about how to ensure only one is running at a time (more on that in a separate mail), but I'd like some feedback on how to handle the second..Nth request. Let's call the initial POST to _replicate "A" and the
second POST "B":

Option 1 -- Respond to B with the results from A
This option works fine if the source is remote. However, if the source is local, the replication started by A will be missing updates to the source DB
that occurred between A and B.  B may be surprised by that result.

Option 2 -- Grab an updated DB and continue the replication
This option will include updates to the source that occurred between A and B
in the response to both requests.

Option 3 -- Respond to A, then trigger another replication for B
In this case we wait till the replication started by A has completed, then do an incremental one and respond to B with the results of that incremental.

I think I'd vote for 3.  Cheers, Adam



If I follow this correctly, the issue is, "POST to _replicate, a
second POST to _replicate occurs before the first request finishes"
(with the same source/target info).

My knowledge of replication is only cursory, but I could also see:

Option 4:

Same as views, we wait for replication to finish and return the same
result to all clients that made a request.

I understand this and Adam's option 3 to be the same. What am I missing? :)

No, not quite. In Option 3 the two requesters get different responses. A gets the result of the original request, B gets the result of the replication triggered automatically after the first one that replicates any updates to the DB which happened during the first pass. If no updates occurred, B will receive the result of the first replication.

Paul's Option 4 is more like Options 1 and 2, where A and B get identical responses. The difference between 1 and 2 is just whether new updates get included in that response.

Whew.

Option 5:

Return an error on B that says, "Yeah, yeah. Already on it."

This would make replication behave a bit like compaction.

Sort of, in that additional triggers are no-ops. Option 1 also has that behavior.

I think I like 3/4 best.

Cheers
Jan
--


Best, Adam

Reply via email to