diff --git a/crowbar_framework/app/models/service_object.rb b/crowbar_framework/app/models/service_object.rb index ae1dcdca05..016c1b3257 100644 --- a/crowbar_framework/app/models/service_object.rb +++ b/crowbar_framework/app/models/service_object.rb @@ -919,6 +919,35 @@ def self.proposal_to_role(proposal, bc_name) RoleObject.new role end + # we can speed-up the application of (n+1)th role if both(n,n+1) + # roles are being applied on the same node. + # + # eg. In our 2node deployment ceilometer{server,central} are always + # applied on the same node, given that they have different priorities, + # they are to be applied, one after the other. + # + # In other words: it's actually reducing the number of times chef-client + # is run rather than speeding up execution of any single run, by + # merging batches together + # + # a batch is [roles, nodes] + def mergebatches(batches) + merged_batches = [] + unless bathces.empty? + current_batch = batches[0] + batches[1..-1].each do |next_batch| + if next_batch[1] == current_batch[1] && !current_batch[0].nil? + current_batch[0] << next_batch[0] + next + end + merged_batches << current_batch + current_batch = next_batch + end + merged_batches << current_batch + end + return merged_batches + end + # # After validation, this is where the role is applied to the system The old # instance (if one exists) is compared with the new instance. roles are @@ -1171,6 +1200,8 @@ def apply_role(role, inst, in_queue, bootstrap = false) batches << [roles, nodes_in_batch] unless nodes_in_batch.empty? end + + batches = mergebatches(batches) Rails.logger.debug "batches: #{batches.inspect}" # Cache attributes that are useful later on