Membership change detection

Cluster object allows registering state listeners. It then guarantees that they will be notified on cluster membership changes.

Background

Given
a running cassandra cluster
And
a file named “printing_listener.rb” with:
class PrintingListener
  def initialize(io)
    @out = io
  end

  def host_found(host)
    @out.puts("Host #{host.ip} is found")
  end

  def host_lost(host)
    @out.puts("Host #{host.ip} is lost")
  end

  def host_up(host)
    @out.puts("Host #{host.ip} is up")
  end

  def host_down(host)
    @out.puts("Host #{host.ip} is down")
  end
end
And
the following example:
require 'printing_listener'
require 'cassandra'

listener = PrintingListener.new($stderr)
cluster  = Cassandra.cluster

cluster.register(listener)

session = cluster.connect

$stdout.puts("=== START ===")
$stdout.flush
$stdin.gets
$stdout.puts("=== STOP ===")
$stdout.flush
And
it is running interactively
And
I wait for its output to contain “START”

some existing hosts are terminated

When
node 3 stops
And
node 2 stops
And
I close the stdin stream
Then
its output should contain:
Host 127.0.0.3 is down
And
its output should contain:
Host 127.0.0.2 is down

a new host joins and then leaves the cluster

When
node 4 joins
And
node 4 leaves
And
I close the stdin stream
Then
its output should contain:
Host 127.0.0.4 is found
Host 127.0.0.4 is up
And
its output should contain:
Host 127.0.0.4 is down
Host 127.0.0.4 is lost