)]}'
{"octavia/cmd/health_manager.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cbafb16ef8323d36f6cb083560bc06d658eefc64","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9ff52f3f_79678727","line":77,"updated":"2017-04-13 03:50:49.000000000","message":"Odd, there should be a join() right here to ensure the child processes actually did terminate...\n\nAnd say if they didn\u0027t after X seconds kill them...","commit_id":"b7f22fd602bb208a6d63eb37365574a85ca3e681"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"27bec51c545a76be8aafd3920901af515f73faec","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def hm_listener():"},{"line_number":41,"context_line":"    # TODO(german): stevedore load those drivers"},{"line_number":42,"context_line":"    signal.signal(signal.SIGINT, signal.SIG_IGN)"},{"line_number":43,"context_line":"    udp_getter \u003d heartbeat_udp.UDPStatusGetter("},{"line_number":44,"context_line":"        update_db.UpdateHealthDb(),"},{"line_number":45,"context_line":"        update_db.UpdateStatsDb())"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_90bf8ffa","line":42,"updated":"2017-04-17 17:00:24.000000000","message":"What\u0027s up with this?","commit_id":"3f4565b05303f99dbd6fe48f6778bc15ac1a4b49"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"e4363a1e8527cce04606981848b64712d774c768","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def hm_listener():"},{"line_number":41,"context_line":"    # TODO(german): stevedore load those drivers"},{"line_number":42,"context_line":"    signal.signal(signal.SIGINT, signal.SIG_IGN)"},{"line_number":43,"context_line":"    udp_getter \u003d heartbeat_udp.UDPStatusGetter("},{"line_number":44,"context_line":"        update_db.UpdateHealthDb(),"},{"line_number":45,"context_line":"        update_db.UpdateStatsDb())"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_c13b07cf","line":42,"in_reply_to":"7ffa3b31_10ddbf41","updated":"2017-04-17 18:32:23.000000000","message":"No you are right, this is not needed.","commit_id":"3f4565b05303f99dbd6fe48f6778bc15ac1a4b49"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"946b1b1385188ff7e0d40f14d9df7e221d64d44e","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def hm_listener():"},{"line_number":41,"context_line":"    # TODO(german): stevedore load those drivers"},{"line_number":42,"context_line":"    signal.signal(signal.SIGINT, signal.SIG_IGN)"},{"line_number":43,"context_line":"    udp_getter \u003d heartbeat_udp.UDPStatusGetter("},{"line_number":44,"context_line":"        update_db.UpdateHealthDb(),"},{"line_number":45,"context_line":"        update_db.UpdateStatsDb())"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_10ddbf41","line":42,"in_reply_to":"7ffa3b31_90bf8ffa","updated":"2017-04-17 17:03:27.000000000","message":"Mainly I guess the question is why?\n\n(not saying its bad, I just don\u0027t understand it).","commit_id":"3f4565b05303f99dbd6fe48f6778bc15ac1a4b49"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"58f0cd805ad05cdd1a30378aafd9d16bd5164fb4","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def hm_listener():"},{"line_number":41,"context_line":"    # TODO(german): stevedore load those drivers"},{"line_number":42,"context_line":"    signal.signal(signal.SIGINT, signal.SIG_IGN)"},{"line_number":43,"context_line":"    udp_getter \u003d heartbeat_udp.UDPStatusGetter("},{"line_number":44,"context_line":"        update_db.UpdateHealthDb(),"},{"line_number":45,"context_line":"        update_db.UpdateStatsDb())"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_3c1ad47c","line":42,"updated":"2017-04-17 19:39:15.000000000","message":"Added signal handling back in as without it udp_getter.check() wont gracefully exit when it gets a SIGINT.","commit_id":"6cb2108133ffb2c0db8975b1f2382d901f831ca6"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"8ac8e3ea7cf6849852c8d780245e8b1573ac02c2","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            process.join()"},{"line_number":83,"context_line":"    except KeyboardInterrupt:"},{"line_number":84,"context_line":"        LOG.info(_LI(\"Health Manager exiting due to signal\"))"},{"line_number":85,"context_line":"        exit_event.set()"},{"line_number":86,"context_line":"        hm_listener_proc.terminate()"},{"line_number":87,"context_line":"        hm_health_check_proc.terminate()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_9f655748","line":85,"updated":"2017-04-17 22:36:40.000000000","message":"So, I think I understand that execution will be \"stuck\" on line 82 above, and when you ctrl-c the signal will be caught in either of the two processes, set the shared exit semaphore, causing both to finish and join, and then it should exit gracefully, having not actually made it to this except block. Right?\n\nSo, is this still needed? Is it possible to actually have KeyboardInterrupt happen, as the signal is being caught? And if so, is this exactly what we still want to do?","commit_id":"6cb2108133ffb2c0db8975b1f2382d901f831ca6"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"aa39c1dbb57e2cd8e6116f2650c87847f1786cce","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            process.join()"},{"line_number":83,"context_line":"    except KeyboardInterrupt:"},{"line_number":84,"context_line":"        LOG.info(_LI(\"Health Manager exiting due to signal\"))"},{"line_number":85,"context_line":"        exit_event.set()"},{"line_number":86,"context_line":"        hm_listener_proc.terminate()"},{"line_number":87,"context_line":"        hm_health_check_proc.terminate()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_daa3d19d","line":85,"in_reply_to":"7ffa3b31_1f84a7b0","updated":"2017-04-18 16:37:33.000000000","message":"In that case, shouldn\u0027t we just retry the joins here? This could terminate the subprocesses before they have time to actually exit based on the signal.\nIt\u0027s also interesting that it\u0027s doing two specific processes here and not using the for-look as above, which honestly doesn\u0027t matter but is inconsistent.","commit_id":"6cb2108133ffb2c0db8975b1f2382d901f831ca6"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"1faac54ba2d0c27fd7d91c47b3554b5b4da070e2","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            process.join()"},{"line_number":83,"context_line":"    except KeyboardInterrupt:"},{"line_number":84,"context_line":"        LOG.info(_LI(\"Health Manager exiting due to signal\"))"},{"line_number":85,"context_line":"        exit_event.set()"},{"line_number":86,"context_line":"        hm_listener_proc.terminate()"},{"line_number":87,"context_line":"        hm_health_check_proc.terminate()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_1f84a7b0","line":85,"in_reply_to":"7ffa3b31_9f655748","updated":"2017-04-17 22:49:23.000000000","message":"KeyboardInterrupt gets sent to each sub process as well as the main process. I am only catching SIG_INT for the sub processes. So the main process will still raise KeyboardInterrupt and run this exception block.","commit_id":"6cb2108133ffb2c0db8975b1f2382d901f831ca6"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"0091b77726ea77d70f2be6e2cbe6ad67217ecb93","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            process.join()"},{"line_number":83,"context_line":"    except KeyboardInterrupt:"},{"line_number":84,"context_line":"        LOG.info(_LI(\"Health Manager exiting due to signal\"))"},{"line_number":85,"context_line":"        exit_event.set()"},{"line_number":86,"context_line":"        hm_listener_proc.terminate()"},{"line_number":87,"context_line":"        hm_health_check_proc.terminate()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ffa3b31_fda8c7db","line":85,"in_reply_to":"7ffa3b31_daa3d19d","updated":"2017-04-18 16:56:12.000000000","message":"That is a fair point I will fix the for loop inconsistency. \n\nIf I call join again in here without setting the exit event I believe the subprocess will hang indefinitely because it is ignoring the SIGINT signal so it doesn\u0027t even realize that it should shut down until this event is set.\n\nAm I doing this wrong? Is there a better way I can do this and have the application still shut down gracefully?","commit_id":"6cb2108133ffb2c0db8975b1f2382d901f831ca6"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1f36960c28935969acd85a39aeff69981d1ff910","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        exit_event.set()"},{"line_number":86,"context_line":"        for process in processes:"},{"line_number":87,"context_line":"            process.join(1)"},{"line_number":88,"context_line":"            process.terminate()"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ffa3b31_8e8a80bc","line":88,"updated":"2017-04-19 20:03:35.000000000","message":"Maybe someone with more MP experience could chime in here, but I *think* this should work. I\u0027ll need to test it in devstack before I +2.","commit_id":"8a56b3cf91587f4590d39acff7d52d01e4a4e96c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"83fa3f12450db4ecaee96c9cf636fdbb36366e6e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def hm_exit(*args, **kwargs):"},{"line_number":54,"context_line":"        health_check.stop()"},{"line_number":55,"context_line":"        hm.executor.shutdown()"},{"line_number":56,"context_line":"    signal.signal(signal.SIGINT, hm_exit)"},{"line_number":57,"context_line":"    health_check \u003d PeriodicWorker([(hm.health_check, None, None)],"},{"line_number":58,"context_line":"                                  schedule_strategy\u003d\u0027aligned_last_finished\u0027)"},{"line_number":59,"context_line":"    health_check.start()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ffa3b31_5a23eb56","line":56,"updated":"2017-04-20 22:16:10.000000000","message":"I think you just need to reorganize some stuff so the signal is before the wait:\n\ndef hm_health_check(exit_event):\n    hm \u003d health_manager.HealthManager()\n    health_check \u003d PeriodicWorker([(hm.health_check, None, None)],\n                                  schedule_strategy\u003d\u0027aligned_last_finished\u0027)\n\n    def hm_exit(*args, **kwargs):\n        health_check.stop()\n        hm.executor.shutdown()\n    signal.signal(signal.SIGINT, hm_exit)\n\n    LOG.debug(\"Pausing before starting health check\")\n    exit_event.wait(CONF.health_manager.heartbeat_timeout)\n    health_check.start()","commit_id":"c21001a9b5a47814a0ab424fdbbe6bd251308c34"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08d558d88a33154cb719e2381ee69bd3ba23d658","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def process_cleanup(*args, **kwargs):"},{"line_number":85,"context_line":"        LOG.info(\"Health Manager exiting due to signal\")"},{"line_number":86,"context_line":"        exit_event.set()"},{"line_number":87,"context_line":"        os.kill(hm_health_check_proc.pid(), signal.SIGINT)"},{"line_number":88,"context_line":"        hm_health_check_proc.join()"},{"line_number":89,"context_line":"        hm_listener_proc.terminate()"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_9b67f125","line":87,"updated":"2017-11-07 17:52:56.000000000","message":"Nov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: INFO octavia.cmd.health_manager [-] Health Manager exiting due to signal\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: CRITICAL octavia [-] Unhandled error: TypeError: \u0027int\u0027 object is not callable\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia Traceback (most recent call last):\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/usr/local/bin/octavia-health-manager\", line 10, in \u003cmodule\u003e\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     sys.exit(main())\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/opt/stack/octavia/octavia/cmd/health_manager.py\", line 95, in main\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     process.join()\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/usr/lib/python2.7/multiprocessing/process.py\", line 145, in join\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     res \u003d self._popen.wait(timeout)\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/usr/lib/python2.7/multiprocessing/forking.py\", line 154, in wait\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     return self.poll(0)\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/usr/lib/python2.7/multiprocessing/forking.py\", line 135, in poll\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     pid, sts \u003d os.waitpid(self.pid, flag)\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia   File \"/opt/stack/octavia/octavia/cmd/health_manager.py\", line 87, in process_cleanup\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia     os.kill(hm_health_check_proc.pid(), signal.SIGINT)\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia TypeError: \u0027int\u0027 object is not callable\nNov 07 09:51:56 devstackpy27-2 octavia-health-manager[6960]: ERROR octavia","commit_id":"12ee3f9ca6796eca61a11ed4ea7a0f8658bb8cc1"}],"octavia/controller/healthmanager/health_manager.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d1677c6ff8ee3060cca1b0c78f6877a9f1124c23","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                    session \u003d db_api.get_session()"},{"line_number":46,"context_line":"                    LOG.debug(\"Starting amphora health check\")"},{"line_number":47,"context_line":"                    failover_count \u003d 0"},{"line_number":48,"context_line":"                    while True:"},{"line_number":49,"context_line":"                        amp \u003d amp_health_repo.get_stale_amphora(session)"},{"line_number":50,"context_line":"                        if amp is None:"},{"line_number":51,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ff52f3f_f9add731","line":48,"updated":"2017-04-13 03:48:04.000000000","message":"To make this respond to shutdowns even faster do the same while not self.exit.is_set() here as well.","commit_id":"b7f22fd602bb208a6d63eb37365574a85ca3e681"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"27bec51c545a76be8aafd3920901af515f73faec","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                LOG.info(_LI(\"Failed over %s amphora\"), failover_count)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        finally:"},{"line_number":55,"context_line":"            self.executor.shutdown()"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_d0c51790","line":55,"updated":"2017-04-17 17:00:24.000000000","message":"So I\u0027d recommend an explicit stop method instead of doing this in a finally block, IMHO such a method is more explicit and easier to reason about.\n\nFinally blocks are also sort of finky; so I\u0027d not recommend them for this (since it can/will block).","commit_id":"3f4565b05303f99dbd6fe48f6778bc15ac1a4b49"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"8d78c8ad9b8a46bbe71a2566168831b3093b1b58","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class HealthManager(object):"},{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        self.cw \u003d cw.ControllerWorker()"},{"line_number":34,"context_line":"        self.threads \u003d CONF.health_manager.failover_threads"},{"line_number":35,"context_line":"        self.executor \u003d ThreadPoolExecutor(self.threads)"},{"line_number":36,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_766a3bed","line":34,"updated":"2017-04-21 06:28:10.000000000","message":"So this is intersting btw, because the periodic schedule inside of futurist already can schedule multiple jobs in parallel; its not a scheduler that fires off one job, waits for it to finish, then fires off the next.\n\nI\u0027m not saying doing this is bad, it just feels odd knowing how the internals of the furturist periodic worker work (because internally used inside of it is a equivalent thread pool executor, lol).\n\nI kid u not @ https://github.com/openstack/futurist/blob/master/futurist/periodics.py#L611 (and ya, I may have written that code, its a little fugly, lol).","commit_id":"91fa0cd40a38c6987b2747b57808747383db76d9"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"096077de5bd685bd9c754d2e98caa465bee93c1f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class HealthManager(object):"},{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        self.cw \u003d cw.ControllerWorker()"},{"line_number":34,"context_line":"        self.threads \u003d CONF.health_manager.failover_threads"},{"line_number":35,"context_line":"        self.executor \u003d ThreadPoolExecutor(self.threads)"},{"line_number":36,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_f11e55b9","line":34,"in_reply_to":"7ffa3b31_71c925aa","updated":"2017-04-21 17:52:33.000000000","message":"Done","commit_id":"91fa0cd40a38c6987b2747b57808747383db76d9"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"e0f774669abd2ce9500e99b8874208096aff5978","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class HealthManager(object):"},{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        self.cw \u003d cw.ControllerWorker()"},{"line_number":34,"context_line":"        self.threads \u003d CONF.health_manager.failover_threads"},{"line_number":35,"context_line":"        self.executor \u003d ThreadPoolExecutor(self.threads)"},{"line_number":36,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_15908649","line":34,"in_reply_to":"7ffa3b31_71c925aa","updated":"2017-04-21 11:03:40.000000000","message":"So, if you plan to change it to use this functionality, you should put \"workflow -1\" to mark the change as Work In Progress, so no one merges it before you are finished making the changes. :)","commit_id":"91fa0cd40a38c6987b2747b57808747383db76d9"},{"author":{"_account_id":25674,"name":"Jude Cross","email":"jucross@blizzard.com","username":"problem_v"},"change_message_id":"5b87f27dd18164a7adc799f665dd86e42be53960","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class HealthManager(object):"},{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        self.cw \u003d cw.ControllerWorker()"},{"line_number":34,"context_line":"        self.threads \u003d CONF.health_manager.failover_threads"},{"line_number":35,"context_line":"        self.executor \u003d ThreadPoolExecutor(self.threads)"},{"line_number":36,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ffa3b31_71c925aa","line":34,"in_reply_to":"7ffa3b31_766a3bed","updated":"2017-04-21 06:36:23.000000000","message":"Interesting, if I am reading this right I can pass my own threadpool factory in even...\n\n:type executor_factory: ExecutorFactory or any callable\n\nThis makes me want to use it... \u003e.\u003e","commit_id":"91fa0cd40a38c6987b2747b57808747383db76d9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f15835d54f635a754ca54664bc39ff63c73c087b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @periodics.periodic(CONF.health_manager.health_check_interval,"},{"line_number":66,"context_line":"                        run_immediately\u003dTrue)"},{"line_number":67,"context_line":"    def health_check(self):"},{"line_number":68,"context_line":"        LOG.debug(\"Starting amphora health check\")"},{"line_number":69,"context_line":"        stats \u003d {"},{"line_number":70,"context_line":"            \u0027failover_attempted\u0027: 0,"},{"line_number":71,"context_line":"            \u0027failover_failed\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f4b6375_a6bf345f","line":68,"updated":"2017-11-07 19:32:37.000000000","message":"nit: this is now redundant to the periodic log message:\n\nNov 07 10:42:43 devstackpy27-2 octavia-health-manager[15769]: DEBUG futurist.periodics [-] Submitting periodic callback \u0027octavia.controller.healthmanager.health_manager.HealthManager.health_check\u0027 {{(pid\u003d15784) _process_scheduled /usr/local/lib/python2.7/dist-packages/futurist/periodics.py:639}}","commit_id":"b7c98b0341d29596969238e520a87fd3abb5c6b8"}],"octavia/tests/unit/cmd/test_health_manager.py":[{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"536b5bf956e4c4768d46bac41d2ed6406a7fc0e9","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import signal"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from octavia.cmd import health_manager"},{"line_number":19,"context_line":"from octavia.tests.unit import base"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f4b6375_b4af6c7b","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":13},"updated":"2017-11-07 02:45:58.000000000","message":"Move this line up and test tox -e pep8 before pushing code.","commit_id":"3fb7477d6f9f4b9377bb95d563eed4e19185f951"}],"octavia/tests/unit/controller/healthmanager/test_health_manager.py":[{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"7f2006b1abf5aa229a6861c89e74091bb5bae272","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import threading"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_db import exception as db_exc"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_eeed2925","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":11},"updated":"2017-11-06 08:59:36.000000000","message":"Please move 1 line up.","commit_id":"1262c64ff5eaf6f148e5d8db26f0edfa9da82c74"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a368a683c00c02e0b57985b42a1a692de5cc85fd","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import threading"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_db import exception as db_exc"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_c0d6aa4f","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":11},"in_reply_to":"3f4b6375_eeed2925","updated":"2017-11-06 23:14:35.000000000","message":"Derp, yes. I failed at alphabet.","commit_id":"1262c64ff5eaf6f148e5d8db26f0edfa9da82c74"}],"requirements.txt":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"9fd2dd66a9297e58b97702f1606fffeec668d3ac","unresolved":false,"context_lines":[{"line_number":7,"context_line":"pbr!\u003d2.1.0,\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":8,"context_line":"SQLAlchemy!\u003d1.1.5,!\u003d1.1.6,!\u003d1.1.7,!\u003d1.1.8,\u003e\u003d1.0.10 # MIT"},{"line_number":9,"context_line":"Babel!\u003d2.4.0,\u003e\u003d2.3.4 # BSD"},{"line_number":10,"context_line":"eventlet!\u003d0.18.3,\u003e\u003d0.18.2 # MIT"},{"line_number":11,"context_line":"futurist\u003e\u003d0.11.0,!\u003d0.15.0  # Apache-2.0"},{"line_number":12,"context_line":"requests!\u003d2.12.2,!\u003d2.13.0,\u003e\u003d2.10.0 # Apache-2.0"},{"line_number":13,"context_line":"rfc3986\u003e\u003d0.3.1 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":14,"id":"7ffa3b31_bb61ceab","line":10,"updated":"2017-04-21 04:46:57.000000000","message":"You added eventlet back in. T_T","commit_id":"f68391ea088f0ce0738ab719cb46c83cc9438217"}]}
