]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-cookbooks.git/commitdiff
Add current node to mon_hosts, if it has role ceph-mon.
authorTommi Virtanen <tv@inktank.com>
Fri, 20 Jul 2012 21:32:18 +0000 (14:32 -0700)
committerTommi Virtanen <tv@inktank.com>
Fri, 20 Jul 2012 21:32:18 +0000 (14:32 -0700)
This shortcircuits the search logic, so ceph-mon --mkfs will always
see itself in ceph-mon, and thus won't end up with an empty monmap.
Empty monmap would prevent it from initializing properly, and the
peer hints aren't enough to help.

Search is not reliable for this, as the search index updates lazily,
and e.g. the "roles:" field, holding the expanded run_list, is only
set at the end of a successful chef-client run.

Crowbar creates a special-purpose role, one per node, and assigns the
actual roles to that role. We work around this by doing the search in
two phases, when running under Crowbar.

Thanks to Tyler Brekke.

libraries/default.rb

index 34cc1b08dd5b71ea0ba2dc1cee5484afcb7ec733..e640fff0462dcb15d714b128ab9c5e76261278ab 100644 (file)
@@ -3,12 +3,33 @@ def is_crowbar?()
 end
 
 def get_mon_addresses()
+  mons = []
+
+  # make sure if this node runs ceph-mon, it's always included even if
+  # search is laggy; put it first in the hopes that clients will talk
+  # primarily to local node
+  if node['roles'].include? 'ceph-mon'
+    mons << node
+  end
+
+  if is_crowbar?
+    mon_roles = search(:role, 'name:crowbar-* AND run_list:role\[ceph-mon\]')
+    if not mon_roles.empty?
+      search_string = mon_roles.map { |role_object| "role:"+role_object.name }.join(' OR ')
+      mons += search(:node, "(#{search_string}) AND ceph_config_environment:#{node['ceph']['config']['environment']}")
+    end
+  else
+    mons += search(:node, "role:ceph-mon AND chef_environment:#{node.chef_environment}")
+  end
+
   if is_crowbar?
-    mon_addresses = search(:node, "role:ceph-mon AND ceph_config_environment:#{node['ceph']['config']['environment']}").map { |node| Chef::Recipe::Barclamp::Inventory.get_network_by_type(node, "admin").address + ":6789" }
+    mon_addresses = mons.map { |node| Chef::Recipe::Barclamp::Inventory.get_network_by_type(node, "admin").address }
   else
-    mon_addresses = search(:node, "role:ceph-mon AND chef_environment:#{node.chef_environment}").map { |node| node["ipaddress"] + ":6789" }
+    mon_addresses = mons.map { |node| node["ipaddress"] }
   end
-  return mon_addresses
+
+  mon_addresses = mon_addresses.map { |ip| ip + ":6789" }
+  return mon_addresses.uniq
 end
 
 QUORUM_STATES = ['leader', 'peon']