## 0.9.0 * Re-architect to use io_uring There are no changes to the semantics, and the latency and throughput are roughly the same as they were in 0.8.0. However, this release changes the way tailsrv uses system resources: * It spawns fewer threads. In 0.8.0 there was one thread per client. In 0.9.0 there is a small fixed number of threads. This means that, when there are many (hundreds/thousands) of clients, tailsrv 0.9 is far more friendly to your system than tailsrv 0.8 was. * It uses more file descriptors. In 0.8.0 we used one fd per client (the socket). In 0.9.0 we use 3 fds per client (the socket and a pipe). If you expect a large number of clients, please set `ulimit -n` accordingly. ## 0.8.0 * There's a new "tsmirror" example program * tscat (and tsmirror) now use TCP_KEEPALIVE to detect a dead connection * Tailsrv no longer reads data sent to it by clients The point of this feature was to allow client to detect a dead connection by periodically sending dummy data to the server. However, it turns out that's exactly what TCP_KEEPALIVE is for! Removing the reading functionality is a simplification (as evidenced by the bugfix in 0.7.1). ## v0.7.2 No user-visible changes. ## v0.7.1 * Client connections will be closed upon encountering an I/O error. tailsrv works by `sendfile()`-ing the watched file to the clients. It's possible for this function to return an error (eg. if the watched file is on a dying hard disk). In this case, we don't know what data was actually sent to the client, and can't reasonably continue. The unknown-state client is therefore terminated. In v0.7.0, however, the connection would remain alive - the client would simply not receive any new data after the error occurred. In v0.7.1, the connection will be closed promptly, so that the client can establish a new connection (and thereby let tailsrv know its current offset). ## v0.7.0 * Tailsrv now reads (and discards) any data send to it by clients. This allows clients to their TCP connections by attempting to send some dummy data to tailsrv. If the connection is silently dead, the write will fail. * Logs are printed to stderr instead of stdout. * The repo now includes an example client program called "tscat".