)]}'
{"oslo/messaging/_drivers/amqpdriver.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                else:"},{"line_number":310,"context_line":"                    return final_reply"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def do_connection_maintenance(self, maintenance_action):"},{"line_number":313,"context_line":"        \"\"\"Maintain inactive connections."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        Assume that maintenance is only needed when connection"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_b401133a","line":312,"updated":"2014-11-14 14:42:15.000000000","message":"Perhaps we can move all heartbeat logic into impl_rabbit.\n\nthe waiter can be accessed by the driver via:\n\n    if self._waiter and self._waiter.conn_lock.acquire(False):\n        ...","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                else:"},{"line_number":310,"context_line":"                    return final_reply"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def do_connection_maintenance(self, maintenance_action):"},{"line_number":313,"context_line":"        \"\"\"Maintain inactive connections."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        Assume that maintenance is only needed when connection"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_2961c2d3","line":312,"in_reply_to":"5a890539_b401133a","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        if self.conn_lock.acquire(False):"},{"line_number":320,"context_line":"            try:"},{"line_number":321,"context_line":"                maintenance_action(self.conn)"},{"line_number":322,"context_line":"            except Exception as e:"},{"line_number":323,"context_line":"                LOG.info(e)"},{"line_number":324,"context_line":"                self.conn.reconnect()"},{"line_number":325,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_9763fe40","line":322,"updated":"2014-11-17 16:27:57.000000000","message":"Shouldn\u0027t this be a more specific exception than \u0027Exception\u0027 ?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        if self.conn_lock.acquire(False):"},{"line_number":320,"context_line":"            try:"},{"line_number":321,"context_line":"                maintenance_action(self.conn)"},{"line_number":322,"context_line":"            except Exception as e:"},{"line_number":323,"context_line":"                LOG.info(e)"},{"line_number":324,"context_line":"                self.conn.reconnect()"},{"line_number":325,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_e9cfba55","line":322,"in_reply_to":"5a890539_9763fe40","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _create_reply_waiter(self, conf, reply_q, conn, allowed_remote_exmods):"},{"line_number":354,"context_line":"        return ReplyWaiter(conf, reply_q, conn, allowed_remote_exmods)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def _send(self, target, ctxt, message,"},{"line_number":357,"context_line":"              wait_for_reply\u003dNone, timeout\u003dNone,"},{"line_number":358,"context_line":"              envelope\u003dTrue, notify\u003dFalse, retry\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_c092794a","line":355,"updated":"2014-11-21 14:59:16.000000000","message":"This change looks useless, now","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"}],"oslo/messaging/_drivers/impl_rabbit.py":[{"author":{"_account_id":935,"name":"James Page","email":"ringo.page@gmail.com","username":"james-page"},"change_message_id":"8531abcea7ce08f4d48169972ad41acc91131500","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"                self.brokers_params.append(params)"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            # Old configuration format"},{"line_number":464,"context_line":"            for adr in self.conf.rabbit_hosts:"},{"line_number":465,"context_line":"                hostname, port \u003d netutils.parse_host_port("},{"line_number":466,"context_line":"                    adr, default_port\u003dself.conf.rabbit_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_9b3033ea","side":"PARENT","line":463,"updated":"2014-10-10 14:12:46.000000000","message":"heartbeat will also need to be supported in the old configuration format","commit_id":"6199e0f92f43d8081fe65e34aaa4a5f3467fe450"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"260140c535b37f17870fce654542856642fe86a1","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"                self.brokers_params.append(params)"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            # Old configuration format"},{"line_number":464,"context_line":"            for adr in self.conf.rabbit_hosts:"},{"line_number":465,"context_line":"                hostname, port \u003d netutils.parse_host_port("},{"line_number":466,"context_line":"                    adr, default_port\u003dself.conf.rabbit_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_467b5229","side":"PARENT","line":463,"in_reply_to":"baa201ad_9b3033ea","updated":"2014-10-10 14:58:58.000000000","message":"Sure. Thank you.","commit_id":"6199e0f92f43d8081fe65e34aaa4a5f3467fe450"},{"author":{"_account_id":935,"name":"James Page","email":"ringo.page@gmail.com","username":"james-page"},"change_message_id":"8531abcea7ce08f4d48169972ad41acc91131500","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import random"},{"line_number":19,"context_line":"import socket"},{"line_number":20,"context_line":"import ssl"},{"line_number":21,"context_line":"import threading"},{"line_number":22,"context_line":"import time"},{"line_number":23,"context_line":"import uuid"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_db2abb7d","line":21,"updated":"2014-10-10 14:12:46.000000000","message":"I think that using threading directly probably breaks the layering in oslo.messaging between underlying messaging and execution drivers.","commit_id":"9cbeb06200555cff4c12a47570d8629e7f250785"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"260140c535b37f17870fce654542856642fe86a1","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import random"},{"line_number":19,"context_line":"import socket"},{"line_number":20,"context_line":"import ssl"},{"line_number":21,"context_line":"import threading"},{"line_number":22,"context_line":"import time"},{"line_number":23,"context_line":"import uuid"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_e6e1a6d1","line":21,"in_reply_to":"baa201ad_db2abb7d","updated":"2014-10-10 14:58:58.000000000","message":"Hmm... Describe please, how to use it correctly? Or what should be used instead of threading imported directly?","commit_id":"9cbeb06200555cff4c12a47570d8629e7f250785"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"f2bbe893bb981ee6ffdd0376e354cfc8aa0bbc44","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                     \u0027RabbitMQ database.\u0027),"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027rabbit_heartbeat\u0027,"},{"line_number":104,"context_line":"               default\u003d60,"},{"line_number":105,"context_line":"               help\u003d\u0027seconds between rabbit keep-alive heartbeat.\u0027),"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # FIXME(markmc): this was toplevel in openstack.common.rpc"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_a4ddcb16","line":104,"updated":"2014-11-11 13:36:30.000000000","message":"Right now default  rpc_response_timeout is also 60 seconds which is the same as this default. Correct me if I\u0027m wrong but client code will not retry requesting if it gets timeout for its response instead of a broken pipe. Maybe the default should be less than 60 secs to allow client to avoid timeouts and retry the request?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                     \u0027RabbitMQ database.\u0027),"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027rabbit_heartbeat\u0027,"},{"line_number":104,"context_line":"               default\u003d60,"},{"line_number":105,"context_line":"               help\u003d\u0027seconds between rabbit keep-alive heartbeat.\u0027),"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # FIXME(markmc): this was toplevel in openstack.common.rpc"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_9393c94e","line":104,"in_reply_to":"5a890539_a4ddcb16","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                        try:"},{"line_number":826,"context_line":"                            self.send_heartbeat()"},{"line_number":827,"context_line":"                        except Exception as e:"},{"line_number":828,"context_line":"                            LOG.exception(e)"},{"line_number":829,"context_line":"                            self.reconnect()"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"            except rpc_common.Timeout:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_172f4940","line":828,"updated":"2014-11-14 14:42:15.000000000","message":"Could we lets iterconsume handle the reconnection. \nHere exception like \u0027we miss a heartbeat\u0027 can be raise, but the connection can still working.\n\nif the connection is really broken, the next drain_events will fail, and reconnect will be launched.\n\nWDYT ?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                        try:"},{"line_number":826,"context_line":"                            self.send_heartbeat()"},{"line_number":827,"context_line":"                        except Exception as e:"},{"line_number":828,"context_line":"                            LOG.exception(e)"},{"line_number":829,"context_line":"                            self.reconnect()"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"            except rpc_common.Timeout:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_3a53c16d","line":828,"in_reply_to":"5a890539_172f4940","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        self._connection_pool \u003d connection_pool"},{"line_number":841,"context_line":"        self._reply_waiters \u003d []"},{"line_number":842,"context_line":"        self._exit_event \u003d threading.Event()"},{"line_number":843,"context_line":"        self._interval \u003d interval / 2.5"},{"line_number":844,"context_line":"        self.daemon \u003d True"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_929eacb7","line":843,"updated":"2014-11-17 16:27:57.000000000","message":"Why 2.5 and not 2.0? Or 3.0 or ... (comment would be useful)","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        self._connection_pool \u003d connection_pool"},{"line_number":841,"context_line":"        self._reply_waiters \u003d []"},{"line_number":842,"context_line":"        self._exit_event \u003d threading.Event()"},{"line_number":843,"context_line":"        self._interval \u003d interval / 2.5"},{"line_number":844,"context_line":"        self.daemon \u003d True"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_babb3174","line":843,"in_reply_to":"5a890539_929eacb7","updated":"2014-11-19 16:42:21.000000000","message":"Seems like we don\u0027t need it after the timeout became lesser in the 104 line.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":847,"context_line":"    def _heartbeat_predicate(conn):"},{"line_number":848,"context_line":"        try:"},{"line_number":849,"context_line":"            conn.send_heartbeat()"},{"line_number":850,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":851,"context_line":"            return True"},{"line_number":852,"context_line":"        except socket.timeout:"},{"line_number":853,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_b232c8a4","line":850,"updated":"2014-11-17 16:27:57.000000000","message":"Same question here, about drain_events()","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":847,"context_line":"    def _heartbeat_predicate(conn):"},{"line_number":848,"context_line":"        try:"},{"line_number":849,"context_line":"            conn.send_heartbeat()"},{"line_number":850,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":851,"context_line":"            return True"},{"line_number":852,"context_line":"        except socket.timeout:"},{"line_number":853,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_45cd0e86","line":850,"in_reply_to":"5a890539_b232c8a4","updated":"2014-11-19 16:42:21.000000000","message":"I can\u0027t see a way to argue this param. This situation is twice more difficult to me, because it is not fully made by me, it is kind of aggregation from our product implementation. So, I believe that the current value doesn\u0027t give a chance to a server. I\u0027d rather use 1 second instead of one hundredth. \n\nI don\u0027t like to have it hardcoded. I\u0027ll be grateful for any suggestions how to compute it.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":859,"context_line":"    def _connection_maintenance(conn):"},{"line_number":860,"context_line":"        try:"},{"line_number":861,"context_line":"            conn.send_heartbeat()"},{"line_number":862,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_81420e66","line":862,"updated":"2014-11-14 14:42:15.000000000","message":"I think we can use the \u0027ensure\u0027 method of the driver here to reuse the exception path and the reconnection handling.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":859,"context_line":"    def _connection_maintenance(conn):"},{"line_number":860,"context_line":"        try:"},{"line_number":861,"context_line":"            conn.send_heartbeat()"},{"line_number":862,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_32117852","line":862,"updated":"2014-11-17 16:27:57.000000000","message":"Why drain_events() here? Seems rather arbitrary.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":859,"context_line":"    def _connection_maintenance(conn):"},{"line_number":860,"context_line":"        try:"},{"line_number":861,"context_line":"            conn.send_heartbeat()"},{"line_number":862,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_a08ce080","line":862,"in_reply_to":"5a890539_32117852","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":859,"context_line":"    def _connection_maintenance(conn):"},{"line_number":860,"context_line":"        try:"},{"line_number":861,"context_line":"            conn.send_heartbeat()"},{"line_number":862,"context_line":"            conn.drain_events(timeout\u003d0.01)"},{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_c0e80c19","line":862,"in_reply_to":"5a890539_81420e66","updated":"2014-11-19 16:42:21.000000000","message":"I didn\u0027t got your point. Do you mean _ensure_heartbeat_thread_initialized or ensure from Connection object? And why do we need it here?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"},{"line_number":866,"context_line":"            LOG.exception(e)"},{"line_number":867,"context_line":"            raise"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"    def run(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_4165861c","line":866,"updated":"2014-11-14 14:42:15.000000000","message":"This exception is logger twice, one here, on time in do_connection_maintenance","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":863,"context_line":"        except socket.timeout:"},{"line_number":864,"context_line":"            pass"},{"line_number":865,"context_line":"        except Exception as e:"},{"line_number":866,"context_line":"            LOG.exception(e)"},{"line_number":867,"context_line":"            raise"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"    def run(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_60e3d805","line":866,"in_reply_to":"5a890539_4165861c","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        # for Python 2.6 compatibility we cannot use wait() return value"},{"line_number":871,"context_line":"        while not self._exit_event.is_set():"},{"line_number":872,"context_line":"            self._connection_pool.filter(self._heartbeat_predicate)"},{"line_number":873,"context_line":"            for reply_waiter in self._reply_waiters:"},{"line_number":874,"context_line":"                reply_waiter.do_connection_maintenance("},{"line_number":875,"context_line":"                    self._connection_maintenance)"},{"line_number":876,"context_line":"            self._exit_event.wait(timeout\u003dself._interval)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_3d960d4d","line":873,"updated":"2014-11-14 14:42:15.000000000","message":"I think self._reply_waiters can only have one item.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        # for Python 2.6 compatibility we cannot use wait() return value"},{"line_number":871,"context_line":"        while not self._exit_event.is_set():"},{"line_number":872,"context_line":"            self._connection_pool.filter(self._heartbeat_predicate)"},{"line_number":873,"context_line":"            for reply_waiter in self._reply_waiters:"},{"line_number":874,"context_line":"                reply_waiter.do_connection_maintenance("},{"line_number":875,"context_line":"                    self._connection_maintenance)"},{"line_number":876,"context_line":"            self._exit_event.wait(timeout\u003dself._interval)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_a4797dc9","line":873,"in_reply_to":"5a890539_3d960d4d","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":893,"context_line":"        self._heartbeat_thread \u003d None"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        connection_pool \u003d rpc_amqp.get_connection_pool(conf, url, Connection)"},{"line_number":896,"context_line":"        self._connection_pool \u003d connection_pool"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        super(RabbitDriver, self).__init__(conf, url,"},{"line_number":899,"context_line":"                                           connection_pool,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_f4bf1ba8","line":896,"updated":"2014-11-14 14:42:15.000000000","message":"This is unuseful, it\u0027s already declared into the base class.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":893,"context_line":"        self._heartbeat_thread \u003d None"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        connection_pool \u003d rpc_amqp.get_connection_pool(conf, url, Connection)"},{"line_number":896,"context_line":"        self._connection_pool \u003d connection_pool"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        super(RabbitDriver, self).__init__(conf, url,"},{"line_number":899,"context_line":"                                           connection_pool,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_1aa46ab8","line":896,"in_reply_to":"5a890539_f4bf1ba8","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":910,"context_line":"            self._heartbeat_thread.start()"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"    def _create_reply_waiter(self, conf, reply_q, conn, allowed_remote_exmods):"},{"line_number":913,"context_line":"        waiter \u003d super(RabbitDriver, self)._create_reply_waiter("},{"line_number":914,"context_line":"            conf, reply_q, conn, allowed_remote_exmods)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        self._ensure_heartbeat_thread_initialized()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_bdbbdde3","line":913,"updated":"2014-11-14 14:42:15.000000000","message":"It seems unuseful to track ReplyWaiter object, they are only one instance of this object per driver instance.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":910,"context_line":"            self._heartbeat_thread.start()"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"    def _create_reply_waiter(self, conf, reply_q, conn, allowed_remote_exmods):"},{"line_number":913,"context_line":"        waiter \u003d super(RabbitDriver, self)._create_reply_waiter("},{"line_number":914,"context_line":"            conf, reply_q, conn, allowed_remote_exmods)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        self._ensure_heartbeat_thread_initialized()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_ff16b047","line":913,"in_reply_to":"5a890539_bdbbdde3","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":913,"context_line":"        waiter \u003d super(RabbitDriver, self)._create_reply_waiter("},{"line_number":914,"context_line":"            conf, reply_q, conn, allowed_remote_exmods)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        self._ensure_heartbeat_thread_initialized()"},{"line_number":917,"context_line":"        self._heartbeat_thread.append_reply_waiter(waiter)"},{"line_number":918,"context_line":"        return waiter"},{"line_number":919,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_b4d033f7","line":916,"updated":"2014-11-14 14:42:15.000000000","message":"I think it should be safer to the start the thread into __init__","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":913,"context_line":"        waiter \u003d super(RabbitDriver, self)._create_reply_waiter("},{"line_number":914,"context_line":"            conf, reply_q, conn, allowed_remote_exmods)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        self._ensure_heartbeat_thread_initialized()"},{"line_number":917,"context_line":"        self._heartbeat_thread.append_reply_waiter(waiter)"},{"line_number":918,"context_line":"        return waiter"},{"line_number":919,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_c0b9eced","line":916,"in_reply_to":"5a890539_b4d033f7","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5f5e432b7359b9a2f8e5c5b3e6583979b1b8acb6","unresolved":false,"context_lines":[{"line_number":918,"context_line":"        return waiter"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"    def _get_connection(self, pooled\u003dTrue):"},{"line_number":921,"context_line":"        self._ensure_heartbeat_thread_initialized()"},{"line_number":922,"context_line":"        return super(RabbitDriver, self)._get_connection(pooled\u003dpooled)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def cleanup(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_f4d63bf0","line":921,"updated":"2014-11-14 14:42:15.000000000","message":"Same here.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":918,"context_line":"        return waiter"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"    def _get_connection(self, pooled\u003dTrue):"},{"line_number":921,"context_line":"        self._ensure_heartbeat_thread_initialized()"},{"line_number":922,"context_line":"        return super(RabbitDriver, self)._get_connection(pooled\u003dpooled)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def cleanup(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_e0bee8d3","line":921,"in_reply_to":"5a890539_f4d63bf0","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def cleanup(self):"},{"line_number":925,"context_line":"        if self._heartbeat_thread is not None:"},{"line_number":926,"context_line":"            self._heartbeat_thread.stop()"},{"line_number":927,"context_line":"        super(RabbitDriver, self).cleanup()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_d743c669","line":926,"updated":"2014-11-17 16:27:57.000000000","message":"Did u forget to do a join() on the thread?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def cleanup(self):"},{"line_number":925,"context_line":"        if self._heartbeat_thread is not None:"},{"line_number":926,"context_line":"            self._heartbeat_thread.stop()"},{"line_number":927,"context_line":"        super(RabbitDriver, self).cleanup()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_5a1c086b","line":926,"in_reply_to":"5a890539_d743c669","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":924,"context_line":"    def cleanup(self):"},{"line_number":925,"context_line":"        if self._heartbeat_thread is not None:"},{"line_number":926,"context_line":"            self._heartbeat_thread.stop()"},{"line_number":927,"context_line":"        super(RabbitDriver, self).cleanup()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_923a2c97","line":927,"updated":"2014-11-17 16:27:57.000000000","message":"Can drivers ever be restarted? If so then the heartbeat_thread is not currently going to be restarted, is that correct?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":924,"context_line":"    def cleanup(self):"},{"line_number":925,"context_line":"        if self._heartbeat_thread is not None:"},{"line_number":926,"context_line":"            self._heartbeat_thread.stop()"},{"line_number":927,"context_line":"        super(RabbitDriver, self).cleanup()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_3a0f3c30","line":927,"in_reply_to":"5a890539_923a2c97","updated":"2014-11-19 16:42:21.000000000","message":"What did you meant when you told \"restarted\"? Did you meant re-initialized?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b8bf179cf98212c12b67e662af28e34b79924528","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        except socket.timeout:"},{"line_number":843,"context_line":"            return True"},{"line_number":844,"context_line":"        except Exception as e:"},{"line_number":845,"context_line":"            LOG.exception(e)"},{"line_number":846,"context_line":"            return False"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_94e39804","line":845,"updated":"2014-11-19 22:55:17.000000000","message":"This seems not so useful.\n\n  LOG.exception(\"Some useful message here\", exc_info\u003dTrue)\n\n^ Seems better, with a useful message added ;)","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e7dc8ea22449c13fa679b0f9d936a172bd3a699f","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        except socket.timeout:"},{"line_number":843,"context_line":"            return True"},{"line_number":844,"context_line":"        except Exception as e:"},{"line_number":845,"context_line":"            LOG.exception(e)"},{"line_number":846,"context_line":"            return False"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_784d2872","line":845,"in_reply_to":"5a890539_94e39804","updated":"2014-11-20 14:13:50.000000000","message":"Done","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6fa340304ea22563f5afd997ef61eb938790c933","unresolved":false,"context_lines":[{"line_number":880,"context_line":"                                           default_exchange,"},{"line_number":881,"context_line":"                                           allowed_remote_exmods)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._initialize_heartbeat_thread()"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":886,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_7cd7eebf","line":883,"updated":"2014-11-20 02:03:47.000000000","message":"Hmmm, the base driver really needs something akin to \u0027open/start\u0027; starting threads in constructors/__init__ just doesn\u0027t feel right IMHO.","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e7dc8ea22449c13fa679b0f9d936a172bd3a699f","unresolved":false,"context_lines":[{"line_number":880,"context_line":"                                           default_exchange,"},{"line_number":881,"context_line":"                                           allowed_remote_exmods)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._initialize_heartbeat_thread()"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":886,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_d9762bd8","line":883,"in_reply_to":"5a890539_7cd7eebf","updated":"2014-11-20 14:13:50.000000000","message":"A thread start moved to a start method.\n\nBut Mehdi wrote in the previous patch set:\n\u003e\u003e\u003e I think it should be safer to the start the thread into __init__\n\nSo I think we need to discuss and argue all existing options.","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b8bf179cf98212c12b67e662af28e34b79924528","unresolved":false,"context_lines":[{"line_number":916,"context_line":"            except (kombu_exc.NotBoundError,"},{"line_number":917,"context_line":"                    kombu_exc.ConnectionLimitExceeded,"},{"line_number":918,"context_line":"                    kombu_exc.ChannelLimitExceeded) as e:"},{"line_number":919,"context_line":"                LOG.info(e)"},{"line_number":920,"context_line":"                self._waiter.conn.reconnect()"},{"line_number":921,"context_line":"            finally:"},{"line_number":922,"context_line":"                self._waiter.conn_lock.release()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_b49ed461","line":919,"updated":"2014-11-19 22:55:17.000000000","message":"A better message here in this LOG.info would be great...","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e7dc8ea22449c13fa679b0f9d936a172bd3a699f","unresolved":false,"context_lines":[{"line_number":916,"context_line":"            except (kombu_exc.NotBoundError,"},{"line_number":917,"context_line":"                    kombu_exc.ConnectionLimitExceeded,"},{"line_number":918,"context_line":"                    kombu_exc.ChannelLimitExceeded) as e:"},{"line_number":919,"context_line":"                LOG.info(e)"},{"line_number":920,"context_line":"                self._waiter.conn.reconnect()"},{"line_number":921,"context_line":"            finally:"},{"line_number":922,"context_line":"                self._waiter.conn_lock.release()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_383480dd","line":919,"in_reply_to":"5a890539_b49ed461","updated":"2014-11-20 14:13:50.000000000","message":"Done","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"170311f29d7e798d112201dc7d762bf83c9ba6c3","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":887,"context_line":"        pass"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def start(self):"},{"line_number":890,"context_line":"        self._heartbeat_thread \u003d IdleConnectionsHeartbeatThread("},{"line_number":891,"context_line":"            self, self.conf.heartbeat_timeout)"},{"line_number":892,"context_line":"        self._heartbeat_thread.start()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_7318eb84","line":889,"updated":"2014-11-20 14:37:04.000000000","message":"This public start method for heartbeat is bad idea because:\n\n1. Every time we run the driver we need to construct it and then not to forget to call the start. Looks weird. \n2. Bad name: what do we start here? (From the client code point of view)\n3. Do all other drivers have heartbeat thread? Or even implement such a concept? Heartbeat is an internal details of the driver implementation, making it visible to client code reduces abstraction of the API.\n\nIMHO starting a heartbeat thread in constructor is absolutely normal. Moreover it is object oriented (and preferrable) approach to perfrom all initializations within constructors.","commit_id":"19fa74b0a39c00b76e040a587ba04f311a9e76a7"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"9740b5f4e62fe9b6b15c2731d9967baee3b25e9d","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":887,"context_line":"        pass"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def start(self):"},{"line_number":890,"context_line":"        self._heartbeat_thread \u003d IdleConnectionsHeartbeatThread("},{"line_number":891,"context_line":"            self, self.conf.heartbeat_timeout)"},{"line_number":892,"context_line":"        self._heartbeat_thread.start()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_d3051e15","line":889,"in_reply_to":"5a890539_7318eb84","updated":"2014-11-20 15:34:48.000000000","message":"Ok, dear reviewers, I like the approach with a thread start in the constructor. But we have no unanimous opinion about the feature. So, I\u0027ll revert it to \"start in the constructor\" approach. I\u0027d rather do a next move, if it will be needed,  after we discuss and argue all the proposed options. So, please lets talk about it.","commit_id":"19fa74b0a39c00b76e040a587ba04f311a9e76a7"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"4d88aa3b42a82a4dbd4cac5659e92d0e21966e78","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":887,"context_line":"        pass"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def start(self):"},{"line_number":890,"context_line":"        self._heartbeat_thread \u003d IdleConnectionsHeartbeatThread("},{"line_number":891,"context_line":"            self, self.conf.heartbeat_timeout)"},{"line_number":892,"context_line":"        self._heartbeat_thread.start()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_bd04bd7e","line":889,"in_reply_to":"5a890539_896355dc","updated":"2014-11-21 10:15:32.000000000","message":"I\u0027ve just said that starting of the heartbeat-thread should be transparent for the client code. Providing the direct method for starting it breaks the design of the driver (Because we don\u0027t need such method in other drivers).","commit_id":"19fa74b0a39c00b76e040a587ba04f311a9e76a7"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"47aab9af4a0f9303e81f3f8a35616526564c6b2f","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def require_features(self, requeue\u003dTrue):"},{"line_number":887,"context_line":"        pass"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def start(self):"},{"line_number":890,"context_line":"        self._heartbeat_thread \u003d IdleConnectionsHeartbeatThread("},{"line_number":891,"context_line":"            self, self.conf.heartbeat_timeout)"},{"line_number":892,"context_line":"        self._heartbeat_thread.start()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_896355dc","line":889,"in_reply_to":"5a890539_d3051e15","updated":"2014-11-20 20:40:27.000000000","message":"IMHO starting a thread isn\u0027t initialization, creating a thread object that will be used later (without starting it), sure that\u0027s initialization. The start() method is like the open() [io.open() for example, or in kombu() the connect method is similar, or in sqlalchemy the connect() method...] method elsewhere in python IMHO, where when u call this method u are starting to use the resources that object provides. To me the start() method here is our version of \u0027connect/open\u0027 where we actually begin to use the resources defined/created in the constructor. This is more like what other libraries do, where the constructor just gets this ready to happen and doesn\u0027t actually do the connect...\n\nTo each there own though; we can probably debate this one for a while, although I\u0027d like to know some examples of libraries/other that are heavily used that do start to use resources in there constructors instead of just \u0027setting up those resources to be used later\u0027; I don\u0027t know many that do this but maybe you do?\n\nAlthough if we are just going to argue this forever, I don\u0027t care that much, lol.","commit_id":"19fa74b0a39c00b76e040a587ba04f311a9e76a7"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        if self.connection:"},{"line_number":633,"context_line":"            try:"},{"line_number":634,"context_line":"                self.connection.release()"},{"line_number":635,"context_line":"                self.connection.close()"},{"line_number":636,"context_line":"            except self.connection_errors:"},{"line_number":637,"context_line":"                pass"},{"line_number":638,"context_line":"            # Setting this in case the next statement fails, though"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_16776bd5","line":635,"updated":"2014-11-21 14:59:16.000000000","message":"useless \u0027close \u003d\u003d release\u0027","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":669,"context_line":""},{"line_number":670,"context_line":"        deadline \u003d time.time() + timeout"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        def _error_callback(exc):"},{"line_number":673,"context_line":"            if isinstance(exc, socket.timeout) and deadline - time.time() \u003c 0:"},{"line_number":674,"context_line":"                LOG.debug(\u0027Timed out waiting for RPC response: %s\u0027, exc)"},{"line_number":675,"context_line":"                raise rpc_common.Timeout()"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_96ffdb00","line":672,"updated":"2014-11-21 14:59:16.000000000","message":"We must not raise any errors in the kombu autoretry callback.\nOtherwise in some case, the channel will not be re-setuped correctly.","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":774,"context_line":"    def _heartbeat_predicate(conn):"},{"line_number":775,"context_line":"        try:"},{"line_number":776,"context_line":"            conn.send_heartbeat()"},{"line_number":777,"context_line":"            conn.drain_events(timeout\u003d1)"},{"line_number":778,"context_line":"            return True"},{"line_number":779,"context_line":"        except socket.timeout:"},{"line_number":780,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_363c67bf","line":777,"updated":"2014-11-21 14:59:16.000000000","message":"Why we need to drain the events here ?","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":788,"context_line":"    def _connection_maintenance(conn):"},{"line_number":789,"context_line":"        try:"},{"line_number":790,"context_line":"            conn.send_heartbeat()"},{"line_number":791,"context_line":"        except socket.timeout:"},{"line_number":792,"context_line":"            pass"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def run(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_56b9f32c","line":791,"updated":"2014-11-21 14:59:16.000000000","message":"If we got a timeout here, I think the connection is not in a bad shape...","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":805,"context_line":""},{"line_number":806,"context_line":"class RabbitDriver(amqpdriver.AMQPDriverBase):"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    _enable_heartbeat \u003d True"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"    def __init__(self, conf, url,"},{"line_number":811,"context_line":"                 default_exchange\u003dNone,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_96eefb89","line":808,"updated":"2014-11-21 14:59:16.000000000","message":"I don\u0027t see the need for that.","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":811,"context_line":"                 default_exchange\u003dNone,"},{"line_number":812,"context_line":"                 allowed_remote_exmods\u003dNone):"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"        self.conf \u003d conf"},{"line_number":815,"context_line":"        self.conf.register_opts(rabbit_opts)"},{"line_number":816,"context_line":"        self.conf.register_opts(rpc_amqp.amqp_opts)"},{"line_number":817,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_f67f3f64","line":814,"updated":"2014-11-21 14:59:16.000000000","message":"Useless this is already done by the  amqpdriver.AMQPDriverBase base class","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"00135435d264cb4c66ff45038f7f6493b4b28c1d","unresolved":false,"context_lines":[{"line_number":821,"context_line":"                                           connection_pool,"},{"line_number":822,"context_line":"                                           default_exchange,"},{"line_number":823,"context_line":"                                           allowed_remote_exmods)"},{"line_number":824,"context_line":"        if self._enable_heartbeat:"},{"line_number":825,"context_line":"            self._start_heartbeat_thread()"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"    def require_features(self, requeue\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_d1025208","line":824,"updated":"2014-11-21 11:25:57.000000000","message":"I hope It is kind of compromise for the dispute.","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":821,"context_line":"                                           connection_pool,"},{"line_number":822,"context_line":"                                           default_exchange,"},{"line_number":823,"context_line":"                                           allowed_remote_exmods)"},{"line_number":824,"context_line":"        if self._enable_heartbeat:"},{"line_number":825,"context_line":"            self._start_heartbeat_thread()"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"    def require_features(self, requeue\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_363547db","line":824,"in_reply_to":"5a890539_d1025208","updated":"2014-11-21 14:59:16.000000000","message":"I think we should check against the kombu.connection.support_heartbearts, if we need to start the thread or not.","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":835,"context_line":"    def cleanup(self):"},{"line_number":836,"context_line":"        if self._heartbeat_thread is not None:"},{"line_number":837,"context_line":"            self._heartbeat_thread.stop()"},{"line_number":838,"context_line":"            self._heartbeat_thread.join()"},{"line_number":839,"context_line":"        super(RabbitDriver, self).cleanup()"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def do_connection_maintenance(self, maintenance_action):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_768b4f68","line":838,"updated":"2014-11-21 14:59:16.000000000","message":"self._heartbeat_thread \u003d None is missing","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":838,"context_line":"            self._heartbeat_thread.join()"},{"line_number":839,"context_line":"        super(RabbitDriver, self).cleanup()"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def do_connection_maintenance(self, maintenance_action):"},{"line_number":842,"context_line":"        \"\"\"Maintain inactive connections."},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"        Assume that maintenance is only needed when connection"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_d620839d","line":841,"updated":"2014-11-21 14:59:16.000000000","message":"This method can be moved into the HeartbeatThread object","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":847,"context_line":"        \"\"\""},{"line_number":848,"context_line":"        if self._waiter and self._waiter.conn_lock.acquire(False):"},{"line_number":849,"context_line":"            try:"},{"line_number":850,"context_line":"                maintenance_action(self._waiter.conn)"},{"line_number":851,"context_line":"            except kombu_exc.NotBoundError:"},{"line_number":852,"context_line":"                LOG.info(\"A channel dependent method on unbound entity. \""},{"line_number":853,"context_line":"                         \"It can be bounded in a few seconds.\", exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_801b11c9","line":850,"updated":"2014-11-21 14:59:16.000000000","message":"Perhaps we should use self._waiter.conn.recoverable_connection_errors and self._waiter.conn.recoverable_channel_errors instead of listing all this kombu exception ?","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"82d02e6dad0db3957b379de855265bd470c3db1c","unresolved":false,"context_lines":[{"line_number":629,"context_line":"    def reset(self):"},{"line_number":630,"context_line":"        \"\"\"Reset a connection so it can be used again.\"\"\""},{"line_number":631,"context_line":"        self.consumers \u003d []"},{"line_number":632,"context_line":"        # NOTE(sileht): ensure the connection have been established"},{"line_number":633,"context_line":"        # somtimes, unittest mock \u0027self.ensure\u0027 method"},{"line_number":634,"context_line":"        # and the channel is never setuped"},{"line_number":635,"context_line":"        if self.channel is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a890539_3ab7d8f6","line":632,"updated":"2014-11-22 00:04:05.000000000","message":"Shouldn\u0027t this be fixed in unittests?","commit_id":"7da6f6ea9d2798fcedaa7d05d1acaf6d723bfcc1"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"f6c060e4a9d55b14925b4b013d7a6025ee29430b","unresolved":false,"context_lines":[{"line_number":629,"context_line":"    def reset(self):"},{"line_number":630,"context_line":"        \"\"\"Reset a connection so it can be used again.\"\"\""},{"line_number":631,"context_line":"        self.consumers \u003d []"},{"line_number":632,"context_line":"        # NOTE(sileht): ensure the connection have been established"},{"line_number":633,"context_line":"        # somtimes, unittest mock \u0027self.ensure\u0027 method"},{"line_number":634,"context_line":"        # and the channel is never setuped"},{"line_number":635,"context_line":"        if self.channel is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a890539_810f6e38","line":632,"in_reply_to":"5a890539_3ab7d8f6","updated":"2014-11-24 10:48:50.000000000","message":"Yep, sure. Done.","commit_id":"7da6f6ea9d2798fcedaa7d05d1acaf6d723bfcc1"},{"author":{"_account_id":7582,"name":"Jan Provaznik","email":"jan.provaznik@gmail.com","username":"jprovazn"},"change_message_id":"8529ee239a5d5e026504124191bcdd1f4f2dcc71","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    cfg.IntOpt(\u0027heartbeat_timeout\u0027,"},{"line_number":105,"context_line":"               default\u003d15,"},{"line_number":106,"context_line":"               help\u003d\u0027seconds between rabbit keep-alive heartbeat.\u0027),"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # FIXME(markmc): this was toplevel in openstack.common.rpc"},{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027fake_rabbit\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a890539_1aafe595","line":106,"updated":"2014-11-27 15:23:07.000000000","message":"It might be I missed something, but heartbeat_timeout is not used anywhere. After brief debugging it seems that in my case self.heratbeat in lib/python2.7/site-packages/amqp/connection.py:heartbeat_tick (which is called from kombu\u0027s heartbeat_check) is still set to 0 and heartbeat is not sent.","commit_id":"729d486ea6aa4d4daef5bfa5fc6846340eb76b7c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"a3b766b56baadacccd3ef0d74e6002430a503179","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    cfg.IntOpt(\u0027heartbeat_timeout\u0027,"},{"line_number":105,"context_line":"               default\u003d15,"},{"line_number":106,"context_line":"               help\u003d\u0027seconds between rabbit keep-alive heartbeat.\u0027),"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # FIXME(markmc): this was toplevel in openstack.common.rpc"},{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027fake_rabbit\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a890539_9a8e75cf","line":106,"in_reply_to":"5a890539_1aafe595","updated":"2014-11-27 15:40:40.000000000","message":"Thanks a lot ! , it have disappeared after a rebase. Done.","commit_id":"729d486ea6aa4d4daef5bfa5fc6846340eb76b7c"},{"author":{"_account_id":7582,"name":"Jan Provaznik","email":"jan.provaznik@gmail.com","username":"jprovazn"},"change_message_id":"b5937ad523cf39908cfaf26994772ac0a0a7205e","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                pass"},{"line_number":808,"context_line":"            except kombu_connection.recoverable_connection_errors:"},{"line_number":809,"context_line":"                LOG.info(\"A recoverable channel errors occurs\", exc_info\u003dTrue)"},{"line_number":810,"context_line":"                self._driver._waiter.kombu_connection.reconnect()"},{"line_number":811,"context_line":"            except kombu_connection.recoverable_channel_errors:"},{"line_number":812,"context_line":"                LOG.info(\"A recoverable connection errors occurs\","},{"line_number":813,"context_line":"                         exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a890539_df81c2c4","line":810,"updated":"2014-11-28 07:56:23.000000000","message":"I\u0027ve noticed now this error in log on compote node which is probably related:\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: 2014-11-28 07:50:26.875 12700 TRACE oslo.messaging._drivers.impl_rabbit\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: Exception in thread Thread-1:\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: Traceback (most recent call last):\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: File \"/usr/lib/python2.7/threading.py\", line 811, in __bootstrap_inner\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: self.run()\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: File \"/opt/stack/venvs/nova/lib/python2.7/site-packages/oslo/messaging/_drivers/impl_rabbit.py\", line 763, in run\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: self._do_reply_connection_heartbeat()\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: File \"/opt/stack/venvs/nova/lib/python2.7/site-packages/oslo/messaging/_drivers/impl_rabbit.py\", line 811, in _do_reply_connection_heartbeat\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: self._driver._waiter.kombu_connection.reconnect()\n Nov 28 07:50:26 overcloud-novacompute0-2tdk4ghuttag nova-compute[12700]: AttributeError: \u0027ReplyWaiter\u0027 object has no attribute \u0027kombu_connection\u0027","commit_id":"c904f2e8df8c97d898bb40058c7ccea8207f17a6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"16c33acf91263784c3872d2d8f06e265e6c00dc6","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                pass"},{"line_number":808,"context_line":"            except kombu_connection.recoverable_connection_errors:"},{"line_number":809,"context_line":"                LOG.info(\"A recoverable channel errors occurs\", exc_info\u003dTrue)"},{"line_number":810,"context_line":"                self._driver._waiter.kombu_connection.reconnect()"},{"line_number":811,"context_line":"            except kombu_connection.recoverable_channel_errors:"},{"line_number":812,"context_line":"                LOG.info(\"A recoverable connection errors occurs\","},{"line_number":813,"context_line":"                         exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a890539_cee02d99","line":810,"in_reply_to":"5a890539_df81c2c4","updated":"2014-11-28 12:53:32.000000000","message":"Thanks, I have added tests to cover that and to cover errors in  _do_pool_connection_heartbeat too.","commit_id":"c904f2e8df8c97d898bb40058c7ccea8207f17a6"}],"oslo/messaging/_drivers/pool.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d07bf00fcca002c64c6d10cfba56b0386d8a4859","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                        self._items.append(item)"},{"line_number":93,"context_line":"                # predicates should handle exceptions by themselves"},{"line_number":94,"context_line":"                except Exception:"},{"line_number":95,"context_line":"                    pass"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @abc.abstractmethod"},{"line_number":98,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_d298346c","line":95,"updated":"2014-11-17 16:27:57.000000000","message":"Seems useful to at least log something so that a bug can be opened against the code that didn\u0027t handle the exception themselves... Instead of dropping it on the floor.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                        self._items.append(item)"},{"line_number":93,"context_line":"                # predicates should handle exceptions by themselves"},{"line_number":94,"context_line":"                except Exception:"},{"line_number":95,"context_line":"                    pass"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @abc.abstractmethod"},{"line_number":98,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_7ae38433","line":95,"in_reply_to":"5a890539_d298346c","updated":"2014-11-19 16:42:21.000000000","message":"Done","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d6f7881c54756f45ed89abf3c9560655c97c0469","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                        self._items.append(item)"},{"line_number":97,"context_line":"                # predicates should handle exceptions by themselves"},{"line_number":98,"context_line":"                except Exception as e:"},{"line_number":99,"context_line":"                    LOG.exception(e)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @abc.abstractmethod"},{"line_number":102,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_b475f433","line":99,"updated":"2014-11-19 22:55:50.000000000","message":"Same as before. Some kind of meaningful message here would be appropriate.","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e7dc8ea22449c13fa679b0f9d936a172bd3a699f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                        self._items.append(item)"},{"line_number":97,"context_line":"                # predicates should handle exceptions by themselves"},{"line_number":98,"context_line":"                except Exception as e:"},{"line_number":99,"context_line":"                    LOG.exception(e)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @abc.abstractmethod"},{"line_number":102,"context_line":"    def create(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_389f2061","line":99,"in_reply_to":"5a890539_b475f433","updated":"2014-11-20 14:13:50.000000000","message":"This is redundant because the exception is already logged in the predicate method. Even more, this try except statement is redundant too because all exceptions are catched by predicate.","commit_id":"630d9bf8fe5dd8bc517bc1c2dbd7af6b8f6989ab"}],"test-requirements.txt":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"745ce1d97c3edb803bd64be7d72cdfd5ec7eae05","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# for test_qpid"},{"line_number":19,"context_line":"qpid-python"},{"line_number":20,"context_line":"greenlet\u003e\u003d0.3.2"},{"line_number":21,"context_line":"# when we can require tox\u003e\u003d 1.4, this can go into tox.ini:"},{"line_number":22,"context_line":"#  [testenv:cover]"},{"line_number":23,"context_line":"#  deps \u003d {[testenv]deps} coverage"}],"source_content_type":"text/plain","patch_set":7,"id":"5a890539_8f483ecd","line":20,"updated":"2014-11-17 18:12:04.000000000","message":"Was this a needed addition?","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3225bf0b56723b8bbb0635bf570e903557f4782f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# for test_qpid"},{"line_number":19,"context_line":"qpid-python"},{"line_number":20,"context_line":"greenlet\u003e\u003d0.3.2"},{"line_number":21,"context_line":"# when we can require tox\u003e\u003d 1.4, this can go into tox.ini:"},{"line_number":22,"context_line":"#  [testenv:cover]"},{"line_number":23,"context_line":"#  deps \u003d {[testenv]deps} coverage"}],"source_content_type":"text/plain","patch_set":7,"id":"5a890539_70d725ee","line":20,"in_reply_to":"5a890539_8f483ecd","updated":"2014-11-19 16:42:21.000000000","message":"Works well without.","commit_id":"7e7bea4a5a89d0bdcd59ce0cc7a510141aac5d93"}],"tests/drivers/test_impl_rabbit.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6626b2f71c11971ae57e75b4adbed7f1b6c6b3e4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        nt \u003d rabbit_driver.IdleConnectionsHeartbeatThread(driver, 1)"},{"line_number":54,"context_line":"        wait.side_effect \u003d lambda *args, **kwargs: nt.stop()"},{"line_number":55,"context_line":"        nt.run()"},{"line_number":56,"context_line":"        conn.send_heartbeat.assert_called()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(rabbit_driver, \u0027IdleConnectionsHeartbeatThread\u0027)"},{"line_number":59,"context_line":"    def test_driver_starts_heartbeating(self, thread):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_6fb9ae14","line":56,"updated":"2014-11-21 14:59:16.000000000","message":"We need to check if we do the correct number of heartbeat according a number of connection created.","commit_id":"e53cc6cb5420f45409204d5a004ee12b4609e4cf"}]}
