The first tail implementation used buffered readers and file readers. This caused problems because the read call was blocking and couldn't shutdown properly.
The second tail implementation was mroe closely based on gnu tail's C implementation but relies on RandomAccessFile. This version had problems with races (restarting from beginning
FLUME-218) and truncation (new test in FLUME-218 patch by Eric Sammer).
The new approach will likely use NIO and nonblocking IO to act cleanly, or possibly use a JNI based approach to get to unix system calls to get and follow file descriptors or inode numbers.