Note: this change was eventually reverted in 2.0.10/2.1.6. Based on practical experience, marking the host down on read timeouts turned out to be too aggressive.
We've added a driver per-host read timeout (SocketOptions.setReadTimeout) to make sure that even if a C* node is misbehaving by accepting request but never sending any request (as in, not even a C* write/read timeout), we don't block the request forever driver side. We don't defunct the connection however on such timeout (so we don't presume the node dead) but we probably should. If the node is misbehaving for one query, it's probably safer to assume that something is wrong with the node. If the misbehaving was ponctual, we'll reconnect right away to the node with little harm done. But if the misbehaving is not ponctual (the server don't drop the connection but something is really wrong with it), then not marking the node dead means we'll continue using the node for querying, timeouting every time.