From e582da68f4c5edd3e4a3cdb62819c210c72dcfad Mon Sep 17 00:00:00 2001
From: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
Date: Wed, 18 Jun 2014 14:18:48 +0200
Subject: [PATCH] Ensures listener queues exist in fake driver

The fanout queues of the fake driver are created at the first executor
poll, but if we use eventlet executor and the fake driver, when the sender
delivers a fanout message before the first poll, the message goes to the
topic queue instead of the server fanout queue.

The changes fixes that by ensuring the all queues exists when the
listener is created.

Closes bug #1331453

Change-Id: I92e7c01dd87d634b741bbcaea92f48730fdd555e
---
 oslo/messaging/_drivers/impl_fake.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/oslo/messaging/_drivers/impl_fake.py b/oslo/messaging/_drivers/impl_fake.py
index ca6eba927..9fc676259 100644
--- a/oslo/messaging/_drivers/impl_fake.py
+++ b/oslo/messaging/_drivers/impl_fake.py
@@ -45,6 +45,12 @@ class FakeListener(base.Listener):
         self._exchange_manager = exchange_manager
         self._targets = targets
 
+        # NOTE(sileht): Ensure that all needed queues exists even the listener
+        # have not been polled yet
+        for target in self._targets:
+            exchange = self._exchange_manager.get_exchange(target.exchange)
+            exchange.ensure_queue(target)
+
     def poll(self, timeout=None):
         if timeout is not None:
             deadline = time.time() + timeout
@@ -77,6 +83,13 @@ class FakeExchange(object):
         self._topic_queues = {}
         self._server_queues = {}
 
+    def ensure_queue(self, target):
+        with self._queues_lock:
+            if target.server:
+                self._get_server_queue(target.topic, target.server)
+            else:
+                self._get_topic_queue(target.topic)
+
     def _get_topic_queue(self, topic):
         return self._topic_queues.setdefault(topic, [])