Bucket shadowing and CAS

29 views
Skip to first unread message

Daniel McGreal

unread,
Aug 18, 2014, 4:35:24 AM8/18/14
to mobile-c...@googlegroups.com
Hi Couchbase Mobile forum posters,

Is it possible to use Couchbase Server's (Java SDK) Check and Set functionality with Sync Gateway's bucket shadowing in order to have optimistic concurrency on both sides of the application? Essentially this boils down to whether SG will respect CAS values when it updates a document in CB. I'm particularly interested in CB3 CAS support with Java SDK 2.0.

Thanks, Dan.

Jens Alfke

unread,
Aug 18, 2014, 12:18:37 PM8/18/14
to mobile-c...@googlegroups.com

On Aug 18, 2014, at 1:35 AM, Daniel McGreal <d.j.m...@gmail.com> wrote:

Is it possible to use Couchbase Server's (Java SDK) Check and Set functionality with Sync Gateway's bucket shadowing in order to have optimistic concurrency on both sides of the application? Essentially this boils down to whether SG will respect CAS values when it updates a document in CB. I'm particularly interested in CB3 CAS support with Java SDK 2.0.

No — the gateway uses a simple Set call without CAS to update the app bucket.

What you're suggesting, I think, is for the gateway to record the CAS value whenever it saves a document to the app bucket, and then use a Set-with-CAS the next time it updates the document; that way if the CAS value has changed the Set will fail, and the gateway can read the current value from the app bucket.

It's been a while since I worked on this code, but IIRC there are two problems:

1. Couchbase Server's Set call doesn't return the new CAS value. So to get this value we'd have to issue an immediate Get after the Set, which could be bad for performance (and is subject to possible race conditions.)

2. It's unclear what to do if there is a conflict. CAS codes carry less information than the revision histories that the Gateway and Couchbase Lite use. The result would be a conflict, but I'm not sure if it would be possible to add the new version from the app bucket to the revision tree in a meaningful way. (Hm, it might be. This needs more thought…)

Do you have any more ideas about how you think this should work? (I will freely admit that I'm not an expert on CAS.)

—Jens

Dan

unread,
Aug 18, 2014, 1:32:31 PM8/18/14
to mobile-c...@googlegroups.com
Thanks (again!) Jens,

Do you have any more ideas about how you think this should work? (I will freely admit that I'm not an expert on CAS.)

Not really I'm afraid! CB-Mobile is actually our first experience with optimistic concurrency. Is the communication between bucket and shadowed bucket push or polled? I.e. How great a window of opportunity is there for an SG revision to overwrite a revision from non-SG code?

I had the impression from the CB SDKs that the caller is in-charge of setting up the CAS value with each call (i.e. changing it to some new value each time though I was looking at CB Java SDK 2 which isn't fully documented yet). If the two sides (SG/CB-SDKs) could agree to source the CAS value on the current revision metadata from SG (e.g. most significant long in the UUID) then that could make this easier, though I gather from your comment about needing a 2nd call that I've misinterpreted it?

I'll try to find some time to check tomorrow.
Thanks, Dan.

--
You received this message because you are subscribed to a topic in the Google Groups "Couchbase Mobile" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/mobile-couchbase/t5mHKrBR8Jk/unsubscribe.
To unsubscribe from this group and all its topics, send an email to mobile-couchba...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/mobile-couchbase/1A413910-8CAF-4655-B06A-3EDC71809C4A%40couchbase.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages