[Ovirt-devel] [PATCH server] Fix dbomatic qpid reconnect
Ian Main
imain at redhat.com
Tue Mar 3 22:49:28 UTC 2009
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
More information about the ovirt-devel
mailing list