[ 
https://issues.apache.org/jira/browse/IGNITE-29241?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18136209#comment-18136209
 ] 

Reza Taroosheh commented on IGNITE-29241:
-----------------------------------------

Reproducer: 
[0acb82f296|https://github.com/apache/ignite/pull/13779/commits/0acb82f296b382511614bfa6620a3b4f35252810]
 adds {{AtomicPutInterruptTest}}, which fails on master: the failure handler is 
called with {{CorruptedTreeException}}. The fix will come as a separate commit 
on top of it in the same draft PR, so you can check the test before and after 
the fix.


> An interrupted ATOMIC put of a new Externalizable class is reported as a 
> corrupted B+Tree and stops the node
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-29241
>                 URL: https://issues.apache.org/jira/browse/IGNITE-29241
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Reza Taroosheh
>            Assignee: Reza Taroosheh
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> If a thread is interrupted while an {{ATOMIC}} cache update writes a value of 
> an {{Externalizable}} class (or a class with its own 
> {{writeObject}}/{{readObject}}) that the node has not used yet, the update 
> fails with {{CorruptedTreeException: B+Tree is corrupted}}. This is a 
> {{CRITICAL_ERROR}}, and the default {{StopNodeOrHaltFailureHandler}} halts 
> the JVM.
> Nothing is corrupted: the interrupt only ends the wait for the class name 
> registration. An interrupt is an ordinary event on a pooled thread, for 
> example at {{ExecutorService.shutdownNow()}}. It should fail the operation, 
> not stop the node.
> Steps:
> # Start a server node with an {{ATOMIC}} cache.
> # Interrupt a thread, then call {{cache.put(1, value)}} from it, where 
> {{value}} is of an {{Externalizable}} class not used in the cluster before.
> Actual: the put fails, and the failure handler is called with 
> {{CorruptedTreeException: B+Tree is corrupted [... msg=Runtime failure on 
> search row ...]}}, caused by {{BinaryObjectException: Failed to register 
> class}}, caused by {{IgniteInterruptedCheckedException: Got interrupted while 
> waiting for future to complete}}.
> Expected: the put fails with an exception, the failure handler is not called, 
> and the node keeps running.
> The same interrupt fails the operation cleanly, without a failure handler 
> call, when the value's class is handled by the binary marshaller, when the 
> {{Externalizable}} class is nested in a binary value, or when the cache is 
> {{TRANSACTIONAL}}, and the write is in a transaction.
> Workaround: write each such class once, on a thread that is not interrupted, 
> before any thread that may be interrupted writes it. 
> {{IgniteBinary.registerClass}} and {{IgniteBinary.toBinary}} do not help.
> Reproduced on 2.18.0 (reported on the dev list: 
> https://lists.apache.org/thread.html/qqyp941vb5vmxlzz0d18yglzjyrw3t7r), and 
> on master by a new test.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to