[OpenAFS-devel] dumpstuff.c buffering: 2 questions
Jeffrey Hutzelman
jhutz@cmu.edu
Thu, 01 Dec 2005 17:53:01 -0500
On Tuesday, November 15, 2005 03:49:46 PM +0100 Peter Somogyi
<psomogyi@gamax.hu> wrote:
> I've examined FDH_READ implementation, it's a standard read.
> I've read its manual (man 2 read), and it tells "[...]it is not an error
> if this number is smaller than the number of bytes requested; this may
> happen for example because fewer bytes are actually available
> right now (maybe because we were close to end-of-file, or because
> we are reading from a pipe, or from a terminal)[...]". So I think
> instead of null padding it should continue reading (if n>0, of course) -
> at least on Linux platform. Am I right?
The documentation of read(2) tends to be a little bit abstract. Access to
plain files is "fast"; there is no possibility of blocking or getting a
short read because there is more data coming that hasn't arrived yet. You
can get a short read if you hit EOF, but the files that DumpFile() are
reading are of known size, so a short read means there was a real error,
either during the read or (more likely) because the contents of the disk
aren't what they're supposed to be. There's never going to be more data.
It becomes necessary to pad the output buffer because the dump tag which
indicates how many bytes are coming has already been sent, and so we have
to fulfill that requirement or they won't be able to process the rest of
the dump.
> Another question is about rx_Write(call, buf, nbytes): is it true that
> writting less (but >0) than nbytes means an error? (in case of file
> write: it's also not an error)
write(2) is very similar to read(2) in this respect. A short write on a
plain file always indicates a problem; you really only need to be able to
deal with short writes on "slow" file descriptiors like devices, pipes, or
sockets.
In any case, rx_Write is not write(2). It's a little hard to tell without
carefully analyzing the code, but rx_Write will never return a short write;
it will always return either the full number of bytes written or zero, with
the latter indicating an error.
-- Jeff