[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Determining if data will be created on Cassandra Write Exceptions

Thanks for the links. I get that all queries need to be idempotent, and we should use retries for data consistency.

But, what happens when the retries fail? Then, the data *may* be there. To maintain consistency we need to rollback any created data, correct?


On Wed, Feb 15, 2017 at 4:53 AM, Nicolas Guyomar <nicolas.guyomar@xxxxxxxxx> wrote:
Hi Rouble,

I usually have to read javadoc in java driver to get my ideas straight regarding exception handling.

As Edward stated, you can know how many replica acknowleged the write in Cassandra response.

Keep in mind that retrying usually mean your write query is idempotent or you don't care having duplicate entries

On 14 February 2017 at 21:49, Edward Capriolo <edlinuxguru@xxxxxxxxx> wrote:

On Tue, Feb 14, 2017 at 2:30 PM, rouble <r.ouble@xxxxxxxxx> wrote:
Cassandra Gurus,

I have a question open on stackoverlow on how to determine if data is actually created when a Write exception is thrown: http://stackoverflow.com/questions/42231140/determining-if-data-will-be-created-on-cassandra-write-exceptions

From my discussion on the question, it seems that on *any* Cassandra write, *any* exception, means the data may or may not be written. With the exception of InvalidQueryException.

I find this unsettling. Maybe I need time to adjust from my RDBMS background, but how is Cassandra supposed to be used for systems that need user feedback? or is it?

Let me use the simple example of account creation. User tries to create an account, and we need to indicate one way or the other whether the account was created. Lets say a WriteTimeoutException is thrown while trying to add the user. User may or may not be written, what do we tell the user? Should we just rollback the change and tell the user that it failed. This seems like the only thing we can do deterministically (and I notice someone doing just that here: http://stackoverflow.com/a/34860495/215120). 

How are people handling WriteTimeoutExceptions or UnavailableExceptions? Rolling back in every case does not seem practical.


There is a difference between WriteTimeoutException and UnavailableException. 

UnavailableException indicates the write was never even attempted.

WriteTimeoutException means the write was attempted. I believe you can interrogate the exception to determine if the operation was successful on any of the natural endpoints. 

The way to "cope" is idempotent writes and retries.  If that model does not fit it is a square peg round hole discussion.