Hi ! Thanks for help. I've created ticket :
https://issues.apache.org/jira/browse/IGNITE-4887
and a commit :
https://github.com/voipp/ignite/commit/aa3487bd9c203394f534c605f84e06436b638e5c
We really need this feature

чт, 30 мар. 2017 г. в 11:31, Alexey Goncharuk <alexey.goncha...@gmail.com>:

> Aleksey,
>
> I doubt your approach works as expected. Current transaction recovery
> protocol heavily relies on the originating node ID in its internal logic.
> For example, currently a transaction will be rolled back if you want to
> transfer a transaction ownership to another node and original tx owner
> fails. An attempt to commit such a transaction on another node may fail
> with all sorts of assertions. After transaction ownership changed, you need
> to notify all current transaction participants about this change, and it
> should also be done failover-safe, let alone that you did not add any tests
> for these cases.
>
> I back Denis here. Please create a ticket first and come up with clear
> use-cases, API and protocol changes design. It is hard to reason about the
> changes you've made when we do not even understand why you are making these
> changes and how they are supposed to work.
>
> --AG
>
> 2017-03-30 10:43 GMT+03:00 ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com>:
>
> > So, what do u think on my idea ?
> >
> > ср, 29 мар. 2017 г. в 10:35, ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com
> >:
> >
> > > Hi! No, i dont have ticket for this.
> > > In the ticket i have implemented methods that change transaction status
> > to
> > > STOP, thus letting it to commit transaction in another thread. In
> another
> > > thread you r going to restart transaction in order to commit it.
> > > The mechanism behind it is obvious : we change thread id to newer one
> in
> > > ThreadMap, and make use of serialization of txState, transactions
> itself
> > to
> > > transfer them into another thread.
> > >
> > >
> > > вт, 28 мар. 2017 г. в 20:15, Denis Magda <dma...@apache.org>:
> > >
> > > Aleksey,
> > >
> > > Do you have a ticket for this? Could you briefly list what exactly was
> > > done and how the things work.
> > >
> > > —
> > > Denis
> > >
> > > > On Mar 28, 2017, at 8:32 AM, ALEKSEY KUZNETSOV <
> > alkuznetsov...@gmail.com>
> > > wrote:
> > > >
> > > > Hi, Igniters! I 've made implementation of transactions of non-single
> > > > coordinator. Here you can start transaction in one thread and commit
> it
> > > in
> > > > another thread.
> > > > Take a look on it. Give your thoughts on it.
> > > >
> > > >
> > > https://github.com/voipp/ignite/pull/10/commits/
> > 3a3d90aa6ac84f125e4c3ce4ced4f269a695ef45
> > > >
> > > > пт, 17 мар. 2017 г. в 19:26, Sergi Vladykin <
> sergi.vlady...@gmail.com
> > >:
> > > >
> > > >> You know better, go ahead! :)
> > > >>
> > > >> Sergi
> > > >>
> > > >> 2017-03-17 16:16 GMT+03:00 ALEKSEY KUZNETSOV <
> > alkuznetsov...@gmail.com
> > > >:
> > > >>
> > > >>> we've discovered several problems regarding your "accumulation"
> > > >>> approach.These are
> > > >>>
> > > >>>   1. perfomance issues when transfering data from temporary cache
> to
> > > >>>   permanent one. Keep in mind big deal of concurent transactions in
> > > >>> Service
> > > >>>   commiter
> > > >>>   2. extreme memory load when keeping temporary cache in memory
> > > >>>   3. As long as user is not acquainted with ignite, working with
> > cache
> > > >>>   must be transparent for him. Keep this in mind. User's node can
> > > >> evaluate
> > > >>>   logic with no transaction at all, so we should deal with both
> types
> > > of
> > > >>>   execution flow : transactional and non-transactional.Another one
> > > >>> problem is
> > > >>>   transaction id support at the user node. We would have handled
> all
> > > >> this
> > > >>>   issues and many more.
> > > >>>   4. we cannot pessimistically lock entity.
> > > >>>
> > > >>> As a result, we decided to move on building distributed
> transaction.
> > We
> > > >> put
> > > >>> aside your "accumulation" approach until we realize how to solve
> > > >>> difficulties above .
> > > >>>
> > > >>> чт, 16 мар. 2017 г. в 16:56, Sergi Vladykin <
> > sergi.vlady...@gmail.com
> > > >:
> > > >>>
> > > >>>> The problem "How to run millions of entities, and millions of
> > > >> operations
> > > >>> on
> > > >>>> a single Pentium3" is out of scope here. Do the math, plan
> capacity
> > > >>>> reasonably.
> > > >>>>
> > > >>>> Sergi
> > > >>>>
> > > >>>> 2017-03-16 15:54 GMT+03:00 ALEKSEY KUZNETSOV <
> > > alkuznetsov...@gmail.com
> > > >>> :
> > > >>>>
> > > >>>>> hmm, If we have millions of entities, and millions of operations,
> > > >> would
> > > >>>> not
> > > >>>>> this approache lead to memory overflow and perfomance degradation
> > > >>>>>
> > > >>>>> чт, 16 мар. 2017 г. в 15:42, Sergi Vladykin <
> > > >> sergi.vlady...@gmail.com
> > > >>>> :
> > > >>>>>
> > > >>>>>> 1. Actually you have to check versions on all the values you
> have
> > > >>> read
> > > >>>>>> during the tx.
> > > >>>>>>
> > > >>>>>> For example if we have [k1 => v1, k2 => v2] and do:
> > > >>>>>>
> > > >>>>>> put(k1, get(k2) + 5)
> > > >>>>>>
> > > >>>>>> We have to remember the version for k2. This logic can be
> > > >> relatively
> > > >>>>> easily
> > > >>>>>> encapsulated in a framework atop of Ignite. You need to
> implement
> > > >> one
> > > >>>> to
> > > >>>>>> make all this stuff usable.
> > > >>>>>>
> > > >>>>>> 2. I suggest to avoid any locking here, because you easily will
> > end
> > > >>> up
> > > >>>>> with
> > > >>>>>> deadlocks. If you do not have too frequent updates for your
> keys,
> > > >>>>>> optimistic approach will work just fine.
> > > >>>>>>
> > > >>>>>> Theoretically in the Committer Service you can start a thread
> for
> > > >> the
> > > >>>>>> lifetime of the whole distributed transaction, take a lock on
> the
> > > >> key
> > > >>>>> using
> > > >>>>>> IgniteCache.lock(K key) before executing any Services, wait for
> > all
> > > >>> the
> > > >>>>>> services to complete, execute optimistic commit in the same
> thread
> > > >>>> while
> > > >>>>>> keeping this lock and then release it. Notice that all the
> Ignite
> > > >>>>>> transactions inside of all Services must be optimistic here to
> be
> > > >>> able
> > > >>>> to
> > > >>>>>> read this locked key.
> > > >>>>>>
> > > >>>>>> But again I do not recommend you using this approach until you
> > > >> have a
> > > >>>>>> reliable deadlock avoidance scheme.
> > > >>>>>>
> > > >>>>>> Sergi
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> 2017-03-16 12:53 GMT+03:00 ALEKSEY KUZNETSOV <
> > > >>> alkuznetsov...@gmail.com
> > > >>>>> :
> > > >>>>>>
> > > >>>>>>> Yeah, now i got it.
> > > >>>>>>> There are some doubts on this approach
> > > >>>>>>> 1) During optimistic commit phase, when you assure no one
> altered
> > > >>> the
> > > >>>>>>> original values, you must check versions of other dependent
> keys.
> > > >>> How
> > > >>>>>> could
> > > >>>>>>> we obtain those keys(in an automative manner, of course) ?
> > > >>>>>>> 2) How could we lock a key before some Service A introduce
> > > >> changes?
> > > >>>> So
> > > >>>>> no
> > > >>>>>>> other service is allowed to change this key-value?(sort of
> > > >>>> pessimistic
> > > >>>>>>> blocking)
> > > >>>>>>> May be you know some implementations of such approach ?
> > > >>>>>>>
> > > >>>>>>> ср, 15 мар. 2017 г. в 17:54, ALEKSEY KUZNETSOV <
> > > >>>>> alkuznetsov...@gmail.com
> > > >>>>>>> :
> > > >>>>>>>
> > > >>>>>>>> Thank you very much for help.  I will answer later.
> > > >>>>>>>>
> > > >>>>>>>> ср, 15 мар. 2017 г. в 17:39, Sergi Vladykin <
> > > >>>>> sergi.vlady...@gmail.com
> > > >>>>>>> :
> > > >>>>>>>>
> > > >>>>>>>> All the services do not update key in place, but only generate
> > > >>> new
> > > >>>>> keys
> > > >>>>>>>> augmented by otx and store the updated value in the same cache
> > > >> +
> > > >>>>>> remember
> > > >>>>>>>> the keys and versions participating in the transaction in some
> > > >>>>> separate
> > > >>>>>>>> atomic cache.
> > > >>>>>>>>
> > > >>>>>>>> Follow this sequence of changes applied to cache contents by
> > > >> each
> > > >>>>>>> Service:
> > > >>>>>>>>
> > > >>>>>>>> Initial cache contents:
> > > >>>>>>>>            [k1 => v1]
> > > >>>>>>>>            [k2 => v2]
> > > >>>>>>>>            [k3 => v3]
> > > >>>>>>>>
> > > >>>>>>>> Cache contents after Service A:
> > > >>>>>>>>            [k1 => v1]
> > > >>>>>>>>            [k2 => v2]
> > > >>>>>>>>            [k3 => v3]
> > > >>>>>>>>            [k1x => v1a]
> > > >>>>>>>>            [k2x => v2a]
> > > >>>>>>>>
> > > >>>>>>>>         + [x => (k1 -> ver1, k2 -> ver2)] in some separate
> > > >>> atomic
> > > >>>>>> cache
> > > >>>>>>>>
> > > >>>>>>>> Cache contents after Service B:
> > > >>>>>>>>            [k1 => v1]
> > > >>>>>>>>            [k2 => v2]
> > > >>>>>>>>            [k3 => v3]
> > > >>>>>>>>            [k1x => v1a]
> > > >>>>>>>>            [k2x => v2ab]
> > > >>>>>>>>            [k3x => v3b]
> > > >>>>>>>>
> > > >>>>>>>>        + [x => (k1 -> ver1, k2 -> ver2, k3 -> ver3)] in some
> > > >>>>> separate
> > > >>>>>>>> atomic cache
> > > >>>>>>>>
> > > >>>>>>>> Finally the Committer Service takes this map of updated keys
> > > >> and
> > > >>>>> their
> > > >>>>>>>> versions from some separate atomic cache, starts Ignite
> > > >>> transaction
> > > >>>>> and
> > > >>>>>>>> replaces all the values for k* keys to values taken from k*x
> > > >>> keys.
> > > >>>>> The
> > > >>>>>>>> successful result must be the following:
> > > >>>>>>>>
> > > >>>>>>>>            [k1 => v1a]
> > > >>>>>>>>            [k2 => v2ab]
> > > >>>>>>>>            [k3 => v3b]
> > > >>>>>>>>            [k1x => v1a]
> > > >>>>>>>>            [k2x => v2ab]
> > > >>>>>>>>            [k3x => v3b]
> > > >>>>>>>>
> > > >>>>>>>>        + [x => (k1 -> ver1, k2 -> ver2, k3 -> ver3)] in some
> > > >>>>> separate
> > > >>>>>>>> atomic cache
> > > >>>>>>>>
> > > >>>>>>>> But Committer Service also has to check that no one updated
> the
> > > >>>>>> original
> > > >>>>>>>> values before us, because otherwise we can not give any
> > > >>>>> serializability
> > > >>>>>>>> guarantee for these distributed transactions. Here we may need
> > > >> to
> > > >>>>> check
> > > >>>>>>> not
> > > >>>>>>>> only versions of the updated keys, but also versions of any
> > > >> other
> > > >>>>> keys
> > > >>>>>>> end
> > > >>>>>>>> result depends on.
> > > >>>>>>>>
> > > >>>>>>>> After that Committer Service has to do a cleanup (may be
> > > >> outside
> > > >>> of
> > > >>>>> the
> > > >>>>>>>> committing tx) to come to the following final state:
> > > >>>>>>>>
> > > >>>>>>>>            [k1 => v1a]
> > > >>>>>>>>            [k2 => v2ab]
> > > >>>>>>>>            [k3 => v3b]
> > > >>>>>>>>
> > > >>>>>>>> Makes sense?
> > > >>>>>>>>
> > > >>>>>>>> Sergi
> > > >>>>>>>>
> > > >>>>>>>>
> > > >>>>>>>> 2017-03-15 16:54 GMT+03:00 ALEKSEY KUZNETSOV <
> > > >>>>> alkuznetsov...@gmail.com
> > > >>>>>>> :
> > > >>>>>>>>
> > > >>>>>>>>>   - what do u mean by saying "
> > > >>>>>>>>> *in a single transaction checks value versions for all the
> > > >> old
> > > >>>>> values
> > > >>>>>>>>>    and replaces them with calculated new ones *"? Every time
> > > >>> you
> > > >>>>>>> change
> > > >>>>>>>>>   value(in some service), you store it to *some special
> > > >> atomic
> > > >>>>>> cache*
> > > >>>>>>> ,
> > > >>>>>>>> so
> > > >>>>>>>>>   when all services ceased working, Service commiter got a
> > > >>>> values
> > > >>>>>> with
> > > >>>>>>>> the
> > > >>>>>>>>>   last versions.
> > > >>>>>>>>>   - After "*does cleanup of temporary keys and values*"
> > > >>> Service
> > > >>>>>>> commiter
> > > >>>>>>>>>   persists them into permanent store, isn't it ?
> > > >>>>>>>>>   - I cant grasp your though, you say "*in case of version
> > > >>>>> mismatch
> > > >>>>>> or
> > > >>>>>>>> TX
> > > >>>>>>>>>   timeout just rollbacks*". But what versions would it
> > > >> match?
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>>> ср, 15 мар. 2017 г. в 15:34, Sergi Vladykin <
> > > >>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>> :
> > > >>>>>>>>>
> > > >>>>>>>>>> Ok, here is what you actually need to implement at the
> > > >>>>> application
> > > >>>>>>>> level.
> > > >>>>>>>>>>
> > > >>>>>>>>>> Lets say we have to call 2 services in the following order:
> > > >>>>>>>>>> - Service A: wants to update keys [k1 => v1,   k2 => v2]
> > > >> to
> > > >>>>> [k1
> > > >>>>>> =>
> > > >>>>>>>>> v1a,
> > > >>>>>>>>>>  k2 => v2a]
> > > >>>>>>>>>> - Service B: wants to update keys [k2 => v2a, k3 => v3]
> > > >> to
> > > >>>> [k2
> > > >>>>>> =>
> > > >>>>>>>>> v2ab,
> > > >>>>>>>>>> k3 => v3b]
> > > >>>>>>>>>>
> > > >>>>>>>>>> The change
> > > >>>>>>>>>>    from [ k1 => v1,   k2 => v2,     k3 => v3   ]
> > > >>>>>>>>>>    to     [ k1 => v1a, k2 => v2ab, k3 => v3b ]
> > > >>>>>>>>>> must happen in a single transaction.
> > > >>>>>>>>>>
> > > >>>>>>>>>>
> > > >>>>>>>>>> Optimistic protocol to solve this:
> > > >>>>>>>>>>
> > > >>>>>>>>>> Each cache key must have a field `otx`, which is a unique
> > > >>>>>>> orchestrator
> > > >>>>>>>> TX
> > > >>>>>>>>>> identifier - it must be a parameter passed to all the
> > > >>> services.
> > > >>>>> If
> > > >>>>>>>> `otx`
> > > >>>>>>>>> is
> > > >>>>>>>>>> set to some value it means that it is an intermediate key
> > > >> and
> > > >>>> is
> > > >>>>>>>> visible
> > > >>>>>>>>>> only inside of some transaction, for the finalized key
> > > >> `otx`
> > > >>>> must
> > > >>>>>> be
> > > >>>>>>>>> null -
> > > >>>>>>>>>> it means the key is committed and visible for everyone.
> > > >>>>>>>>>>
> > > >>>>>>>>>> Each cache value must have a field `ver` which is a version
> > > >>> of
> > > >>>>> that
> > > >>>>>>>>> value.
> > > >>>>>>>>>>
> > > >>>>>>>>>> For both fields (`otx` and `ver`) the safest way is to use
> > > >>>> UUID.
> > > >>>>>>>>>>
> > > >>>>>>>>>> Workflow is the following:
> > > >>>>>>>>>>
> > > >>>>>>>>>> Orchestrator starts the distributed transaction with `otx`
> > > >> =
> > > >>> x
> > > >>>>> and
> > > >>>>>>>> passes
> > > >>>>>>>>>> this parameter to all the services.
> > > >>>>>>>>>>
> > > >>>>>>>>>> Service A:
> > > >>>>>>>>>> - does some computations
> > > >>>>>>>>>> - stores [k1x => v1a, k2x => v2a]  with TTL = Za
> > > >>>>>>>>>>      where
> > > >>>>>>>>>>          Za - left time from max Orchestrator TX duration
> > > >>>> after
> > > >>>>>>>> Service
> > > >>>>>>>>> A
> > > >>>>>>>>>> end
> > > >>>>>>>>>>          k1x, k2x - new temporary keys with field `otx` =
> > > >> x
> > > >>>>>>>>>>          v2a has updated version `ver`
> > > >>>>>>>>>> - returns a set of updated keys and all the old versions
> > > >> to
> > > >>>> the
> > > >>>>>>>>>> orchestrator
> > > >>>>>>>>>>       or just stores it in some special atomic cache like
> > > >>>>>>>>>>       [x => (k1 -> ver1, k2 -> ver2)] TTL = Za
> > > >>>>>>>>>>
> > > >>>>>>>>>> Service B:
> > > >>>>>>>>>> - retrieves the updated value k2x => v2a because it knows
> > > >>>> `otx`
> > > >>>>> =
> > > >>>>>> x
> > > >>>>>>>>>> - does computations
> > > >>>>>>>>>> - stores [k2x => v2ab, k3x => v3b] TTL = Zb
> > > >>>>>>>>>> - updates the set of updated keys like [x => (k1 -> ver1,
> > > >> k2
> > > >>>> ->
> > > >>>>>>> ver2,
> > > >>>>>>>> k3
> > > >>>>>>>>>> -> ver3)] TTL = Zb
> > > >>>>>>>>>>
> > > >>>>>>>>>> Service Committer (may be embedded into Orchestrator):
> > > >>>>>>>>>> - takes all the updated keys and versions for `otx` = x
> > > >>>>>>>>>>       [x => (k1 -> ver1, k2 -> ver2, k3 -> ver3)]
> > > >>>>>>>>>> - in a single transaction checks value versions for all
> > > >> the
> > > >>>> old
> > > >>>>>>> values
> > > >>>>>>>>>>       and replaces them with calculated new ones
> > > >>>>>>>>>> - does cleanup of temporary keys and values
> > > >>>>>>>>>> - in case of version mismatch or TX timeout just rollbacks
> > > >>> and
> > > >>>>>>> signals
> > > >>>>>>>>>>        to Orchestrator to restart the job with new `otx`
> > > >>>>>>>>>>
> > > >>>>>>>>>> PROFIT!!
> > > >>>>>>>>>>
> > > >>>>>>>>>> This approach even allows you to run independent parts of
> > > >> the
> > > >>>>> graph
> > > >>>>>>> in
> > > >>>>>>>>>> parallel (with TX transfer you will always run only one at
> > > >> a
> > > >>>>> time).
> > > >>>>>>>> Also
> > > >>>>>>>>> it
> > > >>>>>>>>>> does not require inventing any special fault tolerance
> > > >>> technics
> > > >>>>>>> because
> > > >>>>>>>>>> Ignite caches are already fault tolerant and all the
> > > >>>> intermediate
> > > >>>>>>>> results
> > > >>>>>>>>>> are virtually invisible and stored with TTL, thus in case
> > > >> of
> > > >>>> any
> > > >>>>>>> crash
> > > >>>>>>>>> you
> > > >>>>>>>>>> will not have inconsistent state or garbage.
> > > >>>>>>>>>>
> > > >>>>>>>>>> Sergi
> > > >>>>>>>>>>
> > > >>>>>>>>>>
> > > >>>>>>>>>> 2017-03-15 11:42 GMT+03:00 ALEKSEY KUZNETSOV <
> > > >>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>> :
> > > >>>>>>>>>>
> > > >>>>>>>>>>> Okay, we are open for proposals on business task. I mean,
> > > >>> we
> > > >>>>> can
> > > >>>>>>> make
> > > >>>>>>>>> use
> > > >>>>>>>>>>> of some other thing, not distributed transaction. Not
> > > >>>>> transaction
> > > >>>>>>>> yet.
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> ср, 15 мар. 2017 г. в 11:24, Vladimir Ozerov <
> > > >>>>>> voze...@gridgain.com
> > > >>>>>>>> :
> > > >>>>>>>>>>>
> > > >>>>>>>>>>>> IMO the use case makes sense. However, as Sergi already
> > > >>>>>>> mentioned,
> > > >>>>>>>>> the
> > > >>>>>>>>>>>> problem is far more complex, than simply passing TX
> > > >> state
> > > >>>>> over
> > > >>>>>> a
> > > >>>>>>>>> wire.
> > > >>>>>>>>>>> Most
> > > >>>>>>>>>>>> probably a kind of coordinator will be required still
> > > >> to
> > > >>>>> manage
> > > >>>>>>> all
> > > >>>>>>>>>> kinds
> > > >>>>>>>>>>>> of failures. This task should be started with clean
> > > >>> design
> > > >>>>>>> proposal
> > > >>>>>>>>>>>> explaining how we handle all these concurrent events.
> > > >> And
> > > >>>>> only
> > > >>>>>>>> then,
> > > >>>>>>>>>> when
> > > >>>>>>>>>>>> we understand all implications, we should move to
> > > >>>> development
> > > >>>>>>>> stage.
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>> On Wed, Mar 15, 2017 at 10:38 AM, ALEKSEY KUZNETSOV <
> > > >>>>>>>>>>>> alkuznetsov...@gmail.com> wrote:
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>>> Right
> > > >>>>>>>>>>>>>
> > > >>>>>>>>>>>>> ср, 15 мар. 2017 г. в 10:35, Sergi Vladykin <
> > > >>>>>>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>>>>>> :
> > > >>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> Good! Basically your orchestrator just takes some
> > > >>>>>> predefined
> > > >>>>>>>>> graph
> > > >>>>>>>>>> of
> > > >>>>>>>>>>>>>> distributed services to be invoked, calls them by
> > > >>> some
> > > >>>>> kind
> > > >>>>>>> of
> > > >>>>>>>>> RPC
> > > >>>>>>>>>>> and
> > > >>>>>>>>>>>>>> passes the needed parameters between them, right?
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> Sergi
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> 2017-03-14 22:46 GMT+03:00 ALEKSEY KUZNETSOV <
> > > >>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> orchestrator is a custom thing. He is responsible
> > > >>> for
> > > >>>>>>>> managing
> > > >>>>>>>>>>>> business
> > > >>>>>>>>>>>>>>> scenarios flows. Many nodes are involved in
> > > >>>> scenarios.
> > > >>>>>> They
> > > >>>>>>>>>>> exchange
> > > >>>>>>>>>>>>> data
> > > >>>>>>>>>>>>>>> and folow one another. If you acquinted with BPMN
> > > >>>>>>> framework,
> > > >>>>>>>> so
> > > >>>>>>>>>>>>>>> orchestrator is like bpmn engine.
> > > >>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> вт, 14 Мар 2017 г., 18:56 Sergi Vladykin <
> > > >>>>>>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> What is Orchestrator for you? Is it a thing
> > > >> from
> > > >>>>>>> Microsoft
> > > >>>>>>>> or
> > > >>>>>>>>>>> your
> > > >>>>>>>>>>>>>> custom
> > > >>>>>>>>>>>>>>>> in-house software?
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> Sergi
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> 2017-03-14 18:00 GMT+03:00 ALEKSEY KUZNETSOV <
> > > >>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> Fine. Let's say we've got multiple servers
> > > >>> which
> > > >>>>>>> fulfills
> > > >>>>>>>>>>> custom
> > > >>>>>>>>>>>>>> logic.
> > > >>>>>>>>>>>>>>>>> This servers compound oriented graph (BPMN
> > > >>>> process)
> > > >>>>>>> which
> > > >>>>>>>>>>>>> controlled
> > > >>>>>>>>>>>>>> by
> > > >>>>>>>>>>>>>>>>> Orchestrator.
> > > >>>>>>>>>>>>>>>>> For instance, *server1  *creates *variable A
> > > >>>> *with
> > > >>>>>>> value
> > > >>>>>>>> 1,
> > > >>>>>>>>>>>>> persists
> > > >>>>>>>>>>>>>> it
> > > >>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>> IGNITE cache and creates *variable B *and
> > > >> sends
> > > >>>> it
> > > >>>>>> to*
> > > >>>>>>>>>> server2.
> > > >>>>>>>>>>>>> *The
> > > >>>>>>>>>>>>>>>>> latests receives *variable B*, do some logic
> > > >>> with
> > > >>>>> it
> > > >>>>>>> and
> > > >>>>>>>>>> stores
> > > >>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>> IGNITE.
> > > >>>>>>>>>>>>>>>>> All the work made by both servers must be
> > > >>>> fulfilled
> > > >>>>>> in
> > > >>>>>>>>> *one*
> > > >>>>>>>>>>>>>>> transaction.
> > > >>>>>>>>>>>>>>>>> Because we need all information done, or
> > > >>>>>>>>> nothing(rollbacked).
> > > >>>>>>>>>>> The
> > > >>>>>>>>>>>>>>>> scenario
> > > >>>>>>>>>>>>>>>>> is managed by orchestrator.
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> вт, 14 мар. 2017 г. в 17:31, Sergi Vladykin <
> > > >>>>>>>>>>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>> Ok, it is not a business case, it is your
> > > >>> wrong
> > > >>>>>>>> solution
> > > >>>>>>>>>> for
> > > >>>>>>>>>>>> it.
> > > >>>>>>>>>>>>>>>>>> Lets try again, what is the business case?
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>> Sergi
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>> 2017-03-14 16:42 GMT+03:00 ALEKSEY
> > > >> KUZNETSOV
> > > >>> <
> > > >>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> The case is the following, One starts
> > > >>>>> transaction
> > > >>>>>>> in
> > > >>>>>>>>> one
> > > >>>>>>>>>>>> node,
> > > >>>>>>>>>>>>>> and
> > > >>>>>>>>>>>>>>>>> commit
> > > >>>>>>>>>>>>>>>>>>> this transaction in another jvm node(or
> > > >>>>> rollback
> > > >>>>>> it
> > > >>>>>>>>>>>> remotely).
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> вт, 14 мар. 2017 г. в 16:30, Sergi
> > > >>> Vladykin <
> > > >>>>>>>>>>>>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>> Because even if you make it work for
> > > >> some
> > > >>>>>>>> simplistic
> > > >>>>>>>>>>>>> scenario,
> > > >>>>>>>>>>>>>>> get
> > > >>>>>>>>>>>>>>>>>> ready
> > > >>>>>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>>>>> write many fault tolerance tests and
> > > >> make
> > > >>>>> sure
> > > >>>>>>> that
> > > >>>>>>>>> you
> > > >>>>>>>>>>> TXs
> > > >>>>>>>>>>>>>> work
> > > >>>>>>>>>>>>>>>>>>> gracefully
> > > >>>>>>>>>>>>>>>>>>>> in all modes in case of crashes. Also
> > > >>> make
> > > >>>>> sure
> > > >>>>>>>> that
> > > >>>>>>>>> we
> > > >>>>>>>>>>> do
> > > >>>>>>>>>>>>> not
> > > >>>>>>>>>>>>>>> have
> > > >>>>>>>>>>>>>>>>> any
> > > >>>>>>>>>>>>>>>>>>>> performance drops after all your
> > > >> changes
> > > >>> in
> > > >>>>>>>> existing
> > > >>>>>>>>>>>>>> benchmarks.
> > > >>>>>>>>>>>>>>>> All
> > > >>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>> all
> > > >>>>>>>>>>>>>>>>>>>> I don't believe these conditions will
> > > >> be
> > > >>>> met
> > > >>>>>> and
> > > >>>>>>>> your
> > > >>>>>>>>>>>>>>> contribution
> > > >>>>>>>>>>>>>>>>> will
> > > >>>>>>>>>>>>>>>>>>> be
> > > >>>>>>>>>>>>>>>>>>>> accepted.
> > > >>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>> Better solution to what problem?
> > > >> Sending
> > > >>> TX
> > > >>>>> to
> > > >>>>>>>>> another
> > > >>>>>>>>>>>> node?
> > > >>>>>>>>>>>>>> The
> > > >>>>>>>>>>>>>>>>>> problem
> > > >>>>>>>>>>>>>>>>>>>> statement itself is already wrong. What
> > > >>>>>> business
> > > >>>>>>>> case
> > > >>>>>>>>>> you
> > > >>>>>>>>>>>> are
> > > >>>>>>>>>>>>>>>> trying
> > > >>>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>>>>> solve? I'm sure everything you need can
> > > >>> be
> > > >>>>> done
> > > >>>>>>> in
> > > >>>>>>>> a
> > > >>>>>>>>>> much
> > > >>>>>>>>>>>>> more
> > > >>>>>>>>>>>>>>>> simple
> > > >>>>>>>>>>>>>>>>>> and
> > > >>>>>>>>>>>>>>>>>>>> efficient way at the application level.
> > > >>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>> Sergi
> > > >>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>> 2017-03-14 16:03 GMT+03:00 ALEKSEY
> > > >>>> KUZNETSOV
> > > >>>>> <
> > > >>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>> Why wrong ? You know the better
> > > >>> solution?
> > > >>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>> вт, 14 мар. 2017 г. в 15:46, Sergi
> > > >>>>> Vladykin <
> > > >>>>>>>>>>>>>>>>>> sergi.vlady...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>> Just serializing TX object and
> > > >>>>>> deserializing
> > > >>>>>>> it
> > > >>>>>>>>> on
> > > >>>>>>>>>>>>> another
> > > >>>>>>>>>>>>>>> node
> > > >>>>>>>>>>>>>>>>> is
> > > >>>>>>>>>>>>>>>>>>>>>> meaningless, because other nodes
> > > >>>>>>> participating
> > > >>>>>>>> in
> > > >>>>>>>>>> the
> > > >>>>>>>>>>>> TX
> > > >>>>>>>>>>>>>> have
> > > >>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>>> know
> > > >>>>>>>>>>>>>>>>>>>>> about
> > > >>>>>>>>>>>>>>>>>>>>>> the new coordinator. This will
> > > >>> require
> > > >>>>>>> protocol
> > > >>>>>>>>>>>> changes,
> > > >>>>>>>>>>>>> we
> > > >>>>>>>>>>>>>>>>>>> definitely
> > > >>>>>>>>>>>>>>>>>>>>> will
> > > >>>>>>>>>>>>>>>>>>>>>> have fault tolerance and
> > > >> performance
> > > >>>>>> issues.
> > > >>>>>>>> IMO
> > > >>>>>>>>>> the
> > > >>>>>>>>>>>>> whole
> > > >>>>>>>>>>>>>>> idea
> > > >>>>>>>>>>>>>>>>> is
> > > >>>>>>>>>>>>>>>>>>>> wrong
> > > >>>>>>>>>>>>>>>>>>>>>> and it makes no sense to waste time
> > > >>> on
> > > >>>>> it.
> > > >>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>> Sergi
> > > >>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>> 2017-03-14 10:57 GMT+03:00 ALEKSEY
> > > >>>>>> KUZNETSOV
> > > >>>>>>> <
> > > >>>>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>> IgniteTransactionState
> > > >>>> implememntation
> > > >>>>>>>> contains
> > > >>>>>>>>>>>>>>>> IgniteTxEntry's
> > > >>>>>>>>>>>>>>>>>>> which
> > > >>>>>>>>>>>>>>>>>>>>> is
> > > >>>>>>>>>>>>>>>>>>>>>>> supposed to be transferable
> > > >>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>> пн, 13 мар. 2017 г. в 19:32,
> > > >>> Dmitriy
> > > >>>>>>>> Setrakyan
> > > >>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>> dsetrak...@apache.org
> > > >>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>> It sounds a little scary to me
> > > >>> that
> > > >>>>> we
> > > >>>>>>> are
> > > >>>>>>>>>>> passing
> > > >>>>>>>>>>>>>>>>> transaction
> > > >>>>>>>>>>>>>>>>>>>>> objects
> > > >>>>>>>>>>>>>>>>>>>>>>>> around. Such object may contain
> > > >>> all
> > > >>>>>> sorts
> > > >>>>>>>> of
> > > >>>>>>>>>>> Ignite
> > > >>>>>>>>>>>>>>>> context.
> > > >>>>>>>>>>>>>>>>> If
> > > >>>>>>>>>>>>>>>>>>>> some
> > > >>>>>>>>>>>>>>>>>>>>>> data
> > > >>>>>>>>>>>>>>>>>>>>>>>> needs to be passed across, we
> > > >>>> should
> > > >>>>>>>> create a
> > > >>>>>>>>>>>> special
> > > >>>>>>>>>>>>>>>>> transfer
> > > >>>>>>>>>>>>>>>>>>>> object
> > > >>>>>>>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>>>>> this case.
> > > >>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>> D.
> > > >>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>> On Mon, Mar 13, 2017 at 9:10
> > > >> AM,
> > > >>>>>> ALEKSEY
> > > >>>>>>>>>>> KUZNETSOV
> > > >>>>>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>> wrote:
> > > >>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>> well, there a couple of
> > > >> issues
> > > >>>>>>> preventing
> > > >>>>>>>>>>>>> transaction
> > > >>>>>>>>>>>>>>>>>>> proceeding.
> > > >>>>>>>>>>>>>>>>>>>>>>>>> At first, After transaction
> > > >>>>>>> serialization
> > > >>>>>>>>> and
> > > >>>>>>>>>>>>>>>>> deserialization
> > > >>>>>>>>>>>>>>>>>>> on
> > > >>>>>>>>>>>>>>>>>>>>> the
> > > >>>>>>>>>>>>>>>>>>>>>>>> remote
> > > >>>>>>>>>>>>>>>>>>>>>>>>> server, there is no txState.
> > > >> So
> > > >>>> im
> > > >>>>>>> going
> > > >>>>>>>> to
> > > >>>>>>>>>> put
> > > >>>>>>>>>>>> it
> > > >>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>>>>>>
> > > >> writeExternal()\readExternal()
> > > >>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>> The last one is Deserialized
> > > >>>>>>> transaction
> > > >>>>>>>>>> lacks
> > > >>>>>>>>>>> of
> > > >>>>>>>>>>>>>>> shared
> > > >>>>>>>>>>>>>>>>>> cache
> > > >>>>>>>>>>>>>>>>>>>>>> context
> > > >>>>>>>>>>>>>>>>>>>>>>>>> field at
> > > >> TransactionProxyImpl.
> > > >>>>>> Perhaps,
> > > >>>>>>>> it
> > > >>>>>>>>>> must
> > > >>>>>>>>>>>> be
> > > >>>>>>>>>>>>>>>> injected
> > > >>>>>>>>>>>>>>>>>> by
> > > >>>>>>>>>>>>>>>>>>>>>>>>> GridResourceProcessor ?
> > > >>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>> пн, 13 мар. 2017 г. в 17:27,
> > > >>>>> ALEKSEY
> > > >>>>>>>>>> KUZNETSOV
> > > >>>>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> while starting and
> > > >> continuing
> > > >>>>>>>> transaction
> > > >>>>>>>>>> in
> > > >>>>>>>>>>>>>>> different
> > > >>>>>>>>>>>>>>>>> jvms
> > > >>>>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>> run
> > > >>>>>>>>>>>>>>>>>>>>>>> into
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> serialization exception in
> > > >>>>>>>>>> writeExternalMeta
> > > >>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> @Override public void
> > > >>>>>>>>>>>> writeExternal(ObjectOutput
> > > >>>>>>>>>>>>>> out)
> > > >>>>>>>>>>>>>>>>>> throws
> > > >>>>>>>>>>>>>>>>>>>>>>>> IOException
> > > >>>>>>>>>>>>>>>>>>>>>>>>> {
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>    writeExternalMeta(out);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> some meta is cannot be
> > > >>>>> serialized.
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> пт, 10 мар. 2017 г. в
> > > >> 17:25,
> > > >>>>> Alexey
> > > >>>>>>>>>>> Goncharuk <
> > > >>>>>>>>>>>>>>>>>>>>>>>>> alexey.goncha...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> Aleksey,
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> I think I am starting to
> > > >> get
> > > >>>> what
> > > >>>>>> you
> > > >>>>>>>>> want,
> > > >>>>>>>>>>>> but I
> > > >>>>>>>>>>>>>>> have
> > > >>>>>>>>>>>>>>>> a
> > > >>>>>>>>>>>>>>>>>> few
> > > >>>>>>>>>>>>>>>>>>>>>>> concerns:
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> - What is the API for the
> > > >>>>> proposed
> > > >>>>>>>>> change?
> > > >>>>>>>>>>> In
> > > >>>>>>>>>>>>> your
> > > >>>>>>>>>>>>>>>> test,
> > > >>>>>>>>>>>>>>>>>> you
> > > >>>>>>>>>>>>>>>>>>>>> pass
> > > >>>>>>>>>>>>>>>>>>>>>> an
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> instance of transaction
> > > >>> created
> > > >>>>> on
> > > >>>>>>>>>> ignite(0)
> > > >>>>>>>>>>> to
> > > >>>>>>>>>>>>> the
> > > >>>>>>>>>>>>>>>>> ignite
> > > >>>>>>>>>>>>>>>>>>>>> instance
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> ignite(1). This is
> > > >> obviously
> > > >>>> not
> > > >>>>>>>> possible
> > > >>>>>>>>>> in
> > > >>>>>>>>>>> a
> > > >>>>>>>>>>>>>> truly
> > > >>>>>>>>>>>>>>>>>>>> distributed
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> (multi-jvm) environment.
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> - How will you synchronize
> > > >>>> cache
> > > >>>>>>> update
> > > >>>>>>>>>>> actions
> > > >>>>>>>>>>>>> and
> > > >>>>>>>>>>>>>>>>>>> transaction
> > > >>>>>>>>>>>>>>>>>>>>>>> commit?
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> Say, you have one node that
> > > >>>>> decided
> > > >>>>>>> to
> > > >>>>>>>>>>> commit,
> > > >>>>>>>>>>>>> but
> > > >>>>>>>>>>>>>>>>> another
> > > >>>>>>>>>>>>>>>>>>> node
> > > >>>>>>>>>>>>>>>>>>>>> is
> > > >>>>>>>>>>>>>>>>>>>>>>>> still
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> writing within this
> > > >>>> transaction.
> > > >>>>>> How
> > > >>>>>>> do
> > > >>>>>>>>> you
> > > >>>>>>>>>>>> make
> > > >>>>>>>>>>>>>> sure
> > > >>>>>>>>>>>>>>>>> that
> > > >>>>>>>>>>>>>>>>>>> two
> > > >>>>>>>>>>>>>>>>>>>>>> nodes
> > > >>>>>>>>>>>>>>>>>>>>>>>> will
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> not call commit() and
> > > >>>> rollback()
> > > >>>>>>>>>>>> simultaneously?
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> - How do you make sure
> > > >> that
> > > >>>>> either
> > > >>>>>>>>>> commit()
> > > >>>>>>>>>>> or
> > > >>>>>>>>>>>>>>>>> rollback()
> > > >>>>>>>>>>>>>>>>>> is
> > > >>>>>>>>>>>>>>>>>>>>>> called
> > > >>>>>>>>>>>>>>>>>>>>>>> if
> > > >>>>>>>>>>>>>>>>>>>>>>>>> an
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> originator failed?
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> 2017-03-10 15:38 GMT+03:00
> > > >>>>> Дмитрий
> > > >>>>>>>> Рябов
> > > >>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>> somefire...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> Alexey Goncharuk, heh, my
> > > >>>>> initial
> > > >>>>>>>>>>>> understanding
> > > >>>>>>>>>>>>>> was
> > > >>>>>>>>>>>>>>>>> that
> > > >>>>>>>>>>>>>>>>>>>>>>> transferring
> > > >>>>>>>>>>>>>>>>>>>>>>>>> of
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> tx
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> ownership from one node
> > > >> to
> > > >>>>>> another
> > > >>>>>>>> will
> > > >>>>>>>>>> be
> > > >>>>>>>>>>>>>> happened
> > > >>>>>>>>>>>>>>>>>>>>> automatically
> > > >>>>>>>>>>>>>>>>>>>>>>>> when
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> originating node is gone
> > > >>>> down.
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> 2017-03-10 15:36
> > > >> GMT+03:00
> > > >>>>>> ALEKSEY
> > > >>>>>>>>>>> KUZNETSOV
> > > >>>>>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Im aiming to span
> > > >>>> transaction
> > > >>>>>> on
> > > >>>>>>>>>> multiple
> > > >>>>>>>>>>>>>>> threads,
> > > >>>>>>>>>>>>>>>>>> nodes,
> > > >>>>>>>>>>>>>>>>>>>>>>>> jvms(soon).
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> So
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> every node is able to
> > > >>>>> rollback,
> > > >>>>>>> or
> > > >>>>>>>>>> commit
> > > >>>>>>>>>>>>>> common
> > > >>>>>>>>>>>>>>>>>>>>> transaction.It
> > > >>>>>>>>>>>>>>>>>>>>>>>>> turned
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> up i
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> need to transfer tx
> > > >>> between
> > > >>>>>> nodes
> > > >>>>>>>> in
> > > >>>>>>>>>>> order
> > > >>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>> commit
> > > >>>>>>>>>>>>>>>>>>>>>> transaction
> > > >>>>>>>>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> different node(in the
> > > >>> same
> > > >>>>>> jvm).
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> пт, 10 мар. 2017 г. в
> > > >>>> 15:20,
> > > >>>>>>> Alexey
> > > >>>>>>>>>>>>> Goncharuk <
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >> alexey.goncha...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Aleksey,
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Do you mean that you
> > > >>>> want a
> > > >>>>>>>> concept
> > > >>>>>>>>>> of
> > > >>>>>>>>>>>>>>>> transferring
> > > >>>>>>>>>>>>>>>>>> of
> > > >>>>>>>>>>>>>>>>>>> tx
> > > >>>>>>>>>>>>>>>>>>>>>>>> ownership
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>> from
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> one node to another?
> > > >> My
> > > >>>>>> initial
> > > >>>>>>>>>>>>> understanding
> > > >>>>>>>>>>>>>>> was
> > > >>>>>>>>>>>>>>>>>> that
> > > >>>>>>>>>>>>>>>>>>>> you
> > > >>>>>>>>>>>>>>>>>>>>>> want
> > > >>>>>>>>>>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>>>>>>>>>> be
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> able
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> to update keys in a
> > > >>>>>> transaction
> > > >>>>>>>>> from
> > > >>>>>>>>>>>>> multiple
> > > >>>>>>>>>>>>>>>>> threads
> > > >>>>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>>>>> parallel.
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> --AG
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2017-03-10 15:01
> > > >>>> GMT+03:00
> > > >>>>>>>> ALEKSEY
> > > >>>>>>>>>>>>> KUZNETSOV
> > > >>>>>>>>>>>>>> <
> > > >>>>>>>>>>>>>>>>>>>>>>>>>> alkuznetsov...@gmail.com
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> :
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Well. Consider
> > > >>>>> transaction
> > > >>>>>>>>> started
> > > >>>>>>>>>> in
> > > >>>>>>>>>>>> one
> > > >>>>>>>>>>>>>>> node,
> > > >>>>>>>>>>>>>>>>> and
> > > >>>>>>>>>>>>>>>>>>>>>> continued
> > > >>>>>>>>>>>>>>>>>>>>>>>> in
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>> another
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> one.
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The following test
> > > >>>>>> describes
> > > >>>>>>> my
> > > >>>>>>>>>> idea:
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Ignite ignite1 =
> > > >>>>> ignite(0);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IgniteTransactions
> > > >>>>>>>> transactions =
> > > >>>>>>>>>>>>>>>>>>>> ignite1.transactions();
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IgniteCache<String,
> > > >>>>>> Integer>
> > > >>>>>>>>> cache
> > > >>>>>>>>>> =
> > > >>>>>>>>>>>>>>>>>>>>>>> ignite1.getOrCreateCache("
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> testCache");
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Transaction tx =
> > > >>>>>>>>>>> transactions.txStart(
> > > >>>>>>>>>>>>>>>>> concurrency,
> > > >>>>>>>>>>>>>>>>>>>>>>> isolation);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cache.put("key1",
> > > >> 1);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cache.put("key2",
> > > >> 2);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tx.stop();
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>> IgniteInternalFuture<Boolean>
> > > >>>>>>>>> fut =
> > > >>>>>>>>>>>>>>>>>>>>>> GridTestUtils.runAsync(()
> > > >>>>>>>>>>>>>>>>>>>>>>>> ->
> > > >>>>>>>>>>>>>>>>>>>>>>>>> {
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>> IgniteTransactions
> > > >>>>> ts =
> > > >>>>>>>>>>>>>>>>>> ignite(1).transactions();
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>> Assert.assertNull(ts.tx());
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>> Assert.assertEquals(
> > > >>>>>>>>>>>>>>>>> TransactionState.STOPPED,
> > > >>>>>>>>>>>>>>>>>>>>>>> tx.state());
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    ts.txStart(tx);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> Assert.assertEquals(TransactionState.ACTIVE,
> > > >>>>>>>>>>>>>>>>>>>>>>> tx.state());
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >> cache.put("key3",
> > > >>>> 3);
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> Assert.assertTrue(cache.remove("key2"));
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    tx.commit();
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    return true;
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> });
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fut.get();
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >> Assert.assertEquals(
> > > >>>>>>>>>>>>>>> TransactionState.COMMITTED,
> > > >>>>>>>>>>>>>>>>>>>>>> tx.state());
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>> Assert.assertEquals((long)1,
> > > >>>>>>>>>>>>>>>>>>> (long)cache.get("key1"));
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>> Assert.assertEquals((long)3,
> > > >>>>>>>>>>>>>>>>>>> (long)cache.get("key3"));
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>> Assert.assertFalse(cache.
> > > >>>>>>>>>>>>>>> containsKey("key2"));
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In method
> > > >>>>> *ts.txStart(...)*
> > > >>>>>>> we
> > > >>>>>>>>> just
> > > >>>>>>>>>>>>> rebind
> > > >>>>>>>>>>>>>>> *tx*
> > > >>>>>>>>>>>>>>>>> to
> > > >>>>>>>>>>>>>>>>>>>>> current
> > > >>>>>>>>>>>>>>>>>>>>>>>>> thread:
> > > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>>>
> > >
> > > --
> >
> > *Best Regards,*
> >
> > *Kuznetsov Aleksey*
> >
>
-- 

*Best Regards,*

*Kuznetsov Aleksey*

Reply via email to