def with_socket_management(server, &block)
check_multithread_status!
@mutex.lock if @multithread
retried = false
begin
socket = server.socket
raise IndexError, "No connection to server (#{server.status})" if socket.nil?
block.call(socket)
rescue SocketError, Errno::EAGAIN, Timeout::Error => err
logger.warn { "Socket failure: #{err.message}" } if logger
server.mark_dead(err)
handle_error(server, err)
rescue MemCacheError, SystemCallError, IOError => err
logger.warn { "Generic failure: #{err.class.name}: #{err.message}" } if logger
handle_error(server, err) if retried || socket.nil?
retried = true
retry
end
ensure
@mutex.unlock if @multithread
end