On Wed, Feb 22, 2017 at 8:42 AM, 안정아 <jungah....@samsung.com> wrote:
> Hi, all > > > > I'm trying to implement a typical CAS operation with LWT query(conditional > update). > > But I'm having trouble keeping integrity of the result when > WriteTimeoutException occurs. > > according to http://www.datastax.com/dev/blog/cassandra-error-handling- > done-right > > "If the paxos phase fails, the driver will throw a WriteTimeoutException > with a WriteType. > > CAS as retrieved with WriteTimeoutException#getWriteType(). > > In this situation you can’t know if the CAS operation has been applied..." > > 1) Doesn't it ruin the whole point of using LWT for CAS operation if you > can't be sure whether the query is applied or not? > > 2-1) Is there anyway to know whether the query is applied when timeout > occurred? > > 2-2) If we can't tell, are there any way to workaround this and keep the > CAS integrity? > > > > Thanks! > > > > > What you might be first trying to do is count the timeouts: https://github.com/edwardcapriolo/ec/blob/master/src/test/java/Base/CompareAndSwapTest.java https://github.com/edwardcapriolo/ec/blob/master/src/test/java/Base/CompareAndSwapTest.java#L99 This tactic does not work. However you can keep re-reading at CL.Serial to determine i the update applied. What I found this to mean is you CANT do this: for (i=0;i<2000;i++){ new Thread(){ () -> { doCasInsert() } }.start(); } Assert.assertEquals(2000, getTotalInserts()) But you CAN do this: for (i=0;i<2000;i++){ new Thread ( () -> { count = "SELECT count(1) from....".setConstistencyLevel(cl.Serial) if (count < 2000){ doCasInsert() } }); } Essentially, because you want know if a CAS operation will succeed even in a client timeout in the future you can not "COUNT" on the insert side. Y