[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