)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"06d307ed71dd359f78049f5dbd7cd2731e32d95a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"      implementation of servers for RPC and notification, not different implementations"},{"line_number":21,"context_line":"      of dispatchers"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":" This patch fixes 1-st point"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":" Change-Id: Id6a48ff27f280d3c51541d9e279e73a5bff6bf96"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"dae33548_f56c89d1","line":23,"updated":"2016-02-18 20:56:31.000000000","message":"This is weird, 2 change-ids.","commit_id":"5df2b42010844895eebec475fc08661c9de8e564"}],"oslo_messaging/_drivers/protocols/amqp/driver.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2bfa0a71692945bf0365ca713c1816ffebd6aae4","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        with timeutils.StopWatch(timeout) as stop_watcher:"},{"line_number":134,"context_line":"            while self._started and not stop_watcher.expired():"},{"line_number":135,"context_line":"                try:"},{"line_number":136,"context_line":"                    message \u003d self.incoming.get(True, 0.25)"},{"line_number":137,"context_line":"                except moves.queue.Empty:"},{"line_number":138,"context_line":"                    continue"},{"line_number":139,"context_line":"                request, ctxt \u003d unmarshal_request(message)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_75b8792a","line":136,"updated":"2016-02-18 21:08:35.000000000","message":"Any reason why 0.25 instead of stop_watcher.leftover()","commit_id":"5df2b42010844895eebec475fc08661c9de8e564"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"5d1598ec46a9090b53be30d57401ec17bba0dc53","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        with timeutils.StopWatch(timeout) as stop_watcher:"},{"line_number":134,"context_line":"            while self._started and not stop_watcher.expired():"},{"line_number":135,"context_line":"                try:"},{"line_number":136,"context_line":"                    message \u003d self.incoming.get(True, 0.25)"},{"line_number":137,"context_line":"                except moves.queue.Empty:"},{"line_number":138,"context_line":"                    continue"},{"line_number":139,"context_line":"                request, ctxt \u003d unmarshal_request(message)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_cb6a5d1a","line":136,"in_reply_to":"dae33548_706b6785","updated":"2016-02-19 19:29:20.000000000","message":"Ok, will follow your idea.","commit_id":"5df2b42010844895eebec475fc08661c9de8e564"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"669436fcde9f450afe1e3a5dec1be3ad1348de34","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        with timeutils.StopWatch(timeout) as stop_watcher:"},{"line_number":134,"context_line":"            while self._started and not stop_watcher.expired():"},{"line_number":135,"context_line":"                try:"},{"line_number":136,"context_line":"                    message \u003d self.incoming.get(True, 0.25)"},{"line_number":137,"context_line":"                except moves.queue.Empty:"},{"line_number":138,"context_line":"                    continue"},{"line_number":139,"context_line":"                request, ctxt \u003d unmarshal_request(message)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_9079cb95","line":136,"in_reply_to":"dae33548_75b8792a","updated":"2016-02-18 21:20:54.000000000","message":"yes. if timeout is None for exemple self.incoming.get(stop_watcher.leftover()) will lock this method till new message comes to the queue. but if another thread will execute stop - poll method should interrupt listening and return None. So this allows check time to time is listener stopped or not.","commit_id":"5df2b42010844895eebec475fc08661c9de8e564"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3b7a28dd48a7c21b128ee5a4d8ee029535f8c62d","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        with timeutils.StopWatch(timeout) as stop_watcher:"},{"line_number":134,"context_line":"            while self._started and not stop_watcher.expired():"},{"line_number":135,"context_line":"                try:"},{"line_number":136,"context_line":"                    message \u003d self.incoming.get(True, 0.25)"},{"line_number":137,"context_line":"                except moves.queue.Empty:"},{"line_number":138,"context_line":"                    continue"},{"line_number":139,"context_line":"                request, ctxt \u003d unmarshal_request(message)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_706b6785","line":136,"in_reply_to":"dae33548_9079cb95","updated":"2016-02-18 21:26:45.000000000","message":"Sounds like u really want a shared event object then, although the incoming object then also needs to use that to so that another thread can do something like event.set() and this will release the other waiting thread that is waiting on incoming messages.","commit_id":"5df2b42010844895eebec475fc08661c9de8e564"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"846ce11b0b67e339beab522ab8a58ac659b2c4be","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        super(ProtonListener, self).__init__(driver.prefetch_size)"},{"line_number":121,"context_line":"        self.driver \u003d driver"},{"line_number":122,"context_line":"        self.incoming \u003d moves.queue.Queue()"},{"line_number":123,"context_line":"        self._started \u003d False"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def start(self):"},{"line_number":126,"context_line":"        self._started \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_2114daf3","line":123,"updated":"2016-02-19 15:09:49.000000000","message":"I agree with Joshua, self.incoming should be arounded with a threading.Event to notify when message are ready to read.\n\nThis bool should be a threading.Event() too, to be threadsafe. (I known that bool is ok with CPython for this purpose, but who for other python stack).","commit_id":"62322c86b46014ddea549e8a868598e828092dca"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"84f6b409b5ed6942a2c0679d4069bf1a9d974ea0","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        super(ProtonListener, self).__init__(driver.prefetch_size)"},{"line_number":121,"context_line":"        self.driver \u003d driver"},{"line_number":122,"context_line":"        self.incoming \u003d moves.queue.Queue()"},{"line_number":123,"context_line":"        self._started \u003d False"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def start(self):"},{"line_number":126,"context_line":"        self._started \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_2b4ae9c5","line":123,"in_reply_to":"bae84128_2114daf3","updated":"2016-02-19 19:28:06.000000000","message":"ok, clear about shared event. But what is the problem with self._started Boolean even if we are talking about  implementation on C++ or Java. Only volatile is needed there. Can you explain by example if I missed something","commit_id":"62322c86b46014ddea549e8a868598e828092dca"}],"oslo_messaging/_executors/impl_eventlet.py":[{"author":{"_account_id":13290,"name":"Oleksii Zamiatin","email":"ozamiatin@mirantis.com","username":"ozamiatin"},"change_message_id":"890a95890110ca8268bddeb263a7d198f0fa4aa3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import futurist"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class EventletExecutor(futurist.GreenThreadPoolExecutor):"},{"line_number":20,"context_line":"    \"\"\"A message executor which integrates with eventlet.\"\"\""},{"line_number":21,"context_line":"    executor_callback \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"dae33548_052f57a1","line":19,"updated":"2016-02-18 13:03:29.000000000","message":"Do we really still need this class?","commit_id":"b08bb3e3cb4a5e6e8180ec79f1a0eb1361cdf519"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"d972cfbc4530de5ab5d98787f56d0b471aeb4eea","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import futurist"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class EventletExecutor(futurist.GreenThreadPoolExecutor):"},{"line_number":20,"context_line":"    \"\"\"A message executor which integrates with eventlet.\"\"\""},{"line_number":21,"context_line":"    executor_callback \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"dae33548_ae80028c","line":19,"in_reply_to":"dae33548_052f57a1","updated":"2016-02-18 15:07:17.000000000","message":"It will be removed after merge of this patch:\nhttps://review.openstack.org/#/c/281173/","commit_id":"b08bb3e3cb4a5e6e8180ec79f1a0eb1361cdf519"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"576e8b4c385352f59d10345ca246853f2b59706f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(EventletExecutor, self).__init__(conf, listener, dispatcher)"},{"line_number":36,"context_line":"        eventletutils.warn_eventlet_not_patched("},{"line_number":37,"context_line":"            expected_patched_modules\u003d[\u0027thread\u0027],"},{"line_number":38,"context_line":"            what\u003d\"the \u0027oslo.messaging eventlet executor\u0027\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    _executor_cls \u003d futurist.GreenThreadPoolExecutor"},{"line_number":41,"context_line":"    _lock_cls \u003d greenthreading.Lock"}],"source_content_type":"text/x-python","patch_set":7,"id":"bae84128_ea493890","side":"PARENT","line":38,"updated":"2016-02-19 11:45:00.000000000","message":"We should continue to warn about that.","commit_id":"03888224a4e01b0c9af11a6db52417104b0f0991"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"ed39a8308795e219577cc0f6724ac15a321092e2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(EventletExecutor, self).__init__(conf, listener, dispatcher)"},{"line_number":36,"context_line":"        eventletutils.warn_eventlet_not_patched("},{"line_number":37,"context_line":"            expected_patched_modules\u003d[\u0027thread\u0027],"},{"line_number":38,"context_line":"            what\u003d\"the \u0027oslo.messaging eventlet executor\u0027\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    _executor_cls \u003d futurist.GreenThreadPoolExecutor"},{"line_number":41,"context_line":"    _lock_cls \u003d greenthreading.Lock"}],"source_content_type":"text/x-python","patch_set":7,"id":"bae84128_36f3850c","side":"PARENT","line":38,"in_reply_to":"bae84128_ea493890","updated":"2016-02-19 12:33:45.000000000","message":"Done","commit_id":"03888224a4e01b0c9af11a6db52417104b0f0991"}],"oslo_messaging/server.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"ea670c3ab24cd5ccd55a39fb169c18cd58f30d81","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def _submit_work(self, callback):"},{"line_number":349,"context_line":"        fut \u003d self._work_executor.submit(callback.run)"},{"line_number":350,"context_line":"        fut.add_done_callback(lambda f: callback.done())"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    @ordered(reset_after\u003d\u0027stop\u0027)"},{"line_number":353,"context_line":"    def start(self, override_pool_size\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"bae84128_06eeb0eb","line":350,"updated":"2016-02-22 14:20:54.000000000","message":"previously, it seems we always ensured callback was called even if self._work_executor.submit(callback.run) failed. do we want to keep this consistent to before and add try/except?","commit_id":"9b1b7ef671ecbce07cbb7b5b7cfb33bbd82bfa3f"},{"author":{"_account_id":8601,"name":"Dmitriy Ukhlov","email":"dukhlov@mirantis.com","username":"dukhlov"},"change_message_id":"4f59d2d27b28b4cb665b78c581a6b9eda43ea408","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def _submit_work(self, callback):"},{"line_number":349,"context_line":"        fut \u003d self._work_executor.submit(callback.run)"},{"line_number":350,"context_line":"        fut.add_done_callback(lambda f: callback.done())"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    @ordered(reset_after\u003d\u0027stop\u0027)"},{"line_number":353,"context_line":"    def start(self, override_pool_size\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"bae84128_ac836503","line":350,"in_reply_to":"bae84128_06eeb0eb","updated":"2016-02-22 15:00:17.000000000","message":"good catch, but I think that self._work_executor.submit(callback.run) itself shouldn\u0027t raise an exception (only in case of bug or unpredictable runtime error) and in this case message processing is not performed at all and possibly post process it (send ack for example as not it is) is undesired","commit_id":"9b1b7ef671ecbce07cbb7b5b7cfb33bbd82bfa3f"}]}
