)]}'
{"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6625b0f9596eb37120b5b3410d51134fe223562c","unresolved":false,"context_lines":[{"line_number":2895,"context_line":"        etc.) and renders it unusable."},{"line_number":2896,"context_line":""},{"line_number":2897,"context_line":"        Don\u0027t call run_in_thread() or force_run_in_thread() after calling"},{"line_number":2898,"context_line":"        terminate()."},{"line_number":2899,"context_line":"        \"\"\""},{"line_number":2900,"context_line":"        for _junk in range(self.nthreads):"},{"line_number":2901,"context_line":"            self._run_queue.put(None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_da0f6b37","line":2898,"updated":"2015-01-08 02:30:10.000000000","message":"good advice, maybe worth a self._running attribute to keep track of this state?","commit_id":"684b81b661279e96dbb8c0f2edecbfd09ab5af99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c0513363f84d91f8fbb506ee073a8557d36d3fb","unresolved":false,"context_lines":[{"line_number":2902,"context_line":"        for thr in self._threads:"},{"line_number":2903,"context_line":"            thr.join()"},{"line_number":2904,"context_line":""},{"line_number":2905,"context_line":"        greenthread.kill(self._consumer_coro)"},{"line_number":2906,"context_line":""},{"line_number":2907,"context_line":"        self.rpipe.close()"},{"line_number":2908,"context_line":"        os.close(self.wpipe)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_a1cdbdbc","line":2905,"updated":"2015-01-12 14:59:44.000000000","message":"I think this should be conditional on self.nthreads \u003e 0 otherwise it may throw an AttributeError because self._consumer_coro is not defined. I guess the whole method can be under that condition.","commit_id":"684b81b661279e96dbb8c0f2edecbfd09ab5af99"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"51d987dccf4d1c0220d7c736cf92a28272944873","unresolved":false,"context_lines":[{"line_number":2908,"context_line":"        greenthread.kill(self._consumer_coro)"},{"line_number":2909,"context_line":""},{"line_number":2910,"context_line":"        self.rpipe.close()"},{"line_number":2911,"context_line":"        os.close(self.wpipe)"},{"line_number":2912,"context_line":""},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"def ismount(path):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_4c70c6dc","line":2911,"updated":"2015-01-12 19:56:15.000000000","message":"maybe go ahead and set self.nthreads \u003d 0 at this point?\n\nNot only would it make it safe to accidently call terminate twice you could also still call run_in_thread in a greenthread w/o hanging your eventlet loop forever.\n\nProbably would be better to add some state to raise an exception if you tried to call run_in_thread or force_run_in_thread after calling terminate, but just making safe while unintuitive is probably better than nothing?","commit_id":"3c667f094157fb8c49d50b1fdb03ee51dfff4f1b"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6625b0f9596eb37120b5b3410d51134fe223562c","unresolved":false,"context_lines":[{"line_number":3755,"context_line":""},{"line_number":3756,"context_line":"    def tearDown(self):"},{"line_number":3757,"context_line":"        if self.tp:"},{"line_number":3758,"context_line":"            self.tp.terminate()"},{"line_number":3759,"context_line":""},{"line_number":3760,"context_line":"    def _pipe_count(self):"},{"line_number":3761,"context_line":"        # Counts the number of pipes that this process owns."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_7515a83b","line":3758,"updated":"2015-01-08 02:30:10.000000000","message":"yeah that\u0027s nice...","commit_id":"684b81b661279e96dbb8c0f2edecbfd09ab5af99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c0513363f84d91f8fbb506ee073a8557d36d3fb","unresolved":false,"context_lines":[{"line_number":3827,"context_line":"                          self._raise_valueerror)"},{"line_number":3828,"context_line":""},{"line_number":3829,"context_line":"    def test_force_run_in_thread_without_threads(self):"},{"line_number":3830,"context_line":"        # with zero threads, force_run_in_thread uses eventlet.tpool"},{"line_number":3831,"context_line":"        tp \u003d utils.ThreadPool(0)"},{"line_number":3832,"context_line":""},{"line_number":3833,"context_line":"        my_id \u003d self._thread_id()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_4658af57","line":3830,"updated":"2015-01-12 14:59:44.000000000","message":"I changed this to be like the other tests:\n\n tp \u003d self.tp \u003d utils.ThreadPool(0)\n\nand got \n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nERROR: test_force_run_in_thread_without_threads (test.unit.common.test_utils.TestThreadPool)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/home/swift/swift/test/unit/common/test_utils.py\", line 3758, in tearDown\n    self.tp.terminate()\n  File \"/home/swift/swift/swift/common/utils.py\", line 2905, in terminate\n    greenthread.kill(self._consumer_coro)\nAttributeError: \u0027ThreadPool\u0027 object has no attribute \u0027_consumer_coro\u0027\n\n----------------------------------------------------------------------","commit_id":"684b81b661279e96dbb8c0f2edecbfd09ab5af99"}]}
