[chef] Re: Concurrency node creation issue


Chronological Thread 
  • From: Joshua Timberman < >
  • To:
  • Subject: [chef] Re: Concurrency node creation issue
  • Date: Tue, 6 Sep 2011 21:23:57 -0600

Hello,

As Andrew points out, this is a race condition.

What we typically do is the specificity route, where a single system who is 
to be master is assigned such as a role. For example the "database master" 
for an application will have a role ... "appname_database_master." Any other 
nodes that are slaves would have "appname_database_slave." Our "database" 
cookbook and its companion "application" follow this pattern and behave 
accordingly.

However I'd love to see a solution that utilizes Noah or Zookeeper to solve 
the problem more dynamically.

On Sep 4, 2011, at 3:57 PM, Daniel Cukier wrote:

> Hi,
> 
> I have in my infrastructure a topology where there's one master node and
> many slave nodes.
> What I want to do is to automatically detect if a node is a master or a
> slave. The rule is:
> 1) If there is no master node yet, the next node will be the master
> 2) If there is a master, the next node will be slave and its master will be
> the already existing master.
> 
> The problem occurs when I have an empty infrastructure (zero nodes) and I
> try to create the first 2 nodes simultaneously.
> When both nodes get provisioned, both check that there is no master and both
> are set to be master, which is a wrong configuration.
> This is a very common synchronization problem, but I don't know how to deal
> with it in the Chef environment.
> 
> Here's the recipe to configure a node:
> 
> @@master = node
> 
> search(:node, 'role:myrole') do |n|
>  if n['myrole']['container_type'] == "master"
>    @@master = n
>    if n.name != node.name
>      node.set['myrole']['container_type'] = "slave"
>    end
>  end
> end
> 
> if @@master == node
>  node.set['myrole']['container_type'] = "master"
> end
> 
> template "#{node['myrole']['install_dir']}/#{ZIP_FILE.gsub('.zip',
> '')}/conf/topology.xml" do
>  source "topology.xml.erb"
>  owner "root"
>  group "root"
>  mode "0644"
>  variables({:master => @@master})
> end
> 
> How can I avoid this problem?
> 
> Thanks a lot
> 
> Daniel Cukier

-- 
Opscode, Inc
Joshua Timberman, Director of Training and Services
IRC, Skype, Twitter, Github: jtimberman




Archive powered by MHonArc 2.6.16.

§