Because people write code like:
myMethod(InputStream in) {
  InputStream child = new InputStream(in);
  child.close();
}

InputStream in = new FileInputStream(... path ...);
myMethod(in);
myMethod(in);

An exception will be thrown when the second myMethod call occurs.

Unfortunately not everyone wraps their calls to a coder with an
UnownedInputStream or a filter input stream which drops close() calls is
why its a problem and in the few places it is done it is used to prevent
bugs from creeping in.



On Tue, Jan 30, 2018 at 11:29 AM, Romain Manni-Bucau <rmannibu...@gmail.com>
wrote:

> I get the issue but I don't get the last part. Concretely we can support
> any lib by just removing the exception in the close, no? What would be the
> issue? No additional wrapper, no lib integration issue.
>
>
> Romain Manni-Bucau
> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> <https://rmannibucau.metawerx.net/> | Old Blog
> <http://rmannibucau.wordpress.com> | Github
> <https://github.com/rmannibucau> | LinkedIn
> <https://www.linkedin.com/in/rmannibucau>
>
> 2018-01-30 19:29 GMT+01:00 Lukasz Cwik <lc...@google.com>:
>
>> Its common in the code base that input and output streams are passed
>> around and the caller is responsible for closing it, not the callee. The
>> UnownedInputStream is to guard against libraries that are poorly behaved
>> and assume they get ownership of the stream when it is given to them.
>>
>> In the code:
>> myMethod(InputStream in) {
>>   InputStream child = new InputStream(in);
>>   child.close();
>> }
>>
>> InputStream in = ...
>> myMethod(in);
>> myMethod(in);
>> When should "in" be closed?
>>
>> To get around this issue, create a filter input/output stream that
>> ignores close calls like on the JAXB coder:
>> https://github.com/apache/beam/blob/master/sdks/java/io/xml/
>> src/main/java/org/apache/beam/sdk/io/xml/JAXBCoder.java#L181
>>
>> We can instead swap around this pattern so that the caller guards against
>> callees closing by wrapping with a filter input/output stream but this
>> costs an additional method call for each input/output stream call.
>>
>>
>> On Tue, Jan 30, 2018 at 10:04 AM, Romain Manni-Bucau <
>> rmannibu...@gmail.com> wrote:
>>
>>> Hi guys,
>>>
>>> All is in the subject ;)
>>>
>>> Rational is to support any I/O library and not fail when the close is
>>> encapsulated.
>>>
>>> Any blocker to swallow this close call?
>>>
>>> Romain Manni-Bucau
>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>> <https://rmannibucau.metawerx.net/> | Old Blog
>>> <http://rmannibucau.wordpress.com> | Github
>>> <https://github.com/rmannibucau> | LinkedIn
>>> <https://www.linkedin.com/in/rmannibucau>
>>>
>>
>>
>

Reply via email to