)]}'
{"oslo/messaging/_executors/impl_trollius.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"4e00e077b258fa938c106befa472b3accba0e7fd","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            self.loop.run_forever()"},{"line_number":48,"context_line":"        except asyncio.CancelledError:"},{"line_number":49,"context_line":"            pass"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class TrolliusExecutor(base.ExecutorBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9uco%3D","line":49,"updated":"2014-02-04 16:33:39.000000000","message":"Do we really not care about this exception, or is it just not handled because this is WIP ? In the former case, a comment might be welcome.","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7984ab4933b598a6a3b9eab2113deed13f6c5cba","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            self.loop.run_forever()"},{"line_number":48,"context_line":"        except asyncio.CancelledError:"},{"line_number":49,"context_line":"            pass"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class TrolliusExecutor(base.ExecutorBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9uV4%3D","line":49,"in_reply_to":"AAAAUH%2F9uco%3D","updated":"2014-02-04 16:52:20.000000000","message":"Oh, this one can be removed. It\u0027s dead code from a previous version. I\u0027m not sure yet how to stop cleanly the event loop. I will work on that when I will be able to stop the listener properly (see change #I3815673a, add a timeout to Listener.poll).","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"4e00e077b258fa938c106befa472b3accba0e7fd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            self.loop \u003d None"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self.loop \u003d event_loop"},{"line_number":61,"context_line":"        if False:"},{"line_number":62,"context_line":"            self.thread_poll \u003d futures.ThreadPoolExecutor(5)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            self.thread_poll \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9ucY%3D","line":61,"updated":"2014-02-04 16:33:39.000000000","message":"So, what would be the real condition ?","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7984ab4933b598a6a3b9eab2113deed13f6c5cba","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            self.loop \u003d None"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self.loop \u003d event_loop"},{"line_number":61,"context_line":"        if False:"},{"line_number":62,"context_line":"            self.thread_poll \u003d futures.ThreadPoolExecutor(5)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            self.thread_poll \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9uVE%3D","line":61,"in_reply_to":"AAAAUH%2F9ucY%3D","updated":"2014-02-04 16:52:20.000000000","message":"As explained in the changelog, I disabled the thread pool because of a bug. In fact, the bug is the fact that a listener cannot be stopped, it\u0027s an unlimited loop. Again, I need a way to stop a listener, see change #I3815673a.","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"4e00e077b258fa938c106befa472b3accba0e7fd","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self.loop \u003d event_loop"},{"line_number":61,"context_line":"        if False:"},{"line_number":62,"context_line":"            self.thread_poll \u003d futures.ThreadPoolExecutor(5)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            self.thread_poll \u003d None"},{"line_number":65,"context_line":"        self._wait_stop \u003d threading.Event()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9ucU%3D","line":62,"updated":"2014-02-04 16:33:39.000000000","message":"Please use a variable to store \u00275\u0027 here, or name the argument.","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0addab03e382bb4837f6b997ecbbd470bbc69774","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self.loop \u003d event_loop"},{"line_number":61,"context_line":"        if False:"},{"line_number":62,"context_line":"            self.thread_poll \u003d futures.ThreadPoolExecutor(5)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            self.thread_poll \u003d None"},{"line_number":65,"context_line":"        self._wait_stop \u003d threading.Event()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9jTc%3D","line":62,"updated":"2014-02-06 04:28:13.000000000","message":"Probably thread_pool right, not thread_poll?","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7984ab4933b598a6a3b9eab2113deed13f6c5cba","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self.loop \u003d event_loop"},{"line_number":61,"context_line":"        if False:"},{"line_number":62,"context_line":"            self.thread_poll \u003d futures.ThreadPoolExecutor(5)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            self.thread_poll \u003d None"},{"line_number":65,"context_line":"        self._wait_stop \u003d threading.Event()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9uUc%3D","line":62,"in_reply_to":"AAAAUH%2F9ucU%3D","updated":"2014-02-04 16:52:20.000000000","message":"The parameter is called \"max_workers\" in ThreadPoolExecutor constructor. It can be an optional parameter to TrolliusExecutor constructor.","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0addab03e382bb4837f6b997ecbbd470bbc69774","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            self.thread_poll.submit(incoming.reply, result)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _dispatch(self, incoming):"},{"line_number":85,"context_line":"        if self.thread_poll is not None:"},{"line_number":86,"context_line":"            self._dispatch_thread(incoming)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            base.ExecutorBase._dispatch(self, incoming)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9jTU%3D","line":85,"updated":"2014-02-06 04:28:13.000000000","message":"Dead code again?","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0addab03e382bb4837f6b997ecbbd470bbc69774","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            self._thread.start()"},{"line_number":112,"context_line":"            # wait until the event loop has been configured"},{"line_number":113,"context_line":"            # (until the event loop is running)"},{"line_number":114,"context_line":"            self._thread.wait_start()"},{"line_number":115,"context_line":"            self.loop \u003d self._thread.loop"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.loop.call_soon_threadsafe(self._start_polling)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9jR4%3D","line":114,"updated":"2014-02-06 04:28:13.000000000","message":"Is it possible that the event loop could never start (or fail to start) and then this will wait forever?","commit_id":"dbdf39cda0df1d6d6c26c9414c433546c4d5f232"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"bfd1767251de7985d7882066b65d98f99b36b367","unresolved":false,"context_lines":[{"line_number":52,"context_line":"class TrolliusExecutor(base.ExecutorBase):"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def __init__(self, conf, listener, dispatcher, event_loop\u003dNone, thread_pool\u003dNone):"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        Parameters specific to the Trollius executor:"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        - event_loop: Trollius event loop used by the executor. By default,"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_baae622c","line":55,"updated":"2014-07-04 10:06:35.000000000","message":"Nit: to go thru new hacking rules multi line docstring should start without a leading new line. :)","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            self._thread \u003d EventLoopThread()"},{"line_number":69,"context_line":"            self.loop \u003d None"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            self.loop \u003d event_loop"},{"line_number":72,"context_line":"        if thread_pool \u003d\u003d True:"},{"line_number":73,"context_line":"            self.thread_pool \u003d futures.ThreadPoolExecutor(5)"},{"line_number":74,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_64ae2187","line":71,"updated":"2014-07-04 11:14:05.000000000","message":"Need\n\n  self._thread \u003d None\n\nhere?","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            self._dispatch_thread(incoming)"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            with self.dispatcher(incoming) as callback:"},{"line_number":101,"context_line":"                callback()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @trollius.coroutine"},{"line_number":104,"context_line":"    def _poll(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_e4e871b6","line":101,"updated":"2014-07-04 11:14:05.000000000","message":"The reply/exception handling in _dispatch_thread() is needed in this case too","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    future \u003d self.loop.run_in_executor(self.thread_pool,"},{"line_number":109,"context_line":"                                                       self.listener.poll)"},{"line_number":110,"context_line":"                    try:"},{"line_number":111,"context_line":"                        incoming \u003d yield future"},{"line_number":112,"context_line":"                    except trollius.CancelledError:"},{"line_number":113,"context_line":"                        # FIXME: don\u0027t cancel, but stop the listener instead"},{"line_number":114,"context_line":"                        future.cancel()"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_64f3819e","line":111,"updated":"2014-07-04 11:14:05.000000000","message":"Should this be \u0027yield from future\u0027 ?","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"03533d2af6ca24715f1b1f48336f8af081abaa9e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                        future.cancel()"},{"line_number":115,"context_line":"                        raise"},{"line_number":116,"context_line":"                else:"},{"line_number":117,"context_line":"                    incoming \u003d self.listener.poll()"},{"line_number":118,"context_line":"                self._dispatch(incoming)"},{"line_number":119,"context_line":"        finally:"},{"line_number":120,"context_line":"            self._wait_stop.set()"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_3cfa4b43","line":117,"updated":"2014-07-07 16:32:10.000000000","message":"Ok so this bit breaks my brain completely!\n\nIn the current Oslo implemntation - the poll will actually try to consume on connections. Here we are running in the trollious eventloop as a coroutine and we are happily using sockets thus blocking? How is that supposed to work without rewriting drivers or even libraries to use ayncio/trollious protocols.","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"03533d2af6ca24715f1b1f48336f8af081abaa9e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                        raise"},{"line_number":116,"context_line":"                else:"},{"line_number":117,"context_line":"                    incoming \u003d self.listener.poll()"},{"line_number":118,"context_line":"                self._dispatch(incoming)"},{"line_number":119,"context_line":"        finally:"},{"line_number":120,"context_line":"            self._wait_stop.set()"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_ffb0c544","line":118,"updated":"2014-07-07 16:32:10.000000000","message":"This bit as well - how is this supposed to work unless this is also a future/coroutine and is yielded from other than just block like any normal code.","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            self._thread.wait_start()"},{"line_number":131,"context_line":"            self.loop \u003d self._thread.loop"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.loop.call_soon_threadsafe(self._start_polling)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        self._wait_stop.wait()"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_24550950","line":133,"updated":"2014-07-04 11:14:05.000000000","message":"Why not do this immediately?","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.loop.call_soon_threadsafe(self._start_polling)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        self._wait_stop.wait()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def stop(self):"},{"line_number":138,"context_line":"        if self._poll_task is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c47d2de9","line":135,"updated":"2014-07-04 11:14:05.000000000","message":"Not sure what this wait() is for","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            self._poll_task.cancel()"},{"line_number":140,"context_line":"            self._poll_task \u003d None"},{"line_number":141,"context_line":"        if self._thread is not None:"},{"line_number":142,"context_line":"            self.loop.call_soon_threadsafe(self.loop.stop)"},{"line_number":143,"context_line":"            self._thread.join()"},{"line_number":144,"context_line":"        if self.thread_pool is not None:"},{"line_number":145,"context_line":"            self.thread_pool.shutdown(wait\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_e4d231d1","line":142,"updated":"2014-07-04 11:14:05.000000000","message":"Why not do this immediately?","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"ba6e26d755902b97f5935c456149ce4cd830fdc3","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.loop.call_soon_threadsafe(self.loop.stop)"},{"line_number":143,"context_line":"            self._thread.join()"},{"line_number":144,"context_line":"        if self.thread_pool is not None:"},{"line_number":145,"context_line":"            self.thread_pool.shutdown(wait\u003dTrue)"},{"line_number":146,"context_line":"            self.thread_pool \u003d None"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def wait(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_248a69bf","line":145,"updated":"2014-07-04 11:14:05.000000000","message":"Hmm, if someone passed us a thread pool, can we assume that it\u0027s ok for us to shut it down ?","commit_id":"081a12852b3aac89b78b1168d0c8ce1d24ce2af2"}]}
