epoll(7) has a section under A9 on whether it is okay to stop reading early without having seen EAGAIN when using edge triggered epoll: "For example, if you call read(2) by asking to read a certain amount of data and read(2) returns a lower number of bytes, you can be sure of having exhausted the read I/O space for the file descriptor." This is incorrect. Notably, if you receive a signal in the middle of such a read it will return early with a partial read. This can happen even in the case of non-blocking reads.
David, Can you provide further information on how you verified this behavior? Thanks, Michael