infinispan/infinispan — pull request #1503 by anistor (2012-12-03 17:14:39+00:00)
Title: ISPN-2362 Remove-inconsistency during NBST

* Add StateTransferConsistencyTest to test ISPN-2362 and ISPN-2502
* Add a new flag, Flag.PUT_FOR_STATE_TRANSFER to be use on put commands done by state transfer
* LocalQueryInterceptor does not index modiifcations done by state transfer
* Add a isFromStateTransfer flag to LocalTransaction that is set to true only for transactions done by state transfer
* BaseRpcInterceptor and BaseBackupInterceptor do not send the command remotely if the transaction is flagged as created by state transfer
* Add support in StateConsumer to keep track of keys updated by user code during state transfer: isKeyUpdated/addUpdatedKey/stopRecordingUpdatedKeys. Recording starts when rebalance begins and will end when rebalance ends or when a ClearCommand is executed.
* The put command generated by state transfer in StateConsumerImpl is now transactional if the cache is transactional. We no longer use SKIP_LOCKING. This fixes ISPN-2502.
* EntryWrappingInterceptor.commitEntryIfNeeded() notifies StateConsumerImpl of any user-updated keys. It also checks if the update is caused by state transfer and the key was previously updated by the user and does not allow the update if so. This ensures no user generated modifications are overwritten or undone by state transfer.
* If the update is caused by state transfer, VersionedEntryWrappingInterceptor does not perform a write skew check and does not increment the version before executing prepare and commits the entry into DataContainer using the supplied version as is. We need to bypass incrementation in order to ensure the version is identical to the one on source node of the state transfer. Not doing so will cause subsequent user generated updates to fail due to write skew. Bypassing write skew checks in state transfer does not impact consistency because the state transfer PUT has lower priority than normal user generated write operations and is always rolled back if a user modification is committed before the state transfer PUT attempts to commit.

JIRA: https://issues.jboss.org/browse/ISPN-2362