class RabbitMQ::Cluster::Etcd

Attributes

client[RW]

Public Class Methods

build() click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 8
def self.build
  puts "etcd address: #{ENV['ETCD_HOST']}"
  new(
    ::Etcd::Client.new(host: ENV['ETCD_HOST'])
  )
end
new(client) click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 15
def initialize(client)
  self.client = client
end

Public Instance Methods

acquire_lock() { || ... } click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 19
def acquire_lock
  client.compare_and_swap('/rabbitmq/lock', value: true, prevValue: false)
  yield
rescue ::Etcd::TestFailed
  client.watch('/rabbitmq/lock')
  retry
ensure
  client.set('/rabbitmq/lock', value: false)
end
nodes() click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 29
def nodes
  with_retry do
    begin
      client.get('/rabbitmq/nodes').children.map(&:value).sort
    rescue ::Etcd::KeyNotFound
      []
    end
  end
end
register(node_name, wait=nil) click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 39
def register(node_name, wait=nil)
  with_retry(wait) do
    client.set(key_for(node_name), value: node_name, ttl: 10)
  end
end

Private Instance Methods

key_for(node_name) click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 75
def key_for(node_name)
  "/rabbitmq/nodes/#{node_name}"
end
with_retry(wait = nil) { || ... } click to toggle source
# File lib/rabbitmq/cluster/etcd.rb, line 62
def with_retry(wait = nil)
  wait ||= 1
  try = 0
  begin
    yield
  rescue
    sleep wait
    try += 1
    retry if try < 10
    raise
  end
end