[mythtv-users] ExternalRecorder - Errno 11

Peter Bennett pb.mythtv at gmail.com
Thu Nov 23 15:40:25 UTC 2017



On 11/23/2017 12:50 AM, Marc Rawji wrote:
> On Wed, Nov 22, 2017 at 4:41 PM, Stephen Worthington 
> <stephen_agent at jsw.gen.nz <mailto:stephen_agent at jsw.gen.nz>> wrote:
>
>     On Wed, 22 Nov 2017 10:28:39 -0800, you wrote:
>
>     >On Tue, Nov 21, 2017 at 11:11 PM, Stephen Worthington <
>     >stephen_agent at jsw.gen.nz <mailto:stephen_agent at jsw.gen.nz>> wrote:
>     >
>     >> On Wed, 22 Nov 2017 06:03:31 +0000, you wrote:
>     >>
>     >> >Hi Everyone,
>     >> >
>     >> >I've been working on an external recorder for a while. It
>     works most of
>     >> the
>     >> >time, but recently i've been getting new errors.
>     >> >
>     >> <snip>
>     >> >My problem below is that I am getting a "Resource temporarily
>     unavailable
>     >> >(11)" when mythtv is trying to read from the stdin (the stdout
>     of my
>     >> >program with the video stream)
>     >> >
>     >> >This seems to happen from this call:
>     >> >https://github.com/MythTV/mythtv/blob/master/mythtv/
>     <https://github.com/MythTV/mythtv/blob/master/mythtv/>
>     >> libs/libmythtv/recorders/ExternalStreamHandler.cpp#L125
>     >> >
>     >> >The STDIN stream is configured to be non blocking, so the
>     errno 11 isn't
>     >> >unexpected:
>     >> >https://github.com/MythTV/mythtv/blob/master/mythtv/
>     <https://github.com/MythTV/mythtv/blob/master/mythtv/>
>     >> libs/libmythtv/recorders/ExternalStreamHandler.cpp#L343
>     >> >
>     >> >I am not sure what to change to keep this from happening....
>     it fails
>     >> about
>     >> >50% of the time, which is annoying.
>     >> >
>     >> >I am looking for advice on a fix, or how to troubleshoot. I am
>     running
>     >> 0.29
>     >> >on Ubuntu 16.04.
>     >> >
>     >> >Thanks!
>     >> >Marc
>     >> >
>     >> <snip>
>     >>
>     >> If I am reading the ExternalStreamHandler.cpp.ExternIO::Read
>     function
>     >> correctly, then the only way that can happen is if your stdout
>     stream
>     >> indicates that it has data buffered and available to be read (the
>     >> poll() call from the Ready() call says there is data there),
>     but then
>     >> your stdout fails to provide that data when it is called from
>     read().
>     >> The most obvious reason I can think of for that would be if
>     your code
>     >> was slow in responding to the read(), due to some unforeseen
>     >> circumstance such as garbage collection or being swapped out at the
>     >> time.  But I would have thought that your stdout buffer would have
>     >> been there waiting to be read, rather than any higher code
>     needing to
>     >> be run to provide the data.  Are you using buffered I/O on your
>     >> stdout?
>     >>
>     >>
>     >Thanks for the quick reply Stephen. I am going to very quickly
>     expose my
>     >ignorance on how these FDs work. (just setting expectations)
>     >
>     >Yes, I am using buffered output, specifically a BufferedWriter in
>     Python (
>     >https://docs.python.org/2/library/io.html#io.BufferedWriter
>     <https://docs.python.org/2/library/io.html#io.BufferedWriter>). I
>     added
>     >explicit "flush" commands after the 'write' command, but it
>     didn't help.
>     >
>     >I'll try dropping the buffered output tonight and see what happens. I
>     >didn't think that using a buffered writer would affect how data
>     is present
>     >in the stream.
>     >
>     >Thanks,
>     >Marc
>
>     I would have hoped that using a BufferedWriter would have provided
>     more buffering rather than less, but it would be useful to try a
>     normal file instead, using the normal buffering, to see if it makes a
>     difference.  The problem with this situation is that the
>     ExternalStreamHandler.cpp code needs to be able to read the data from
>     the pipe buffer instantly, as it has been told that there is data
>     waiting.  So if the buffer the data is coming from is not locked in
>     RAM, it may not be instantly available.  The normal file I/O buffers
>     in Python are handled in the underlying C library and should work the
>     way ExternalStreamHandler.cpp expects them to, but it is vaguely
>     possible that BufferedWriter changes that and accessing its buffers
>     requires running the Python interpreter, which could cause this
>     problem.  The documentation of BufferedWriter is not specific enough
>     about how it works to know exactly how its low level buffering works,
>     but it is suggestive that the data may be lying in a higher level
>     buffer.
>
>
> Just gave it a go and no joy, same behavior as before...
>
> In my Python code, the salient part is:
> data = fd.read(256)
> if data:
>     if (self.last_write_time is None):
>         self.logger.debug("First bytes written to stdout")
>     self.__bin_stdout.write(data)
>     self.__bin_stdout.flush()
>     self.last_write_time = time.time()
> self.writer_control.wait(0.5)
>
> and self.__bin_stdout is equal to sys.stdout.
>
> Would it have to do with:
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html
>
> It indicates that for streams, the POLLIN is set even if the message 
> is of zero length.
>
> Thanks,
> Marc
>
>
I suggest creating a ticket for this.

You may want to look at the import recorder. I recently committed a fix 
that allows it to be used for recordings. See the fix at 
https://code.mythtv.org/trac/ticket/13114 and documentation at 
https://www.mythtv.org/wiki/Import_recorder . Currently the fix is only 
available in master, scheduled for v30.

Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mythtv.org/pipermail/mythtv-users/attachments/20171123/b81e2f1e/attachment.html>


More information about the mythtv-users mailing list