[
https://issues.apache.org/jira/browse/HBASE-6390?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13413870#comment-13413870
]
Andrew Purtell commented on HBASE-6390:
---------------------------------------
So what you are looking for here is a way for a user to, perhaps optionally,
make idempotent requests out of Append and Increment, correct?
Let me volunteer a couple of strawmen:
1) Could overload the timestamp of the Append and Increment requests. If the
request is "out of date" relative to another request already applied, throw
back a DoNotRetryException (or just a DNRE for that op if submitted as a
MultiAction). This is roughly how ZooKeeper handles this class of distributed
synchronization issue. Timestamp becomes a global sequence number. Not a
logical sequence number so clocks must be closely synchronized. Each memstore
would track the (server side) time of the most recent in-place update mutation.
Could go further and keep a soft cache of in-place update times by row or even
KV for use by append/increment/ICV. If more specific information gets evicted
from the cache due to pressure then fallback to the per-memstore global
timestamp would still insure correctness but potentially more resubmission work
for the client/app.
2) A more generic option could be:
* Extend the API where the user can set an optional cookie (a long).
* Keep a ring buffer of recent cookies up on the server.
* Check the buffer first if a request with given cookie has already been
applied and throw an exception back to the client if so.
Wouldn't guarantee correctness outside of some time bound. Also I worry about
state management on the server. How large would that buffer need to be to
capture all cookies submitted within ~(2 * time bound)?
> append() and increment() may result in inconsistent result on retries.
> ----------------------------------------------------------------------
>
> Key: HBASE-6390
> URL: https://issues.apache.org/jira/browse/HBASE-6390
> Project: HBase
> Issue Type: Bug
> Affects Versions: 0.94.0, 0.96.0
> Reporter: Ashutosh Jindal
>
> append() and increment() api can give inconsistent result in following
> scenarios :
> 1- For eg, if the client does not receive the response in the specified time,
> it retries. Now the first call to increment/append is already done and this
> retry will again make the operation to succeed.
> 2- Now if the sync() to WAL fails we get an IOException, on getting an
> exception there is a retry done which again results in the doing the
> increment/append again.
> When may need some sort of roll back for the second problem.
> For the first one we need to see how to handle this.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira