Logistics Pipes

Logistics Pipes

13M Downloads

Requesting from behind an iron pipe throws an exception and kicks the client

firelizzard18 opened this issue ยท 3 comments

commented

I have my main network and my personal network. Between the two there's an iron pipe that lets items into but not out of my personal network. My personal network consists of a chest with a chassis+provider and another chest with a remote orderer. When I use the remote orderer to request certain items, an exception is thrown and my client is kicked from the server. So far the items that have caused this error are sticks (one available, and a crafting recipe that takes jungle wood planks) and jungle wood planks (one available, and a crafting recipe that takes rubber wood (lots of that available)). (fml-server-latest.log provides no additional information.)

[20:18:54] [Server thread/ERROR] [FML]: PacketInboundHandler exception
java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.TimSort.mergeLo(TimSort.java:777) ~[?:1.8.0_91]
        at java.util.TimSort.mergeAt(TimSort.java:514) ~[?:1.8.0_91]
        at java.util.TimSort.mergeCollapse(TimSort.java:441) ~[?:1.8.0_91]
        at java.util.TimSort.sort(TimSort.java:245) ~[?:1.8.0_91]
        at java.util.Arrays.sort(Arrays.java:1512) ~[?:1.8.0_91]
        at java.util.ArrayList.sort(ArrayList.java:1454) ~[?:1.8.0_91]
        at java.util.Collections.sort(Collections.java:175) ~[?:1.8.0_91]
        at logisticspipes.request.RequestTreeNode.getProviders(RequestTreeNode.java:304) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.checkProvider(RequestTreeNode.java:272) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.<init>(RequestTreeNode.java:48) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.<init>(RequestTreeNode.java:31) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTree.<init>(RequestTree.java:43) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestTree.request(RequestTree.java:177) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestTree.request(RequestTree.java:202) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestHandler.request(RequestHandler.java:48) ~[RequestHandler.class:0.9.3.local]
        at logisticspipes.network.packets.orderer.RequestSubmitPacket.processPacket(RequestSubmitPacket.java:29) ~[RequestSubmitPacket.class:0.9.3.local]
        at logisticspipes.network.PacketInboundHandler.channelRead0(PacketInboundHandler.java:21) ~[PacketInboundHandler.class:0.9.3.local]
        at logisticspipes.network.PacketInboundHandler.channelRead0(PacketInboundHandler.java:16) ~[PacketInboundHandler.class:0.9.3.local]
        at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[SimpleChannelInboundHandler.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:?]
        at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [MessageToMessageCodec.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
        at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]
        at cpw.mods.fml.common.network.internal.FMLProxyPacket.func_148833_a(FMLProxyPacket.java:77) [FMLProxyPacket.class:?]
        at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:212) [ej.class:?]
        at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:165) [nc.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:659) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:334) [lt.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:547) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:427) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:685) [li.class:?]
[20:18:54] [Server thread/ERROR] [FML]: There was a critical exception handling a packet on channel LogisticsPipes
java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.TimSort.mergeLo(TimSort.java:777) ~[?:1.8.0_91]
        at java.util.TimSort.mergeAt(TimSort.java:514) ~[?:1.8.0_91]
        at java.util.TimSort.mergeCollapse(TimSort.java:441) ~[?:1.8.0_91]
        at java.util.TimSort.sort(TimSort.java:245) ~[?:1.8.0_91]
        at java.util.Arrays.sort(Arrays.java:1512) ~[?:1.8.0_91]
        at java.util.ArrayList.sort(ArrayList.java:1454) ~[?:1.8.0_91]
        at java.util.Collections.sort(Collections.java:175) ~[?:1.8.0_91]
        at logisticspipes.request.RequestTreeNode.getProviders(RequestTreeNode.java:304) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.checkProvider(RequestTreeNode.java:272) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.<init>(RequestTreeNode.java:48) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTreeNode.<init>(RequestTreeNode.java:31) ~[RequestTreeNode.class:0.9.3.local]
        at logisticspipes.request.RequestTree.<init>(RequestTree.java:43) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestTree.request(RequestTree.java:177) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestTree.request(RequestTree.java:202) ~[RequestTree.class:0.9.3.local]
        at logisticspipes.request.RequestHandler.request(RequestHandler.java:48) ~[RequestHandler.class:0.9.3.local]
        at logisticspipes.network.packets.orderer.RequestSubmitPacket.processPacket(RequestSubmitPacket.java:29) ~[RequestSubmitPacket.class:0.9.3.local]
        at logisticspipes.network.PacketInboundHandler.channelRead0(PacketInboundHandler.java:21) ~[PacketInboundHandler.class:0.9.3.local]
        at logisticspipes.network.PacketInboundHandler.channelRead0(PacketInboundHandler.java:16) ~[PacketInboundHandler.class:0.9.3.local]
        at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[SimpleChannelInboundHandler.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[MessageToMessageDecoder.class:?]
        at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?]
        at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?]
        at cpw.mods.fml.common.network.internal.FMLProxyPacket.func_148833_a(FMLProxyPacket.java:77) [FMLProxyPacket.class:?]
        at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:212) [ej.class:?]
        at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:165) [nc.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:659) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:334) [lt.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:547) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:427) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:685) [li.class:?]
commented

The line in question is 107 in the github sources:

Collections.sort(validSources, new workWeightedSorter(1.0));
commented

This issue affects JRE 1.7 and up (details). A workaround is to add -Djava.util.Arrays.useLegacyMergeSort=true to the java options when launching.

commented

Yeah, the Tim Sort (originates from Python) was introduced in Java 7 and that algorithm is very good. The old merge sort might just work with the issue we have.
I never looked into our "weighted sorter", but I am sure it was done wrong. Hence the exception.