<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jun 6, 2013 at 3:22 PM, Chris Behrens <span dir="ltr"><<a href="mailto:cbehrens@codestud.com" target="_blank">cbehrens@codestud.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><br><div><div><div class="h5"><div></div></div></div><div>?  There's a try/except in reconnect() in impl_kombu around the piece that can raise… unless we want to think something like LOG.* calls could fail.</div>
</div></div></blockquote><div> <br></div>Sure there is a try/except in reconnect(), but the catch all re-raises the exception unless it is a timeout.  Here is the code:<br><br>            except Exception as e:<br>                # NOTE(comstud): Unfortunately it's possible for amqplib<br>
                # to return an error not covered by its transport<br>                # connection_errors in the case of a timeout waiting for<br>                # a protocol response.  (See paste link in LP888621)<br>                # So, we check all exceptions for 'timeout' in them<br>
                # and try to reconnect in this case.<br>                if 'timeout' not in str(e):<br>                    raise<br><br></div><div class="gmail_quote">Preceding the above is a catch for a few other exception types:<br>
<br>            except (IOError, self.connection_errors) as e:<br>                pass<br><br></div><div class="gmail_quote"><div>but anything else will simply raise an exception in an unprotected piece of code, since ensure() doesn't include the reconnect itself in a try block:<br>
<br>    def ensure(self, error_callback, method, *args, **kwargs):<br>        while True:<br>            try:<br>                return method(*args, **kwargs)<br>            except (self.connection_errors, socket.timeout, IOError) as e:<br>
                if error_callback:<br>                    error_callback(e)<br>            except Exception as e:<br>                # NOTE(comstud): Unfortunately it's possible for amqplib<br>                # to return an error not covered by its transport<br>
                # connection_errors in the case of a timeout waiting for<br>                # a protocol response.  (See paste link in LP888621)<br>                # So, we check all exceptions for 'timeout' in them<br>
                # and try to reconnect in this case.<br>                if 'timeout' not in str(e):<br>                    raise<br>                if error_callback:<br>                    error_callback(e)<br>            self.reconnect()<br>
<br></div><div>See the last line above.<br><br></div><div>One unknown is whether there are any other exceptions coming from the reconnect() code other than IOError, self.connection_errors and timeout.  Maybe, maybe not.  That's why I do give some credit to this code, but it wouldn't hurt to plug this hole in a way that would prevent future bugs.  In other words, as close to the base of the thread as possible.<br>
</div><div><br></div><div>Ray<br></div></div></div></div>