[Ovirt-devel] [PATCH server] Fix taskomatic qpid reconnect

Ian Main imain at redhat.com
Tue Mar 3 23:00:50 UTC 2009


This patch uses the managed connection arrangement in the qpid library
which uses a separate thread to manage the qpid connection.  This is
the same as was done for dbomatic in the previous patch.

Signed-off-by: Ian Main <imain at redhat.com>
---
 src/task-omatic/taskomatic.rb |   58 +++++++++++++---------------------------
 1 files changed, 19 insertions(+), 39 deletions(-)

diff --git a/src/task-omatic/taskomatic.rb b/src/task-omatic/taskomatic.rb
index 8d35692..eb8e2ae 100755
--- a/src/task-omatic/taskomatic.rb
+++ b/src/task-omatic/taskomatic.rb
@@ -60,9 +60,6 @@ class TaskOmatic
     @sleeptime = 2
     @nth_host = 0
 
-    @session = Qpid::Qmf::Session.new()
-    @broker = nil
-
     do_daemon = true
 
     opts = OptionParser.new do |opts|
@@ -98,43 +95,31 @@ class TaskOmatic
       @logger = Logger.new(STDERR)
     end
 
+    ensure_credentials
 
-    # this has to be after daemonizing now because it could take a LONG time to
-    # actually connect if qpidd isn't running yet etc.
-    qpid_ensure_connected
-
-  end
-
-  def qpid_ensure_connected()
-
-    return if @broker and @broker.connected?
-
-    sleepy = 2
-
-    while true do
-      begin
-        server, port = get_srv('qpidd', 'tcp')
-        raise "Unable to determine qpid server from DNS SRV record" if not server
+    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
 
-        @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI')
+    @session = Qpid::Qmf::Session.new(:manage_connections => true)
+    @logger.info "Connecting to amqp://#{server}:#{port}"
+    @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI')
 
-        # Connection succeeded, go about our business.
-        @logger.info "Connected to amqp://#{server}:#{port}"
-        return
+  end
 
-      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')
+    get_credentials('libvirt')
 
-      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}"
+        get_credentials('libvirt')
       end
     end
   end
@@ -804,8 +789,6 @@ class TaskOmatic
         end
       end
 
-      qpid_ensure_connected
-
       tasks.each do |task|
 
         task.time_started = Time.now
@@ -867,9 +850,6 @@ class TaskOmatic
   end
 end
 
-get_credentials('libvirt')
-get_credentials('qpidd')
-
 taskomatic = TaskOmatic.new()
 taskomatic.mainloop()
 
-- 
1.6.0.6




More information about the ovirt-devel mailing list