There may exist two issues in Asyncprocess code as following:
1) In Htable#backgroundFlushCommits, we have following code:
In a rare situation like the following:
When there are some updates ongoing, a client call Put(internally backgroundFlushCommits get triggered). Then comes the issue:
The first ap.hasError() returns false and the second ap.hasError() returns true. So we could throw exception to caller while writeAsyncBuffer isn't empty.(some updates are still on going).
If a client retry with different values for the same keys, we could end up with nondeterministic state.
2) The following code only update cache for the first row. We should update cache for all the regions inside resultForRS because actions are sent to multiple regions per RS