When SASL authentication is requested of a MemcachedClient it should always ensure that auth takes place before anything else on the queue is processed. After some experimentation, it seems The best way to handle this is to extend the MemcachedNode interface to add some methods. This in turn allows for the changes to be implemented in the TCPMemcachedNodeImpl class. There is special handling with the inputQueue and addOperation if a reconnect occurs during authentication. It's a bit harder at the BinaryMemcachedNodeImpl, though arguably makes more sense there. Since these are all pretty well hidden as an implementation detail, it's okay for it to be here. Who knows, maybe someday ascii will have SASL. Probably not though.
The contribution by Blair Zajac inverts the ConnectionFactoryBuilder defaults to match that of the DefaultConnectionFactory. This updates the tests to check for the new default, and test the new change.
With this change, the MemcachedClient has a method of using the connection observer to determine a connected server is consistently timing out, indicating it has hard-failed. This will destroy that connection so things may rehash or reconnect, depending on the hash behavior.
This is just the default stringification, clients can use whatever they want, but by default, this seems to provide consistent results with libketama.
DefaultConnectionFactory#isDaemon() is false while ConnectionFactoryBuilder builds a ConectionFactory that by default returns true for #isDaemon(), so to make them consistent, modify ConnectionFactoryBuilder to have #isDaemon() be false.
This means that instead of raising a queue overflow exception on insert, the client can optionally block waiting for space to become available instead (with a timeout that will result in the same exception).
This broke on operating systems where the IPv6 localhost is not listed in /etc/hosts as "localhost" but as "ip6-localhost" for Ubuntu or "localhost6.localdomain6" for Centos 5 and Foresight Linux.
The code will now allow multiple whitespace and commas to separate "host:port" tokens.