We still need to confirm the correct behavior: 1) Should it be possible to call Transaction.close() from a different thread? 2) Do we need to call close() after commit()? What about commitAsync()? What if exception happens?
Can someone clarify this? On Tue, Jul 25, 2017 at 11:08 PM, Nikolay Izhikov <nizhikov....@gmail.com> wrote: > Pavel. > > You will fix .Net client so I don't need to change threadId checks in my > pull request. > Is that correct? > > 25.07.2017 20:19, Pavel Tupitsyn пишет: > > Further investigation shows that platform code performs unnecessary close() >> calls for committed & rolled back transactions (sync and async). >> Ticket filed: https://issues.apache.org/jira/browse/IGNITE-5834 >> >> I'll fix this tomorrow and it should resolve your issue. >> >> Thanks, >> Pavel >> >> On Tue, Jul 25, 2017 at 7:56 PM, Pavel Tupitsyn <ptupit...@apache.org> >> wrote: >> >> Anyway, disallowing close() from another thread would be a breaking >>> change, we can't do that. >>> >>> On Tue, Jul 25, 2017 at 7:36 PM, Pavel Tupitsyn <ptupit...@apache.org> >>> wrote: >>> >>> I've reproduced the issue, it happens because in .NET we auto-close the >>>> transaction >>>> on commit/rollback. This involves two things: >>>> * release .NET reference to Java object >>>> * call Transaction.close() >>>> >>>> With sync methods this is trivial, but with commitAsync/rollbackAsync we >>>> have to call close() >>>> in IgniteFuture listener, which is called in a different thread. >>>> >>>> I think we need to be able to close() a transaction from any thread. >>>> Otherwise I don't see a non-blocking way to deal with >>>> commitAsync/rollbackAsync. >>>> >>>> Thanks, >>>> Pavel >>>> >>>> On Tue, Jul 25, 2017 at 6:10 PM, Николай Ижиков <nizhikov....@gmail.com >>>> > >>>> wrote: >>>> >>>> Hi, Pavel >>>>> >>>>> You can check my pull request. >>>>> https://github.com/apache/ignite/pull/2334 >>>>> >>>>> For now I return checks so it has to fail on .Net test suite >>>>> >>>>> >>>>> 2017-07-25 17:16 GMT+03:00 Pavel Tupitsyn <ptupit...@apache.org>: >>>>> >>>>> Hi Николай, >>>>>> >>>>>> .NET test in question (TestTxStateAndExceptions) does not do any >>>>>> multithreading, >>>>>> everything is called from a single thread. >>>>>> >>>>>> I see that the latest .NET run of your pull request on TeamCity >>>>>> >>>>> finished >>>>> >>>>>> successfully: >>>>>> http://ci.ignite.apache.org/viewLog.html?buildId=738277 >>>>>> >>>>>> Do you still have a problem with this? If yes, how can I reproduce it? >>>>>> Can you prepare a branch where the test fails, so I can run it >>>>>> locally? >>>>>> >>>>>> Thanks, >>>>>> Pavel >>>>>> >>>>>> On Tue, Jul 25, 2017 at 4:47 PM, Николай Ижиков < >>>>>> >>>>> nizhikov....@gmail.com> >>>>> >>>>>> wrote: >>>>>> >>>>>> Hello, Igniters. >>>>>>> >>>>>>> I working on issue https://issues.apache.org/jira/browse/IGNITE-5712 >>>>>>> I found that .Net client perform transaction operation(`tx.close()`) >>>>>>> >>>>>> in >>>>> >>>>>> thread that not owns transaction. >>>>>>> >>>>>>> So I can't include checks for threadId in my pull request. >>>>>>> >>>>>>> Is it a bug or a desirable behabiour? >>>>>>> >>>>>>> With my new check I got following stack trace: >>>>>>> >>>>>>> Check: >>>>>>> >>>>>>> `assert (threadId() == Thread.currentThread().getId());` >>>>>>> >>>>>>> Exception: >>>>>>> >>>>>>> Test(s) failed. System.AggregateException : One or more errors >>>>>>> >>>>>> occurred. >>>>> >>>>>> ----> Apache.Ignite.Core.Common.IgniteException : Java exception >>>>>>> >>>>>> occurred >>>>>> >>>>>>> [class=java.lang.AssertionError, message=] ----> >>>>>>> Apache.Ignite.Core.Common.JavaException : java.lang.AssertionError >>>>>>> >>>>>> at >>>>> >>>>>> org.apache.ignite.internal.processors.cache.transactions. >>>>>>> TransactionProxyImpl.enter0(TransactionProxyImpl.java:113) >>>>>>> at >>>>>>> org.apache.ignite.internal.processors.cache.transactions. >>>>>>> TransactionProxyImpl.enter(TransactionProxyImpl.java:106) >>>>>>> at >>>>>>> org.apache.ignite.internal.processors.cache.transactions. >>>>>>> TransactionProxyImpl.close(TransactionProxyImpl.java:317) >>>>>>> at >>>>>>> org.apache.ignite.internal.processors.platform.transactions. >>>>>>> PlatformTransactions.txClose(PlatformTransactions.java:136) >>>>>>> at >>>>>>> org.apache.ignite.internal.processors.platform.transactions. >>>>>>> PlatformTransactions.processInLongOutLong(PlatformTransactio >>>>>>> >>>>>> ns.java:178) >>>>> >>>>>> at >>>>>>> org.apache.ignite.internal.processors.platform.PlatformTarge >>>>>>> >>>>>> tProxyImpl. >>>>> >>>>>> inLongOutLong(PlatformTargetProxyImpl.java:53) >>>>>>> at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean >>>>>>> includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wa >>>>>>> >>>>>> it(Int32 >>>>> >>>>>> millisecondsTimeout, CancellationToken cancellationToken) at >>>>>>> System.Threading.Tasks.Task.Wait() at >>>>>>> Apache.Ignite.Core.Tests.Cache.CacheAbstractTransactionalTest >>>>>>> .TestTxStateAndExceptions() >>>>>>> in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core.Tests\Cache\CacheAbstractTransactionalTest.cs:line >>>>>>> 510 --IgniteException at >>>>>>> Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.Error(Void* >>>>>>> >>>>>> target, >>>>> >>>>>> Int32 errType, SByte* errClsChars, Int32 errClsCharsLen, SByte* >>>>>>> errMsgChars, Int32 errMsgCharsLen, SByte* stackTraceChars, Int32 >>>>>>> stackTraceCharsLen, Void* errData, Int32 errDataLen) in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\Unmanaged\UnmanagedCallbacks.cs:line >>>>>>> 1066 at >>>>>>> Apache.Ignite.Core.Impl.Unmanaged.IgniteJniNativeMethods. >>>>>>> TargetInLongOutLong(Void* >>>>>>> ctx, Void* target, Int32 opType, Int64 val) at >>>>>>> Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils.TargetInLon >>>>>>> >>>>>> gOutLong( >>>>> >>>>>> IUnmanagedTarget >>>>>>> target, Int32 opType, Int64 memPtr) in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\Unmanaged\UnmanagedUtils.cs:line >>>>>>> 429 at Apache.Ignite.Core.Impl.PlatformTarget.DoOutInOp(Int32 type, >>>>>>> >>>>>> Int64 >>>>>> >>>>>>> val) in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\PlatformTarget.cs:line >>>>>>> 717 at >>>>>>> Apache.Ignite.Core.Impl.Transactions.TransactionsImpl. >>>>>>> TxClose(TransactionImpl >>>>>>> tx) in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\Transactions\TransactionsImpl.cs:line >>>>>>> 216 at Apache.Ignite.Core.Impl.Transactions.TransactionImpl.Close() >>>>>>> >>>>>> in >>>>> >>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\Transactions\TransactionImpl.cs:line >>>>>>> 442 at >>>>>>> Apache.Ignite.Core.Impl.Transactions.TransactionImpl.< >>>>>>> CloseWhenComplete>b__d(Task >>>>>>> x) in >>>>>>> c:\BuildAgent\work\820be461cd64b574\modules\platforms\dotnet\Apache. >>>>>>> Ignite.Core\Impl\Transactions\TransactionImpl.cs:line >>>>>>> 460 at System.Threading.Tasks.Task.Execute() --JavaException ------- >>>>>>> Stderr: ------- Test started: >>>>>>> CacheAbstractTransactionalTest.TestTxStateAndExceptions Test >>>>>>> >>>>>> finished: >>>>> >>>>>> CacheAbstractTransactionalTest.TestTxStateAndExceptions >>>>>>> -- >>>>>>> Nikolay Izhikov >>>>>>> nizhikov....@gmail.com >>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Nikolay Izhikov >>>>> nizhikov....@gmail.com >>>>> >>>>> >>>> >>>> >>> >>