Hi, Igniters!

 Currently we have context switching implemented for optimistic
transactions [1].

 Goal of the current ticket is to support transaction suspend()\resume()
operations for pessimistic transactions.

 The essential problem with them lies in *IgniteTxAdapter#threadId*.
 Thread id is set when transaction is created and afterwards is transferred
between nodes by GridDistributedTx requests\responses when we perform
put\get operations.
 When we suspend and resume transaction, thread id is got changed locally,
but not on remote nodes.

 In ticket I decided to partly remove thread id from source, and introduced
*undefined* value for it, where its value must be ignored.
 Another solution can be to replace thread id usage with some new global
transaction id counter.

 The former solution has advantages :
 compatibility is preserved, step-by-step clear implementation, minimal
changes to explicit cache lock work(it still creates candidates with
not-null thread id) as opposed to the last solution.

 There are 3 possible solutions to "thread id on remote nodes" issue :
 1) Change thread id on remote nodes once suspend()\resume() is called.
 2) Get rid of sending thread id to remote nodes.
 3) Don’t remove the field, just put -1 (undefined) in it.

 The last option was chosen, because it will save compatibility in cluster
with nodes of older versions.
 Note that still outside the transaction, when explicit cache lock is
created, thread id is set not null value in lock request(i.e.
GridNearLockRequest).

 Thread id is moved from global IgniteTxAdapter to GridNearTxLocal, as long
as only *near local* transaction is need it.
 For instance, when local candidate(either near local or dht local) is
created for GridNearTxLocal. Note that remote candidates are created with
thread id undefined, because it useless for non-local candidates.
 In IgniteTxAdapter#ownsLock thread id is replaced with tx version check.
 We could do it, because near transactions has got unique versions to check
against.

 In tx synchronizer GridCacheTxFinishSync thread id is replaced with tx
version, so we don't need to store it and send by GridFinishResponse
messages.
 As a consequence, thread id is also removed from grid near finish\prepare
request\response.

 Also, thread id information is removed from deadlock messages (in
TxDeadlock, TxDeadlockDetection).

Please, review it:

ticket *https://issues.apache.org/jira/browse/IGNITE-5714
<https://issues.apache.org/jira/browse/IGNITE-5714>*
pull request *https://github.com/apache/ignite/pull/2789
<https://github.com/apache/ignite/pull/2789>*
review https://reviews.ignite.apache.org/ignite/review/IGNT-CR-364

 [1] : https://issues.apache.org/jira/browse/IGNITE-5712.
-- 

*Best Regards,*

*Kuznetsov Aleksey*

Reply via email to