)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"3552bda001654dc1cda1c6077eaf1b30ec31272f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"underlying base services and then a wait() to ensure that they complete before"},{"line_number":19,"context_line":"shutdown."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"If any service is implemented on a FixedLoopingBase related object is suspended"},{"line_number":22,"context_line":"on a greenthread.sleep() the previous call to stop() will have no effect and so"},{"line_number":23,"context_line":"the wait() will block until the sleep() finishes.  For tasks that either have a"},{"line_number":24,"context_line":"frequent FixedLoopingBase interface or a short initial_delay this may not be a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df140735_ca575802","line":21,"updated":"2017-06-01 15:18:14.000000000","message":"should be \"..service that is implemented...\"","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"3150806a69baae8b9c339ea113b5239c748b6ace","unresolved":false,"context_lines":[{"line_number":18,"context_line":"underlying base services and then a wait() to ensure that they complete before"},{"line_number":19,"context_line":"shutdown."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"If any service is implemented on a FixedLoopingBase related object is suspended"},{"line_number":22,"context_line":"on a greenthread.sleep() the previous call to stop() will have no effect and so"},{"line_number":23,"context_line":"the wait() will block until the sleep() finishes.  For tasks that either have a"},{"line_number":24,"context_line":"frequent FixedLoopingBase interface or a short initial_delay this may not be a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df140735_c54047a8","line":21,"in_reply_to":"df140735_ca575802","updated":"2017-06-02 13:24:29.000000000","message":"Done","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"979658cd94a89ac1b21572e50cdde765273baf7c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"underlying base services and then a wait() to ensure that they complete before"},{"line_number":19,"context_line":"shutdown."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"If any service is implemented on a FixedLoopingBase related object is suspended"},{"line_number":22,"context_line":"on a greenthread.sleep() the previous call to stop() will have no effect and so"},{"line_number":23,"context_line":"the wait() will block until the sleep() finishes.  For tasks that either have a"},{"line_number":24,"context_line":"frequent FixedLoopingBase interface or a short initial_delay this may not be a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df140735_c8b2c0e6","line":21,"in_reply_to":"df140735_ca575802","updated":"2017-06-01 16:06:06.000000000","message":"Thanks.  I\u0027ll change that with the next patch.","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"}],"oslo_service/loopingcall.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"3552bda001654dc1cda1c6077eaf1b30ec31272f","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def stop(self):"},{"line_number":95,"context_line":"        self._running \u003d False"},{"line_number":96,"context_line":"        if self.abort is not None:"},{"line_number":97,"context_line":"            self.abort.set()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def wait(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_6a6f2c92","line":96,"range":{"start_line":96,"start_character":7,"end_line":96,"end_character":34},"updated":"2017-06-01 15:18:14.000000000","message":"Do we expect anyone to call stop() without first calling _start()?  (Doesn\u0027t hurt anything, just wondering if it\u0027s needed.)","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"3150806a69baae8b9c339ea113b5239c748b6ace","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def stop(self):"},{"line_number":95,"context_line":"        self._running \u003d False"},{"line_number":96,"context_line":"        if self.abort is not None:"},{"line_number":97,"context_line":"            self.abort.set()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def wait(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_451677aa","line":96,"range":{"start_line":96,"start_character":7,"end_line":96,"end_character":34},"in_reply_to":"df140735_6a6f2c92","updated":"2017-06-02 13:24:29.000000000","message":"Done","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"979658cd94a89ac1b21572e50cdde765273baf7c","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def stop(self):"},{"line_number":95,"context_line":"        self._running \u003d False"},{"line_number":96,"context_line":"        if self.abort is not None:"},{"line_number":97,"context_line":"            self.abort.set()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def wait(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_4881108f","line":96,"range":{"start_line":96,"start_character":7,"end_line":96,"end_character":34},"in_reply_to":"df140735_6a6f2c92","updated":"2017-06-01 16:06:06.000000000","message":"I don\u0027t see any mention of such a use case in the docs.  Not sure why someone would call stop() before start().  Alternatively, we could just instantiate the threading.Event() directly in __init__() rather than wait for start().","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"3552bda001654dc1cda1c6077eaf1b30ec31272f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            self.abort.wait(initial_delay)"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            watch \u003d timeutils.StopWatch()"},{"line_number":140,"context_line":"            while self._running:"},{"line_number":141,"context_line":"                watch.restart()"},{"line_number":142,"context_line":"                result \u003d func(*self.args, **self.kw)"},{"line_number":143,"context_line":"                watch.stop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_0af1d06b","line":140,"range":{"start_line":140,"start_character":12,"end_line":140,"end_character":32},"updated":"2017-06-01 15:18:14.000000000","message":"Could we get rid of \"_running\" and just use \"not self.abort.is_set()\" in it\u0027s place ?","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"979658cd94a89ac1b21572e50cdde765273baf7c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            self.abort.wait(initial_delay)"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            watch \u003d timeutils.StopWatch()"},{"line_number":140,"context_line":"            while self._running:"},{"line_number":141,"context_line":"                watch.restart()"},{"line_number":142,"context_line":"                result \u003d func(*self.args, **self.kw)"},{"line_number":143,"context_line":"                watch.stop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_28e01c96","line":140,"range":{"start_line":140,"start_character":12,"end_line":140,"end_character":32},"in_reply_to":"df140735_0af1d06b","updated":"2017-06-01 16:06:06.000000000","message":"It could be replaced I suppose.  I am not sure why _running is referenced in the _on_done method though.  Doesn\u0027t seem useful since if _on_done is invoked then the greenthread running _run_loop is definitely not running anymore and since it is the only reader of that value it doesn\u0027t seem useful.\n\nI\u0027ll wait to see what any core developers think about such a change.","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"3150806a69baae8b9c339ea113b5239c748b6ace","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            self.abort.wait(initial_delay)"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            watch \u003d timeutils.StopWatch()"},{"line_number":140,"context_line":"            while self._running:"},{"line_number":141,"context_line":"                watch.restart()"},{"line_number":142,"context_line":"                result \u003d func(*self.args, **self.kw)"},{"line_number":143,"context_line":"                watch.stop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_651cdbc0","line":140,"range":{"start_line":140,"start_character":12,"end_line":140,"end_character":32},"in_reply_to":"df140735_28e01c96","updated":"2017-06-02 13:24:29.000000000","message":"To increase readability I check _running but converted it to a property to check the state of the abort Event.","commit_id":"4c801bca1f88bbb9aba35818f9756a69d4a4d665"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"c4a0000ede9d215cf81ddef67cc27070045aff8a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.f \u003d f"},{"line_number":89,"context_line":"        self._thread \u003d None"},{"line_number":90,"context_line":"        self.done \u003d None"},{"line_number":91,"context_line":"        self.abort \u003d threading.Event()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @property"},{"line_number":94,"context_line":"    def _running(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_ae814ec5","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":38},"updated":"2017-11-29 06:09:31.000000000","message":"oslo service used eventlet heavily, which use coroutines to execute function. I\u0027m not sure threading.Event work well with coroutines.","commit_id":"ba28d511e08c02803ac834bf563eb30a135c2c6e"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"2332bc38957ca8d8ce27b5cf29ec648459b1e438","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.f \u003d f"},{"line_number":89,"context_line":"        self._thread \u003d None"},{"line_number":90,"context_line":"        self.done \u003d None"},{"line_number":91,"context_line":"        self.abort \u003d threading.Event()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @property"},{"line_number":94,"context_line":"    def _running(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_be972445","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":38},"in_reply_to":"ff82abbf_00c4be3e","updated":"2017-11-30 02:38:38.000000000","message":"good to know that this patch works well in production, there is little potential risk.","commit_id":"ba28d511e08c02803ac834bf563eb30a135c2c6e"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"cd6a981e78174f7a164facad124c0f6651a598e0","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.f \u003d f"},{"line_number":89,"context_line":"        self._thread \u003d None"},{"line_number":90,"context_line":"        self.done \u003d None"},{"line_number":91,"context_line":"        self.abort \u003d threading.Event()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @property"},{"line_number":94,"context_line":"    def _running(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_00c4be3e","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":38},"in_reply_to":"ff82abbf_ae814ec5","updated":"2017-11-29 12:46:28.000000000","message":"Can you point to the documentation that states this limitation?  \n\nWe have been using this patch in production since I first posted this patch and we have not had any issues.","commit_id":"ba28d511e08c02803ac834bf563eb30a135c2c6e"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"77ac6157b84ca95bc4e38bcb7923c82995355888","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.f \u003d f"},{"line_number":89,"context_line":"        self._thread \u003d None"},{"line_number":90,"context_line":"        self.done \u003d None"},{"line_number":91,"context_line":"        self.abort \u003d threading.Event()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @property"},{"line_number":94,"context_line":"    def _running(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_b7c3d3ec","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":38},"in_reply_to":"ff82abbf_ae814ec5","updated":"2017-11-29 17:53:52.000000000","message":"The eventlet code monkey-patches \"threading\", and has several testcases that explictly test threading.Event.","commit_id":"ba28d511e08c02803ac834bf563eb30a135c2c6e"}],"oslo_service/tests/test_loopingcall.py":[{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"2cc7874c8b6287903ae2788959f8a2c025edea59","unresolved":false,"context_lines":[{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        random_mock.return_value \u003d .8"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        timer \u003d loopingcall.BackOffLoopingCall(false)"},{"line_number":326,"context_line":"        self.assertRaises(loopingcall.LoopingCallTimeOut,"},{"line_number":327,"context_line":"                          timer.start().wait)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        expected_times \u003d [mock.call(1.6),"},{"line_number":330,"context_line":"                          mock.call(2.4000000000000004),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_8e770ba1","line":327,"range":{"start_line":325,"start_character":0,"end_line":327,"end_character":45},"updated":"2017-06-02 15:09:15.000000000","message":"I just realized that these changes can be reverted now that I have added the _sleep() function and I mock that instead of the wait() method.  Same comment applies to all similar changes in this file.","commit_id":"3a12e0ff6398434257caa906211726e3917af908"}]}
