[Ovirt-devel] [PATCH server] Fix race condition with ovirt-identify-node.
Ian Main
imain at redhat.com
Fri Dec 5 20:52:25 UTC 2008
This patch teaches dbomatic how to keep track of whether or not
it has actually synced an object with the database. There were
problems with db-omatic getting information before the database
entries were created by ovirt-identify-node and co. Now dbomatic
will keep trying until synced with the database.
Signed-off-by: Ian Main <imain at redhat.com>
---
src/db-omatic/db_omatic.rb | 21 ++++++++++++++++++---
1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb
index ba245e6..fe2d47c 100755
--- a/src/db-omatic/db_omatic.rb
+++ b/src/db-omatic/db_omatic.rb
@@ -29,8 +29,13 @@ class DbOmatic < Qpid::Qmf::Console
def update_domain_state(domain, state_override = nil)
vm = Vm.find(:first, :conditions => [ "uuid = ?", domain['uuid'] ])
if vm == nil
- puts "VM Not found in database, must be created by user; ignoring."
- return
+ puts "VM Not found in database, must be created by user; ignoring."
+
+ #XXX: I mark this one as 'synced' here even though we couldn't sync
+ #it because there really should be a db entry for every vm unless it
+ #was created outside of ovirt.
+ domain[:synced] = true
+ return
end
if state_override != nil
@@ -61,6 +66,8 @@ class DbOmatic < Qpid::Qmf::Console
puts "Updating VM #{domain['name']} to state #{state}"
vm.state = state
vm.save
+
+ domain[:synced] = true
end
def update_host_state(host_info, state)
@@ -78,9 +85,15 @@ class DbOmatic < Qpid::Qmf::Console
# XXX: This would just be for init..
#db_host.is_disabled = 0
db_host.save
+ host_info[:synced] = true
else
# FIXME: This would be a newly registered host. We could put it in the database.
puts "Unknown host, probably not registered yet??"
+ # XXX: So it turns out this can happen as there is a race condition on bootup
+ # where the registration takes longer than libvirt-qpid does to relay information.
+ # So in this case, we mark this object as not synced so it will get resynced
+ # again in the heartbeat.
+ host_info[:synced] = false
end
end
@@ -106,6 +119,7 @@ class DbOmatic < Qpid::Qmf::Console
values[:agent_bank] = obj.object_id.agent_bank
values[:class_type] = obj.klass_key[1]
values[:timed_out] = false
+ values[:synced] = false
puts "New object type #{type}"
new_object = true
@@ -150,6 +164,7 @@ class DbOmatic < Qpid::Qmf::Console
values[:agent_bank] = obj.object_id.agent_bank
values[:class_type] = obj.klass_key[1]
values[:timed_out] = false
+ values[:synced] = false
end
obj.statistics.each do |key, newval|
if values[key.to_s] != newval
@@ -203,7 +218,7 @@ class DbOmatic < Qpid::Qmf::Console
@cached_objects[objkey][:agent_bank] == agent.agent_bank
values = @cached_objects[objkey]
- if values[:timed_out] == true
+ if values[:timed_out] == true or values[:synced] == false
puts "Marking object of type #{values[:class_type]} as in service."
if values[:class_type] == 'node'
update_host_state(values, Host::STATE_AVAILABLE)
--
1.6.0.4
More information about the ovirt-devel
mailing list