2011/6/10 Galder Zamarreño <gal...@redhat.com>: > > 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?
Hi Galder, I'm not sure to what you're referring to. I was not proposing to change anything on the reader side, just - if possible as I don't know this code - to try not sending anything if we fail to build a proper stream (instead of sending a broken stream). That is of course feasible only if you've not started transmitting already. Sanne > > 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 > _______________________________________________ infinispan-dev mailing list infinispan-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/infinispan-dev