I've attached HangTest. I suppose it should not hang, am i right ?

чт, 29 июн. 2017 г. в 14:54, ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com>:

> Igntrs.
> Im rewieving all usages of threadId of
> transaction.(IgniteTxAdapter#threadID). What is the point of usage threadId
> in mvcc entry ?
>
> пн, 3 апр. 2017 г. в 9:47, ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com>:
>
>> so what do u think on my idea?
>>
>> пт, 31 Мар 2017 г., 11:05 ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com>:
>>
>>> sorry for misleading you. We planned to support multi-node transactions,
>>> but failed.
>>>
>>> пт, 31 мар. 2017 г. в 10:51, Alexey Goncharuk <
>>> alexey.goncha...@gmail.com>:
>>>
>>> Well, now the scenario is more clear, but it has nothing to do with
>>> multiple coordinators :) Let me think a little bit about it.
>>>
>>> 2017-03-31 9:53 GMT+03:00 ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com>:
>>>
>>> > so what do u think on the issue ?
>>> >
>>> > чт, 30 Мар 2017 г., 17:49 ALEKSEY KUZNETSOV <alkuznetsov...@gmail.com
>>> >:
>>> >
>>> > > 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/aa3487bd9c203394f534c605f84e06
>>> > 436b638e5c
>>> > > 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
>>>
>>> --

*Best Regards,*

*Kuznetsov Aleksey*

Reply via email to