)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"72bf7634e11d0ec107877b991f23b3fcdf34d100","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow to requeue the notification message"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch allow to requeue the notification received by the"},{"line_number":10,"context_line":"notification listener."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial implements blueprint notification-subscriber-server"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAVn%2F%2F5dM%3D","line":10,"updated":"2014-03-03 15:53:56.000000000","message":"There are subtleties in this patch which really deserved to be described in the commit message - e.g. the change to duplicate message detection\n\nThere should also have been a brief description of what the new API looks like - i.e. \"return REQUEUE from a endpoint function\"","commit_id":"d8d2ad95d79bad991b471e97a6b7985552aba91b"}],"oslo/messaging/_drivers/amqp.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"72bf7634e11d0ec107877b991f23b3fcdf34d100","unresolved":false,"context_lines":[{"line_number":319,"context_line":"           before ack is returned. This method prevents doing it."},{"line_number":320,"context_line":"        \"\"\""},{"line_number":321,"context_line":"        if UNIQUE_ID in message_data:"},{"line_number":322,"context_line":"            msg_id \u003d message_data.get(UNIQUE_ID)"},{"line_number":323,"context_line":"            if msg_id in self.prev_msgids:"},{"line_number":324,"context_line":"                raise rpc_common.DuplicateMessageError(msg_id\u003dmsg_id)"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVn%2F%2F5dA%3D","line":322,"updated":"2014-03-03 15:53:56.000000000","message":"This change from pop() to get() is a problem - we should not leak the _unique_id field out of the driver. I\u0027ll submit a follow-up patch to fix this.","commit_id":"d8d2ad95d79bad991b471e97a6b7985552aba91b"}],"oslo/messaging/_drivers/amqpdriver.py":[{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"c473d387cb33d776355eb9415c26e3274c3061aa","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            self._send_reply(conn, ending\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def requeue(self):"},{"line_number":70,"context_line":"        self.listener.msg_id_cache.remove(self.message)"},{"line_number":71,"context_line":"        self.requeue_callback()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B%2F8Y%3D","line":70,"updated":"2014-02-17 18:22:24.000000000","message":"Does this mean that requeue() will only ever be called serially (never concurrently and never concurrently with receiving subsequent messages)?\n\nWhat happens if the connection is lost between receiving the message and requeing it?","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"adf290eead720cab1df65a1475fba89d0fd5a73f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            self._send_reply(conn, ending\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def requeue(self):"},{"line_number":70,"context_line":"        self.listener.msg_id_cache.remove(self.message)"},{"line_number":71,"context_line":"        self.requeue_callback()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B6Sk%3D","line":70,"in_reply_to":"AAAAUX%2F%2B%2F8Y%3D","updated":"2014-02-18 09:04:18.000000000","message":"Hum, ok, when I have added the cache removal and seen the comment of the MsgCache class, something bothered me. Now I catch the point, I will update the way that message cache is update/checked to ensure the concurrently works when we lost the server.","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"50378376dacad0f7a7710121c185312ef10f8daa","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            self._send_reply(conn, ending\u003dTrue)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def requeue(self):"},{"line_number":70,"context_line":"        self.listener.msg_id_cache.remove(self.message)"},{"line_number":71,"context_line":"        self.requeue_callback()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2Bj%2B4%3D","line":70,"in_reply_to":"AAAAUX%2F%2B6Sk%3D","updated":"2014-02-20 14:08:51.000000000","message":"I have change this in latest patch, It fix the concurrent issue.","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"990db8d61dc44851f86846a547dc6524f4f274dd","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def requeue(self):"},{"line_number":74,"context_line":"        # NOTE(sileht): In case of the connection is lost between receiving the"},{"line_number":75,"context_line":"        # message and requeing it, this requeue call fail"},{"line_number":76,"context_line":"        # but because the message is not acknowledged and not added to the"},{"line_number":77,"context_line":"        # msg_id_cache, the message will be reconsumed, the only difference is"},{"line_number":78,"context_line":"        # the message stay at the beginning of the queue instead of moving to"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F4%2B8%3D","line":75,"updated":"2014-02-27 15:15:58.000000000","message":"What do you mean by \u0027fail\u0027 in this context? Is it just that the operation is ignored and is in essence a noop? Or might it throw some exception? or could it accidentally requeue a different delivery if the delivery tags were reused on the new subscription in some way? The first of these would be hramless (I just don\u0027t know enough aboutthe internals of kombu to say which of these it will be).","commit_id":"b881828a446a549745138c9a1e3bfe3b45d0b6ff"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"e52a5915230f6cc5edd81b33231a231113578bc6","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def requeue(self):"},{"line_number":74,"context_line":"        # NOTE(sileht): In case of the connection is lost between receiving the"},{"line_number":75,"context_line":"        # message and requeing it, this requeue call fail"},{"line_number":76,"context_line":"        # but because the message is not acknowledged and not added to the"},{"line_number":77,"context_line":"        # msg_id_cache, the message will be reconsumed, the only difference is"},{"line_number":78,"context_line":"        # the message stay at the beginning of the queue instead of moving to"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2FzGs%3D","line":75,"in_reply_to":"AAAAVX%2F%2F4%2B8%3D","updated":"2014-02-28 11:39:34.000000000","message":"This call raise an exception, like the acknowledge one.\nBut I think you have point something is missing to handle the exception when ack or requeue the message. I guess something into executor to log it and continue. I will propose an other patch for that.","commit_id":"b881828a446a549745138c9a1e3bfe3b45d0b6ff"},{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"9969fa1f81ea7df426b643e4e3120df7ab6d4937","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def requeue(self):"},{"line_number":74,"context_line":"        # NOTE(sileht): In case of the connection is lost between receiving the"},{"line_number":75,"context_line":"        # message and requeing it, this requeue call fail"},{"line_number":76,"context_line":"        # but because the message is not acknowledged and not added to the"},{"line_number":77,"context_line":"        # msg_id_cache, the message will be reconsumed, the only difference is"},{"line_number":78,"context_line":"        # the message stay at the beginning of the queue instead of moving to"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2FxHc%3D","line":75,"in_reply_to":"AAAAVX%2F%2FxVE%3D","updated":"2014-02-28 12:25:33.000000000","message":"I think catching it and ignoring it in impl_rabbit might be better. As you say in the comment above, the message will be implicitly requeued since unacknowledged so there is no real value in raising the exception to the application. (Having different behaviour wrt the two executors seems less than ideal also, especially for something like this that would be quite rare so not obvious. That is a separate concern though, especially if you prevent the requeue callback throwing). \n\nJust my 2 cents as usual of course :-)","commit_id":"b881828a446a549745138c9a1e3bfe3b45d0b6ff"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b1c587d71ce5a52327697f00106f0956cc71b8cb","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def requeue(self):"},{"line_number":74,"context_line":"        # NOTE(sileht): In case of the connection is lost between receiving the"},{"line_number":75,"context_line":"        # message and requeing it, this requeue call fail"},{"line_number":76,"context_line":"        # but because the message is not acknowledged and not added to the"},{"line_number":77,"context_line":"        # msg_id_cache, the message will be reconsumed, the only difference is"},{"line_number":78,"context_line":"        # the message stay at the beginning of the queue instead of moving to"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2FxVE%3D","line":75,"in_reply_to":"AAAAVX%2F%2FzGs%3D","updated":"2014-02-28 11:58:57.000000000","message":"The blocking executor just stop and raise the exception, this is the desired behavior I think, the eventlet one already log it and continue, so this is fine too.","commit_id":"b881828a446a549745138c9a1e3bfe3b45d0b6ff"}],"oslo/messaging/_drivers/base.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"ef6c247bfc9b9564ccc1d3ee16d90abebd4ce1a4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def acknowledge(self):"},{"line_number":41,"context_line":"        \"Acknowledge the message.\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def requeue(self):"},{"line_number":44,"context_line":"        \"Requeue the message.\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Flsw%3D","line":43,"updated":"2014-02-25 19:29:53.000000000","message":"Should this method be abstract, so the driver has to make the explicit decision about whether or not to support it?","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"de9afcc205f00fec17a8761c8e9e9fe274654450","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def acknowledge(self):"},{"line_number":41,"context_line":"        \"Acknowledge the message.\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def requeue(self):"},{"line_number":44,"context_line":"        \"Requeue the message.\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fgrg%3D","line":43,"in_reply_to":"AAAAU3%2F%2Flsw%3D","updated":"2014-02-26 08:00:02.000000000","message":"Done","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"}],"oslo/messaging/_drivers/impl_fake.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"c5e094416c983057cd90132a7bc11ea896c487a6","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class FakeIncomingMessage(base.IncomingMessage):"},{"line_number":29,"context_line":"    def __init__(self, listener, ctxt, message, topic, server, fanout,"},{"line_number":30,"context_line":"                 reply_q):"},{"line_number":31,"context_line":"        super(FakeIncomingMessage, self).__init__(listener, ctxt, message)"},{"line_number":32,"context_line":"        self._topic \u003d topic"},{"line_number":33,"context_line":"        self._server \u003d server"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FDQ0%3D","line":30,"updated":"2014-02-17 12:54:26.000000000","message":"Not loving the information leakage here - i.e. the message needing to know about the target\n\nCould we have the exchange pass a requeue callback?\n\ni.e.\n\n  def requeue():\n      self.deliver_message(topic, ctxt, message, server, fanout, reply_q)\n\n  queue.append((ctxt, message, reply_q, requeue))","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1dfdb7022e42e345bca4b11f1bdf2334463a4108","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class FakeIncomingMessage(base.IncomingMessage):"},{"line_number":29,"context_line":"    def __init__(self, listener, ctxt, message, topic, server, fanout,"},{"line_number":30,"context_line":"                 reply_q):"},{"line_number":31,"context_line":"        super(FakeIncomingMessage, self).__init__(listener, ctxt, message)"},{"line_number":32,"context_line":"        self._topic \u003d topic"},{"line_number":33,"context_line":"        self._server \u003d server"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FCuw%3D","line":30,"in_reply_to":"AAAAUX%2F%2FDQ0%3D","updated":"2014-02-17 15:31:11.000000000","message":"Why not. Done","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"6017f579b5c301b99680a9ab1630f23c7e19b059","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class FakeIncomingMessage(base.IncomingMessage):"},{"line_number":29,"context_line":"    def __init__(self, listener, ctxt, message, topic, server, fanout,"},{"line_number":30,"context_line":"                 reply_q):"},{"line_number":31,"context_line":"        super(FakeIncomingMessage, self).__init__(listener, ctxt, message)"},{"line_number":32,"context_line":"        self._topic \u003d topic"},{"line_number":33,"context_line":"        self._server \u003d server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FB8M%3D","line":30,"updated":"2014-02-17 14:58:39.000000000","message":"Would prefer to be passed a requeue callback","commit_id":"d79e3db4544f9aba09e2c080110f8510f0ec74d6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5787d484693e81e6b0c23bdc1c50648336a20337","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class FakeIncomingMessage(base.IncomingMessage):"},{"line_number":29,"context_line":"    def __init__(self, listener, ctxt, message, topic, server, fanout,"},{"line_number":30,"context_line":"                 reply_q):"},{"line_number":31,"context_line":"        super(FakeIncomingMessage, self).__init__(listener, ctxt, message)"},{"line_number":32,"context_line":"        self._topic \u003d topic"},{"line_number":33,"context_line":"        self._server \u003d server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FBwI%3D","line":30,"in_reply_to":"AAAAUX%2F%2FB8M%3D","updated":"2014-02-17 15:30:44.000000000","message":"Done","commit_id":"d79e3db4544f9aba09e2c080110f8510f0ec74d6"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"ef6c247bfc9b9564ccc1d3ee16d90abebd4ce1a4","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                queues \u003d [self._get_topic_queue(topic)]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            def requeue():"},{"line_number":85,"context_line":"                self.deliver_message(topic, ctxt, message, server\u003dserver,"},{"line_number":86,"context_line":"                                     fanout\u003dfanout, reply_q\u003dreply_q)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            for queue in queues:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Flrg%3D","line":85,"updated":"2014-02-25 19:29:53.000000000","message":"Is there any chance of this callback being invoked while self._queues_lock is still held? Does that need to be an RLock to allow reentrant locking?","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"de9afcc205f00fec17a8761c8e9e9fe274654450","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                queues \u003d [self._get_topic_queue(topic)]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            def requeue():"},{"line_number":85,"context_line":"                self.deliver_message(topic, ctxt, message, server\u003dserver,"},{"line_number":86,"context_line":"                                     fanout\u003dfanout, reply_q\u003dreply_q)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            for queue in queues:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2FgvQ%3D","line":85,"in_reply_to":"AAAAU3%2F%2Flrg%3D","updated":"2014-02-26 08:00:02.000000000","message":"Yes, it can, It have changed it to a RLock.","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"}],"oslo/messaging/_drivers/impl_qpid.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"c5e094416c983057cd90132a7bc11ea896c487a6","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    @staticmethod"},{"line_number":102,"context_line":"    def requeue():"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeue messages\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class ConsumerBase(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FDPo%3D","line":104,"updated":"2014-02-17 12:54:26.000000000","message":"This disturbs me\n\nAt the very least, I think we need some very explicit documentation associated with RequeueMessageException that warns people that some message transports will not implement this\n\nAnd ... what are the semantics with qpid if you don\u0027t acknowledge a message?","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1dfdb7022e42e345bca4b11f1bdf2334463a4108","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    @staticmethod"},{"line_number":102,"context_line":"    def requeue():"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeue messages\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class ConsumerBase(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FBk8%3D","line":104,"in_reply_to":"AAAAUX%2F%2FDPo%3D","updated":"2014-02-17 15:31:11.000000000","message":"This method now acknowledge the message before raise the exception. And the documentation and the error message have been improved.","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"1a2b526c5d79575d2cd178684f490128367cab81","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def requeue(self):"},{"line_number":102,"context_line":"        self.acknowledge()"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeuing messages (the message has been \u0027"},{"line_number":105,"context_line":"                                  \u0027acknowledged instead)\u0027)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2FAVs%3D","line":103,"updated":"2014-02-17 18:04:52.000000000","message":"Though clearly not intended to be actually used in this form, this seems a little illogical to me. A request to requeue is the opposite of an acknowledgement (nack v. ack), so why acknowledge \u0027instead\u0027? I think a simple raise NotImplementedError(\u0027The QPID driver has not been update to support requeue\u0027) would be more obvious[1].\n\nFWIW, to \u0027requeue\u0027 over AMQP 0-10 you issue a release, which with the qpid.messaging client would be:\n\n  self._session.acknowledge(self._raw_message, Disposition(RELEASED))\n\n(You can optionally indicate whether to mark the message redelivered next time it gets delivered).\n\nThis won\u0027t do anything at present in impl_qpid.py for the same reason that acknowledge() won\u0027t do anything at present - the subscriptions are not requested to have acknowledgement enabled.\n\n[1] Any service that uses this feature will require its users to switch to rabbitmq if they are not already using it. I know this concern has been deferred to another blueprint, but since that seems likely to cause some unintended headaches, I\u0027ll repeat it here in passing ;-)","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"bd5957d66aea8334cbefe12a0aa60d39241b7b35","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def requeue(self):"},{"line_number":102,"context_line":"        self.acknowledge()"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeuing messages (the message has been \u0027"},{"line_number":105,"context_line":"                                  \u0027acknowledged instead)\u0027)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B5z0%3D","line":103,"in_reply_to":"AAAAUX%2F%2B6t8%3D","updated":"2014-02-18 10:11:05.000000000","message":"I suggested above that a simple raise NotImplementedError(\u0027The QPID driver has not been updated to support requeue\u0027) would be more obvious than trying to acknowledge.\n\nWhile I still think that is true, I wonder if it would be even \u0027better\u0027 to simply log an error. \n\nThe code using this feature will have thrown an exception, so control will have moved away from the context where they could perhaps handle the lack of the expected/desired feature. Is there anything that can be done apart from simply logging the issue and either exiting or continuing? And of these last two, is continuing perhaps not the better option? This way, while expectations would not be met, and the unprocessed message would not be redelivered, it would be no worse than if an exception is thrown and perhaps lightly better, since the while thing won\u0027t grind to a stop.\n\n(The safest thing would be to have some way of requesting/enabling this feature at startup, and throw the error there where it can be caught and handled, or where the service relying on it can exit before anything is lost. https://blueprints.launchpad.net/oslo.messaging/+spec/notification-listener-qos describes that more generally).\n\nI do agree entirely that the total lack of automated test coverage leaves one very nervous about making any changes! I plan to attempt to start trying to address this soon.","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"adf290eead720cab1df65a1475fba89d0fd5a73f","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def requeue(self):"},{"line_number":102,"context_line":"        self.acknowledge()"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeuing messages (the message has been \u0027"},{"line_number":105,"context_line":"                                  \u0027acknowledged instead)\u0027)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B6t8%3D","line":103,"in_reply_to":"AAAAUX%2F%2FAVs%3D","updated":"2014-02-18 09:04:18.000000000","message":"I understand your point, but the rpc layer of oslo-incubator already have this limitation (even worse, the message is silently ack instead of requeue but without any traceback/error/warning,).\n\nDo you prefer I issue the release ? even it do nothing ? Should I removed the NotImplementedError ?\n\nI\u0027m very afraid about coding anything into the qpid driver, because my knowledge is limited, I have no working setup and the code coverage is zero, and I don\u0027t want to break this driver.\n\nThis is why I have preferred to defer the work. Also the usage of this feature in ceilometer is optional, you need to enable the event part of ceilometer and configure that you want reprocess message that have failed to store in database. And both are disable by default.","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"72bf7634e11d0ec107877b991f23b3fcdf34d100","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def requeue(self):"},{"line_number":103,"context_line":"        raise NotImplementedError(\u0027The QPID driver does not yet support \u0027"},{"line_number":104,"context_line":"                                  \u0027requeuing messages\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class ConsumerBase(object):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVn%2F%2F5b8%3D","line":104,"updated":"2014-03-03 15:53:56.000000000","message":"I really don\u0027t like that there is no way for the application to know in advance that a driver doesn\u0027t support its needs. I\u0027ll submit a follow-on suggestion for that.","commit_id":"d8d2ad95d79bad991b471e97a6b7985552aba91b"}],"oslo/messaging/_drivers/impl_zmq.py":[{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"1a2b526c5d79575d2cd178684f490128367cab81","unresolved":false,"context_lines":[{"line_number":846,"context_line":"    def requeue(self):"},{"line_number":847,"context_line":"        raise NotImplementedError(\u0027The ZeroMQ driver does not yet support \u0027"},{"line_number":848,"context_line":"                                  \u0027requeuing messages (the message has been \u0027"},{"line_number":849,"context_line":"                                  \u0027acknowledged instead)\u0027)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"class ZmqListener(base.Listener):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2FATk%3D","line":849,"updated":"2014-02-17 18:04:52.000000000","message":"As with the qpid driver, I don\u0027t think the \u0027acknowledged instead\u0027 bit is helpful.","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"adf290eead720cab1df65a1475fba89d0fd5a73f","unresolved":false,"context_lines":[{"line_number":846,"context_line":"    def requeue(self):"},{"line_number":847,"context_line":"        raise NotImplementedError(\u0027The ZeroMQ driver does not yet support \u0027"},{"line_number":848,"context_line":"                                  \u0027requeuing messages (the message has been \u0027"},{"line_number":849,"context_line":"                                  \u0027acknowledged instead)\u0027)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"class ZmqListener(base.Listener):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B638%3D","line":849,"in_reply_to":"AAAAUX%2F%2FATk%3D","updated":"2014-02-18 09:04:18.000000000","message":"Done","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"}],"oslo/messaging/notify/dispatcher.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"c5e094416c983057cd90132a7bc11ea896c487a6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"},{"line_number":35,"context_line":"    requeue the message."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Only supported by drivers: fake://, rabbit://"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FDOI%3D","line":37,"updated":"2014-02-17 12:54:26.000000000","message":"Yeah, need more details about the implications of raising this exception when using other drivers","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1dfdb7022e42e345bca4b11f1bdf2334463a4108","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"},{"line_number":35,"context_line":"    requeue the message."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Only supported by drivers: fake://, rabbit://"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FBkU%3D","line":37,"in_reply_to":"AAAAUX%2F%2FDOI%3D","updated":"2014-02-17 15:31:11.000000000","message":"Done","commit_id":"823e43d1ebd701187c70488882c539a6a5f9ae3d"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"6017f579b5c301b99680a9ab1630f23c7e19b059","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"},{"line_number":35,"context_line":"    requeue the message."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Only supported by drivers: fake://, rabbit://"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FB9E%3D","line":37,"updated":"2014-02-17 14:58:39.000000000","message":"More info needed on transport drivers which don\u0027t support requeue","commit_id":"d79e3db4544f9aba09e2c080110f8510f0ec74d6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5787d484693e81e6b0c23bdc1c50648336a20337","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"},{"line_number":35,"context_line":"    requeue the message."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Only supported by drivers: fake://, rabbit://"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FBkw%3D","line":37,"in_reply_to":"AAAAUX%2F%2FB9E%3D","updated":"2014-02-17 15:30:44.000000000","message":"Done","commit_id":"d79e3db4544f9aba09e2c080110f8510f0ec74d6"},{"author":{"_account_id":8784,"name":"Gordon Sim","email":"gsim@redhat.com","username":"gordonsim"},"change_message_id":"a03820fd2d010ec4fd44a5886c757c04d26c18be","unresolved":false,"context_lines":[{"line_number":28,"context_line":"PRIORITIES \u003d [\u0027audit\u0027, \u0027debug\u0027, \u0027info\u0027, \u0027warn\u0027, \u0027error\u0027, \u0027critical\u0027, \u0027sample\u0027]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RequeueMessageException(Exception):"},{"line_number":32,"context_line":"    \"\"\"Encapsulates an Requeue exception"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B%2B6I%3D","line":31,"updated":"2014-02-17 20:25:00.000000000","message":"This is the visible change to the API and therefore the hardest thing to change. As a suggestion, is there another name that would accurately cover all the intended cases where this would be raised? Something that is less of a request for action and more of an indication of an exceptional condition with regards to message processing? E.g. TemporaryProcessingFailure or something?\n\nIf there is, I think such a name might be better lend itself to more configurable, policy driven (and perhaps driver dependent) implementation in future.  It seems like that better separates the concerns, with whatever is using oslo.messaging indicating the condition and the messaging specific choices and policies controlled in this library and its configuration. (It\u0027s a subtle point, I accept, since its just a naming issue, but this name feels like a very specific action is being requested).","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"adf290eead720cab1df65a1475fba89d0fd5a73f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"PRIORITIES \u003d [\u0027audit\u0027, \u0027debug\u0027, \u0027info\u0027, \u0027warn\u0027, \u0027error\u0027, \u0027critical\u0027, \u0027sample\u0027]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RequeueMessageException(Exception):"},{"line_number":32,"context_line":"    \"\"\"Encapsulates an Requeue exception"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    Merely instantiating this exception will ask to the executor to"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUX%2F%2B64E%3D","line":31,"in_reply_to":"AAAAUX%2F%2B%2B6I%3D","updated":"2014-02-18 09:04:18.000000000","message":"TemporaryProcessingFailure looks good for me, too. This name works for the ceilometer purpose of this feature. \n\n@Markmc, do you agree for this name too ?","commit_id":"1e02846926e7d76027b595bf3c4b643f7a8022bf"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"121060cd7e715841bd3d04ddfa8823d47ead7d49","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        for callback in self._callbacks_by_priority.get(priority, []):"},{"line_number":120,"context_line":"            localcontext.set_local_context(ctxt)"},{"line_number":121,"context_line":"            try:"},{"line_number":122,"context_line":"                callback(ctxt, publisher_id, event_type, payload)"},{"line_number":123,"context_line":"            finally:"},{"line_number":124,"context_line":"                localcontext.clear_local_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2B3So%3D","line":121,"updated":"2014-02-18 14:49:50.000000000","message":"Mehdi - what do you think of just supporting a boolean return (e.g. \u0027handled\u0027?) here for requeue rather than the exception ?\n\ne.g.\n\n    handled \u003d callback(....)\n    if not (handled is None or handled):\n        raise RequeueMessageException(...)\n\nand then make RequeueMessageException private and not exposed in the API","commit_id":"6303b63303cbb416e064fc654bef0466f38a3499"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"31a0baaa363ecfded78cce8315fd153d1a3cd6c7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    Only supported by drivers: fake://, rabbit://"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    In case of an unsupported driver the message is even acknowledged and a"},{"line_number":45,"context_line":"    NotImplementedError is raised and logged."},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2BkHQ%3D","line":45,"updated":"2014-02-20 14:06:02.000000000","message":"I will remove this class and update the doc in the _dispatch method instead","commit_id":"326eb137897b6d89400df19e7dd633418d595239"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"ef6c247bfc9b9564ccc1d3ee16d90abebd4ce1a4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            else:"},{"line_number":76,"context_line":"                incoming.requeue()"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            raise Exception(\u0027Should never be reached\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _dispatch_and_handle_error(self, incoming):"},{"line_number":81,"context_line":"        \"\"\"Dispatch a notification message to the appropriate endpoint method."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Flp8%3D","line":78,"updated":"2014-02-25 19:29:53.000000000","message":"This is a strange sort of thing to be checking for if we think it won\u0027t happen.","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"de9afcc205f00fec17a8761c8e9e9fe274654450","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            else:"},{"line_number":76,"context_line":"                incoming.requeue()"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            raise Exception(\u0027Should never be reached\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _dispatch_and_handle_error(self, incoming):"},{"line_number":81,"context_line":"        \"\"\"Dispatch a notification message to the appropriate endpoint method."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2FgzI%3D","line":78,"in_reply_to":"AAAAU3%2F%2Flp8%3D","updated":"2014-02-26 08:00:02.000000000","message":"Yes I have removed it.","commit_id":"407fed42b89e894f347c2559087642ee0cae38eb"}],"oslo/messaging/notify/listener.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ae1be89646f83eca253034a8ede56891319375c0","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    \"\"\"Encapsulates an Requeue exception"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Merely instantiating this exception will ask to the executor to"},{"line_number":88,"context_line":"    requeue the message"},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2FPw4%3D","line":88,"updated":"2014-02-14 16:44:16.000000000","message":"\"Raise this from a notification listener endpoint method if the current message should be re-queued. Not that not all notification drivers or transports support this and the message may be lost.\"\n\nAlso need to hook this up to the docs","commit_id":"024d53e5c778c43b1de2f3a7cb519e05a6deca57"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"72bf7634e11d0ec107877b991f23b3fcdf34d100","unresolved":false,"context_lines":[{"line_number":78,"context_line":"message."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"The message is acknowledge only if all endpoints return"},{"line_number":81,"context_line":"messaging.NotificationResult.HANDLED"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"If nothing is returned by an endpoint, this is considered like"},{"line_number":84,"context_line":"messaging.NotificationResult.HANDLED"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVn%2F%2F5Is%3D","line":81,"updated":"2014-03-03 15:53:56.000000000","message":"This exposes that \u0027handled\u0027 is a little strange - if there are multiple endpoint functions to be invoked, you could argue that returning \u0027handled\u0027 from one of them suggests that subsequent functions should not be invoked.","commit_id":"d8d2ad95d79bad991b471e97a6b7985552aba91b"}]}
