summaryrefslogtreecommitdiffstats
path: root/nova/rpc.py
diff options
context:
space:
mode:
authorJosh Kearney <josh.kearney@rackspace.com>2010-11-19 15:47:24 -0600
committerJosh Kearney <josh.kearney@rackspace.com>2010-11-19 15:47:24 -0600
commit300e6e3517d0e50c7fd6775eff10f1b0d677f25a (patch)
tree861287f82feb79ac56ef306e5fe67fbb5c747a6b /nova/rpc.py
parent5b0a1704e1daf4d929b43792bc7415f5263d7e8c (diff)
downloadnova-300e6e3517d0e50c7fd6775eff10f1b0d677f25a.tar.gz
nova-300e6e3517d0e50c7fd6775eff10f1b0d677f25a.tar.xz
nova-300e6e3517d0e50c7fd6775eff10f1b0d677f25a.zip
Check for running AMQP instances
Diffstat (limited to 'nova/rpc.py')
-rw-r--r--nova/rpc.py45
1 files changed, 25 insertions, 20 deletions
diff --git a/nova/rpc.py b/nova/rpc.py
index ea36d69f4..0c79c7f76 100644
--- a/nova/rpc.py
+++ b/nova/rpc.py
@@ -24,6 +24,7 @@ No fan-out support yet.
import json
import logging
import sys
+import time
import uuid
from carrot import connection as carrot_connection
@@ -82,31 +83,35 @@ class Consumer(messaging.Consumer):
Contains methods for connecting the fetch method to async loops
"""
def __init__(self, *args, **kwargs):
- self.failed_connection = False
- super(Consumer, self).__init__(*args, **kwargs)
+ while True:
+ try:
+ super(Consumer, self).__init__(*args, **kwargs)
+ break
+ except:
+ logging.warning("AMQP server on %s:%d is unreachable. " \
+ "Trying again in 30 seconds." % (
+ FLAGS.rabbit_host,
+ FLAGS.rabbit_port
+ ))
+ time.sleep(30)
+ continue
def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False):
"""Wraps the parent fetch with some logic for failed connections"""
- # TODO(vish): the logic for failed connections and logging should be
- # refactored into some sort of connection manager object
try:
- if self.failed_connection:
- # NOTE(vish): conn is defined in the parent class, we can
- # recreate it as long as we create the backend too
- # pylint: disable-msg=W0201
- self.conn = Connection.recreate()
- self.backend = self.conn.create_backend()
super(Consumer, self).fetch(no_ack, auto_ack, enable_callbacks)
- if self.failed_connection:
- logging.error("Reconnected to queue")
- self.failed_connection = False
- # NOTE(vish): This is catching all errors because we really don't
- # exceptions to be logged 10 times a second if some
- # persistent failure occurs.
- except Exception: # pylint: disable-msg=W0703
- if not self.failed_connection:
- logging.exception("Failed to fetch message from queue")
- self.failed_connection = True
+ except:
+ try:
+ self.connection = Connection.recreate()
+ self.backend = self.connection.create_backend()
+ self.declare()
+ except:
+ logging.warning("AMQP server on %s:%d is unreachable. " \
+ "Trying again in 30 seconds." % (
+ FLAGS.rabbit_host,
+ FLAGS.rabbit_port
+ ))
+ time.sleep(30)
def attach_to_eventlet(self):
"""Only needed for unit tests!"""