)]}'
{"oslo_messaging/_drivers/zmq_driver/client/publishers/dealer/zmq_dealer_call_publisher.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.matchmaker \u003d matchmaker"},{"line_number":46,"context_line":"        self.reply_waiter \u003d reply_waiter or zmq_waiters.ReplyWaiter(conf)"},{"line_number":47,"context_line":"        self.sockets_manager \u003d sockets_manager"},{"line_number":48,"context_line":"        self.sender \u003d sender or CallSender(self.sockets_manager,"},{"line_number":49,"context_line":"                                           zmq_senders.SenderDirect(),"},{"line_number":50,"context_line":"                                           self.reply_waiter)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_8380e247","line":48,"updated":"2016-06-23 12:08:25.000000000","message":"Here should be one of our new senders and again, lets pass it to init (construct sender earlier in the client). Lets eliminate CallSender and CallSenderProxy","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.matchmaker \u003d matchmaker"},{"line_number":46,"context_line":"        self.reply_waiter \u003d reply_waiter or zmq_waiters.ReplyWaiter(conf)"},{"line_number":47,"context_line":"        self.sockets_manager \u003d sockets_manager"},{"line_number":48,"context_line":"        self.sender \u003d sender or CallSender(self.sockets_manager,"},{"line_number":49,"context_line":"                                           zmq_senders.SenderDirect(),"},{"line_number":50,"context_line":"                                           self.reply_waiter)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c455cd50","line":48,"in_reply_to":"3aaa91ec_8380e247","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                zmq_names.message_type_str(request.msg_type)"},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        reply_future, \u003d self.sender.send_request(request)"},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            _, reply \u003d reply_future.result(timeout\u003drequest.timeout)"},{"line_number":61,"context_line":"        except AssertionError:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_030072a9","line":58,"updated":"2016-06-23 12:08:25.000000000","message":"Lets get future not from sender.send (Sender shouldn\u0027t know if we are going to receive something), but from reply waiter, when we register socket for tracking reply.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                zmq_names.message_type_str(request.msg_type)"},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        reply_future, \u003d self.sender.send_request(request)"},{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            _, reply \u003d reply_future.result(timeout\u003drequest.timeout)"},{"line_number":61,"context_line":"        except AssertionError:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_241651a7","line":58,"in_reply_to":"3aaa91ec_030072a9","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":85,"context_line":"class CallSender(zmq_publisher_base.QueuedSender):"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __init__(self, sockets_manager, sender, reply_waiter):"},{"line_number":88,"context_line":"        assert sender, \"Valid sender expected!\""},{"line_number":89,"context_line":"        super(CallSender, self).__init__(sockets_manager, sender)"},{"line_number":90,"context_line":"        assert reply_waiter, \"Valid reply waiter expected!\""},{"line_number":91,"context_line":"        self.reply_waiter \u003d reply_waiter"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_839d825b","line":88,"updated":"2016-06-23 12:08:25.000000000","message":"This initialization should be a part of a publisher. Lets remove CallSender class also.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"class CallSender(zmq_publisher_base.QueuedSender):"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __init__(self, sockets_manager, sender, reply_waiter):"},{"line_number":88,"context_line":"        assert sender, \"Valid sender expected!\""},{"line_number":89,"context_line":"        super(CallSender, self).__init__(sockets_manager, sender)"},{"line_number":90,"context_line":"        assert reply_waiter, \"Valid reply waiter expected!\""},{"line_number":91,"context_line":"        self.reply_waiter \u003d reply_waiter"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_84ff4566","line":88,"in_reply_to":"3aaa91ec_839d825b","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def send_request(self, request):"},{"line_number":94,"context_line":"        self.queue.put(request)"},{"line_number":95,"context_line":"        return self.reply_waiter.track_request(request)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _connect_socket(self, target):"},{"line_number":98,"context_line":"        socket \u003d self.sockets_manager.get_socket(target)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_83af4293","line":95,"updated":"2016-06-23 12:08:25.000000000","message":"This track_request() call should be made in the publisher. Sender should know nothing about reply waiter. It\u0027s publisher\u0027s responsibility to coordinate it\u0027s sender and reply_waiter","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def send_request(self, request):"},{"line_number":94,"context_line":"        self.queue.put(request)"},{"line_number":95,"context_line":"        return self.reply_waiter.track_request(request)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _connect_socket(self, target):"},{"line_number":98,"context_line":"        socket \u003d self.sockets_manager.get_socket(target)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_64021971","line":95,"in_reply_to":"3aaa91ec_83af4293","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.queue.put(request)"},{"line_number":95,"context_line":"        return self.reply_waiter.track_request(request)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _connect_socket(self, target):"},{"line_number":98,"context_line":"        socket \u003d self.sockets_manager.get_socket(target)"},{"line_number":99,"context_line":"        self.reply_waiter.register_socket(socket, self._recv_reply)"},{"line_number":100,"context_line":"        return socket"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_83e10201","line":97,"updated":"2016-06-23 12:08:25.000000000","message":"Socket connection is publisher\u0027s responsibility, not sender\u0027s","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.queue.put(request)"},{"line_number":95,"context_line":"        return self.reply_waiter.track_request(request)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _connect_socket(self, target):"},{"line_number":98,"context_line":"        socket \u003d self.sockets_manager.get_socket(target)"},{"line_number":99,"context_line":"        self.reply_waiter.register_socket(socket, self._recv_reply)"},{"line_number":100,"context_line":"        return socket"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a4f40187","line":97,"in_reply_to":"3aaa91ec_83e10201","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.reply_waiter.register_socket(socket, self._recv_reply)"},{"line_number":100,"context_line":"        return socket"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _recv_reply(self, socket):"},{"line_number":103,"context_line":"        empty \u003d socket.recv()"},{"line_number":104,"context_line":"        assert empty \u003d\u003d b\u0027\u0027, \"Empty expected!\""},{"line_number":105,"context_line":"        reply \u003d socket.recv_pyobj()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_231c8e11","line":102,"updated":"2016-06-23 12:08:25.000000000","message":"This method should go to reply waiter.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.reply_waiter.register_socket(socket, self._recv_reply)"},{"line_number":100,"context_line":"        return socket"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _recv_reply(self, socket):"},{"line_number":103,"context_line":"        empty \u003d socket.recv()"},{"line_number":104,"context_line":"        assert empty \u003d\u003d b\u0027\u0027, \"Empty expected!\""},{"line_number":105,"context_line":"        reply \u003d socket.recv_pyobj()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_b50d4940","line":102,"in_reply_to":"3aaa91ec_231c8e11","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        socket \u003d self._connect_socket(request.target)"},{"line_number":50,"context_line":"        self.sender.send(socket, request)"},{"line_number":51,"context_line":"        self.reply_receiver.register_socket(socket)"},{"line_number":52,"context_line":"        reply_future, \u003d self.reply_receiver.track_request(request)"},{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            _, reply \u003d reply_future.result(timeout\u003drequest.timeout)"},{"line_number":55,"context_line":"        except AssertionError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_1e29798a","line":52,"updated":"2016-06-26 16:34:55.000000000","message":"Lets extract logic below(including) this line to a _receive_reply() method for the sake of readability.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        socket \u003d self._connect_socket(request.target)"},{"line_number":50,"context_line":"        self.sender.send(socket, request)"},{"line_number":51,"context_line":"        self.reply_receiver.register_socket(socket)"},{"line_number":52,"context_line":"        reply_future, \u003d self.reply_receiver.track_request(request)"},{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            _, reply \u003d reply_future.result(timeout\u003drequest.timeout)"},{"line_number":55,"context_line":"        except AssertionError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_a5a63bbe","line":52,"in_reply_to":"3aaa91ec_1e29798a","updated":"2016-06-27 13:47:31.000000000","message":"Done","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        else:"},{"line_number":72,"context_line":"            return reply.reply_body"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _connect_socket(self, target):"},{"line_number":75,"context_line":"        return self.sockets_manager.get_socket(target)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def cleanup(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_5e082128","line":74,"updated":"2016-06-26 16:34:55.000000000","message":"Do we still need this method?","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        else:"},{"line_number":72,"context_line":"            return reply.reply_body"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _connect_socket(self, target):"},{"line_number":75,"context_line":"        return self.sockets_manager.get_socket(target)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def cleanup(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_0cc65749","line":74,"in_reply_to":"3aaa91ec_5e082128","updated":"2016-06-27 13:47:31.000000000","message":"Yes, it is overridden in DealerCallPublisherProxy.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"}],"oslo_messaging/_drivers/zmq_driver/client/publishers/dealer/zmq_dealer_publisher.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        sockets_manager \u003d zmq_publisher_base.SocketsManager("},{"line_number":32,"context_line":"            conf, matchmaker, zmq.ROUTER, zmq.DEALER"},{"line_number":33,"context_line":"        )"},{"line_number":34,"context_line":"        sender \u003d zmq_senders.SenderDirect()"},{"line_number":35,"context_line":"        super(DealerPublisher, self).__init__(sockets_manager, sender)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def send_request(self, request):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_832462af","line":34,"updated":"2016-06-23 12:08:25.000000000","message":"Lets pass sender as an argument to init.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        sockets_manager \u003d zmq_publisher_base.SocketsManager("},{"line_number":32,"context_line":"            conf, matchmaker, zmq.ROUTER, zmq.DEALER"},{"line_number":33,"context_line":"        )"},{"line_number":34,"context_line":"        sender \u003d zmq_senders.SenderDirect()"},{"line_number":35,"context_line":"        super(DealerPublisher, self).__init__(sockets_manager, sender)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def send_request(self, request):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a16eb393","line":34,"in_reply_to":"3aaa91ec_832462af","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":24,"context_line":"zmq \u003d zmq_async.import_zmq()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class DealerPublisher(zmq_publisher_base.QueuedSender):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def send_request(self, request):"},{"line_number":30,"context_line":"        if request.msg_type \u003d\u003d zmq_names.CALL_TYPE:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_7b0a4f27","line":27,"updated":"2016-06-26 16:34:55.000000000","message":"If we consider QueuedSender not a part of publishers hierarchy, then we can merge these two publishers.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":24,"context_line":"zmq \u003d zmq_async.import_zmq()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class DealerPublisher(zmq_publisher_base.QueuedSender):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def send_request(self, request):"},{"line_number":30,"context_line":"        if request.msg_type \u003d\u003d zmq_names.CALL_TYPE:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_ef42dd67","line":27,"in_reply_to":"3aaa91ec_7b0a4f27","updated":"2016-06-27 13:47:31.000000000","message":"DealerPublisher and DealerPublisherProxy don\u0027t differ only by senders. Sending logic is also different: proxy-publishers use routing keys (get them from routing tables and set within each request), while direct-publishers don\u0027t. We can move all stuff related to routing keys to proxy-senders, but I agree that logic isn\u0027t senders\u0027 responsibility.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"9b1d91753bda6216755bac60725b18e445bd6ac5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        super(DealerPublisher, self).send_request(request)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class DealerPublisherAsync(object):"},{"line_number":58,"context_line":"    \"\"\"This simplified publisher is to be used with eventlet only."},{"line_number":59,"context_line":"        Eventlet takes care about zmq sockets sharing between green threads"},{"line_number":60,"context_line":"        using queued lock."}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_0125785b","side":"PARENT","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":27},"updated":"2016-06-27 13:51:59.000000000","message":"It seems, that we don\u0027t need this publisher anymore since it is identical to DealerPublisher.","commit_id":"7a0f9334db9591a085d3a5b2c55dff24b1f21511"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"e99889c4de81db38336157ae7ec162c14c741837","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        super(DealerPublisher, self).send_request(request)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class DealerPublisherAsync(object):"},{"line_number":58,"context_line":"    \"\"\"This simplified publisher is to be used with eventlet only."},{"line_number":59,"context_line":"        Eventlet takes care about zmq sockets sharing between green threads"},{"line_number":60,"context_line":"        using queued lock."}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_1e8e6027","side":"PARENT","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":27},"in_reply_to":"3aaa91ec_0125785b","updated":"2016-06-27 19:12:22.000000000","message":"Agree. Nevertheless we need to stick to the same behaviour using new entities yet (I mean queued/non-queued when creating senders) to keep tests passing.","commit_id":"7a0f9334db9591a085d3a5b2c55dff24b1f21511"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"9b1d91753bda6216755bac60725b18e445bd6ac5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.sender.send(socket, request)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class DealerCallPublisher(zmq_publisher_base.PublisherBase):"},{"line_number":49,"context_line":"    \"\"\"CALL publisher using direct connections.\"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __init__(self, sockets_manager, sender, reply_receiver):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_814848ce","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":5},"updated":"2016-06-27 13:51:59.000000000","message":"I moved call-publisher to this module to make it more similar to zmq_dealer_publisher_proxy module.","commit_id":"b696f9caac03434c17c6a17093faa110797b0ecb"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"e99889c4de81db38336157ae7ec162c14c741837","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.sender.send(socket, request)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class DealerCallPublisher(zmq_publisher_base.PublisherBase):"},{"line_number":49,"context_line":"    \"\"\"CALL publisher using direct connections.\"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __init__(self, sockets_manager, sender, reply_receiver):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_3eb4fccf","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":5},"in_reply_to":"3aaa91ec_814848ce","updated":"2016-06-27 19:12:22.000000000","message":"+","commit_id":"b696f9caac03434c17c6a17093faa110797b0ecb"}],"oslo_messaging/_drivers/zmq_driver/client/publishers/dealer/zmq_dealer_publisher_proxy.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":29,"context_line":"zmq \u003d zmq_async.import_zmq()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class DealerPublisherProxy(object):"},{"line_number":33,"context_line":"    \"\"\"Non-CALL publisher via proxy.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, conf, matchmaker, sockets_manager):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_e026fccc","line":32,"updated":"2016-06-23 12:08:25.000000000","message":"DealerPublisher and DealerPublisherProxy differ only by sender. Lets unify them to the same publisher, passing sender object as an argument to init method. We can construct senders in ZmqClient along with needed publisher.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"zmq \u003d zmq_async.import_zmq()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class DealerPublisherProxy(object):"},{"line_number":33,"context_line":"    \"\"\"Non-CALL publisher via proxy.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, conf, matchmaker, sockets_manager):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a65fe13f","line":32,"in_reply_to":"3aaa91ec_e026fccc","updated":"2016-06-24 15:06:37.000000000","message":"DealerPublisher is derived from QueuedSender, so they are actually different. I am not sure whether we can merge them into a single class.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        )"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class CallSenderProxy(zmq_dealer_call_publisher.CallSender):"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def __init__(self, conf, matchmaker, sockets_manager, sender,"},{"line_number":71,"context_line":"                 reply_waiter):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_60c84c23","line":68,"updated":"2016-06-23 12:08:25.000000000","message":"We need to eliminate this class by moving everything related to message send to SenderProxy and other staff goes to publisher or reply_waiter.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        )"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class CallSenderProxy(zmq_dealer_call_publisher.CallSender):"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def __init__(self, conf, matchmaker, sockets_manager, sender,"},{"line_number":71,"context_line":"                 reply_waiter):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d7c0dd2c","line":68,"in_reply_to":"3aaa91ec_60c84c23","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def _connect_socket(self, target):"},{"line_number":80,"context_line":"        return self.socket"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _recv_reply(self, socket):"},{"line_number":83,"context_line":"        empty \u003d socket.recv()"},{"line_number":84,"context_line":"        assert empty \u003d\u003d b\u0027\u0027, \"Empty expected!\""},{"line_number":85,"context_line":"        reply_id \u003d socket.recv()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a036b44f","line":82,"updated":"2016-06-23 12:08:25.000000000","message":"This kind of method goes to reply_waiter","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def _connect_socket(self, target):"},{"line_number":80,"context_line":"        return self.socket"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _recv_reply(self, socket):"},{"line_number":83,"context_line":"        empty \u003d socket.recv()"},{"line_number":84,"context_line":"        assert empty \u003d\u003d b\u0027\u0027, \"Empty expected!\""},{"line_number":85,"context_line":"        reply_id \u003d socket.recv()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_7513e166","line":82,"in_reply_to":"3aaa91ec_a036b44f","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"}],"oslo_messaging/_drivers/zmq_driver/client/publishers/zmq_publisher_base.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    Publisher can send request objects from zmq_request."},{"line_number":57,"context_line":"    \"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, sockets_manager):"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        \"\"\"Construct publisher"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a3e99e82","line":59,"updated":"2016-06-23 12:08:25.000000000","message":"Here we can pass sender and store it as self.sender \u003d sender.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    Publisher can send request objects from zmq_request."},{"line_number":57,"context_line":"    \"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, sockets_manager):"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        \"\"\"Construct publisher"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_af217fb6","line":59,"in_reply_to":"3aaa91ec_a3e99e82","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        :type request: zmq_request.Request"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _send_request(self, socket, request):"},{"line_number":83,"context_line":"        \"\"\"Send request to consumer."},{"line_number":84,"context_line":"        Helper private method which defines basic sending behavior."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c3502a61","line":82,"updated":"2016-06-23 12:08:25.000000000","message":"This method is out of publisher now (only a sender knows how to send message on a socket). Lets remove it.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        :type request: zmq_request.Request"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _send_request(self, socket, request):"},{"line_number":83,"context_line":"        \"\"\"Send request to consumer."},{"line_number":84,"context_line":"        Helper private method which defines basic sending behavior."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_cf268bcd","line":82,"in_reply_to":"3aaa91ec_c3502a61","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.sockets_manager.cleanup()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class SocketsManager(object):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def __init__(self, conf, matchmaker, listener_type, socket_type):"},{"line_number":106,"context_line":"        self.conf \u003d conf"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a3a07e44","line":103,"updated":"2016-06-23 12:08:25.000000000","message":"Please move SocketsManager to it\u0027s own module","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.sockets_manager.cleanup()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class SocketsManager(object):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def __init__(self, conf, matchmaker, listener_type, socket_type):"},{"line_number":106,"context_line":"        self.conf \u003d conf"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_2f358ff6","line":103,"in_reply_to":"3aaa91ec_a3a07e44","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def __init__(self, sockets_manager, sender):"},{"line_number":181,"context_line":"        super(QueuedSender, self).__init__(sockets_manager)"},{"line_number":182,"context_line":"        self.sender \u003d sender"},{"line_number":183,"context_line":"        self.queue, self.empty_exception \u003d zmq_async.get_queue()"},{"line_number":184,"context_line":"        self.executor \u003d zmq_async.get_executor(self.run_loop)"},{"line_number":185,"context_line":"        self.executor.execute()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c385caad","line":182,"updated":"2016-06-23 12:08:25.000000000","message":"pass sender to a base class","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def __init__(self, sockets_manager, sender):"},{"line_number":181,"context_line":"        super(QueuedSender, self).__init__(sockets_manager)"},{"line_number":182,"context_line":"        self.sender \u003d sender"},{"line_number":183,"context_line":"        self.queue, self.empty_exception \u003d zmq_async.get_queue()"},{"line_number":184,"context_line":"        self.executor \u003d zmq_async.get_executor(self.run_loop)"},{"line_number":185,"context_line":"        self.executor.execute()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_4f19fb87","line":182,"in_reply_to":"3aaa91ec_c385caad","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.sockets_manager.cleanup()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class QueuedSender(PublisherBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, sockets_manager, sender):"},{"line_number":87,"context_line":"        super(QueuedSender, self).__init__(sockets_manager, sender)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_db2ee3a3","line":84,"updated":"2016-06-26 16:34:55.000000000","message":"Lets make QueuedSender not a part of publishers hierarchy. It definitely relates to a sender. So my proposal is to make each sender optionally to be a Queued or not by creating this QueuedSender object in a sender.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.sockets_manager.cleanup()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class QueuedSender(PublisherBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, sockets_manager, sender):"},{"line_number":87,"context_line":"        super(QueuedSender, self).__init__(sockets_manager, sender)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_4c733f16","line":84,"in_reply_to":"3aaa91ec_db2ee3a3","updated":"2016-06-27 13:47:31.000000000","message":"Done","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"eebcb58d038528e27d29b523269f0c6a9347788d","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def cleanup(self):"},{"line_number":80,"context_line":"        \"\"\"Cleanup publisher. Close allocated connections.\"\"\""},{"line_number":81,"context_line":"        self.sender.cleanup()"},{"line_number":82,"context_line":"        self.sockets_manager.cleanup()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_60524515","line":81,"updated":"2016-07-04 15:24:34.000000000","message":"Why do we remove this?","commit_id":"e443be1f47e5587fcd699afc55de9c91b22bf6da"}],"oslo_messaging/_drivers/zmq_driver/client/zmq_client.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"e99889c4de81db38336157ae7ec162c14c741837","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            publishers\u003d{"},{"line_number":142,"context_line":"                zmq_names.CALL_TYPE:"},{"line_number":143,"context_line":"                    zmq_dealer_publisher_proxy.DealerCallPublisherProxy("},{"line_number":144,"context_line":"                        self.sockets_manager, sender, receiver"},{"line_number":145,"context_line":"                    ),"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                \"default\":"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_be162cef","line":144,"range":{"start_line":144,"start_character":46,"end_line":144,"end_character":52},"updated":"2016-06-27 19:12:22.000000000","message":"I suppose currently tempest is broken because we\u0027ve ignored queued parameter creating senders, so they are all non-queued. Lets restore queued for this sender so we have the same behaviour as we had before refactoring.","commit_id":"b696f9caac03434c17c6a17093faa110797b0ecb"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"d71fc3ff6296623c009d5e825c4b275e8fc92c50","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            publishers\u003d{"},{"line_number":142,"context_line":"                zmq_names.CALL_TYPE:"},{"line_number":143,"context_line":"                    zmq_dealer_publisher_proxy.DealerCallPublisherProxy("},{"line_number":144,"context_line":"                        self.sockets_manager, sender, receiver"},{"line_number":145,"context_line":"                    ),"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                \"default\":"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_f37d86b2","line":144,"range":{"start_line":144,"start_character":46,"end_line":144,"end_character":52},"in_reply_to":"3aaa91ec_be162cef","updated":"2016-06-27 21:44:09.000000000","message":"The behavior won\u0027t be the same since QueuedSender is only responsible for storing messages in a queue and sending them in a background thread. It was also establishing connections before (also in background). Now we get and connect sockets in the main thread, which may lead to blocking when matchmaker has no available hosts (due to continuous retrying in redis). So some functional tests fail from time to time due to timeouts (not on asserts, mainly on cleanUp when a control cast message is being sent to a stopped server). I don\u0027t like this behavior and I think we should eliminate retrying on empty result: if there are no hosts in redis at the moment, then a message is just discarded (like it is implemented in rabbit, which simply discards messages with routing keys that don\u0027t have any queues bound with them).","commit_id":"b696f9caac03434c17c6a17093faa110797b0ecb"}],"oslo_messaging/_drivers/zmq_driver/client/zmq_senders.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                self._send_request(socket, request)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            self._send_request(socket, request)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class RoutingTable(object):"},{"line_number":92,"context_line":"    \"\"\"This class implements local routing-table cache"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_8e0da992","line":89,"updated":"2016-06-23 12:08:25.000000000","message":"Lets also introduce some kind of ReplySender here and use it on consumer side to send a reply.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                self._send_request(socket, request)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            self._send_request(socket, request)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class RoutingTable(object):"},{"line_number":92,"context_line":"    \"\"\"This class implements local routing-table cache"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_be2de8a9","line":89,"in_reply_to":"3aaa91ec_8e0da992","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            self._send_request(socket, request)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class RoutingTable(object):"},{"line_number":92,"context_line":"    \"\"\"This class implements local routing-table cache"},{"line_number":93,"context_line":"        taken from matchmaker. Its purpose is to give the next routable"},{"line_number":94,"context_line":"        host id (remote DEALER\u0027s id) by request for specific target in"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_c35aea4f","line":91,"updated":"2016-06-23 12:08:25.000000000","message":"Please move routing table to it\u0027s own module","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            self._send_request(socket, request)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class RoutingTable(object):"},{"line_number":92,"context_line":"    \"\"\"This class implements local routing-table cache"},{"line_number":93,"context_line":"        taken from matchmaker. Its purpose is to give the next routable"},{"line_number":94,"context_line":"        host id (remote DEALER\u0027s id) by request for specific target in"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_a164f3e4","line":91,"in_reply_to":"3aaa91ec_c35aea4f","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.routing_table \u003d zmq_routing_table.RoutingTable(conf, matchmaker)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_routing_keys(self, request):"},{"line_number":46,"context_line":"        if request.msg_type in zmq_names.DIRECT_TYPES:"},{"line_number":47,"context_line":"            return [self.routing_table.get_routable_host(request.target)]"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return [zmq_address.target_to_subscribe_filter(request.target)] \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_d749b632","line":46,"updated":"2016-06-26 16:34:55.000000000","message":"This logic should be a publisher\u0027s responsibility. When we will make acks for e.g. fanout  we need to have control over each message sending/retrying.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.routing_table \u003d zmq_routing_table.RoutingTable(conf, matchmaker)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_routing_keys(self, request):"},{"line_number":46,"context_line":"        if request.msg_type in zmq_names.DIRECT_TYPES:"},{"line_number":47,"context_line":"            return [self.routing_table.get_routable_host(request.target)]"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return [zmq_address.target_to_subscribe_filter(request.target)] \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_8f29998c","line":46,"in_reply_to":"3aaa91ec_d749b632","updated":"2016-06-27 13:47:31.000000000","message":"Done","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"a61f91141d4b44945012bc62288be9362d731e65","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                self.routing_table.get_all_hosts(request.target)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def send(self, socket, request):"},{"line_number":54,"context_line":"        for routing_key in self._get_routing_keys(request):"},{"line_number":55,"context_line":"            socket.send(b\u0027\u0027, zmq.SNDMORE)"},{"line_number":56,"context_line":"            socket.send(six.b(str(request.msg_type)), zmq.SNDMORE)"},{"line_number":57,"context_line":"            socket.send(six.b(routing_key), zmq.SNDMORE)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_d7f7f6d0","line":54,"updated":"2016-06-26 16:34:55.000000000","message":"Please move this for-loop to a publisher and leave only a plain single send for sender, because sender\u0027s responsibility is message format.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"2a5726b7216cd3c4a0bce244a4a069eaf021b3a4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                self.routing_table.get_all_hosts(request.target)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def send(self, socket, request):"},{"line_number":54,"context_line":"        for routing_key in self._get_routing_keys(request):"},{"line_number":55,"context_line":"            socket.send(b\u0027\u0027, zmq.SNDMORE)"},{"line_number":56,"context_line":"            socket.send(six.b(str(request.msg_type)), zmq.SNDMORE)"},{"line_number":57,"context_line":"            socket.send(six.b(routing_key), zmq.SNDMORE)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_ef1e5d5e","line":54,"in_reply_to":"3aaa91ec_d7f7f6d0","updated":"2016-06-27 13:47:31.000000000","message":"Done","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"}],"oslo_messaging/_drivers/zmq_driver/client/zmq_waiters.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"7385aac7b6a83d0160906d1b3261896b76029caa","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":29,"context_line":"class WaiterBase(object):"},{"line_number":30,"context_line":"    \"\"\"Base response waiting interface.\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_cecb3152","line":29,"updated":"2016-06-23 12:08:25.000000000","message":"Lets rename waiters to receivers, so we can have Sender/Receiver pair.","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"77021c12b46fa6dd0a83b71c90f75984d4c7678b","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":29,"context_line":"class WaiterBase(object):"},{"line_number":30,"context_line":"    \"\"\"Base response waiting interface.\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d5545522","line":29,"in_reply_to":"3aaa91ec_cecb3152","updated":"2016-06-24 15:06:37.000000000","message":"Done","commit_id":"9214ac2514cbd1248e606ec2b9c4e5c815eda60e"}],"oslo_messaging/_drivers/zmq_driver/zmq_updater.py":[{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"47da936c9c9c7f48f8d48b002c1540428cb55d8c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.conf \u003d conf"},{"line_number":32,"context_line":"        self.matchmaker \u003d matchmaker"},{"line_number":33,"context_line":"        self.update_method \u003d update_method"},{"line_number":34,"context_line":"        # make first update immediately"},{"line_number":35,"context_line":"        self.update_method()"},{"line_number":36,"context_line":"        self.executor \u003d zmq_async.get_executor(method\u003dself._update_loop)"},{"line_number":37,"context_line":"        self.executor.execute()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_bab5f17e","line":34,"range":{"start_line":34,"start_character":8,"end_line":34,"end_character":9},"updated":"2016-06-24 16:01:20.000000000","message":"Without this line unit-tests testing calls don\u0027t pass since actual message sending (and getting available hosts from a matchmaker) happens before  an executor of a server\u0027s target updater starts working, so we get an empty list of hosts.","commit_id":"7e4ebb4b1f490df62bcdb760b38b8f7a022a46a8"}]}
