This patch uses the managed connection arrangement in the qpid library which uses a separate thread to manage the qpid connection; a much better way to go. Signed-off-by: Ian Main <imain at redhat.com> --- src/db-omatic/db_omatic.rb | 55 ++++++++++++++----------------------------- 1 files changed, 18 insertions(+), 37 deletions(-) diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb index 6dc02fb..96202f4 100755 --- a/src/db-omatic/db_omatic.rb +++ b/src/db-omatic/db_omatic.rb @@ -40,7 +40,6 @@ class DbOmatic < Qpid::Qmf::Console @cached_objects = {} @heartbeats = {} @broker = nil - @session = Qpid::Qmf::Session.new(:console => self) do_daemon = true @@ -74,49 +73,33 @@ class DbOmatic < Qpid::Qmf::Console end @logger.info "dbomatic started." - get_credentials('qpidd') + ensure_credentials database_connect - qpid_ensure_connected - - end - - - # FIXME: This should move into a library but I think we'll need - # to make some sort of singleton class for these applications so we can - # share the logger and qpid variables etc. It's getting to show itself - # as a problem but I don't want to go crazy right now as we're supposed - # to be in freeze. :) - def qpid_ensure_connected() - - return if @broker and @broker.connected? - sleepy = 2 + server, port = nil + (1..4).each do + server, port = get_srv('qpidd', 'tcp') + break if server + @logger.error "Unable to determine qpid server from DNS SRV record" if not server + sleep(10) + end - while true do - begin - server, port = get_srv('qpidd', 'tcp') - raise "Unable to determine qpid server from DNS SRV record" if not server + raise "Unable to determine server and port from DNS SRV records" if not server - @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI') + @logger.info "Connecting to amqp://#{server}:#{port}" + @session = Qpid::Qmf::Session.new(:console => self, :manage_connections => true) + @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI') + end - # Connection succeeded, go about our business. - @logger.info "Connected to amqp://#{server}:#{port}" - return - rescue Exception => msg - @logger.error "Error connecting to qpidd: #{msg}" - @logger.error msg.backtrace - end - sleep(sleepy) - sleepy *= 2 - sleepy = 120 if sleepy > 120 + def ensure_credentials() + get_credentials('qpidd') - begin - # Could also be a credentials problem? Try to get them again.. + Thread.new do + while true do + sleep(3600) get_credentials('qpidd') - rescue Exception => msg - @logger.error "Error getting qpidd credentials: #{msg}" end end end @@ -370,8 +353,6 @@ class DbOmatic < Qpid::Qmf::Console while true sleep(5) - qpid_ensure_connected - synchronize do # Get seconds from the epoch t = Time.new.to_i -- 1.6.0.6
Jason Guiditta
2009-Mar-05 18:20 UTC
[Ovirt-devel] [PATCH server] Fix dbomatic qpid reconnect
ACK, dbomatic seems to still work fine after this patch. On Tue, Mar 3, 2009 at 5:49 PM, Ian Main <imain at redhat.com> wrote:> This patch uses the managed connection arrangement in the qpid library > which uses a separate thread to manage the qpid connection; a much > better way to go. > > Signed-off-by: Ian Main <imain at redhat.com> > --- > src/db-omatic/db_omatic.rb | 55 > ++++++++++++++----------------------------- > 1 files changed, 18 insertions(+), 37 deletions(-) > > diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb > index 6dc02fb..96202f4 100755 > --- a/src/db-omatic/db_omatic.rb > +++ b/src/db-omatic/db_omatic.rb > @@ -40,7 +40,6 @@ class DbOmatic < Qpid::Qmf::Console > @cached_objects = {} > @heartbeats = {} > @broker = nil > - @session = Qpid::Qmf::Session.new(:console => self) > > do_daemon = true > > @@ -74,49 +73,33 @@ class DbOmatic < Qpid::Qmf::Console > end > @logger.info "dbomatic started." > > - get_credentials('qpidd') > + ensure_credentials > > database_connect > - qpid_ensure_connected > - > - end > - > - > - # FIXME: This should move into a library but I think we'll need > - # to make some sort of singleton class for these applications so we > can > - # share the logger and qpid variables etc. It's getting to show > itself > - # as a problem but I don't want to go crazy right now as we're > supposed > - # to be in freeze. :) > - def qpid_ensure_connected() > - > - return if @broker and @broker.connected? > > - sleepy = 2 > + server, port = nil > + (1..4).each do > + server, port = get_srv('qpidd', 'tcp') > + break if server > + @logger.error "Unable to determine qpid server from DNS SRV > record" if not server > + sleep(10) > + end > > - while true do > - begin > - server, port = get_srv('qpidd', 'tcp') > - raise "Unable to determine qpid server from DNS SRV > record" if not server > + raise "Unable to determine server and port from DNS SRV records" > if not server > > - @broker = @session.add_broker("amqp://#{server}:#{port}", > :mechanism => 'GSSAPI') > + @logger.info "Connecting to amqp://#{server}:#{port}" > + @session = Qpid::Qmf::Session.new(:console => self, > :manage_connections => true) > + @broker = @session.add_broker("amqp://#{server}:#{port}", > :mechanism => 'GSSAPI') > + end > > - # Connection succeeded, go about our business. > - @logger.info "Connected to amqp://#{server}:#{port}" > - return > > - rescue Exception => msg > - @logger.error "Error connecting to qpidd: #{msg}" > - @logger.error msg.backtrace > - end > - sleep(sleepy) > - sleepy *= 2 > - sleepy = 120 if sleepy > 120 > + def ensure_credentials() > + get_credentials('qpidd') > > - begin > - # Could also be a credentials problem? Try to get them > again.. > + Thread.new do > + while true do > + sleep(3600) > get_credentials('qpidd') > - rescue Exception => msg > - @logger.error "Error getting qpidd credentials: #{msg}" > end > end > end > @@ -370,8 +353,6 @@ class DbOmatic < Qpid::Qmf::Console > while true > sleep(5) > > - qpid_ensure_connected > - > synchronize do > # Get seconds from the epoch > t = Time.new.to_i > -- > 1.6.0.6 > > _______________________________________________ > Ovirt-devel mailing list > Ovirt-devel at redhat.com > https://www.redhat.com/mailman/listinfo/ovirt-devel >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://listman.redhat.com/archives/ovirt-devel/attachments/20090305/403ea560/attachment.htm>