On Jun 10, 2011, at 11:42 AM, Sanne Grinovero wrote: > 2011/6/10 Galder Zamarreño <gal...@redhat.com>: >> >> On Jun 9, 2011, at 5:47 PM, Manik Surtani wrote: >> >>> +1 to writing the error marker to the stream. At least prevent false alarms. >>> >>> Re: unit testing our externalizers, Galder, any thoughts there? >> >> The debugging done by Sanne/Dan seems to be correct. >> >> EOFException is simply saying: "hey, i'm expecting all these bytes but the >> stream finished before I could read them all" >> >> This generally means that the side generating the stream encountered an >> issue, and that's precisely what happens on the generation side. >> >> The receiver side cannot do much here other than say: "hey, i don't have all >> the bytes" - and that's precisely what the EOFException is doing. >> >> I think the error marker could be complicated to implement (i.e. imagine >> expecting to read a byte and instead getting an ERROR marker). What would be >> much easier to do is for VersionAwareMarshaller or GenericJBossMarshaller to >> provide more hints about what's wrong. So, they could hide the inner details >> of the EOFException and launder it into something that's clearer to the user: >> >> "The stream ended unexpectedly, please check for any errors where the stream >> was generated" >> >> The right exception here is still an EOFException. >> >> That's all the receiver side can do. > > Agreed that's reasonable on the receiver side, and of course we can't > control the network so while we can't always prevent it, can we still > try to not send incomplete streams from the sending side?
Isn't that complicating the stream reading code quite a bit? I can only imagine being possible to do that with a catch throwable and then have an ERROR object/marker of some sort. Then, everytime you read something you'd have to check whether it's a the error object or marker. Now, how do you compare an int or a byte with an Object? If it's a marker, which marker? It could just happen that the marker (i.e. a byte) it's actually part of the correct stream. Besides, what do we gain with this? Nothing, the receiver side is still gonna say the same, "something went wrong on the client side" > > Sanne > >> >>> >>> Sent from my mobile phone >>> >>> On 9 Jun 2011, at 16:24, Dan Berindei <dan.berin...@gmail.com> wrote: >>> >>>> I don't think it's an externalizer issue, as I also see some >>>> exceptions on the node that generates state: >>>> >>>> 2011-06-09 18:16:18,250 ERROR >>>> [org.infinispan.remoting.transport.jgroups.JGroupsTransport] >>>> (STREAMING_STATE_TRANSFER-sender-1,Infinispan-Cluster,NodeA-57902) >>>> ISPN00095: Caught while responding to state transfer request >>>> org.infinispan.statetransfer.StateTransferException: >>>> java.util.concurrent.TimeoutException: >>>> STREAMING_STATE_TRANSFER-sender-1,Infinispan-Cluster,NodeA-57902 could >>>> not obtain exclusive processing lock after 10 seconds. Locks in >>>> question are >>>> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock@a35c90[Read >>>> locks = 1] and >>>> java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock@111fb7f[Unlocked] >>>> at >>>> org.infinispan.statetransfer.StateTransferManagerImpl.generateState(StateTransferManagerImpl.java:177) >>>> at >>>> org.infinispan.remoting.InboundInvocationHandlerImpl.generateState(InboundInvocationHandlerImpl.java:248) >>>> at >>>> org.infinispan.remoting.transport.jgroups.JGroupsTransport.getState(JGroupsTransport.java:585) >>>> at >>>> org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.handleUpEvent(MessageDispatcher.java:690) >>>> at >>>> org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:771) >>>> at org.jgroups.JChannel.up(JChannel.java:1484) >>>> at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1074) >>>> at >>>> org.jgroups.protocols.pbcast.STREAMING_STATE_TRANSFER$StateProviderHandler.process(STREAMING_STATE_TRANSFER.java:651) >>>> at >>>> org.jgroups.protocols.pbcast.STREAMING_STATE_TRANSFER$StateProviderThreadSpawner$1.run(STREAMING_STATE_TRANSFER.java:580) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) >>>> at java.lang.Thread.run(Thread.java:636) >>>> Caused by: java.util.concurrent.TimeoutException: >>>> STREAMING_STATE_TRANSFER-sender-1,Infinispan-Cluster,NodeA-57902 could >>>> not obtain exclusive processing lock after 10 seconds. Locks in >>>> question are >>>> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock@a35c90[Read >>>> locks = 1] and >>>> java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock@111fb7f[Unlocked] >>>> at >>>> org.infinispan.remoting.transport.jgroups.JGroupsDistSync.acquireProcessingLock(JGroupsDistSync.java:100) >>>> at >>>> org.infinispan.statetransfer.StateTransferManagerImpl.generateTransactionLog(StateTransferManagerImpl.java:204) >>>> at >>>> org.infinispan.statetransfer.StateTransferManagerImpl.generateState(StateTransferManagerImpl.java:167) >>>> ... 11 more >>>> >>>> I guess we could write an error marker in the stream to prevent the >>>> EOFException on the receiving side, but the end result would be the >>>> same. >>>> >>>> Dan >>>> >>>> >>>> On Thu, Jun 9, 2011 at 5:58 PM, Sanne Grinovero <sa...@infinispan.org> >>>> wrote: >>>>> Hello all, >>>>> if I happen to look at the console while the tests are running, I see >>>>> this exception popup very often: >>>>> >>>>> 2011-06-09 15:32:18,092 ERROR [JGroupsTransport] >>>>> (Incoming-1,Infinispan-Cluster,NodeB-32230) ISPN00096: Caught while >>>>> requesting or applying state >>>>> org.infinispan.statetransfer.StateTransferException: >>>>> java.io.EOFException: Read past end of file >>>>> at >>>>> org.infinispan.statetransfer.StateTransferManagerImpl.applyState(StateTransferManagerImpl.java:333) >>>>> at >>>>> org.infinispan.remoting.InboundInvocationHandlerImpl.applyState(InboundInvocationHandlerImpl.java:230) >>>>> at >>>>> org.infinispan.remoting.transport.jgroups.JGroupsTransport.setState(JGroupsTransport.java:602) >>>>> at >>>>> org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.handleUpEvent(MessageDispatcher.java:711) >>>>> at >>>>> org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:771) >>>>> at org.jgroups.JChannel.up(JChannel.java:1441) >>>>> at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1074) >>>>> at >>>>> org.jgroups.protocols.pbcast.STREAMING_STATE_TRANSFER.connectToStateProvider(STREAMING_STATE_TRANSFER.java:523) >>>>> at >>>>> org.jgroups.protocols.pbcast.STREAMING_STATE_TRANSFER.handleStateRsp(STREAMING_STATE_TRANSFER.java:462) >>>>> at >>>>> org.jgroups.protocols.pbcast.STREAMING_STATE_TRANSFER.up(STREAMING_STATE_TRANSFER.java:223) >>>>> at org.jgroups.protocols.FRAG2.up(FRAG2.java:189) >>>>> at org.jgroups.protocols.FC.up(FC.java:479) >>>>> at org.jgroups.protocols.pbcast.GMS.up(GMS.java:891) >>>>> at org.jgroups.protocols.pbcast.STABLE.up(STABLE.java:246) >>>>> at >>>>> org.jgroups.protocols.UNICAST.handleDataReceived(UNICAST.java:613) >>>>> at org.jgroups.protocols.UNICAST.up(UNICAST.java:294) >>>>> at org.jgroups.protocols.pbcast.NAKACK.up(NAKACK.java:703) >>>>> at org.jgroups.protocols.VERIFY_SUSPECT.up(VERIFY_SUSPECT.java:133) >>>>> at org.jgroups.protocols.FD.up(FD.java:275) >>>>> at org.jgroups.protocols.FD_SOCK.up(FD_SOCK.java:275) >>>>> at org.jgroups.protocols.MERGE2.up(MERGE2.java:209) >>>>> at org.jgroups.protocols.Discovery.up(Discovery.java:291) >>>>> at org.jgroups.protocols.TP.passMessageUp(TP.java:1102) >>>>> at >>>>> org.jgroups.protocols.TP$IncomingPacket.handleMyMessage(TP.java:1658) >>>>> at org.jgroups.protocols.TP$IncomingPacket.run(TP.java:1640) >>>>> at >>>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) >>>>> at >>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) >>>>> at java.lang.Thread.run(Thread.java:662) >>>>> Caused by: java.io.EOFException: Read past end of file >>>>> at >>>>> org.jboss.marshalling.SimpleDataInput.eofOnRead(SimpleDataInput.java:126) >>>>> at >>>>> org.jboss.marshalling.SimpleDataInput.readUnsignedByteDirect(SimpleDataInput.java:263) >>>>> at >>>>> org.jboss.marshalling.SimpleDataInput.readUnsignedByte(SimpleDataInput.java:224) >>>>> at >>>>> org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209) >>>>> at >>>>> org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:37) >>>>> at >>>>> org.infinispan.marshall.jboss.GenericJBossMarshaller.objectFromObjectStream(GenericJBossMarshaller.java:192) >>>>> at >>>>> org.infinispan.marshall.VersionAwareMarshaller.objectFromObjectStream(VersionAwareMarshaller.java:190) >>>>> at >>>>> org.infinispan.statetransfer.StateTransferManagerImpl.processCommitLog(StateTransferManagerImpl.java:230) >>>>> at >>>>> org.infinispan.statetransfer.StateTransferManagerImpl.applyTransactionLog(StateTransferManagerImpl.java:252) >>>>> at >>>>> org.infinispan.statetransfer.StateTransferManagerImpl.applyState(StateTransferManagerImpl.java:322) >>>>> ... 27 more >>>>> >>>>> But I'm not sure if it's an issue, as it seems tests are not failing. >>>>> I consider a "Read past end of file" quite suspiciously looking; would >>>>> it be possible to think that some internal Externalizer is writing >>>>> less bytes than what it's attempting to read? >>>>> Is there something clever I could do to understand which object the >>>>> marshaller is trying to read when something like this is happening? >>>>> I've found debugging this quite hard. >>>>> >>>>> Also, it doesn't look like our externalizers have a good test >>>>> coverage; They are likely implicitly tested as I assume that nothing >>>>> would work if they aren't, but still it looks like we have no explicit >>>>> tests for them? >>>>> >>>>> Cheers, >>>>> Sanne >>>>> _______________________________________________ >>>>> infinispan-dev mailing list >>>>> infinispan-dev@lists.jboss.org >>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >>>>> >>>> >>>> _______________________________________________ >>>> infinispan-dev mailing list >>>> infinispan-dev@lists.jboss.org >>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >>> >>> _______________________________________________ >>> infinispan-dev mailing list >>> infinispan-dev@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >> -- >> Galder Zamarreño >> Sr. Software Engineer >> Infinispan, JBoss Cache >> >> >> _______________________________________________ >> infinispan-dev mailing list >> infinispan-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> > > _______________________________________________ > infinispan-dev mailing list > infinispan-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/infinispan-dev -- Galder Zamarreño Sr. Software Engineer Infinispan, JBoss Cache _______________________________________________ infinispan-dev mailing list infinispan-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/infinispan-dev