)]}'
{"nova/tests/integrated/test_multiprocess_api.py":[{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_flags(self):"},{"line_number":44,"context_line":"        f \u003d super(MultiprocessEC2Test, self)._get_flags()"},{"line_number":45,"context_line":"        f[\u0027ec2_workers\u0027] \u003d 2"},{"line_number":46,"context_line":"        return f"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_ec2(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Tg%3D","line":45,"updated":"2012-06-06 15:27:56.000000000","message":"Is there any way to ensure that 2 workers really got started?","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_flags(self):"},{"line_number":44,"context_line":"        f \u003d super(MultiprocessEC2Test, self)._get_flags()"},{"line_number":45,"context_line":"        f[\u0027ec2_workers\u0027] \u003d 2"},{"line_number":46,"context_line":"        return f"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_ec2(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8OM%3D","line":45,"in_reply_to":"AAAAHn%2F%2F8Tg%3D","updated":"2012-06-06 17:16:48.000000000","message":"I\u0027ll add a new test case in MultiprocessWSGITest() for cover this (ensure correct # of workers are started).  Make sense?","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            else:"},{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":"        # wait for new worker"},{"line_number":155,"context_line":"        time.sleep(1.5)"},{"line_number":156,"context_line":"        f \u003d os.popen(\u0027ps --no-headers --ppid %d|wc -l\u0027 %"},{"line_number":157,"context_line":"                     self.master_worker_pid)"},{"line_number":158,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8T4%3D","line":155,"updated":"2012-06-06 15:27:56.000000000","message":"Is there a way we can do this test without sleeping? Unit tests are too slow as it is and hardcoded sleeps just make it worse.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            else:"},{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":"        # wait for new worker"},{"line_number":155,"context_line":"        time.sleep(1.5)"},{"line_number":156,"context_line":"        f \u003d os.popen(\u0027ps --no-headers --ppid %d|wc -l\u0027 %"},{"line_number":157,"context_line":"                     self.master_worker_pid)"},{"line_number":158,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAIH%2F%2F%2F%2F4%3D","line":155,"in_reply_to":"AAAAHn%2F%2F8T4%3D","updated":"2012-06-06 17:16:48.000000000","message":"I agree that hardcoded sleep is ugly and maybe buggy. Other than sleep, all I can think of is busy polling for certain times.  Doesn\u0027t seem like a better option to me.  What about cutting sleep time to \u003c 1 sec ?","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        os.kill(self.master_worker_pid, signal.SIGTERM)"},{"line_number":172,"context_line":"        time.sleep(1.5)"},{"line_number":173,"context_line":"        # check if service is still available (shouldn\u0027t be)"},{"line_number":174,"context_line":"        #\"\"\""},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            self.api.get_flavors()"},{"line_number":177,"context_line":"            self.fail(\u0027API service should have been terminated\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8T0%3D","line":174,"updated":"2012-06-06 15:27:56.000000000","message":"Remove this comment please","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        os.kill(self.master_worker_pid, signal.SIGTERM)"},{"line_number":172,"context_line":"        time.sleep(1.5)"},{"line_number":173,"context_line":"        # check if service is still available (shouldn\u0027t be)"},{"line_number":174,"context_line":"        #\"\"\""},{"line_number":175,"context_line":"        try:"},{"line_number":176,"context_line":"            self.api.get_flavors()"},{"line_number":177,"context_line":"            self.fail(\u0027API service should have been terminated\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Ps%3D","line":174,"in_reply_to":"AAAAHn%2F%2F8T0%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        except Exception as ex:"},{"line_number":179,"context_line":"            exc_value \u003d sys.exc_info()[1]"},{"line_number":180,"context_line":"            self.assertTrue(\u0027Connection refused\u0027 in exc_value or"},{"line_number":181,"context_line":"                            \u0027ECONNREFUSED\u0027 in exc_value)"},{"line_number":182,"context_line":"        #\"\"\""},{"line_number":183,"context_line":"        #self.api.get_flavors()"},{"line_number":184,"context_line":"        # check there is no OS processes left over"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8To%3D","line":181,"updated":"2012-06-06 15:27:56.000000000","message":"This would be cleaner like this:\n\n    except socket.error as exc:\n        self.assertEqual(exc.errno, errno.ECONNREFUSED)\n    else:\n        self.fail(\u0027API service should have been terminated\u0027)","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        except Exception as ex:"},{"line_number":179,"context_line":"            exc_value \u003d sys.exc_info()[1]"},{"line_number":180,"context_line":"            self.assertTrue(\u0027Connection refused\u0027 in exc_value or"},{"line_number":181,"context_line":"                            \u0027ECONNREFUSED\u0027 in exc_value)"},{"line_number":182,"context_line":"        #\"\"\""},{"line_number":183,"context_line":"        #self.api.get_flavors()"},{"line_number":184,"context_line":"        # check there is no OS processes left over"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8PY%3D","line":181,"in_reply_to":"AAAAHn%2F%2F8To%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            self.assertTrue(\u0027Connection refused\u0027 in exc_value or"},{"line_number":181,"context_line":"                            \u0027ECONNREFUSED\u0027 in exc_value)"},{"line_number":182,"context_line":"        #\"\"\""},{"line_number":183,"context_line":"        #self.api.get_flavors()"},{"line_number":184,"context_line":"        # check there is no OS processes left over"},{"line_number":185,"context_line":"        f \u003d os.popen(\u0027ps --no-headers --ppid %d\u0027 % self.master_worker_pid)"},{"line_number":186,"context_line":"        self.assertEqual(f.readline(), \u0027\u0027, \u0027No OS processes left.\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Tw%3D","line":183,"updated":"2012-06-06 15:27:56.000000000","message":"Remove these too please","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            self.assertTrue(\u0027Connection refused\u0027 in exc_value or"},{"line_number":181,"context_line":"                            \u0027ECONNREFUSED\u0027 in exc_value)"},{"line_number":182,"context_line":"        #\"\"\""},{"line_number":183,"context_line":"        #self.api.get_flavors()"},{"line_number":184,"context_line":"        # check there is no OS processes left over"},{"line_number":185,"context_line":"        f \u003d os.popen(\u0027ps --no-headers --ppid %d\u0027 % self.master_worker_pid)"},{"line_number":186,"context_line":"        self.assertEqual(f.readline(), \u0027\u0027, \u0027No OS processes left.\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Pw%3D","line":183,"in_reply_to":"AAAAHn%2F%2F8Tw%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee08bde9aeafcf89874c37f385a7020e41243dc1","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class MultiprocessWSGITest(integrated_helpers._IntegratedTestBase):"},{"line_number":127,"context_line":"    def setUp(self):"},{"line_number":128,"context_line":"        self.workers \u003d 2"},{"line_number":129,"context_line":"        super(MultiprocessWSGITest, self).setUp()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _start_api_service(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fqc%3D","line":128,"updated":"2012-06-14 14:59:20.000000000","message":"Just a thought; you can treat as a femtonit: Why not use a class attribute?  Then you could get rid of this setUp() override…","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class MultiprocessWSGITest(integrated_helpers._IntegratedTestBase):"},{"line_number":127,"context_line":"    def setUp(self):"},{"line_number":128,"context_line":"        self.workers \u003d 2"},{"line_number":129,"context_line":"        super(MultiprocessWSGITest, self).setUp()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _start_api_service(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FHw%3D","line":128,"in_reply_to":"AAAAIn%2F%2F%2Fqc%3D","updated":"2012-06-15 06:27:05.000000000","message":"Done","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return f"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_number_of_workers(self):"},{"line_number":145,"context_line":"        time.sleep(0.5)"},{"line_number":146,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep python|grep %d -c\u0027 %"},{"line_number":147,"context_line":"                     self.master_worker_pid)"},{"line_number":148,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fpw%3D","line":145,"updated":"2012-06-14 15:13:25.000000000","message":"I\u0027d prefer looping running ps (perhaps with a small sleep in between) until it finds the new worker instead of a hardcoded sleep. The unit tests are slow enough as it is.","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return f"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_number_of_workers(self):"},{"line_number":145,"context_line":"        time.sleep(0.5)"},{"line_number":146,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep python|grep %d -c\u0027 %"},{"line_number":147,"context_line":"                     self.master_worker_pid)"},{"line_number":148,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FIE%3D","line":145,"in_reply_to":"AAAAIn%2F%2F%2Fpw%3D","updated":"2012-06-15 06:27:05.000000000","message":"OK. I\u0027ll try the looping way.","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee08bde9aeafcf89874c37f385a7020e41243dc1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d\u0027 %"},{"line_number":156,"context_line":"                     self.master_worker_pid)"},{"line_number":157,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":158,"context_line":"        f.readline()"},{"line_number":159,"context_line":"        children_pid \u003d f.readline().split()"},{"line_number":160,"context_line":"        for pid in children_pid:"},{"line_number":161,"context_line":"            LOG.warn(\u0027pid of first child is %s\u0027 % pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FqU%3D","line":158,"updated":"2012-06-14 14:59:20.000000000","message":"I\u0027m not sure I agree; I\u0027m not aware of any really strict ordering on ps.  I could be wrong about that, I admit, but it seems to me it\u0027d be more robust to filter the list and explicitly skip items that have the master_worker\u0027s pid…","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d\u0027 %"},{"line_number":156,"context_line":"                     self.master_worker_pid)"},{"line_number":157,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":158,"context_line":"        f.readline()"},{"line_number":159,"context_line":"        children_pid \u003d f.readline().split()"},{"line_number":160,"context_line":"        for pid in children_pid:"},{"line_number":161,"context_line":"            LOG.warn(\u0027pid of first child is %s\u0027 % pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FGc%3D","line":158,"in_reply_to":"AAAAIn%2F%2F%2Fp4%3D","updated":"2012-06-15 06:27:05.000000000","message":"Since OS X version of \u0027ps\u0027 doesn\u0027t support \u0027--sort\u0027, I\u0027ll use \u0027sort\u0027 to explicitly sort the output.","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d\u0027 %"},{"line_number":156,"context_line":"                     self.master_worker_pid)"},{"line_number":157,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":158,"context_line":"        f.readline()"},{"line_number":159,"context_line":"        children_pid \u003d f.readline().split()"},{"line_number":160,"context_line":"        for pid in children_pid:"},{"line_number":161,"context_line":"            LOG.warn(\u0027pid of first child is %s\u0027 % pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fp4%3D","line":158,"in_reply_to":"AAAAIn%2F%2F%2FqU%3D","updated":"2012-06-14 15:13:25.000000000","message":"That is correct. ps output is unsorted by default, which ends up being pid order. If there\u0027s a wrap in pid, then the child can come before the parent.\n\nUsing the \u0027--sort ppid\u0027 option should sort the way the code expects (but I haven\u0027t tested it enough to make sure)","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d\u0027 %"},{"line_number":156,"context_line":"                     self.master_worker_pid)"},{"line_number":157,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":158,"context_line":"        f.readline()"},{"line_number":159,"context_line":"        children_pid \u003d f.readline().split()"},{"line_number":160,"context_line":"        for pid in children_pid:"},{"line_number":161,"context_line":"            LOG.warn(\u0027pid of first child is %s\u0027 % pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FGg%3D","line":158,"in_reply_to":"AAAAIn%2F%2F%2FqU%3D","updated":"2012-06-15 06:27:05.000000000","message":"You are right, there is not strict ordering on output of \u0027ps\u0027 unless specified.  Will fix.","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                continue"},{"line_number":167,"context_line":"        # wait for new worker"},{"line_number":168,"context_line":"        time.sleep(0.5)"},{"line_number":169,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep %d|grep python -c\u0027 %"},{"line_number":170,"context_line":"                     self.master_worker_pid)"},{"line_number":171,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fp0%3D","line":168,"updated":"2012-06-14 15:13:25.000000000","message":"Same thing about sleep","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                continue"},{"line_number":167,"context_line":"        # wait for new worker"},{"line_number":168,"context_line":"        time.sleep(0.5)"},{"line_number":169,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep %d|grep python -c\u0027 %"},{"line_number":170,"context_line":"                     self.master_worker_pid)"},{"line_number":171,"context_line":"        workers \u003d f.readline()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FHk%3D","line":168,"in_reply_to":"AAAAIn%2F%2F%2Fp0%3D","updated":"2012-06-15 06:27:05.000000000","message":"Done","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.assertTrue(len(flavors) \u003e 0, \u0027Num of flavors \u003e 0.\u0027)"},{"line_number":183,"context_line":"        # send SIGTERM to master_worker will terminate service"},{"line_number":184,"context_line":"        os.kill(self.master_worker_pid, signal.SIGTERM)"},{"line_number":185,"context_line":"        time.sleep(1)"},{"line_number":186,"context_line":"        # check there is no OS processes left over"},{"line_number":187,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep python|grep %d -c\u0027 %"},{"line_number":188,"context_line":"                     self.master_worker_pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fps%3D","line":185,"updated":"2012-06-14 15:13:25.000000000","message":"Same thing about sleep","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.assertTrue(len(flavors) \u003e 0, \u0027Num of flavors \u003e 0.\u0027)"},{"line_number":183,"context_line":"        # send SIGTERM to master_worker will terminate service"},{"line_number":184,"context_line":"        os.kill(self.master_worker_pid, signal.SIGTERM)"},{"line_number":185,"context_line":"        time.sleep(1)"},{"line_number":186,"context_line":"        # check there is no OS processes left over"},{"line_number":187,"context_line":"        f \u003d os.popen(\u0027ps ax -o ppid,command|grep python|grep %d -c\u0027 %"},{"line_number":188,"context_line":"                     self.master_worker_pid)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FHg%3D","line":185,"in_reply_to":"AAAAIn%2F%2F%2Fps%3D","updated":"2012-06-15 06:27:05.000000000","message":"Done","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"d3782682fb21cfc33ea9c4a05d137cfee1185ee7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Test multiprocess enabled EC2/OSAPI_Compute/OSAPI_Volume/Metadata API service."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import boto"},{"line_number":20,"context_line":"from boto.ec2 import regioninfo"},{"line_number":21,"context_line":"import errno"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import signal"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAIn%2F%2F%2Bxk%3D","line":20,"updated":"2012-06-15 19:47:49.000000000","message":"boto is a third-party import, so these two imports should be in a group by themselves between the standard imports (import errno/import time) and the nova imports (import nova.flags/import nova.tests.integrated.integrated_helpers).","commit_id":"70f9141229a7d236765a5b9eb7bd6c5e576b56dc"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"943aed5a23893298196ab340a2d6012ab7740491","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Test multiprocess enabled EC2/OSAPI_Compute/OSAPI_Volume/Metadata API service."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":"import boto"},{"line_number":20,"context_line":"from boto.ec2 import regioninfo"},{"line_number":21,"context_line":"import errno"},{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import signal"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAIn%2F%2F%2Bn4%3D","line":20,"in_reply_to":"AAAAIn%2F%2F%2Bxk%3D","updated":"2012-06-15 23:36:54.000000000","message":"Done","commit_id":"70f9141229a7d236765a5b9eb7bd6c5e576b56dc"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"d3782682fb21cfc33ea9c4a05d137cfee1185ee7","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def test_killed_worker_recover(self):"},{"line_number":153,"context_line":"        # kill one worker and check if new worker can come up"},{"line_number":154,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d|sort -g\u0027 %"},{"line_number":155,"context_line":"                     self.master_worker_pid)"},{"line_number":156,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":157,"context_line":"        f.readline()"},{"line_number":158,"context_line":"        children_pid \u003d f.readline().split()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAIn%2F%2F%2Bxg%3D","line":155,"updated":"2012-06-15 19:47:49.000000000","message":"Honestly, adding sort isn\u0027t the way I would have done this; for one thing, sort is subject to locale collation rules, and for another, python has a nice, predictable sort implementation.  Still, I suppose this will work, so I won\u0027t raise an objection here, other than this obligatory comment :)","commit_id":"70f9141229a7d236765a5b9eb7bd6c5e576b56dc"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"943aed5a23893298196ab340a2d6012ab7740491","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def test_killed_worker_recover(self):"},{"line_number":153,"context_line":"        # kill one worker and check if new worker can come up"},{"line_number":154,"context_line":"        f \u003d os.popen(\u0027ps ax -o pid,ppid,command|grep python|grep %d|sort -g\u0027 %"},{"line_number":155,"context_line":"                     self.master_worker_pid)"},{"line_number":156,"context_line":"        # skip first line of result since it\u0027s master worker"},{"line_number":157,"context_line":"        f.readline()"},{"line_number":158,"context_line":"        children_pid \u003d f.readline().split()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAIn%2F%2F%2Bn8%3D","line":155,"in_reply_to":"AAAAIn%2F%2F%2Bxg%3D","updated":"2012-06-15 23:36:54.000000000","message":":)","commit_id":"70f9141229a7d236765a5b9eb7bd6c5e576b56dc"}],"nova/wsgi.py":[{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._logger \u003d logging.getLogger(\"nova.%s.wsgi.server\" % self.name)"},{"line_number":76,"context_line":"        self._wsgi_logger \u003d logging.WritableLogger(self._logger)"},{"line_number":77,"context_line":"        self.master_worker \u003d None"},{"line_number":78,"context_line":"        self.children \u003d []"},{"line_number":79,"context_line":"        self.running \u003d multiprocessing.Value(\u0027i\u0027, 1, lock\u003dTrue)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Tc%3D","line":78,"updated":"2012-06-06 15:27:56.000000000","message":"This could probably be a set()","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._logger \u003d logging.getLogger(\"nova.%s.wsgi.server\" % self.name)"},{"line_number":76,"context_line":"        self._wsgi_logger \u003d logging.WritableLogger(self._logger)"},{"line_number":77,"context_line":"        self.master_worker \u003d None"},{"line_number":78,"context_line":"        self.children \u003d []"},{"line_number":79,"context_line":"        self.running \u003d multiprocessing.Value(\u0027i\u0027, 1, lock\u003dTrue)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Ro%3D","line":78,"in_reply_to":"AAAAHn%2F%2F8Tc%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            (self.host, self.port) \u003d self._socket.getsockname()"},{"line_number":109,"context_line":"        except Exception as ex:"},{"line_number":110,"context_line":"            self._logger.error(_(\"Failed to create socket: %(error)s.\")"},{"line_number":111,"context_line":"            % {\u0027error\u0027: ex})"},{"line_number":112,"context_line":"            raise"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if self.workers \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8TU%3D","line":111,"updated":"2012-06-06 15:27:56.000000000","message":"Can you fix the whitespace here? It shouldn\u0027t be left aligned.\n\nAlso, using % isn\u0027t necessary, just pass a dict as the second argument to error() and it will work fine.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            (self.host, self.port) \u003d self._socket.getsockname()"},{"line_number":109,"context_line":"        except Exception as ex:"},{"line_number":110,"context_line":"            self._logger.error(_(\"Failed to create socket: %(error)s.\")"},{"line_number":111,"context_line":"            % {\u0027error\u0027: ex})"},{"line_number":112,"context_line":"            raise"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if self.workers \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8R0%3D","line":111,"in_reply_to":"AAAAHn%2F%2F8TU%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def run_server_in_process(self):"},{"line_number":132,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":133,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":134,"context_line":"        eventlet.hubs.use_hub(\u0027poll\u0027)"},{"line_number":135,"context_line":"        eventlet.patcher.monkey_patch(all\u003dFalse, socket\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self._pool \u003d eventlet.GreenPool(size\u003dself._pool_size)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8S8%3D","line":134,"updated":"2012-06-06 15:27:56.000000000","message":"Why is this necessary? The default should be sufficient","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def run_server_in_process(self):"},{"line_number":132,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":133,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":134,"context_line":"        eventlet.hubs.use_hub(\u0027poll\u0027)"},{"line_number":135,"context_line":"        eventlet.patcher.monkey_patch(all\u003dFalse, socket\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self._pool \u003d eventlet.GreenPool(size\u003dself._pool_size)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Rs%3D","line":134,"in_reply_to":"AAAAHn%2F%2F8S8%3D","updated":"2012-06-06 17:16:48.000000000","message":"Well, if this line is missing, eventlet will fail with some strange error when spawn new greenthread, at least on my environment.  But I didn\u0027t dig-in to find out why.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":133,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":134,"context_line":"        eventlet.hubs.use_hub(\u0027poll\u0027)"},{"line_number":135,"context_line":"        eventlet.patcher.monkey_patch(all\u003dFalse, socket\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self._pool \u003d eventlet.GreenPool(size\u003dself._pool_size)"},{"line_number":138,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Sw%3D","line":135,"updated":"2012-06-06 15:27:56.000000000","message":"Is this necessary? We\u0027ve already done monkey patching so I\u0027m not sure I understand what this is trying to do","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":133,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":134,"context_line":"        eventlet.hubs.use_hub(\u0027poll\u0027)"},{"line_number":135,"context_line":"        eventlet.patcher.monkey_patch(all\u003dFalse, socket\u003dTrue)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self._pool \u003d eventlet.GreenPool(size\u003dself._pool_size)"},{"line_number":138,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Rc%3D","line":135,"in_reply_to":"AAAAHn%2F%2F8Sw%3D","updated":"2012-06-06 17:16:48.000000000","message":"I wasn\u0027t sure whether child process can inherit monkeypatching.  I just did some quick test, remove it seemed OK.  I\u0027ll do that in new patch.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        while running.value \u003e 0:"},{"line_number":202,"context_line":"            try:"},{"line_number":203,"context_line":"                pid, status \u003d os.wait()"},{"line_number":204,"context_line":"                if os.WIFEXITED(status) or os.WIFSIGNALED(status):"},{"line_number":205,"context_line":"                    self._logger.error(_(\u0027Dead worker %(pid)s\u0027) % locals())"},{"line_number":206,"context_line":"                    if pid in self.children:"},{"line_number":207,"context_line":"                        self.children.remove(pid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Sk%3D","line":204,"updated":"2012-06-06 15:27:56.000000000","message":"I\u0027m a little confused by this if statement.\n\nWouldn\u0027t we want to restart the children in any case it exited?\n\nBut I can\u0027t think of a situation where this if statement will ever evaluate to False, so it seems superfluous?","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        while running.value \u003e 0:"},{"line_number":202,"context_line":"            try:"},{"line_number":203,"context_line":"                pid, status \u003d os.wait()"},{"line_number":204,"context_line":"                if os.WIFEXITED(status) or os.WIFSIGNALED(status):"},{"line_number":205,"context_line":"                    self._logger.error(_(\u0027Dead worker %(pid)s\u0027) % locals())"},{"line_number":206,"context_line":"                    if pid in self.children:"},{"line_number":207,"context_line":"                        self.children.remove(pid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8RA%3D","line":204,"in_reply_to":"AAAAHn%2F%2F8Sk%3D","updated":"2012-06-06 17:16:48.000000000","message":"You are right. We want to restart dead child in any case. And the if state is superfluous, I\u0027ll remove it.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                        self.children.remove(pid)"},{"line_number":208,"context_line":"                        if running.value \u003e 0:"},{"line_number":209,"context_line":"                            self.run_child()"},{"line_number":210,"context_line":"            except OSError, err:"},{"line_number":211,"context_line":"                if err.errno not in (errno.EINTR, errno.ECHILD):"},{"line_number":212,"context_line":"                    raise"},{"line_number":213,"context_line":"            except KeyboardInterrupt:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8TA%3D","line":210,"updated":"2012-06-06 15:27:56.000000000","message":"except OSError as err:","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                        self.children.remove(pid)"},{"line_number":208,"context_line":"                        if running.value \u003e 0:"},{"line_number":209,"context_line":"                            self.run_child()"},{"line_number":210,"context_line":"            except OSError, err:"},{"line_number":211,"context_line":"                if err.errno not in (errno.EINTR, errno.ECHILD):"},{"line_number":212,"context_line":"                    raise"},{"line_number":213,"context_line":"            except KeyboardInterrupt:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8RY%3D","line":210,"in_reply_to":"AAAAHn%2F%2F8TA%3D","updated":"2012-06-06 17:16:48.000000000","message":"Done","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                    raise"},{"line_number":213,"context_line":"            except KeyboardInterrupt:"},{"line_number":214,"context_line":"                self._logger.info(_(\u0027Caught keyboard interrupt. Exiting.\u0027))"},{"line_number":215,"context_line":"                self.running \u003d False"},{"line_number":216,"context_line":"                break"},{"line_number":217,"context_line":"        eventlet.greenio.shutdown_safe(self._socket)"},{"line_number":218,"context_line":"        self._socket.close()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Sg%3D","line":215,"updated":"2012-06-06 15:27:56.000000000","message":"Shouldn\u0027t this match the rest of the code:\n\n    running.value \u003d -1","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                    raise"},{"line_number":213,"context_line":"            except KeyboardInterrupt:"},{"line_number":214,"context_line":"                self._logger.info(_(\u0027Caught keyboard interrupt. Exiting.\u0027))"},{"line_number":215,"context_line":"                self.running \u003d False"},{"line_number":216,"context_line":"                break"},{"line_number":217,"context_line":"        eventlet.greenio.shutdown_safe(self._socket)"},{"line_number":218,"context_line":"        self._socket.close()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8RU%3D","line":215,"in_reply_to":"AAAAHn%2F%2F8Sg%3D","updated":"2012-06-06 17:16:48.000000000","message":"Ah, didn\u0027t notice that I missed it. Will fix.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"82557b6e3b077da1e387cd31c122121ca34bd64d","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        except greenlet.GreenletExit:"},{"line_number":264,"context_line":"            LOG.info(_(\"WSGI server has stopped.\"))"},{"line_number":265,"context_line":"        except KeyboardInterrupt:"},{"line_number":266,"context_line":"            pass"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class Request(webob.Request):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Sc%3D","line":266,"updated":"2012-06-06 15:27:56.000000000","message":"Why do KeyboardInterrupt exceptions get ignored?","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"6628cd85ecc7349b8d14fae34458b3e0240eb15e","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        except greenlet.GreenletExit:"},{"line_number":264,"context_line":"            LOG.info(_(\"WSGI server has stopped.\"))"},{"line_number":265,"context_line":"        except KeyboardInterrupt:"},{"line_number":266,"context_line":"            pass"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class Request(webob.Request):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAHn%2F%2F8Q0%3D","line":266,"in_reply_to":"AAAAHn%2F%2F8Sc%3D","updated":"2012-06-06 17:16:48.000000000","message":"It shouldn\u0027t, another historical debug code left-over.  Will fix.","commit_id":"dc56f3314ffa103acd6ed50dd37524d4250ec656"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ee08bde9aeafcf89874c37f385a7020e41243dc1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import eventlet"},{"line_number":28,"context_line":"import eventlet.wsgi"},{"line_number":29,"context_line":"import greenlet"},{"line_number":30,"context_line":"import multiprocessing"},{"line_number":31,"context_line":"from paste import deploy"},{"line_number":32,"context_line":"import routes.middleware"},{"line_number":33,"context_line":"import webob.dec"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FqQ%3D","line":30,"updated":"2012-06-14 14:59:20.000000000","message":"multiprocessing is a standard library, not a third party import…","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import eventlet"},{"line_number":28,"context_line":"import eventlet.wsgi"},{"line_number":29,"context_line":"import greenlet"},{"line_number":30,"context_line":"import multiprocessing"},{"line_number":31,"context_line":"from paste import deploy"},{"line_number":32,"context_line":"import routes.middleware"},{"line_number":33,"context_line":"import webob.dec"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FIQ%3D","line":30,"in_reply_to":"AAAAIn%2F%2F%2FqQ%3D","updated":"2012-06-15 06:27:05.000000000","message":"Done","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                try:"},{"line_number":162,"context_line":"                    os.kill(pid, signal.SIGTERM)"},{"line_number":163,"context_line":"                except OSError:"},{"line_number":164,"context_line":"                    # skip if pid is not found."},{"line_number":165,"context_line":"                    pass"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        def hup(*args):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fpo%3D","line":164,"updated":"2012-06-14 15:13:25.000000000","message":"This should check errno since kill can raise an exception in a few different cases.\n\n    except OSError as exc:\n        if exc.errno !\u003d errno.ESRCH:\n            raise","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                try:"},{"line_number":162,"context_line":"                    os.kill(pid, signal.SIGTERM)"},{"line_number":163,"context_line":"                except OSError:"},{"line_number":164,"context_line":"                    # skip if pid is not found."},{"line_number":165,"context_line":"                    pass"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        def hup(*args):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FII%3D","line":164,"in_reply_to":"AAAAIn%2F%2F%2Fpo%3D","updated":"2012-06-15 06:27:05.000000000","message":"Thanks.","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"47eca69cf6328ad3e71a3ec144f52491743081a3","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            for pid in self.children:"},{"line_number":238,"context_line":"                try:"},{"line_number":239,"context_line":"                    os.kill(pid, signal.SIGTERM)"},{"line_number":240,"context_line":"                except OSError:"},{"line_number":241,"context_line":"                    pass"},{"line_number":242,"context_line":"                self.children.remove(pid)"},{"line_number":243,"context_line":"            # now terminate master_worker"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2Fpg%3D","line":240,"updated":"2012-06-14 15:13:25.000000000","message":"Same thing here with checking errno","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"820568a404b756b8a282c4f185b1232f7cfcc848","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            for pid in self.children:"},{"line_number":238,"context_line":"                try:"},{"line_number":239,"context_line":"                    os.kill(pid, signal.SIGTERM)"},{"line_number":240,"context_line":"                except OSError:"},{"line_number":241,"context_line":"                    pass"},{"line_number":242,"context_line":"                self.children.remove(pid)"},{"line_number":243,"context_line":"            # now terminate master_worker"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAIn%2F%2F%2FIM%3D","line":240,"in_reply_to":"AAAAIn%2F%2F%2Fpg%3D","updated":"2012-06-15 06:27:05.000000000","message":"Done","commit_id":"d826f35a9d9041196f253ae4fbf2f31570562d6b"},{"author":{"_account_id":100,"name":"Johannes Erdfelt","email":"johannes@erdfelt.com","username":"johannes.erdfelt"},"change_message_id":"feca5c955be367df9c1a0987be43aaa6c2a732ee","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def run_server_in_process(self):"},{"line_number":135,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":136,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":137,"context_line":"        #(zhiteng) Mac OS X don\u0027t have \u0027poll\u0027 support, so we leave eventlet"},{"line_number":138,"context_line":"        # to determine which hub to use."},{"line_number":139,"context_line":"        eventlet.hubs.use_hub()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAI3%2F%2F%2Fl8%3D","line":136,"updated":"2012-06-20 16:52:03.000000000","message":"I don\u0027t understand what this is for. Looking through the Python core module sources, default_request_version is only there to specify how to parse invalid HTTP requests. This change appears to be completely unrelated to the rest of the patch.","commit_id":"306cdf3e1e71f0a65a1a89848aaf091e5a42213e"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"dadefdaf4b4bdb9dc3aeffc301aff476c04bbe20","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def run_server_in_process(self):"},{"line_number":135,"context_line":"        \"\"\"Run a WSGI server.\"\"\""},{"line_number":136,"context_line":"        eventlet.wsgi.HttpProtocol.default_request_version \u003d \"HTTP/1.0\""},{"line_number":137,"context_line":"        #(zhiteng) Mac OS X don\u0027t have \u0027poll\u0027 support, so we leave eventlet"},{"line_number":138,"context_line":"        # to determine which hub to use."},{"line_number":139,"context_line":"        eventlet.hubs.use_hub()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAI3%2F%2F%2Bxw%3D","line":136,"in_reply_to":"AAAAI3%2F%2F%2Fl8%3D","updated":"2012-06-21 19:04:43.000000000","message":"Done","commit_id":"306cdf3e1e71f0a65a1a89848aaf091e5a42213e"}]}
