Bug 4734 - netvirt/GatewayMacResolverService: null pinter exception
authorIsaku Yamahata <isaku.yamahata@intel.com>
Mon, 7 Dec 2015 23:26:35 +0000 (15:26 -0800)
committerFlavio Fernandes <ffernand@redhat.com>
Tue, 8 Dec 2015 21:09:10 +0000 (21:09 +0000)
commit82c56b13aa10427a2b1a447876f255ce5f8142ed
treefbcf47c8b40cbba693fdf9c02c419f9495234d31
parent94dadfdef97bdee5706aeede61eb2738a6d3ed0f
Bug 4734 - netvirt/GatewayMacResolverService: null pinter exception

Null pointer exception happens as follows. there is no guarantee that
gatewayToArpMetadataMap caches entry for gatewayIp.  This patch only
addresses null pointer exception. The race condition should be handled
somehow.

> 2015-12-03 18:48:38,091 | ERROR | ntLoopGroup-11-2 | ExecutionList                    | 37 - com.google.guava - 18.0.0 | RuntimeException while executing runnable com.google.common.util.concurrent.Futures$6@4c708463 with executor INSTANCE
> java.lang.NullPointerException
>         at org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.arp.GatewayMacResolverService$3.onSuccess(GatewayMacResolverService.java:262)[268:org.opendaylight.ovsdb.openstack.net-virt-providers:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.arp.GatewayMacResolverService$3.onSuccess(GatewayMacResolverService.java:249)[268:org.opendaylight.ovsdb.openstack.net-virt-providers:1.2.1.SNAPSHOT]
>         at com.google.common.util.concurrent.Futures$6.run(Futures.java:1319)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ChainingListenableFuture$1.run(Futures.java:918)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ImmediateFuture.addListener(Futures.java:106)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:914)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ChainingListenableFuture$1.run(Futures.java:918)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ChainingListenableFuture$1.run(Futures.java:918)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ImmediateFuture.addListener(Futures.java:106)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:914)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185)[37:com.google.guava:18.0.0]
>         at com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:53)[37:com.google.guava:18.0.0]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.AbstractRpcListener.successfulRpc(AbstractRpcListener.java:88)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.SimpleRpcListener.operationSuccessful(SimpleRpcListener.java:17)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.AbstractRpcListener.operationComplete(AbstractRpcListener.java:63)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680)[100:io.netty.common:4.0.30.Final]
>         at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:567)[100:io.netty.common:4.0.30.Final]
>         at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:406)[100:io.netty.common:4.0.30.Final]
>         at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:672)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:262)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:342)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:318)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:761)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:311)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:729)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1127)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:663)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:644)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:663)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:644)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.DefaultChannelPipeline.flush(DefaultChannelPipeline.java:897)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.channel.AbstractChannel.flush(AbstractChannel.java:192)[101:io.netty.transport:4.0.30.Final]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.ChannelOutboundQueue.flush(ChannelOutboundQueue.java:212)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.ChannelOutboundQueue.access$000(ChannelOutboundQueue.java:37)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at org.opendaylight.openflowjava.protocol.impl.core.connection.ChannelOutboundQueue$1.run(ChannelOutboundQueue.java:81)[249:org.opendaylight.openflowjava.openflow-protocol-impl:0.7.0.SNAPSHOT]
>         at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:327)[100:io.netty.common:4.0.30.Final]
>         at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350)[101:io.netty.transport:4.0.30.Final]
>         at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110)[100:io.netty.common:4.0.30.Final]
>         at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)[100:io.netty.common:4.0.30.Final]
>         at java.lang.Thread.run(Thread.java:745)[:1.8.0_45-internal]

Change-Id: I0f7d233b14b672c98ff41d6295eded51da3d4e2a
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/arp/GatewayMacResolverService.java