Hi Sergey, Thanks for your suggestion. I verified all other image writers with present code(For WBMP after changing BufferedImageType to TYPE_BYTE_BINARY) there are no problems in them.
Cache is closed properly and we don't see IndexOutOfBoundsException. Thanks, Jay -----Original Message----- From: Sergey Bylokhov Sent: Wednesday, December 02, 2015 12:43 AM To: Jayathirth D V; Philip Race Cc: 2d-dev@openjdk.java.net Subject: Re: [OpenJDK 2D-Dev] Review request for JDK-6967419 : IndexOutOfBoundsException when drawing PNGs Hi, Jay. Can you please check other writers and confirm that similar issues are not exists there(just try a different writers in the test)? If the problem exists it can be fixed as a separate issue, if everything works as expected nothing should be changed. On 17.11.15 14:41, Jayathirth D V wrote: > Hi Phil, > > Thanks for pointing to JDK-8041746 . > > _My observations:_ > > I think with Andrew's test case we are able to identify the problem > submitter might have faced in JDK-6967419 . By deliberately throwing > exception at count 30000L we are trying to reproduce scenario of > possible IOException where client is closing the socket(probably > because of communication problem between client & server) and IDAT > chunk is being written. If we change count to any other number(like > 10L) which relates to writing of data apart from IDAT chunk we don't > see any issue(no exception and cache is closed properly). > > This might explain why submitter is seeing 7 out of 20 fail. > > Also by using the test case we are able to see flushedPos going past > by > 4 bytes to Pos when ios.close() is called as mentioned by submitter in > JDK-6967419. So catching the IOException and updating 'startPos' > value, will not result in IndexOutOfBoundsException and ios.close() > will be performed properly. > > Please let us know your inputs. > > Thanks, > > Jay > > *From:*Phil Race > *Sent:* Tuesday, November 17, 2015 3:22 AM > *To:* Jayathirth D V > *Cc:* Prasanta Sadhukhan; 2d-dev@openjdk.java.net > *Subject:* Re: Review request for JDK-6967419 : > IndexOutOfBoundsException when drawing PNGs > > This one reads like it should be obvious but I find it less so .. > The unsatisfying part is that we do not seem to know what caused the > IOException in the customer case. > > Andrew came up with a way to reproduce the symptoms but we really > don't know what caused the exception in the case of the submitter. > It does not seem likely he was 'deliberately' throwing an exception to > mess up his own application. > > I just found this : https://bugs.openjdk.java.net/browse/JDK-8041746 > > The interesting part is that this bug (the one you are working on) the > submitter also wrote that he was using "a ServletOutputStream" > > So consequently I wonder if it was something like what is described in > 8041746 is going on here. It could explain how he sees 7 out of 20 fail. > > Please take a look at that one to have a think about it. > Would your fix help that real world case ? > > -phil. > > On 11/12/2015 08:11 PM, Jayathirth D V wrote: > > Hi Phil, > > I have added public evaluation in bug. Please review. > > Thanks, > > Jay > > *From:*Philip Race > *Sent:* Friday, November 13, 2015 12:11 AM > *To:* Jayathirth D V > *Cc:* Prasanta Sadhukhan; 2d-dev@openjdk.java.net > <mailto:2d-dev@openjdk.java.net> > *Subject:* Re: Review request for JDK-6967419 : > IndexOutOfBoundsException when drawing PNGs > > Please add a *public* evaluation to the bug report. I will look at > it more then .. > > -phil. > > On 11/6/15, 2:20 AM, Jayathirth D V wrote: > > Hi Prasanta, > > As discussed, only in case of write_IDAT there is finally block > which calls ios.finish() which internally calls seek() with > improper startPos. In other cases we are not trying to access > improper startPos because there is no call to ios.finish(). We > can verify this behavior by changing logic where we throw > IOException in test case. > > And I have modified test to not catch IOBE as per your > suggestion. Please find updated Webrev link: > > http://cr.openjdk.java.net/~rchamyal/jay/6967419/webrev.01/ > > <http://cr.openjdk.java.net/%7Erchamyal/jay/6967419/webrev.01/> > > Thanks, > > Jay > > *From:*prasanta sadhukhan > *Sent:* Friday, November 06, 2015 2:45 PM > *To:* Jayathirth D V; 2d-dev@openjdk.java.net > <mailto:2d-dev@openjdk.java.net> > *Cc:* Philip Race > *Subject:* Re: Review request for JDK-6967419 : > IndexOutOfBoundsException when drawing PNGs > > Hi Jay, > > looks ok but > I guess you need to do the same for finish() method too in > similar way you did for finishChunk() as finish() is called from > write_IHDR, write_CHRM etc and it calls flushBefore(). > Also, I guess you should not consume IOB Exception and let it be > thrown to user instead of RuntimeException after catching IOBE. > > Regards > Prasanta > > On 11/5/2015 5:25 PM, Jayathirth D V wrote: > > Hello All, > > Please review following fix in jdk9: > > Bug : https://bugs.openjdk.java.net/browse/JDK-6967419 > > Webrev : > http://cr.openjdk.java.net/~rchamyal/jay/6967419/webrev.00/ > > <http://cr.openjdk.java.net/%7Erchamyal/jay/6967419/webrev.00/> > > Bug : IndexOutOfBoundsException when drawing PNGs > > Root cause : When user intentionally throws IO Exception > while write is happening. > We call ios.finish() in finally > block of write_IDAT() which internally goes to > finishChunk(). But the startPos of the chunk is still > pointing to present IDAT chunk but flushedPos(streamPos) is > pointing to end of IDAT chunk. > So in finishChunk(), startPos > will be less than flushedPos. This is causing > IndexOutOfBoundException in stream.seek() and cache is not > closed. > > Solution : If IOException is thrown by user, catch the > exception while write is happening and update startPos to > streamPos. So that when seek() happens in finishChunk() we > don't see IndexOutOfBoundsException and cache is closed > properly. > > Thanks, > > Jay > -- Best regards, Sergey.