[OT] select and sysread problem on solaris
Mark Blackman
mark at blackmans.org
Thu Sep 11 10:33:20 BST 2008
On 11 Sep 2008, at 02:12, Paul Johnson wrote:
> I'm looking for a little help in solving a problem which has me
> stumped
> and couldn't think of anywhere better to come. That's not the problem
> by the way, but I'll take answers to that as well.
>
> I have about 210 named pipes (FIFOs) and three processes which are
> running a select over a third of the pipes each, and then calling
> sysread on the pipe before writing out the data to log files.
>
> This has been working well in production for almost two years handling
> many GB of data daily.
>
> Recently, another thirty or so pipes have been added to this group and
> very occassionally I am noticing a problem whereby select will
> indicate
> that a pipe is ready for reading and sysread will attempt to read from
> the pipe, but there is actually nothing there to be read, and so the
> sysread call hangs waiting for input.
>
> Reproducing this problem is difficult, but I currently have the system
> in such a state. The pipe on which the sysread call is waiting is one
> of the new pipes.
>
> I can only think of four possible explanations here:
>
> 1. My code is broken. I don't think this is the case but don't want
> to rule it out.
>
> 2. Some other process has read the data inbetween the select
> returning
> and the sysread being called. lsof shows no unexpected processes
> accessing the pipe at the moment and no one should have been
> on the
> system to have run cat or anything. last shows nothing
> suspicious.
>
> 3. Perl's select is broken.
>
> 4. The OS broken.
>
> Is my assumption correct that if select tells you there is
> something to
> be read then there should be something there to be read? Can anyone
> think of any other possibilities?
>
> What is curious to me is that the process writing to the named pipe is
> hung. Is the pipe locked somehow until the sysread call has returned?
>
> Unless I can think of anything better to do, tomorrow I will try to
> send
> some data to the named pipe that is being read to see if that will
> allow
> the sysread to return. If it does, I should be able to tell
> whether any
> data has been lost from the named pipe, which might indicate that
> another process had read it.
>
> I am running perl-5.8.8 on Solaris 8. The program writing to named
> pipe
> is a Java program which is writing to STDOUT. That program has been
> called using system by a Perl wrapper which has reopened STDOUT to the
> named pipe. The program reading from the named pipe is using PERLIO.
>
> I'm open to any hints, suggestions or solutions.
>
This reminds of a issue I found with select/sysread on solaris too,
although it turned out it was a misunderstanding on my part of the perl
sysread semantics compared to the read system call. It was something
to do with what happened when a pipe was closed unexpectedly I think.
You might review the docs on sysread and select, but I'm sure you've
done that already.
the perl select docs also suggest you use the O_NONBLOCK flag for the
case you're referring to as well.
Sorry, but that's all I can offer without doing any serious research.
- Mark
More information about the london.pm
mailing list