On 02/11/2012 18:36, Staffan Larsen wrote:
This is a preliminary review request for adding an API for tracing I/O calls.
For now, this is an empty infrastructure intended to enable diagnosing/tracing
of i/o calls. A user of the API can register a listener and get callbacks for
read and write operations on sockets and files. It does not (yet) cover
asynchronous i/o calls. When not used, the implementation should add a minimum
of overhead. To provide useful information to the user, FileInputStream,
FileOutputStream and RandomAccessFile have been modified to keep track of the
path they operate on (when available).
Webrev: http://cr.openjdk.java.net/~sla/iotrace/webrev.00/
Feedback is most welcome,
/Staffan
Part of me is a somewhat disappointed to see hooks going into the I/O
paths, but I understand why it needs to be done. I see the mails that
getting some performance figures on the overhead and that would be good
to have.
I think IoTrace/IoTraceListener needs to have some javadoc. I suggest
this because it's impossible to implement IoTraceListener (even in the
JDK) without some documentation as to how it is used. I see there is a
block comment in IoTraceListener but there are other things that an
implementer needs to know, particularly as to possible behavior when
there is an I/O error. Looking at the usages then it looks like in *End
might not be called, in other cases it can be called with 0 when there
is an error.
I also see mails about IoTrace.listener needing to be volatile, that
would be good to do.
I also think it would be useful to have a basic sanity test of the
hooks. I realize there will be product usage elsewhere but we should
have something simple in the jdk repository too.
In FileInputStream, FileOutputStream and FileChannelImpl then the
comment on path is that it is null "if there is no file" but I think
this should say that the stream (or parent stream in the case of a file
channel) is created with a file descriptor.
In SocketChannelImpl then if the channel is configured non-blocking
socketReadEnd will be called without a socketReadBegin. If this is
intended then it will be something for the IoTrace/IoTraceListener javadoc.
I realize the focus is blocking I/O for now but one thing to know is
that timed read operations on socket adapters (the socket obtained by
calling SocketChannel's socket method) configures the socket channel to
be non-blocking so this means that this I/O will not be observed by the
IoTraceListener.
In both FileChannelImpl and SocketChannelImpl then normalize will now be
called twice on each return status, I don't expect this will be
observable from a performance perspective.
SolarisUserDefinedFileAttributeView - this is I/O on a file's extended
attributes rather than its contents, it might not interesting to the
IoTraceListener.
UnixChannelFactory L137, this line is getting long, might be better to
go into a second line.
WindowsChannelFactory - one thing to be aware of is newFileChannel will
also be called when open named streams so pathForWindows won't be the
name of a file that you see on the file system. I don't know if this is
interesting here or not, it should be rare.
That's all I have.
-Alan.