[ 
https://issues.apache.org/jira/browse/IGNITE-15196?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alexander Lapin updated IGNITE-15196:
-------------------------------------
    Description: 
In case of node stop it's possible to get null as a result of an invoke 
operation.
{code:java}
return cluster
    .requestResponse(fromNetworkAddress(addr), message)
    .timeout(Duration.ofMillis(timeout))
    .toFuture()
    .thenApply(m -> m == null ? null : m.data()); // The result can be null on 
node stopping.
{code}
It's a rather confusing behavior that produces NPE. See IGNITE-15195 for more 
details. In order not not fail with NPE I've updated null handling in a 
following way
{code:java}
return cluster
    .requestResponse(fromNetworkAddress(addr), message)
    .timeout(Duration.ofMillis(timeout))
    .toFuture()
    .thenApply(m -> {
        if (m == null)
            throw new CompletionException(new NodeStoppingCheckedException());
        else
            return m.data();
    }); // The result can be null on node stopping.{code}
within IGNITE-15148 

In order to reproduce given issue restore original
{code:java}
.thenApply(m -> m == null ? null : m.data());
{code}
and run
{code:java}
 
org.apache.ignite.internal.runner.app.IgnitionTest#testNodeStartWithoutBootstrapConfiguration{code}
several times.

As a result NPE will be logged on node stop:
{code:java}
SEVERE: Unexpected exception
class org.apache.ignite.lang.IgniteInternalException: 
java.lang.NullPointerException
        at 
org.apache.ignite.internal.metastorage.client.CursorImpl$InnerIterator.hasNext(CursorImpl.java:109)
        at 
org.apache.ignite.internal.metastorage.client.MetaStorageServiceImpl$WatchProcessor$Watcher.run(MetaStorageServiceImpl.java:446)
Caused by: java.util.concurrent.ExecutionException: 
java.lang.NullPointerException
        at 
java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
        at 
java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
        at 
org.apache.ignite.internal.metastorage.client.CursorImpl$InnerIterator.hasNext(CursorImpl.java:101)
        ... 1 more
Caused by: java.lang.NullPointerException
        at 
org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl.lambda$run$15(RaftGroupServiceImpl.java:323)
        at 
java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:642)
        at 
java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
        at 
java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
        at 
org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl$1.accept(RaftGroupServiceImpl.java:406)
        at 
org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl$1.accept(RaftGroupServiceImpl.java:360)
        at 
java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
        at 
java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
        at 
java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
        at 
java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
        at 
reactor.core.publisher.MonoToCompletableFuture.onComplete(MonoToCompletableFuture.java:83)
        at 
reactor.core.publisher.SerializedSubscriber.onComplete(SerializedSubscriber.java:146)
        at 
reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onComplete(FluxTimeout.java:228)
        at 
reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:129)
        at 
reactor.core.publisher.LambdaSubscriber.onComplete(LambdaSubscriber.java:132)
        at 
reactor.core.publisher.FluxTake$TakeFuseableSubscriber.onComplete(FluxTake.java:423)
        at 
reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onComplete(FluxFilterFuseable.java:165)
        at 
reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onComplete(FluxFilterFuseable.java:384)
        at 
reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.checkTerminated(FluxOnBackpressureBuffer.java:416)
        at 
reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.drainRegular(FluxOnBackpressureBuffer.java:253)
        at 
reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.drain(FluxOnBackpressureBuffer.java:225)
        at 
reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.onComplete(FluxOnBackpressureBuffer.java:204)
        at 
reactor.core.publisher.DirectProcessor$DirectInner.onComplete(DirectProcessor.java:349)
        at 
reactor.core.publisher.DirectProcessor.onComplete(DirectProcessor.java:166)
        at 
reactor.core.publisher.FluxCreate$BaseSink.complete(FluxCreate.java:438)
        at 
reactor.core.publisher.FluxCreate$SerializedSink.drainLoop(FluxCreate.java:239)
        at 
reactor.core.publisher.FluxCreate$SerializedSink.drain(FluxCreate.java:205)
        at 
reactor.core.publisher.FluxCreate$SerializedSink.complete(FluxCreate.java:196)
        at 
org.apache.ignite.network.scalecube.ScaleCubeDirectMarshallerTransport.lambda$doStop$2(ScaleCubeDirectMarshallerTransport.java:134)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4219)
        at 
reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onComplete(FluxConcatArray.java:303)
        at 
reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:81)
        at 
reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
        at 
reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
        at 
reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onComplete(FluxPeekFuseable.java:931)
        at 
reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onComplete(MonoSubscribeOn.java:160)
        at 
reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:81)
        at 
reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
        at 
reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1783)
        at 
reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241)
        at 
reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:156)
        at 
io.scalecube.cluster.gossip.GossipProtocolImpl.doSpreadGossip(GossipProtocolImpl.java:177)
        at 
reactor.core.scheduler.PeriodicSchedulerTask.call(PeriodicSchedulerTask.java:49)
        at 
reactor.core.scheduler.PeriodicSchedulerTask.run(PeriodicSchedulerTask.java:63)
        at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at 
java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
        at 
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)

{code}

  was:
In case of node stop it's possible to get null as a result of an invoke 
operation.
{code:java}
return cluster
    .requestResponse(fromNetworkAddress(addr), message)
    .timeout(Duration.ofMillis(timeout))
    .toFuture()
    .thenApply(m -> m == null ? null : m.data()); // The result can be null on 
node stopping.
{code}
It's a rather confusing behavior that produces NPE. See IGNITE-15195 for more 
details. In order not not fail with NPE I've updated null handling in a 
following way
{code:java}
return cluster
    .requestResponse(fromNetworkAddress(addr), message)
    .timeout(Duration.ofMillis(timeout))
    .toFuture()
    .thenApply(m -> {
        if (m == null)
            throw new CompletionException(new NodeStoppingCheckedException());
        else
            return m.data();
    }); // The result can be null on node stopping.{code}
within IGNITE-15148
{panel}
 {panel}
 


> Null seems to be an unexpected result for  ScaleCubeMessagingService#invoke() 
> on node stopping
> ----------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-15196
>                 URL: https://issues.apache.org/jira/browse/IGNITE-15196
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Alexander Lapin
>            Priority: Major
>              Labels: ignite-3
>
> In case of node stop it's possible to get null as a result of an invoke 
> operation.
> {code:java}
> return cluster
>     .requestResponse(fromNetworkAddress(addr), message)
>     .timeout(Duration.ofMillis(timeout))
>     .toFuture()
>     .thenApply(m -> m == null ? null : m.data()); // The result can be null 
> on node stopping.
> {code}
> It's a rather confusing behavior that produces NPE. See IGNITE-15195 for more 
> details. In order not not fail with NPE I've updated null handling in a 
> following way
> {code:java}
> return cluster
>     .requestResponse(fromNetworkAddress(addr), message)
>     .timeout(Duration.ofMillis(timeout))
>     .toFuture()
>     .thenApply(m -> {
>         if (m == null)
>             throw new CompletionException(new NodeStoppingCheckedException());
>         else
>             return m.data();
>     }); // The result can be null on node stopping.{code}
> within IGNITE-15148 
> In order to reproduce given issue restore original
> {code:java}
> .thenApply(m -> m == null ? null : m.data());
> {code}
> and run
> {code:java}
>  
> org.apache.ignite.internal.runner.app.IgnitionTest#testNodeStartWithoutBootstrapConfiguration{code}
> several times.
> As a result NPE will be logged on node stop:
> {code:java}
> SEVERE: Unexpected exception
> class org.apache.ignite.lang.IgniteInternalException: 
> java.lang.NullPointerException
>       at 
> org.apache.ignite.internal.metastorage.client.CursorImpl$InnerIterator.hasNext(CursorImpl.java:109)
>       at 
> org.apache.ignite.internal.metastorage.client.MetaStorageServiceImpl$WatchProcessor$Watcher.run(MetaStorageServiceImpl.java:446)
> Caused by: java.util.concurrent.ExecutionException: 
> java.lang.NullPointerException
>       at 
> java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
>       at 
> java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
>       at 
> org.apache.ignite.internal.metastorage.client.CursorImpl$InnerIterator.hasNext(CursorImpl.java:101)
>       ... 1 more
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl.lambda$run$15(RaftGroupServiceImpl.java:323)
>       at 
> java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:642)
>       at 
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
>       at 
> java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
>       at 
> org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl$1.accept(RaftGroupServiceImpl.java:406)
>       at 
> org.apache.ignite.raft.client.service.impl.RaftGroupServiceImpl$1.accept(RaftGroupServiceImpl.java:360)
>       at 
> java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
>       at 
> java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
>       at 
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
>       at 
> java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
>       at 
> reactor.core.publisher.MonoToCompletableFuture.onComplete(MonoToCompletableFuture.java:83)
>       at 
> reactor.core.publisher.SerializedSubscriber.onComplete(SerializedSubscriber.java:146)
>       at 
> reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onComplete(FluxTimeout.java:228)
>       at 
> reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:129)
>       at 
> reactor.core.publisher.LambdaSubscriber.onComplete(LambdaSubscriber.java:132)
>       at 
> reactor.core.publisher.FluxTake$TakeFuseableSubscriber.onComplete(FluxTake.java:423)
>       at 
> reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onComplete(FluxFilterFuseable.java:165)
>       at 
> reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onComplete(FluxFilterFuseable.java:384)
>       at 
> reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.checkTerminated(FluxOnBackpressureBuffer.java:416)
>       at 
> reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.drainRegular(FluxOnBackpressureBuffer.java:253)
>       at 
> reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.drain(FluxOnBackpressureBuffer.java:225)
>       at 
> reactor.core.publisher.FluxOnBackpressureBuffer$BackpressureBufferSubscriber.onComplete(FluxOnBackpressureBuffer.java:204)
>       at 
> reactor.core.publisher.DirectProcessor$DirectInner.onComplete(DirectProcessor.java:349)
>       at 
> reactor.core.publisher.DirectProcessor.onComplete(DirectProcessor.java:166)
>       at 
> reactor.core.publisher.FluxCreate$BaseSink.complete(FluxCreate.java:438)
>       at 
> reactor.core.publisher.FluxCreate$SerializedSink.drainLoop(FluxCreate.java:239)
>       at 
> reactor.core.publisher.FluxCreate$SerializedSink.drain(FluxCreate.java:205)
>       at 
> reactor.core.publisher.FluxCreate$SerializedSink.complete(FluxCreate.java:196)
>       at 
> org.apache.ignite.network.scalecube.ScaleCubeDirectMarshallerTransport.lambda$doStop$2(ScaleCubeDirectMarshallerTransport.java:134)
>       at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
>       at reactor.core.publisher.Mono.subscribe(Mono.java:4219)
>       at 
> reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onComplete(FluxConcatArray.java:303)
>       at 
> reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:81)
>       at 
> reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
>       at 
> reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
>       at 
> reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onComplete(FluxPeekFuseable.java:931)
>       at 
> reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onComplete(MonoSubscribeOn.java:160)
>       at 
> reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:81)
>       at 
> reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
>       at 
> reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1783)
>       at 
> reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241)
>       at 
> reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:156)
>       at 
> io.scalecube.cluster.gossip.GossipProtocolImpl.doSpreadGossip(GossipProtocolImpl.java:177)
>       at 
> reactor.core.scheduler.PeriodicSchedulerTask.call(PeriodicSchedulerTask.java:49)
>       at 
> reactor.core.scheduler.PeriodicSchedulerTask.run(PeriodicSchedulerTask.java:63)
>       at 
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
>       at 
> java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
>       at 
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>       at java.base/java.lang.Thread.run(Thread.java:834)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to