You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by Valentin Kulichenko <va...@gmail.com> on 2015/12/03 06:08:14 UTC

EntryProcessor invoked twice

Igniters,

I noticed that when I execute cache.invoke() in transactional cache, it's
invoked twice for the same old value on the primary node. First invocation
is done on prepare step [1], the second one happens on commit [2]. Is this
expected behavior? Why can't we reuse already calculated new value during
commit?

[1]
java.lang.RuntimeException: XXX
        at
com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
        at
com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
        at
org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
        at
org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
        at
org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

[2]
java.lang.RuntimeException: XXX
        at
com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
        at
com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
        at
org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
        at
org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
        at
org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
        at
org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
        at
org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
        at
org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
        at
org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
        at
org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
        at
org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
        at
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
        at
org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
        at
org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
        at
org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
        at
org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
        at
org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

-Val

Re: EntryProcessor invoked twice

Posted by Valentin Kulichenko <va...@gmail.com>.
I created the ticket for this issue:
https://issues.apache.org/jira/browse/IGNITE-2083

Alexey G., can you please share your thoughts in this ticket?

-Val

On Thu, Dec 3, 2015 at 2:56 PM, Andrey Kornev <an...@hotmail.com>
wrote:

> Dmitriy,
>
> Alexey's point is just an explanation of the existing implementation and
> not how it is supposed to be.  And while nobody really knows what the
> correct behavior should be, the one implemented by Ignite is incredibly
> over-engineered. As I argued in a different thread, other vendors provide
> more reasonable implementations and their users seem to be quite content
> with the performance.
>
> Cheers
> Andrey
>
> > From: dsetrakyan@gridgain.com
> > Date: Thu, 3 Dec 2015 10:35:34 -0800
> > Subject: Re: EntryProcessor invoked twice
> > To: dev@ignite.apache.org
> >
> > Point taken.
> >
> > However I still don’t get why it should be called twice in PESSIMISTIC
> > mode. Can someone explain?
> >
> > D.
> >
> > On Thu, Dec 3, 2015 at 10:04 AM, Andrey Gura <ag...@gridgain.com> wrote:
> >
> > > Hi,
> > >
> > > Recently Alexey Goncharuk wrote in thread "EntryProcessor execution
> > > semantics":
> > >
> > > For example, in a case of explicit optimistic
> > > > READ_COMMITTED transaction it may be called more than once because
> Ignite
> > > > needs to calculate a return value for the first invoke() and then it
> > > should
> > > > be called second time during commit when transactional locks are
> held.
> > >
> > >
> > > Current requirement is that an EntryProcessor should be a stateless
> > > > function, and it may be called more than once (but of course it will
> > > > receive the same cache value every time).
> > > >
> > >
> > >
> > >
> > > On Thu, Dec 3, 2015 at 8:46 PM, Valentin Kulichenko <
> > > valentin.kulichenko@gmail.com> wrote:
> > >
> > > > Dmitry,
> > > >
> > > > Counter will not be incremented twice, because the entry is locked
> and EP
> > > > is guaranteed to be called both times for the same old value. So
> there is
> > > > no critical bug here in my view, but I just don't see the reason why
> we
> > > > call it two times instead of one for one operation.
> > > >
> > > > -Val
> > > >
> > > > On Thu, Dec 3, 2015 at 1:22 AM, Dmitriy Setrakyan <
> dsetrakyan@apache.org
> > > >
> > > > wrote:
> > > >
> > > > > I think this is definitely a bug. Imagine that EP is used to
> maintain a
> > > > > counter, and the counter is incremented with every update. In this
> case
> > > > the
> > > > > counter will be updated 2 times instead of 1.
> > > > >
> > > > > Alexey G., would be nice to hear your thoughts here.
> > > > >
> > > > > D.
> > > > >
> > > > > On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
> > > > > valentin.kulichenko@gmail.com> wrote:
> > > > >
> > > > > > Igniters,
> > > > > >
> > > > > > I noticed that when I execute cache.invoke() in transactional
> cache,
> > > > it's
> > > > > > invoked twice for the same old value on the primary node. First
> > > > > invocation
> > > > > > is done on prepare step [1], the second one happens on commit
> [2]. Is
> > > > > this
> > > > > > expected behavior? Why can't we reuse already calculated new
> value
> > > > during
> > > > > > commit?
> > > > > >
> > > > > > [1]
> > > > > > java.lang.RuntimeException: XXX
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > > > >         at java.lang.Thread.run(Thread.java:745)
> > > > > >
> > > > > > [2]
> > > > > > java.lang.RuntimeException: XXX
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > > > >         at
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > > > >         at java.lang.Thread.run(Thread.java:745)
> > > > > >
> > > > > > -Val
> > > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Andrey Gura
> > > GridGain Systems, Inc.
> > > www.gridgain.com
> > >
>
>

RE: EntryProcessor invoked twice

Posted by Andrey Kornev <an...@hotmail.com>.
Dmitriy,

Alexey's point is just an explanation of the existing implementation and not how it is supposed to be.  And while nobody really knows what the correct behavior should be, the one implemented by Ignite is incredibly over-engineered. As I argued in a different thread, other vendors provide more reasonable implementations and their users seem to be quite content with the performance.

Cheers
Andrey

> From: dsetrakyan@gridgain.com
> Date: Thu, 3 Dec 2015 10:35:34 -0800
> Subject: Re: EntryProcessor invoked twice
> To: dev@ignite.apache.org
> 
> Point taken.
> 
> However I still don’t get why it should be called twice in PESSIMISTIC
> mode. Can someone explain?
> 
> D.
> 
> On Thu, Dec 3, 2015 at 10:04 AM, Andrey Gura <ag...@gridgain.com> wrote:
> 
> > Hi,
> >
> > Recently Alexey Goncharuk wrote in thread "EntryProcessor execution
> > semantics":
> >
> > For example, in a case of explicit optimistic
> > > READ_COMMITTED transaction it may be called more than once because Ignite
> > > needs to calculate a return value for the first invoke() and then it
> > should
> > > be called second time during commit when transactional locks are held.
> >
> >
> > Current requirement is that an EntryProcessor should be a stateless
> > > function, and it may be called more than once (but of course it will
> > > receive the same cache value every time).
> > >
> >
> >
> >
> > On Thu, Dec 3, 2015 at 8:46 PM, Valentin Kulichenko <
> > valentin.kulichenko@gmail.com> wrote:
> >
> > > Dmitry,
> > >
> > > Counter will not be incremented twice, because the entry is locked and EP
> > > is guaranteed to be called both times for the same old value. So there is
> > > no critical bug here in my view, but I just don't see the reason why we
> > > call it two times instead of one for one operation.
> > >
> > > -Val
> > >
> > > On Thu, Dec 3, 2015 at 1:22 AM, Dmitriy Setrakyan <dsetrakyan@apache.org
> > >
> > > wrote:
> > >
> > > > I think this is definitely a bug. Imagine that EP is used to maintain a
> > > > counter, and the counter is incremented with every update. In this case
> > > the
> > > > counter will be updated 2 times instead of 1.
> > > >
> > > > Alexey G., would be nice to hear your thoughts here.
> > > >
> > > > D.
> > > >
> > > > On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
> > > > valentin.kulichenko@gmail.com> wrote:
> > > >
> > > > > Igniters,
> > > > >
> > > > > I noticed that when I execute cache.invoke() in transactional cache,
> > > it's
> > > > > invoked twice for the same old value on the primary node. First
> > > > invocation
> > > > > is done on prepare step [1], the second one happens on commit [2]. Is
> > > > this
> > > > > expected behavior? Why can't we reuse already calculated new value
> > > during
> > > > > commit?
> > > > >
> > > > > [1]
> > > > > java.lang.RuntimeException: XXX
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > > >         at java.lang.Thread.run(Thread.java:745)
> > > > >
> > > > > [2]
> > > > > java.lang.RuntimeException: XXX
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > > >         at
> > > > >
> > > > >
> > > >
> > >
> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > > >         at java.lang.Thread.run(Thread.java:745)
> > > > >
> > > > > -Val
> > > > >
> > > >
> > >
> >
> >
> >
> > --
> > Andrey Gura
> > GridGain Systems, Inc.
> > www.gridgain.com
> >
 		 	   		  

Re: EntryProcessor invoked twice

Posted by Dmitriy Setrakyan <ds...@gridgain.com>.
Point taken.

However I still don’t get why it should be called twice in PESSIMISTIC
mode. Can someone explain?

D.

On Thu, Dec 3, 2015 at 10:04 AM, Andrey Gura <ag...@gridgain.com> wrote:

> Hi,
>
> Recently Alexey Goncharuk wrote in thread "EntryProcessor execution
> semantics":
>
> For example, in a case of explicit optimistic
> > READ_COMMITTED transaction it may be called more than once because Ignite
> > needs to calculate a return value for the first invoke() and then it
> should
> > be called second time during commit when transactional locks are held.
>
>
> Current requirement is that an EntryProcessor should be a stateless
> > function, and it may be called more than once (but of course it will
> > receive the same cache value every time).
> >
>
>
>
> On Thu, Dec 3, 2015 at 8:46 PM, Valentin Kulichenko <
> valentin.kulichenko@gmail.com> wrote:
>
> > Dmitry,
> >
> > Counter will not be incremented twice, because the entry is locked and EP
> > is guaranteed to be called both times for the same old value. So there is
> > no critical bug here in my view, but I just don't see the reason why we
> > call it two times instead of one for one operation.
> >
> > -Val
> >
> > On Thu, Dec 3, 2015 at 1:22 AM, Dmitriy Setrakyan <dsetrakyan@apache.org
> >
> > wrote:
> >
> > > I think this is definitely a bug. Imagine that EP is used to maintain a
> > > counter, and the counter is incremented with every update. In this case
> > the
> > > counter will be updated 2 times instead of 1.
> > >
> > > Alexey G., would be nice to hear your thoughts here.
> > >
> > > D.
> > >
> > > On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
> > > valentin.kulichenko@gmail.com> wrote:
> > >
> > > > Igniters,
> > > >
> > > > I noticed that when I execute cache.invoke() in transactional cache,
> > it's
> > > > invoked twice for the same old value on the primary node. First
> > > invocation
> > > > is done on prepare step [1], the second one happens on commit [2]. Is
> > > this
> > > > expected behavior? Why can't we reuse already calculated new value
> > during
> > > > commit?
> > > >
> > > > [1]
> > > > java.lang.RuntimeException: XXX
> > > >         at
> > > >
> > > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > >         at
> > > >
> > > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > >         at
> > > >
> > > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > >         at
> > > >
> > > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > >         at java.lang.Thread.run(Thread.java:745)
> > > >
> > > > [2]
> > > > java.lang.RuntimeException: XXX
> > > >         at
> > > >
> > > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > > >         at
> > > >
> > > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > > >         at
> > > >
> > > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > > >         at
> > > >
> > > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > > >         at
> > > >
> > > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > > >         at java.lang.Thread.run(Thread.java:745)
> > > >
> > > > -Val
> > > >
> > >
> >
>
>
>
> --
> Andrey Gura
> GridGain Systems, Inc.
> www.gridgain.com
>

Re: EntryProcessor invoked twice

Posted by Andrey Gura <ag...@gridgain.com>.
Hi,

Recently Alexey Goncharuk wrote in thread "EntryProcessor execution
semantics":

For example, in a case of explicit optimistic
> READ_COMMITTED transaction it may be called more than once because Ignite
> needs to calculate a return value for the first invoke() and then it should
> be called second time during commit when transactional locks are held.


Current requirement is that an EntryProcessor should be a stateless
> function, and it may be called more than once (but of course it will
> receive the same cache value every time).
>



On Thu, Dec 3, 2015 at 8:46 PM, Valentin Kulichenko <
valentin.kulichenko@gmail.com> wrote:

> Dmitry,
>
> Counter will not be incremented twice, because the entry is locked and EP
> is guaranteed to be called both times for the same old value. So there is
> no critical bug here in my view, but I just don't see the reason why we
> call it two times instead of one for one operation.
>
> -Val
>
> On Thu, Dec 3, 2015 at 1:22 AM, Dmitriy Setrakyan <ds...@apache.org>
> wrote:
>
> > I think this is definitely a bug. Imagine that EP is used to maintain a
> > counter, and the counter is incremented with every update. In this case
> the
> > counter will be updated 2 times instead of 1.
> >
> > Alexey G., would be nice to hear your thoughts here.
> >
> > D.
> >
> > On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
> > valentin.kulichenko@gmail.com> wrote:
> >
> > > Igniters,
> > >
> > > I noticed that when I execute cache.invoke() in transactional cache,
> it's
> > > invoked twice for the same old value on the primary node. First
> > invocation
> > > is done on prepare step [1], the second one happens on commit [2]. Is
> > this
> > > expected behavior? Why can't we reuse already calculated new value
> during
> > > commit?
> > >
> > > [1]
> > > java.lang.RuntimeException: XXX
> > >         at
> > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > >         at
> > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > >         at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > >         at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > >         at java.lang.Thread.run(Thread.java:745)
> > >
> > > [2]
> > > java.lang.RuntimeException: XXX
> > >         at
> > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> > >         at
> > >
> > >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> > >         at
> > >
> > >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> > >         at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> > >         at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> > >         at java.lang.Thread.run(Thread.java:745)
> > >
> > > -Val
> > >
> >
>



-- 
Andrey Gura
GridGain Systems, Inc.
www.gridgain.com

Re: EntryProcessor invoked twice

Posted by Valentin Kulichenko <va...@gmail.com>.
Dmitry,

Counter will not be incremented twice, because the entry is locked and EP
is guaranteed to be called both times for the same old value. So there is
no critical bug here in my view, but I just don't see the reason why we
call it two times instead of one for one operation.

-Val

On Thu, Dec 3, 2015 at 1:22 AM, Dmitriy Setrakyan <ds...@apache.org>
wrote:

> I think this is definitely a bug. Imagine that EP is used to maintain a
> counter, and the counter is incremented with every update. In this case the
> counter will be updated 2 times instead of 1.
>
> Alexey G., would be nice to hear your thoughts here.
>
> D.
>
> On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
> valentin.kulichenko@gmail.com> wrote:
>
> > Igniters,
> >
> > I noticed that when I execute cache.invoke() in transactional cache, it's
> > invoked twice for the same old value on the primary node. First
> invocation
> > is done on prepare step [1], the second one happens on commit [2]. Is
> this
> > expected behavior? Why can't we reuse already calculated new value during
> > commit?
> >
> > [1]
> > java.lang.RuntimeException: XXX
> >         at
> >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> >         at
> >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> >         at
> >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> >         at
> >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> >         at java.lang.Thread.run(Thread.java:745)
> >
> > [2]
> > java.lang.RuntimeException: XXX
> >         at
> >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
> >         at
> >
> >
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
> >         at
> >
> >
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
> >         at
> >
> >
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
> >         at
> >
> >
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
> >         at
> >
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> >         at
> >
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> >         at java.lang.Thread.run(Thread.java:745)
> >
> > -Val
> >
>

Re: EntryProcessor invoked twice

Posted by Dmitriy Setrakyan <ds...@apache.org>.
I think this is definitely a bug. Imagine that EP is used to maintain a
counter, and the counter is incremented with every update. In this case the
counter will be updated 2 times instead of 1.

Alexey G., would be nice to hear your thoughts here.

D.

On Wed, Dec 2, 2015 at 9:08 PM, Valentin Kulichenko <
valentin.kulichenko@gmail.com> wrote:

> Igniters,
>
> I noticed that when I execute cache.invoke() in transactional cache, it's
> invoked twice for the same old value on the primary node. First invocation
> is done on prepare step [1], the second one happens on commit [2]. Is this
> expected behavior? Why can't we reuse already calculated new value during
> commit?
>
> [1]
> java.lang.RuntimeException: XXX
>         at
>
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
>         at
>
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onEntriesLocked(GridDhtTxPrepareFuture.java:381)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare0(GridDhtTxPrepareFuture.java:909)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLocked(GridDhtTxPrepareFuture.java:527)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare(GridDhtTxPrepareFuture.java:822)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.prepareAsync(GridDhtTxLocal.java:462)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareNearTx(IgniteTxHandler.java:406)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.prepareTx(IgniteTxHandler.java:200)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processNearTxPrepareRequest(IgniteTxHandler.java:101)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:114)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$1.apply(IgniteTxHandler.java:112)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
>         at
>
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>         at
>
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>         at java.lang.Thread.run(Thread.java:745)
>
> [2]
> java.lang.RuntimeException: XXX
>         at
>
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:106)
>         at
>
> com.workday.fabric.ScratchClient$ScratchEntryProcessor.process(ScratchClient.java:96)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter.applyTransformClosures(IgniteTxAdapter.java:1314)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.userCommit(IgniteTxLocalAdapter.java:826)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter.finish(GridDhtTxLocalAdapter.java:836)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.finish(GridDhtTxLocal.java:657)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal.commitAsync(GridDhtTxLocal.java:557)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:574)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onDone(GridDhtTxPrepareFuture.java:95)
>         at
>
> org.apache.ignite.internal.util.future.GridCompoundFuture.checkComplete(GridCompoundFuture.java:260)
>         at
>
> org.apache.ignite.internal.util.future.GridCompoundFuture.access$700(GridCompoundFuture.java:43)
>         at
>
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:358)
>         at
>
> org.apache.ignite.internal.util.future.GridCompoundFuture$Listener.apply(GridCompoundFuture.java:302)
>         at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:262)
>         at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListeners(GridFutureAdapter.java:250)
>         at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:380)
>         at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:346)
>         at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:323)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$MiniFuture.onResult(GridDhtTxPrepareFuture.java:1477)
>         at
>
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture.onResult(GridDhtTxPrepareFuture.java:454)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.processDhtTxPrepareResponse(IgniteTxHandler.java:524)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler.access$200(IgniteTxHandler.java:87)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:144)
>         at
>
> org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$6.apply(IgniteTxHandler.java:142)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:580)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:280)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:198)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:77)
>         at
>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:160)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:811)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:106)
>         at
>
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:774)
>         at
>
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>         at
>
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>         at java.lang.Thread.run(Thread.java:745)
>
> -Val
>