Ian Main
2008-Dec-05 20:52 UTC
[Ovirt-devel] [PATCH server] Fix race condition with ovirt-identify-node.
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
Perry Myers
2008-Dec-05 23:16 UTC
[Ovirt-devel] [PATCH server] Fix race condition with ovirt-identify-node.
Ian Main wrote:> 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.Ack. Seems to work for me, I went ahead and pushed this. Perry> 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)-- |=- Red Hat, Engineering, Emerging Technologies, Boston -=| |=- Email: pmyers at redhat.com -=| |=- Office: +1 412 474 3552 Mobile: +1 703 362 9622 -=| |=- GnuPG: E65E4F3D 88F9 F1C9 C2F3 1303 01FE 817C C5D2 8B91 E65E 4F3D -=|