[Ovirt-devel] ovirt-server patch for vm failover and actual data set to db

Ian Main imain at redhat.com
Tue Jan 27 18:18:17 UTC 2009


Sorry I took so long to get back to you on this one.  There are some
issues with formatting in this patch etc. but mostly I've been thinking
that we need to have this configurable in the WUI.

I'm curious what other people think about rebooting crashed hosts?  Is
this a desired feature?

	Ian

On Wed, 21 Jan 2009 18:51:44 +0300
Василец Дмитрий <pronix.service at gmail.com> wrote:

> this patch restart vm from crashed host and set to db current data about vm.
> please test or criticize it.
>  fencing is ipmi , when domain['state'] set 'crashed' i will reboot host
> 
> 
> diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb
> index 4afffb1..bdab392 100755
> --- a/src/db-omatic/db_omatic.rb
> +++ b/src/db-omatic/db_omatic.rb
> @@ -74,6 +76,65 @@ class DbOmatic < Qpid::Qmf::Console
>          domain[:synced] = true
>      end
> 
> +    #find hostname from values['node'] where values['class_type'] == 'domain'
> +    def get_host_id(abank,bbank) #возвращает значение не то что надо
> - числовой идентификатор ноды возвращает
> +     begin
> +	@cached_objects.keys.each do |objkey|
> +  	  if @cached_objects[objkey][:agent_bank].to_s == abank and
> @cached_objects[objkey][:broker_bank].to_s == bbank and
> @cached_objects[objkey][:class_type].to_s == 'node'
> +		return Host.find(:first, :conditions => ['hostname =
> ?', at cached_objects[objkey]["hostname"].to_s]).id
> +		    break
> +	  end
> +	end
> +      rescue => ex
> +	log("error in get_host_id")
> +	log(ex)
> +     end
> +    end
> +
> +    def set_host(values,digit)
> +      begin
> +	vm = Vm.find(:first, :conditions => ['description = ?',values["name"].to_s])
> +	if vm and digit
> +	vm.host_id = digit
> +	vm.save!
> +	else
> +		log("this vm not exist #{values["name"]}")
> +	end
> +      rescue => ex
> +	puts "error when set_host for #{values["name"]}"
> +	puts ex
> +      end
> +    end
> +
> +    def start_crashed_vm(vm)
> +	task = VmTask.new( :user => 'db-omatic', :task_target => vm, :action
> => 'start_vm', :state => 'queued')
> +	task.save!
> +	log("set task for start crashed vm #{vm.id}")
> +    end
> +
> +    def set_domain_stopped(domain)
> +      begin
> +        vm = Vm.find(:first, :conditions => ['uuid = ?', domain['uuid']])
> +        if vm != nil
> +	  curstate = vm.state
> +          vm.state = Vm::STATE_STOPPED
> +          vm.host_id = nil
> +          vm.save
> +	  domain['state'] = 'crashed'  # and now i will use ipmi for reboot
> anavailable host - simple fencing
> +	  if curstate == Vm::STATE_RUNNING
> +            start_crashed_vm(vm)
> +	  end
> +        else
> +          log('vm == nil ')
> +        end
> +        log("domain  #{domain['id']} already stopped")
> +      rescue => ex
> +        log("can\'t set domain #{domain['id']} stopped")
> +	log(ex)
> +      end
> +    end
> +
> +
>      def update_host_state(host_info, state)
>          db_host = Host.find(:first, :conditions => [ "hostname = ?",
> host_info['hostname'] ])
>          if db_host
> 
> @@ -130,20 +190,36 @@ class DbOmatic < Qpid::Qmf::Console
>              end
> 
>              domain_state_change = false
> -
> +	    change_node = false
>              obj.properties.each do |key, newval|
>                  if values[key.to_s] != newval
>                      values[key.to_s] = newval
>                      #log "new value for property #{key} : #{newval}"
>                      if type == "domain" and key.to_s == "state"
> -                        domain_state_change = true
> +			domain_state_change = true
>                      end
> +		    if type == "domain" and key.to_s == "node"
> +			change_node = true
> +		    end
> +
>                  end
>              end
> 
>              if domain_state_change
>                  update_domain_state(values)
>              end
> +	if change_node		
> +	values.each do |key,val|
> +	  if key == 'state' and val == 'running'
> +		abank = values['node'].to_s.split('-')[3]
> +		bbank = values['node'].to_s.split('-')[4]
> +		@@host_id = get_host_id(abank,bbank)
> +		set_host(values,@@host_id)
> +		log("update node data for #{values['name']}")
> +		break
> +	  end
> +	end
> +	end
> 
>              if new_object
>                  if type == "node"
> @@ -187,11 +263,6 @@ class DbOmatic < Qpid::Qmf::Console
>          end
>      end
> 
> -
> -    def del_agent(agent)
> -        agent_disconnected(agent)
> -    end
> -
>      # This method marks objects associated with the given agent as
> timed out/invalid.  Called either
>      # when the agent heartbeats out, or we get a del_agent callback.
>      def agent_disconnected(agent)
> @@ -204,11 +275,13 @@ class DbOmatic < Qpid::Qmf::Console
>                  if values[:timed_out] == false
>                      if values[:class_type] == 'node'
>                          update_host_state(values, Host::STATE_UNAVAILABLE)
> +			values[:timed_out] = true
>                      elsif values[:class_type] == 'domain'
> -                        update_domain_state(values, Vm::STATE_UNREACHABLE)
> -                    end
> +			set_domain_stopped(values)
> +			values[:timed_out] = true
> +		@cached_objects.delete(objkey)
> +		    end
>                  end
> -            values[:timed_out] = true
>              end
>          end
>      end
> @@ -248,6 +320,7 @@ class DbOmatic < Qpid::Qmf::Console
>          db_vm = Vm.find(:all)
>          db_vm.each do |vm|
>              log "Marking vm #{vm.description} as stopped."
> +	    vm.host_id = nil
>              vm.state = Vm::STATE_STOPPED
>              vm.save
>          end
> 
> 
> 
> 
> -- 
> С уважением, Дмитрий.
> 
> _______________________________________________
> Ovirt-devel mailing list
> Ovirt-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/ovirt-devel




More information about the ovirt-devel mailing list