)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"c32ff5e9f7290c0a5e60232e49f92915b3eb5e59","unresolved":false,"context_lines":[{"line_number":39,"context_line":"support neutron listener and port-status"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Change-Id: I9f643e95dc4da1d9ff5b2ee27729a293ff7f47e6"},{"line_number":42,"context_line":"Partially-implements: blueprint refactor-port-status-update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"5a74a57a_79b736d8","line":42,"updated":"2016-11-25 03:52:09.000000000","message":"Also Closes-Bug: #1636714","commit_id":"78a17f82e1b297cc25dfde8530cd53bcc4de47f5"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ae7459d4ab3c0674d95cd66e8fccd0120d8b45c0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"workers are created. Say this neutron-server is neutron listener"},{"line_number":17,"context_line":"on the node"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"2. Currently neutron-servers only register itself to df-db, but"},{"line_number":20,"context_line":"will not update it with a timestamp periodically. When there is a"},{"line_number":21,"context_line":"event(e.g port-status up/down) to send, The df controller chooses"},{"line_number":22,"context_line":"a neutron-server randomly without caring it is dead or alive."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"5a74a57a_08986ebf","line":20,"range":{"start_line":19,"start_character":3,"end_line":20,"end_character":15},"updated":"2016-11-28 07:36:49.000000000","message":"do you mean with this change or before that?","commit_id":"d9206a45d2f03362a43cbc230711f26b9bf9f2d7"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refactor port-status-update NB API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Before this patch, when there are more than one neutron-server"},{"line_number":10,"context_line":"workers on a single node, every each worker holds a port_status_notifier"},{"line_number":11,"context_line":"instance and each of them subscribes the same topic because they"},{"line_number":12,"context_line":"are on the same node. This is not necessary."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a6eadb0_91f8bdc6","line":10,"range":{"start_line":10,"start_character":26,"end_line":10,"end_character":43},"updated":"2016-12-19 10:09:05.000000000","message":"every worker","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Before this patch, when there are more than one neutron-server"},{"line_number":10,"context_line":"workers on a single node, every each worker holds a port_status_notifier"},{"line_number":11,"context_line":"instance and each of them subscribes the same topic because they"},{"line_number":12,"context_line":"are on the same node. This is not necessary."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes sure there is only one neutron-server worker"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a6eadb0_712a412e","line":11,"range":{"start_line":11,"start_character":36,"end_line":11,"end_character":45},"updated":"2016-12-19 10:09:05.000000000","message":"for or to","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":12,"context_line":"are on the same node. This is not necessary."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes sure there is only one neutron-server worker"},{"line_number":15,"context_line":"subscribe the topic(hostname of the node) no matter how many"},{"line_number":16,"context_line":"workers are created. Say this neutron-server is neutron listener"},{"line_number":17,"context_line":"on the node"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a6eadb0_51dc6546","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":9},"updated":"2016-12-19 10:09:05.000000000","message":"subscribed to","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"the timestamp, then chooses from the lastest 50% neutron listeners."},{"line_number":28,"context_line":"This can help to avoid chooing a dead one as far as possible"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"For now, we don\u0027t remove neutron listeners from df-db automatically."},{"line_number":31,"context_line":"But admins can do it manually."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Change-Id: I9f643e95dc4da1d9ff5b2ee27729a293ff7f47e6"},{"line_number":34,"context_line":"Partially-implements: blueprint refactor-port-status-update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a6eadb0_7186c114","line":31,"range":{"start_line":30,"start_character":0,"end_line":31,"end_character":30},"updated":"2016-12-19 10:09:05.000000000","message":"On the opposite, if there is zero active listeners left, is there any action taken?","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"8d6f2b4b74577e145b088e118d60c727688e0d28","unresolved":false,"context_lines":[{"line_number":27,"context_line":"the timestamp, then chooses from the lastest 50% neutron listeners."},{"line_number":28,"context_line":"This can help to avoid chooing a dead one as far as possible"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"For now, we don\u0027t remove neutron listeners from df-db automatically."},{"line_number":31,"context_line":"But admins can do it manually."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Change-Id: I9f643e95dc4da1d9ff5b2ee27729a293ff7f47e6"},{"line_number":34,"context_line":"Partially-implements: blueprint refactor-port-status-update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a6eadb0_f7755c32","line":31,"range":{"start_line":30,"start_character":0,"end_line":31,"end_character":30},"in_reply_to":"1a6eadb0_7186c114","updated":"2016-12-19 11:34:36.000000000","message":"We just log a warning in redis_port_status_notifier.py, line 100","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"}],"devstack/plugin.sh":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"OVS_VSWITCHD_PID\u003d$OVS_DIR\"/\"$OVS_VSWITCHD_SERVICE\".pid\""},{"line_number":56,"context_line":"OVS_VSWITCH_OCSSCHEMA_FILE\u003d${OVS_VSWITCH_OCSSCHEMA_FILE:-\"/usr/share/openvswitch/vswitch.ovsschema\"}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# Port status notifier"},{"line_number":59,"context_line":"ENABLE_NEUTRON_LISTENER\u003d${ENABLE_NEUTRON_LISTENER:-\"False\"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"ACTION\u003d$1"}],"source_content_type":"text/x-sh","patch_set":12,"id":"7a77a97e_b1095597","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":22},"updated":"2016-11-21 02:37:03.000000000","message":"Comments update?","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":55,"context_line":"OVS_VSWITCHD_PID\u003d$OVS_DIR\"/\"$OVS_VSWITCHD_SERVICE\".pid\""},{"line_number":56,"context_line":"OVS_VSWITCH_OCSSCHEMA_FILE\u003d${OVS_VSWITCH_OCSSCHEMA_FILE:-\"/usr/share/openvswitch/vswitch.ovsschema\"}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# Port status notifier"},{"line_number":59,"context_line":"ENABLE_NEUTRON_LISTENER\u003d${ENABLE_NEUTRON_LISTENER:-\"False\"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"ACTION\u003d$1"}],"source_content_type":"text/x-sh","patch_set":12,"id":"7a77a97e_8c06fe83","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":22},"in_reply_to":"7a77a97e_b1095597","updated":"2016-11-21 03:44:37.000000000","message":"Done","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"if is_service_enabled df-redis ; then"},{"line_number":90,"context_line":"    is_df_db_driver_selected \u0026\u0026 die $LINENO \"More than one database service is set for Dragonflow.\""},{"line_number":91,"context_line":"    source $DEST/dragonflow/devstack/redis_driver"},{"line_number":92,"context_line":"    NB_DRIVER_CLASS\u003d\"redis_nb_db_driver\""},{"line_number":93,"context_line":"    DF_REDIS_PUBSUB\u003d${DF_REDIS_PUBSUB:-\"True\"}"},{"line_number":94,"context_line":"else"},{"line_number":95,"context_line":"    DF_REDIS_PUBSUB\u003d\"False\""}],"source_content_type":"text/x-sh","patch_set":12,"id":"7a77a97e_316b851f","line":92,"updated":"2016-11-21 02:37:03.000000000","message":"Why removing enabling notifier for redis?","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":89,"context_line":"if is_service_enabled df-redis ; then"},{"line_number":90,"context_line":"    is_df_db_driver_selected \u0026\u0026 die $LINENO \"More than one database service is set for Dragonflow.\""},{"line_number":91,"context_line":"    source $DEST/dragonflow/devstack/redis_driver"},{"line_number":92,"context_line":"    NB_DRIVER_CLASS\u003d\"redis_nb_db_driver\""},{"line_number":93,"context_line":"    DF_REDIS_PUBSUB\u003d${DF_REDIS_PUBSUB:-\"True\"}"},{"line_number":94,"context_line":"else"},{"line_number":95,"context_line":"    DF_REDIS_PUBSUB\u003d\"False\""}],"source_content_type":"text/x-sh","patch_set":12,"id":"7a77a97e_ccfc7674","line":92,"in_reply_to":"7a77a97e_316b851f","updated":"2016-11-21 03:44:37.000000000","message":"Because port-status is supported by all df-db backend. For detail, you can take it look at commit message No.3.","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"}],"dragonflow/cli/df_db.py":[{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":28,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":29,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":30,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":31,"context_line":"             \u0027unique_key\u0027, \u0027n_listener\u0027]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_7176cf3f","line":31,"updated":"2016-12-01 17:18:12.000000000","message":"Can we make it, neutron_listener or just listener? Because it will code more readable.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":28,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":29,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":30,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":31,"context_line":"             \u0027unique_key\u0027, \u0027n_listener\u0027]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_b9574501","line":31,"in_reply_to":"3a71b18c_7176cf3f","updated":"2016-12-02 06:08:14.000000000","message":"I will make it \u0027listener\u0027, neutron_listener is a bit too long","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":27,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":28,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":29,"context_line":"             \u0027unique_key\u0027, \u0027listener\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_5198e56a","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":37},"updated":"2016-12-19 10:09:05.000000000","message":"maybe this can be a bit more specific name","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"8d6f2b4b74577e145b088e118d60c727688e0d28","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":27,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":28,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":29,"context_line":"             \u0027unique_key\u0027, \u0027listener\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_97b8a8e7","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":37},"in_reply_to":"1a6eadb0_5198e56a","updated":"2016-12-19 11:34:36.000000000","message":"Any example? No better ones come to my mind :)","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"001161f16b1e0eb1d356dcfe25fa4f8eebb469dc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":27,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":28,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":29,"context_line":"             \u0027unique_key\u0027, \u0027listener\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_7ae74812","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":37},"in_reply_to":"1a6eadb0_6b788590","updated":"2016-12-20 05:47:15.000000000","message":"I think we can keep it listener, and I will replace it with models.xxx.table_name","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"efb8f88ed8b4f0aab2addb3ac4228d2351c00313","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":27,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":28,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":29,"context_line":"             \u0027unique_key\u0027, \u0027listener\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_6b788590","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":37},"in_reply_to":"1a6eadb0_97b8a8e7","updated":"2016-12-19 12:53:15.000000000","message":"maybe event_listener. another question, why \u0027listener\u0027 is specified explicitly and not as other like models.XXX.table_name","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8f6ee32bc16fbd5e02d84560cc9de107a39f3f9e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             models.LogicalRouter.table_name, models.Chassis.table_name,"},{"line_number":27,"context_line":"             models.SecurityGroup.table_name, models.Floatingip.table_name,"},{"line_number":28,"context_line":"             models.QosPolicy.table_name, models.Publisher.table_name,"},{"line_number":29,"context_line":"             \u0027unique_key\u0027, \u0027listener\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def print_tables():"}],"source_content_type":"text/x-python","patch_set":40,"id":"1a6eadb0_4129ce36","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":36},"updated":"2016-12-20 01:16:56.000000000","message":"This should be  models.Listener.table_name","commit_id":"1bd8e07ea29df60f013183483774daf641a0abd0"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"035cba1a2b766de9e27004432c21a39effb11226","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"db_tables \u003d list(models.table_class_mapping) + [\u0027unique_key\u0027, \u0027portstats\u0027]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def print_tables():"},{"line_number":29,"context_line":"    columns \u003d [\u0027table\u0027]"},{"line_number":30,"context_line":"    tables \u003d [{\u0027table\u0027: table} for table in db_tables]"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba5201f7_50348cdd","side":"PARENT","line":27,"updated":"2016-12-29 03:07:59.000000000","message":"No need to change here.","commit_id":"01d5a7483d72c121fd4a974a63c62de1e2d2d0a3"}],"dragonflow/common/common_params.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"               help\u003d_(\u0027Drivers to use for the Dragonflow pub/sub\u0027)),"},{"line_number":62,"context_line":"    cfg.BoolOpt(\u0027enable_neutron_listener\u0027,"},{"line_number":63,"context_line":"                default\u003dFalse,"},{"line_number":64,"context_line":"                help\u003d_(\u0027Enable Dragonflow controllers send notifications\u0027"},{"line_number":65,"context_line":"                       \u0027e.g port status, to neutron-server\u0027)),"},{"line_number":66,"context_line":"    cfg.ListOpt(\u0027publishers_ips\u0027,"},{"line_number":67,"context_line":"                default\u003d[\u0027$local_ip\u0027],"},{"line_number":68,"context_line":"                help\u003d_(\u0027List of the Neutron Server Publisher IPs.\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_f1a02d44","line":65,"range":{"start_line":64,"start_character":23,"end_line":65,"end_character":59},"updated":"2016-11-21 02:37:03.000000000","message":"This is actually enabling listener in neutron server, right? I think it is good to also add that listener will be enabled in neutron server.","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":61,"context_line":"               help\u003d_(\u0027Drivers to use for the Dragonflow pub/sub\u0027)),"},{"line_number":62,"context_line":"    cfg.BoolOpt(\u0027enable_neutron_listener\u0027,"},{"line_number":63,"context_line":"                default\u003dFalse,"},{"line_number":64,"context_line":"                help\u003d_(\u0027Enable Dragonflow controllers send notifications\u0027"},{"line_number":65,"context_line":"                       \u0027e.g port status, to neutron-server\u0027)),"},{"line_number":66,"context_line":"    cfg.ListOpt(\u0027publishers_ips\u0027,"},{"line_number":67,"context_line":"                default\u003d[\u0027$local_ip\u0027],"},{"line_number":68,"context_line":"                help\u003d_(\u0027List of the Neutron Server Publisher IPs.\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_cc339660","line":65,"range":{"start_line":64,"start_character":23,"end_line":65,"end_character":59},"in_reply_to":"7a77a97e_f1a02d44","updated":"2016-11-21 03:44:37.000000000","message":"Ok, and I am considering to remove the config. Because all df-db backends support and need this functionality","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ae7459d4ab3c0674d95cd66e8fccd0120d8b45c0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"               \u0027neutron_listener_report_delay\u0027)),"},{"line_number":152,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_delay\u0027,"},{"line_number":153,"context_line":"        default\u003d3,"},{"line_number":154,"context_line":"        help\u003d_(\u0027The max delay for Neutron to report heart beat to df-db\u0027))"},{"line_number":155,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_68e2c230","line":154,"range":{"start_line":154,"start_character":24,"end_line":154,"end_character":29},"updated":"2016-11-28 07:36:49.000000000","message":"in sec?","commit_id":"d9206a45d2f03362a43cbc230711f26b9bf9f2d7"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        default\u003d\u0027tap-metadata\u0027,"},{"line_number":159,"context_line":"        help\u003d_(\u0027The name of the interface to bind the metadata\u0027"},{"line_number":160,"context_line":"               \u0027service proxy\u0027)),"},{"line_number":161,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_interval\u0027,"},{"line_number":162,"context_line":"        default\u003d10,"},{"line_number":163,"context_line":"        help\u003d_(\u0027Neutron report heart beat to df-db every this number in\u0027"},{"line_number":164,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_f19e5f06","line":161,"updated":"2016-12-01 17:18:12.000000000","message":"Can we use the only report_interval? Read this blueprint, https://review.openstack.org/#/c/385719/8/doc/source/specs/support_check_chassis_alive.rst may be the same configuration name can be used. I think, for reporting heart beat for any services or component this parameter can be used in all the components.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        default\u003d\u0027tap-metadata\u0027,"},{"line_number":159,"context_line":"        help\u003d_(\u0027The name of the interface to bind the metadata\u0027"},{"line_number":160,"context_line":"               \u0027service proxy\u0027)),"},{"line_number":161,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_interval\u0027,"},{"line_number":162,"context_line":"        default\u003d10,"},{"line_number":163,"context_line":"        help\u003d_(\u0027Neutron report heart beat to df-db every this number in\u0027"},{"line_number":164,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_d9f881e8","line":161,"in_reply_to":"3a71b18c_f19e5f06","updated":"2016-12-02 06:08:14.000000000","message":"I\u0027d prefer to use different config names for different compontes. Consider the all-in-one node, people may want to use different interval for different components.\nWhat\u0027s more, I am thinking, in the future, we could divide the configurations of neutron-server, df-controllers, df-publishers to different sections in dragonflow.ini","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":164,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"},{"line_number":165,"context_line":"               \u0027neutron_listener_report_delay\u0027)),"},{"line_number":166,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_delay\u0027,"},{"line_number":167,"context_line":"        default\u003d3,"},{"line_number":168,"context_line":"        help\u003d_(\u0027The max delay in seconds for Neutron to report heart\u0027"},{"line_number":169,"context_line":"               \u0027beat to df-db\u0027))"},{"line_number":170,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_d14ec395","line":167,"range":{"start_line":167,"start_character":5,"end_line":167,"end_character":18},"updated":"2016-12-01 17:18:12.000000000","message":"I think, this is very low value. May be we should consider this value carefully otherwise it might result performance degradation.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":164,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"},{"line_number":165,"context_line":"               \u0027neutron_listener_report_delay\u0027)),"},{"line_number":166,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_delay\u0027,"},{"line_number":167,"context_line":"        default\u003d3,"},{"line_number":168,"context_line":"        help\u003d_(\u0027The max delay in seconds for Neutron to report heart\u0027"},{"line_number":169,"context_line":"               \u0027beat to df-db\u0027))"},{"line_number":170,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_1bc90679","line":167,"range":{"start_line":167,"start_character":5,"end_line":167,"end_character":18},"in_reply_to":"3a71b18c_d14ec395","updated":"2016-12-02 06:08:14.000000000","message":"Accepted. I took a look monitor_table_poll_time and the report_interval you referred in last comment, they are 30s by default. So I think 25s for neutron_listener_report_interval and 10s for neutron_listener_report_delay by default could be better.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"}],"dragonflow/common/utils.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":31,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027dragonflow.pubsub_driver\u0027"},{"line_number":32,"context_line":"DF_NB_DB_DRIVER_NAMESPACE \u003d \u0027dragonflow.nb_db_driver\u0027"},{"line_number":33,"context_line":"DF_PORT_STATUS_DRIVER_NAMESPACE \u003d \u0027dragonflow.port_status_driver\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_e65bec52","line":34,"updated":"2016-12-13 09:36:11.000000000","message":"If you have chance to respin the patch, try to remove the change here.","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"}],"dragonflow/conf/df_common_params.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":163,"context_line":"               \u0027service proxy\u0027)),"},{"line_number":164,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_interval\u0027,"},{"line_number":165,"context_line":"        default\u003d25,"},{"line_number":166,"context_line":"        help\u003d_(\u0027Neutron report heart beat to df-db every this number in\u0027"},{"line_number":167,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"},{"line_number":168,"context_line":"               \u0027neutron_listener_report_delay\u0027)),"},{"line_number":169,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_delay\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_c60c3045","line":166,"range":{"start_line":166,"start_character":45,"end_line":166,"end_character":50},"updated":"2016-12-13 09:36:11.000000000","message":"This is something user interfaced, maybe reword this?","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_interval\u0027,"},{"line_number":165,"context_line":"        default\u003d25,"},{"line_number":166,"context_line":"        help\u003d_(\u0027Neutron report heart beat to df-db every this number in\u0027"},{"line_number":167,"context_line":"               \u0027seconds plus a random delay, which is no more than\u0027"},{"line_number":168,"context_line":"               \u0027neutron_listener_report_delay\u0027)),"},{"line_number":169,"context_line":"    cfg.IntOpt(\u0027neutron_listener_report_delay\u0027,"},{"line_number":170,"context_line":"        default\u003d10,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_661d1c73","line":167,"range":{"start_line":167,"start_character":51,"end_line":167,"end_character":53},"updated":"2016-12-13 09:36:11.000000000","message":"should be?","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                               db_port\u003dcfg.CONF.df.remote_db_port)"},{"line_number":89,"context_line":"        self.vswitch_api.initialize(self.nb_api)"},{"line_number":90,"context_line":"        if cfg.CONF.df.enable_neutron_listener:"},{"line_number":91,"context_line":"            self.nb_api.publisher.initialize()"},{"line_number":92,"context_line":"        self.topology \u003d topology.Topology(self,"},{"line_number":93,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_ccc8f6aa","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":46},"updated":"2016-11-21 02:37:03.000000000","message":"Will this cause multi initialization along with https://github.com/openstack/dragonflow/blob/914d2b1b3d901b931bb41226e77c4fb6fcb0c38c/dragonflow/db/api_nb.py#L80","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                               db_port\u003dcfg.CONF.df.remote_db_port)"},{"line_number":89,"context_line":"        self.vswitch_api.initialize(self.nb_api)"},{"line_number":90,"context_line":"        if cfg.CONF.df.enable_neutron_listener:"},{"line_number":91,"context_line":"            self.nb_api.publisher.initialize()"},{"line_number":92,"context_line":"        self.topology \u003d topology.Topology(self,"},{"line_number":93,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_ec0db28f","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":46},"in_reply_to":"7a77a97e_ccc8f6aa","updated":"2016-11-21 03:44:37.000000000","message":"I don\u0027t think so, because the code you referred is called in neutron side","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        if l \u003d\u003d 0:"},{"line_number":598,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":599,"context_line":"            return"},{"line_number":600,"context_line":"        elif l \u003d\u003d 1:"},{"line_number":601,"context_line":"            n \u003d listeners[0]"},{"line_number":602,"context_line":"        else:"},{"line_number":603,"context_line":"            # sort by timestamp and choose from the latest ones. This can"},{"line_number":604,"context_line":"            # avoid a dead one is chosen as far as possible"},{"line_number":605,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":606,"context_line":"            n \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":607,"context_line":"        t \u003d n.get_topic()"},{"line_number":608,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dt)"},{"line_number":609,"context_line":"        LOG.info(_LI(\"Publish to neutron %s\"), t)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_2c932a5c","line":606,"range":{"start_line":600,"start_character":0,"end_line":606,"end_character":61},"updated":"2016-11-21 02:37:03.000000000","message":"This can alleviate the problem of choosing dead neutron server. Since the neutron server is reporting timestamp now, why not check the neutron server that reports within (for example) 30S. And random chose neutron server within these neutron servers.","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        if l \u003d\u003d 0:"},{"line_number":598,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":599,"context_line":"            return"},{"line_number":600,"context_line":"        elif l \u003d\u003d 1:"},{"line_number":601,"context_line":"            n \u003d listeners[0]"},{"line_number":602,"context_line":"        else:"},{"line_number":603,"context_line":"            # sort by timestamp and choose from the latest ones. This can"},{"line_number":604,"context_line":"            # avoid a dead one is chosen as far as possible"},{"line_number":605,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":606,"context_line":"            n \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":607,"context_line":"        t \u003d n.get_topic()"},{"line_number":608,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dt)"},{"line_number":609,"context_line":"        LOG.info(_LI(\"Publish to neutron %s\"), t)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_4cfb0647","line":606,"range":{"start_line":600,"start_character":0,"end_line":606,"end_character":61},"in_reply_to":"7a77a97e_2c932a5c","updated":"2016-11-21 03:44:37.000000000","message":"yes, I have been considering this. But the 30s limit can not guarantee a dead one not be choosen either, it also alleviate the problem. \n\nWhat about this, but I dont think it make much sense, also it also help to alleviate it, not solve the problem\nwhile retry \u003e 3:\n    n \u003d random.choice(listeners[:len(listeners) / 2])\n    if n.timestamp - now \u003e 30\n        retry -\u003d 1\n        contine\n    else:\n        break\nelse:\n    raise","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ae7459d4ab3c0674d95cd66e8fccd0120d8b45c0","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        return self.chassis_name"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    def notify_port_status(self, ovs_port, status):"},{"line_number":574,"context_line":"        if self.port_status_notifier is not None:"},{"line_number":575,"context_line":"            port_id \u003d ovs_port.get_iface_id()"},{"line_number":576,"context_line":"            self.port_status_notifier.notify_port_status(\u0027lport\u0027, port_id,"},{"line_number":577,"context_line":"                                                         \u0027update\u0027, status)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_c896763d","line":574,"range":{"start_line":574,"start_character":7,"end_line":574,"end_character":49},"updated":"2016-11-28 07:36:49.000000000","message":"you can just check:\nif self.port_status_notifier:","commit_id":"d9206a45d2f03362a43cbc230711f26b9bf9f2d7"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        return self.chassis_name"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def notify_port_status(self, ovs_port, status):"},{"line_number":558,"context_line":"        if self.port_status_notifier is not None:"},{"line_number":559,"context_line":"            self.port_status_notifier.notify_port_status(ovs_port, status)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_58241d5f","line":558,"range":{"start_line":558,"start_character":11,"end_line":558,"end_character":48},"updated":"2016-12-05 03:41:14.000000000","message":"if self.port_status_notifier:","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9f3199a03608a9e5cfe6954d44d06e215d075248","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                               db_port\u003dcfg.CONF.df.remote_db_port)"},{"line_number":88,"context_line":"        self.vswitch_api.initialize(self.nb_api)"},{"line_number":89,"context_line":"        if cfg.CONF.df.enable_port_status_notifier:"},{"line_number":90,"context_line":"            self.port_status_notifier.initialize(nb_api\u003dself.nb_api,"},{"line_number":91,"context_line":"                                                 is_neutron_server\u003dFalse)"},{"line_number":92,"context_line":"        self.topology \u003d topology.Topology(self,"},{"line_number":93,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":94,"context_line":"        if self.enable_db_consistency:"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a6eadb0_3e0a7226","line":91,"range":{"start_line":90,"start_character":49,"end_line":91,"end_character":72},"updated":"2016-12-17 14:03:35.000000000","message":"nit: you can pass the args directly","commit_id":"19284410a627ccbddcc12e627bc8ffd02e3e2e82"}],"dragonflow/controller/topology.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"16d90f560cf4e05d4f9a88f9581b9045638fd5dd","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def _vm_port_added(self, ovs_port):"},{"line_number":161,"context_line":"        self._vm_port_updated(ovs_port)"},{"line_number":162,"context_line":"        # publish vm port up event"},{"line_number":163,"context_line":"        if cfg.CONF.df.enable_neutron_listener:"},{"line_number":164,"context_line":"            self.controller.notify_port_status("},{"line_number":165,"context_line":"                ovs_port, constants.PORT_STATUS_UP)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_8abee6ab","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":47},"updated":"2016-11-20 15:41:22.000000000","message":"Maybe call this always and check if listener is enabled in df_local_controller.py?","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"488d71a6480c8e97e53b2c000383285b5cfab7b6","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def _vm_port_added(self, ovs_port):"},{"line_number":161,"context_line":"        self._vm_port_updated(ovs_port)"},{"line_number":162,"context_line":"        # publish vm port up event"},{"line_number":163,"context_line":"        if cfg.CONF.df.enable_neutron_listener:"},{"line_number":164,"context_line":"            self.controller.notify_port_status("},{"line_number":165,"context_line":"                ovs_port, constants.PORT_STATUS_UP)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_4c6146d2","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":47},"in_reply_to":"7a77a97e_8abee6ab","updated":"2016-11-21 02:21:46.000000000","message":"good idea","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"16d90f560cf4e05d4f9a88f9581b9045638fd5dd","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                \u0027Failed to process logical port offline event %s\u0027) % lport_id)"},{"line_number":220,"context_line":"        finally:"},{"line_number":221,"context_line":"            # publish vm port down event."},{"line_number":222,"context_line":"            if cfg.CONF.df.enable_neutron_listener:"},{"line_number":223,"context_line":"                self.controller.notify_port_status("},{"line_number":224,"context_line":"                    ovs_port, constants.PORT_STATUS_DOWN)"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_aadf220b","line":222,"range":{"start_line":222,"start_character":12,"end_line":222,"end_character":51},"updated":"2016-11-20 15:41:22.000000000","message":"Same","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"efb8b1be7478ea00213851cbd1956c10cd931803","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    def allocate_tunnel_key(self):"},{"line_number":146,"context_line":"        return self.driver.allocate_unique_key(\u0027lport\u0027)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def get_all_neutron_listener(self):"},{"line_number":149,"context_line":"        listeners \u003d self.driver.get_all_entries(\u0027n_listener\u0027)"},{"line_number":150,"context_line":"        return listeners"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_9ae70946","line":148,"range":{"start_line":148,"start_character":24,"end_line":148,"end_character":32},"updated":"2016-11-13 07:21:56.000000000","message":"listeners","commit_id":"a34d9d38678ef0bbb7ae202de41408617582812d"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"efb8b1be7478ea00213851cbd1956c10cd931803","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def create_neutron_listener(self, server_ip, **columns):"},{"line_number":153,"context_line":"        listener \u003d {"},{"line_number":154,"context_line":"            \u0027ip\u0027: server_ip"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":"        listener.update(columns)"},{"line_number":157,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_daf18103","line":154,"range":{"start_line":154,"start_character":11,"end_line":154,"end_character":16},"updated":"2016-11-13 07:21:56.000000000","message":"the key of listener? pls use \"id\" instread","commit_id":"a34d9d38678ef0bbb7ae202de41408617582812d"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"73249e7f315c5315dcdf19fff6b392cd0f5d4667","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def create_neutron_listener(self, server_ip, **columns):"},{"line_number":153,"context_line":"        listener \u003d {"},{"line_number":154,"context_line":"            \u0027ip\u0027: server_ip"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":"        listener.update(columns)"},{"line_number":157,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_20717078","line":154,"range":{"start_line":154,"start_character":11,"end_line":154,"end_character":16},"in_reply_to":"9a629dbe_daf18103","updated":"2016-11-13 13:54:01.000000000","message":"I am planning the add the hostname to the listener table as the id, just like what chassis table does. So I think we can keep ip for now","commit_id":"a34d9d38678ef0bbb7ae202de41408617582812d"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"efb8b1be7478ea00213851cbd1956c10cd931803","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def update_neutron_listener(self, server_ip, **columns):"},{"line_number":162,"context_line":"        listener \u003d {"},{"line_number":163,"context_line":"            \u0027ip\u0027: server_ip"},{"line_number":164,"context_line":"        }"},{"line_number":165,"context_line":"        listener.update(columns)"},{"line_number":166,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_faf645f8","line":163,"range":{"start_line":163,"start_character":12,"end_line":163,"end_character":16},"updated":"2016-11-13 07:21:56.000000000","message":"ditto","commit_id":"a34d9d38678ef0bbb7ae202de41408617582812d"},{"author":{"_account_id":22060,"name":"jingting","email":"kangjingting@huawei.com","username":"jingting"},"change_message_id":"6e4b8e8ceb5df148fefbb34c3e41c62422986fbe","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.driver.create_key(\u0027n_listener\u0027, server_ip,"},{"line_number":159,"context_line":"                               listener_json, None)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def update_neutron_listener(self, server_ip, **columns):"},{"line_number":162,"context_line":"        listener \u003d {"},{"line_number":163,"context_line":"            \u0027ip\u0027: server_ip"},{"line_number":164,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_c04b4f5e","line":161,"range":{"start_line":161,"start_character":8,"end_line":161,"end_character":31},"updated":"2016-11-14 01:58:34.000000000","message":"not used?","commit_id":"ba5ff21107cbc771781ad6f951756d15a6f55976"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"8450d0a735c4c372a8c3c37c25ec9f0f67278fdb","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.driver.create_key(\u0027n_listener\u0027, server_ip,"},{"line_number":159,"context_line":"                               listener_json, None)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def update_neutron_listener(self, server_ip, **columns):"},{"line_number":162,"context_line":"        listener \u003d {"},{"line_number":163,"context_line":"            \u0027ip\u0027: server_ip"},{"line_number":164,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_404adf28","line":161,"range":{"start_line":161,"start_character":8,"end_line":161,"end_character":31},"in_reply_to":"9a629dbe_c04b4f5e","updated":"2016-11-14 02:08:56.000000000","message":"yes, for now, but it will be used in a later patch. It will be used to report heart beat of neutron-server","commit_id":"ba5ff21107cbc771781ad6f951756d15a6f55976"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    def allocate_tunnel_key(self):"},{"line_number":146,"context_line":"        return self.driver.allocate_unique_key(\u0027lport\u0027)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def get_neutron_listener(self, id):"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            listener \u003d self.driver.get_key(\u0027n_listener\u0027, id, None)"},{"line_number":151,"context_line":"            return Listener(listener)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_ac949a36","line":148,"range":{"start_line":148,"start_character":35,"end_line":148,"end_character":37},"updated":"2016-11-21 02:37:03.000000000","message":"It is recommend not to shadow the python keyword/build-in function name with variable name. You can change to ip_address to make it more reasonable.","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    def allocate_tunnel_key(self):"},{"line_number":146,"context_line":"        return self.driver.allocate_unique_key(\u0027lport\u0027)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def get_neutron_listener(self, id):"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            listener \u003d self.driver.get_key(\u0027n_listener\u0027, id, None)"},{"line_number":151,"context_line":"            return Listener(listener)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_acc1fae5","line":148,"range":{"start_line":148,"start_character":35,"end_line":148,"end_character":37},"in_reply_to":"7a77a97e_ac949a36","updated":"2016-11-21 03:44:37.000000000","message":"I agree, but I used to be advised to keep consisten with other APIs. Maybe we can fix this in another patch.","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        listeners \u003d self.driver.get_all_entries(\u0027n_listener\u0027)"},{"line_number":157,"context_line":"        return [Listener(l) for l in listeners]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def create_neutron_listener(self, id, **columns):"},{"line_number":160,"context_line":"        listener \u003d {"},{"line_number":161,"context_line":"            \u0027id\u0027: id"},{"line_number":162,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_cc971638","line":159,"range":{"start_line":159,"start_character":38,"end_line":159,"end_character":40},"updated":"2016-11-21 02:37:03.000000000","message":"ditto","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        self.driver.create_key(\u0027n_listener\u0027, id,"},{"line_number":166,"context_line":"                               listener_json, None)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":169,"context_line":"        listener \u003d {"},{"line_number":170,"context_line":"            \u0027id\u0027: id"},{"line_number":171,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_ec9a1261","line":168,"range":{"start_line":168,"start_character":38,"end_line":168,"end_character":40},"updated":"2016-11-21 02:37:03.000000000","message":"ditto","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                               listener_json, None)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":174,"context_line":"        listener \u003d {"},{"line_number":175,"context_line":"            \u0027id\u0027: id"},{"line_number":176,"context_line":"        }"},{"line_number":177,"context_line":"        listener.update(columns)"},{"line_number":178,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":179,"context_line":"        self.driver.set_key(\u0027n_listener\u0027, id,"},{"line_number":180,"context_line":"                            listener_json, None)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_725ebb46","line":178,"range":{"start_line":174,"start_character":0,"end_line":178,"end_character":49},"updated":"2016-12-01 17:18:12.000000000","message":"this code can be can be moved in a different method, so that it can be reused in this method as well as previous method.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                               listener_json, None)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":174,"context_line":"        listener \u003d {"},{"line_number":175,"context_line":"            \u0027id\u0027: id"},{"line_number":176,"context_line":"        }"},{"line_number":177,"context_line":"        listener.update(columns)"},{"line_number":178,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":179,"context_line":"        self.driver.set_key(\u0027n_listener\u0027, id,"},{"line_number":180,"context_line":"                            listener_json, None)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_7b303a57","line":178,"range":{"start_line":174,"start_character":0,"end_line":178,"end_character":49},"in_reply_to":"3a71b18c_725ebb46","updated":"2016-12-02 06:08:14.000000000","message":"I agree. But Many other methods has the same problem. I think we can fix all of these in a new patch at one blow","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            self.publisher.send_event(update)"},{"line_number":147,"context_line":"            eventlet.sleep(0)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def allocate_tunnel_key(self):"},{"line_number":150,"context_line":"        return self.driver.allocate_unique_key("},{"line_number":151,"context_line":"            db_models.LogicalPort.table_name)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def get_neutron_listener(self, id):"},{"line_number":154,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_d196a893","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":45},"updated":"2016-12-13 09:36:11.000000000","message":"This has been removed in https://review.openstack.org/#/c/404664/1/dragonflow/db/api_nb.py","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def get_neutron_listener(self, id):"},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            listener \u003d self.driver.get_key(\u0027listener\u0027, id, None)"},{"line_number":152,"context_line":"            return db_models.Listener(listener)"},{"line_number":153,"context_line":"        except Exception:"},{"line_number":154,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_f69fec00","line":151,"range":{"start_line":151,"start_character":44,"end_line":151,"end_character":52},"updated":"2016-12-14 02:52:51.000000000","message":"try to use the table_name you added in models.","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            return None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def get_all_neutron_listeners(self):"},{"line_number":157,"context_line":"        listeners \u003d self.driver.get_all_entries(\u0027listener\u0027)"},{"line_number":158,"context_line":"        return [db_models.Listener(l) for l in listeners]"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def create_neutron_listener(self, id, **columns):"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_568500ab","line":157,"range":{"start_line":157,"start_character":49,"end_line":157,"end_character":57},"updated":"2016-12-14 02:52:51.000000000","message":"ditto","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        }"},{"line_number":164,"context_line":"        listener.update(columns)"},{"line_number":165,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":166,"context_line":"        self.driver.create_key(\u0027listener\u0027, id,"},{"line_number":167,"context_line":"                               listener_json, None)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def update_neutron_listener(self, id, **columns):"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_7694bce1","line":166,"range":{"start_line":166,"start_character":32,"end_line":166,"end_character":40},"updated":"2016-12-14 02:52:51.000000000","message":"ditto","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        }"},{"line_number":173,"context_line":"        listener.update(columns)"},{"line_number":174,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":175,"context_line":"        self.driver.set_key(\u0027listener\u0027, id,"},{"line_number":176,"context_line":"                            listener_json, None)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def register_notification_callback(self, controller):"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_968f98cb","line":175,"range":{"start_line":175,"start_character":29,"end_line":175,"end_character":37},"updated":"2016-12-14 02:52:51.000000000","message":"ditto","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3ba943e7a2196ad77513f2296bc16f152c610622","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    def get_neutron_listener(self, id):"},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            listener \u003d self.driver.get_key(db_models.Listener.table_name,"},{"line_number":152,"context_line":"                                           id, None)"},{"line_number":153,"context_line":"            return db_models.Listener(listener)"},{"line_number":154,"context_line":"        except Exception:"},{"line_number":155,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":42,"id":"1a6eadb0_7d3ae2ce","line":152,"range":{"start_line":152,"start_character":47,"end_line":152,"end_character":51},"updated":"2016-12-20 06:12:30.000000000","message":"pls remove the useless arg as this patch:\nhttps://review.openstack.org/#/c/412221/","commit_id":"303cea878e087a21d358f98684bfa56477dc24aa"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3ba943e7a2196ad77513f2296bc16f152c610622","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        listener.update(columns)"},{"line_number":166,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":167,"context_line":"        self.driver.create_key(db_models.Listener.table_name, id,"},{"line_number":168,"context_line":"                               listener_json, None)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":171,"context_line":"        listener \u003d {"}],"source_content_type":"text/x-python","patch_set":42,"id":"1a6eadb0_bd347ade","line":168,"range":{"start_line":168,"start_character":46,"end_line":168,"end_character":50},"updated":"2016-12-20 06:12:30.000000000","message":"ditto","commit_id":"303cea878e087a21d358f98684bfa56477dc24aa"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"3ba943e7a2196ad77513f2296bc16f152c610622","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        listener.update(columns)"},{"line_number":175,"context_line":"        listener_json \u003d jsonutils.dumps(listener)"},{"line_number":176,"context_line":"        self.driver.set_key(db_models.Listener.table_name, id,"},{"line_number":177,"context_line":"                            listener_json, None)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def delete_neutron_listener(self, host):"},{"line_number":180,"context_line":"        self.driver.delete_key(db_models.Listener.table_name, host)"}],"source_content_type":"text/x-python","patch_set":42,"id":"1a6eadb0_1d500e0a","line":177,"range":{"start_line":177,"start_character":43,"end_line":177,"end_character":47},"updated":"2016-12-20 06:12:30.000000000","message":"ditto","commit_id":"303cea878e087a21d358f98684bfa56477dc24aa"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4ef925dd66eb292ebc6c8750c8f00519bbf13f50","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.driver.create_key(db_models.Listener.table_name, id,"},{"line_number":177,"context_line":"                               listener_json)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":180,"context_line":"        listener \u003d {"},{"line_number":181,"context_line":"            \u0027id\u0027: id"},{"line_number":182,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_e9876f5e","line":179,"updated":"2017-01-08 09:48:58.000000000","message":"This method may delete existing columns, if they appear in the database, but not in **columns.","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d64b17d3cb6fe965ba5aa4109b68003e7e1284da","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.driver.create_key(db_models.Listener.table_name, id,"},{"line_number":177,"context_line":"                               listener_json)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def update_neutron_listener(self, id, **columns):"},{"line_number":180,"context_line":"        listener \u003d {"},{"line_number":181,"context_line":"            \u0027id\u0027: id"},{"line_number":182,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_b882cbc6","line":179,"in_reply_to":"ba5201f7_e9876f5e","updated":"2017-01-10 12:26:31.000000000","message":"Done","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4ef925dd66eb292ebc6c8750c8f00519bbf13f50","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                self.db_change_callback)"},{"line_number":196,"context_line":"        self._read_db_changes_from_queue()"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def register_listener_callback(self, cb, topic):"},{"line_number":199,"context_line":"        if not self.use_pubsub:"},{"line_number":200,"context_line":"            self.driver.register_notification_callback(cb)"},{"line_number":201,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_898fc373","line":198,"updated":"2017-01-08 09:48:58.000000000","message":"This method needs documentation. Am I right in understanding it can only be called from neutron-server, and only once?","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d64b17d3cb6fe965ba5aa4109b68003e7e1284da","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                self.db_change_callback)"},{"line_number":196,"context_line":"        self._read_db_changes_from_queue()"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def register_listener_callback(self, cb, topic):"},{"line_number":199,"context_line":"        if not self.use_pubsub:"},{"line_number":200,"context_line":"            self.driver.register_notification_callback(cb)"},{"line_number":201,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_bdfe4436","line":198,"in_reply_to":"ba5201f7_898fc373","updated":"2017-01-10 12:26:31.000000000","message":"Yes, you\u0027re right, I\u0027ll do it","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"ae862a17b499aa73d40e857aa54189824e87209b","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        :param: a callback method to handle the message from Dragonflow"},{"line_number":203,"context_line":"        controller"},{"line_number":204,"context_line":"        :param topic: the topic this neutron listener cares about, e.g the"},{"line_number":205,"context_line":"        hostname of the node "},{"line_number":206,"context_line":"        \"\"\""},{"line_number":207,"context_line":"        if not self.use_pubsub:"},{"line_number":208,"context_line":"            self.driver.register_notification_callback(cb)"}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_2838433d","line":205,"range":{"start_line":205,"start_character":28,"end_line":205,"end_character":29},"updated":"2017-01-10 12:46:18.000000000","message":"Extra whitespace at end of line. I think Jenkins will fail over this.","commit_id":"2ed8c5588298ac7eae27bff91cf08de224b60beb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"fdcd068dc631ca4a87fa326f454a3c47fd0a2608","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        self._read_db_changes_from_queue()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def register_listener_callback(self, cb, topic):"},{"line_number":198,"context_line":"        \"\"\"Register a callbach for Neutron listener"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        This method is used to register a callback for Neutron listener"},{"line_number":201,"context_line":"        to handle the message from Dragonflow controller. It should only be"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a3905b3_cc24e7c6","line":198,"range":{"start_line":198,"start_character":22,"end_line":198,"end_character":30},"updated":"2017-01-21 13:30:52.000000000","message":"typo - callbach -\u003e callback","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"}],"dragonflow/db/models.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":437,"context_line":"    def __str__(self):"},{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"class Listener(NbDbObject):"},{"line_number":442,"context_line":"    def get_id(self):"},{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_1177403b","line":440,"updated":"2016-12-13 09:36:11.000000000","message":"nit: Try to move the class definition at line 390. So we can have nb db models and sb db models separated.","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"891dcb63dabb358688d3d1e30a3b93e677c52d27","unresolved":false,"context_lines":[{"line_number":437,"context_line":"    def __str__(self):"},{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"class Listener(NbDbObject):"},{"line_number":442,"context_line":"    def get_id(self):"},{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_457e4de5","line":440,"in_reply_to":"1a6eadb0_1177403b","updated":"2016-12-14 02:35:32.000000000","message":"Done","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"class Listener(NbDbObject):"},{"line_number":442,"context_line":"    def get_id(self):"},{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_11c90079","line":441,"range":{"start_line":441,"start_character":6,"end_line":441,"end_character":14},"updated":"2016-12-13 09:36:11.000000000","message":"Why not add a table_name to this db model?","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"891dcb63dabb358688d3d1e30a3b93e677c52d27","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"class Listener(NbDbObject):"},{"line_number":442,"context_line":"    def get_id(self):"},{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_858865e9","line":441,"range":{"start_line":441,"start_character":6,"end_line":441,"end_character":14},"in_reply_to":"1a6eadb0_11c90079","updated":"2016-12-14 02:35:32.000000000","message":"Done","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"class Listener(NbDbObject):"},{"line_number":442,"context_line":"    def get_id(self):"},{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_topic(self):"},{"line_number":446,"context_line":"        return \u0027n_listener\u0027 + \u0027_\u0027 + self.inner_obj[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_11f2e0d2","line":443,"range":{"start_line":442,"start_character":0,"end_line":443,"end_character":35},"updated":"2016-12-13 09:36:11.000000000","message":"This has been defined in super class","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        return self.inner_obj[\u0027ppid\u0027]"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"    def get_name(self):"},{"line_number":455,"context_line":"        return self.inner_obj.get(\u0027name\u0027)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def get_version(self):"},{"line_number":458,"context_line":"        return self.inner_obj.get(\u0027version\u0027)"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def __str__(self):"},{"line_number":461,"context_line":"        return str(self.inner_obj)"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_71bf94d0","line":461,"range":{"start_line":455,"start_character":0,"end_line":461,"end_character":34},"updated":"2016-12-13 09:36:11.000000000","message":"ditto","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4f5ab169f81b96c640ebfab2f01a5d77075e87fc","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        return self.inner_obj[\u0027id\u0027]"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def get_topic(self):"},{"line_number":446,"context_line":"        return \u0027n_listener\u0027 + \u0027_\u0027 + self.inner_obj[\u0027id\u0027]"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    def get_timestamp(self):"},{"line_number":449,"context_line":"        return self.inner_obj[\u0027timestamp\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_edf9c081","line":446,"range":{"start_line":446,"start_character":15,"end_line":446,"end_character":33},"updated":"2016-12-14 14:26:53.000000000","message":"nit: \"n_listener_\"","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4f5ab169f81b96c640ebfab2f01a5d77075e87fc","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    def get_ppid(self):"},{"line_number":452,"context_line":"        return self.inner_obj[\u0027ppid\u0027]"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"    def get_name(self):"},{"line_number":455,"context_line":"        return self.inner_obj.get(\u0027name\u0027)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def get_version(self):"},{"line_number":458,"context_line":"        return self.inner_obj.get(\u0027version\u0027)"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def __str__(self):"},{"line_number":461,"context_line":"        return str(self.inner_obj)"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_6dde9012","line":461,"range":{"start_line":454,"start_character":4,"end_line":461,"end_character":34},"updated":"2016-12-14 14:26:53.000000000","message":"use the base class methods directly if you do not define new behavior","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"}],"dragonflow/db/neutron/lockedobjects_db.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"035cba1a2b766de9e27004432c21a39effb11226","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        lock_id \u003d args[1][\u0027security_group_rule\u0027][\u0027security_group_id\u0027]"},{"line_number":119,"context_line":"    elif RESOURCE_ML2_SECURITY_GROUP_RULE_DELETE \u003d\u003d type:"},{"line_number":120,"context_line":"        lock_id \u003d args[1][\u0027security_group_id\u0027]"},{"line_number":121,"context_line":"    elif RESOURCE_NEUTRON_LISTENER \u003d\u003d type:"},{"line_number":122,"context_line":"        lock_id \u003d args[1]"},{"line_number":123,"context_line":"    if not lock_id:"},{"line_number":124,"context_line":"        lock_id \u003d GLOBAL_LOCK_ID"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba5201f7_b0785891","line":122,"range":{"start_line":121,"start_character":0,"end_line":122,"end_character":25},"updated":"2016-12-29 03:07:59.000000000","message":"Mistake here when rebase?","commit_id":"3f11126f32c652a206fcd09b9eae8971c86ea8c5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"dca8d0d900fd77c140a5501b460452afb564d67b","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        lock_id \u003d args[1]"},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        raise df_exc.UnknownResourceException(resource_type\u003dresource_type)"},{"line_number":124,"context_line":"    if not lock_id:"},{"line_number":125,"context_line":"        lock_id \u003d GLOBAL_LOCK_ID"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    return lock_id"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_44547220","line":125,"range":{"start_line":124,"start_character":0,"end_line":125,"end_character":32},"updated":"2017-01-11 01:40:47.000000000","message":"This should be removed as \"not lock_id\" case is covered at line 123","commit_id":"2ed8c5588298ac7eae27bff91cf08de224b60beb"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2f9d82619ed8077d8343adf3c9cb96d3da6528fd","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        lock_id \u003d args[1][\u0027security_group_id\u0027]"},{"line_number":118,"context_line":"    elif RESOURCE_QOS \u003d\u003d resource_type:"},{"line_number":119,"context_line":"        lock_id \u003d args[0][2][\u0027id\u0027]"},{"line_number":120,"context_line":"    elif RESOURCE_NEUTRON_LISTENER \u003d\u003d type:"},{"line_number":121,"context_line":"        lock_id \u003d args[1]"},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        raise df_exc.UnknownResourceException(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a3905b3_4d6239da","line":120,"range":{"start_line":120,"start_character":38,"end_line":120,"end_character":42},"updated":"2017-01-19 01:19:36.000000000","message":"it should be resource_type here, right?","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"9b6317217d4daab036ef804d06eb9fb1d62a9b8a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        lock_id \u003d args[1][\u0027security_group_id\u0027]"},{"line_number":118,"context_line":"    elif RESOURCE_QOS \u003d\u003d resource_type:"},{"line_number":119,"context_line":"        lock_id \u003d args[0][2][\u0027id\u0027]"},{"line_number":120,"context_line":"    elif RESOURCE_NEUTRON_LISTENER \u003d\u003d type:"},{"line_number":121,"context_line":"        lock_id \u003d args[1]"},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        raise df_exc.UnknownResourceException(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":53,"id":"1a430d35_c82a8ee7","line":120,"range":{"start_line":120,"start_character":38,"end_line":120,"end_character":42},"in_reply_to":"5a3905b3_4d1a3919","updated":"2017-02-10 07:42:47.000000000","message":"Done","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"9cee2f1b08d8245a26ba737c782a4d26697ebe30","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        lock_id \u003d args[1][\u0027security_group_id\u0027]"},{"line_number":118,"context_line":"    elif RESOURCE_QOS \u003d\u003d resource_type:"},{"line_number":119,"context_line":"        lock_id \u003d args[0][2][\u0027id\u0027]"},{"line_number":120,"context_line":"    elif RESOURCE_NEUTRON_LISTENER \u003d\u003d type:"},{"line_number":121,"context_line":"        lock_id \u003d args[1]"},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        raise df_exc.UnknownResourceException(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a3905b3_4d1a3919","line":120,"range":{"start_line":120,"start_character":38,"end_line":120,"end_character":42},"in_reply_to":"5a3905b3_4d6239da","updated":"2017-01-19 01:29:55.000000000","message":"And that is why we should avoid shadowing python build-in keywords.","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"9b6317217d4daab036ef804d06eb9fb1d62a9b8a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        lock_id \u003d args[1][\u0027security_group_id\u0027]"},{"line_number":118,"context_line":"    elif RESOURCE_QOS \u003d\u003d resource_type:"},{"line_number":119,"context_line":"        lock_id \u003d args[0][2][\u0027id\u0027]"},{"line_number":120,"context_line":"    elif RESOURCE_NEUTRON_LISTENER \u003d\u003d type:"},{"line_number":121,"context_line":"        lock_id \u003d args[1]"},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        raise df_exc.UnknownResourceException(resource_type\u003dresource_type)"}],"source_content_type":"text/x-python","patch_set":53,"id":"1a430d35_88f24699","line":120,"range":{"start_line":120,"start_character":38,"end_line":120,"end_character":42},"in_reply_to":"5a3905b3_4d6239da","updated":"2017-02-10 07:42:47.000000000","message":"Done","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"}],"dragonflow/db/pubsub_drivers/redis_port_status_notifier.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"16f08bc810a5a22142cac61ad690d62482df8510","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    # local controller code"},{"line_number":73,"context_line":"    def _send_port_status_event(self, table, key, action, value):"},{"line_number":74,"context_line":"        listeners \u003d self.nb_api.get_all_neutron_listeners()"},{"line_number":75,"context_line":"        topic \u003d random.choice(listeners)"},{"line_number":76,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dtopic)"},{"line_number":77,"context_line":"        self.pub.send_event(update)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_4be66ee9","line":74,"range":{"start_line":74,"start_character":32,"end_line":74,"end_character":57},"updated":"2016-11-14 13:01:30.000000000","message":"This will return a bunch of json string, right?","commit_id":"ba5ff21107cbc771781ad6f951756d15a6f55976"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"16f08bc810a5a22142cac61ad690d62482df8510","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def _send_port_status_event(self, table, key, action, value):"},{"line_number":74,"context_line":"        listeners \u003d self.nb_api.get_all_neutron_listeners()"},{"line_number":75,"context_line":"        topic \u003d random.choice(listeners)"},{"line_number":76,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dtopic)"},{"line_number":77,"context_line":"        self.pub.send_event(update)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # server code"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_cb48becf","line":76,"range":{"start_line":76,"start_character":63,"end_line":76,"end_character":75},"updated":"2016-11-14 13:01:30.000000000","message":"You are using the json as topic here, is that the plan?","commit_id":"ba5ff21107cbc771781ad6f951756d15a6f55976"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ae7459d4ab3c0674d95cd66e8fccd0120d8b45c0","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @lock_db.wrap_db_lock(lock_db.RESOURCE_NEUTRON_LISTENER)"},{"line_number":53,"context_line":"    def create_heart_beat_reporter(self, host):"},{"line_number":54,"context_line":"        listener \u003d self.nb_api.get_neutron_listener(host)"},{"line_number":55,"context_line":"        if listener is None:"},{"line_number":56,"context_line":"            self._create_heart_beat_reporter(self, host)"},{"line_number":57,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_c8091686","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":57},"updated":"2016-11-28 07:36:49.000000000","message":"when/where registered listener is removed from the DB in case of the worker failure?","commit_id":"d9206a45d2f03362a43cbc230711f26b9bf9f2d7"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ae7459d4ab3c0674d95cd66e8fccd0120d8b45c0","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            if constants.PORT_STATUS_DOWN \u003d\u003d value:"},{"line_number":103,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class HearBeatReporter(object):"},{"line_number":106,"context_line":"    def __init__(self, api_nb):"},{"line_number":107,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":108,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_a8313a5c","line":105,"range":{"start_line":105,"start_character":6,"end_line":105,"end_character":10},"updated":"2016-11-28 07:36:49.000000000","message":"Heart","commit_id":"d9206a45d2f03362a43cbc230711f26b9bf9f2d7"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        if l \u003d\u003d 0:"},{"line_number":85,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":86,"context_line":"            return"},{"line_number":87,"context_line":"        elif l \u003d\u003d 1:"},{"line_number":88,"context_line":"            n \u003d listeners[0]"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            # sort by timestamp and choose from the latest ones. This can"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_3b8fbf24","line":87,"range":{"start_line":87,"start_character":9,"end_line":87,"end_character":20},"updated":"2016-12-01 17:18:12.000000000","message":"is this condition really required?\n\nIt is not important and actually silly to comment. It came to my mind, so i am going to write. Can we put positive case first like\nif l:\n  statements\nelse\n  LOG WARNING\n\nmost of the time, first condition is going to hit and skip rest of the part. There is no logical or syntax problem in existing code. :D :D\n\nBTW Well thought logic to choose random listener +1.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        if l \u003d\u003d 0:"},{"line_number":85,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":86,"context_line":"            return"},{"line_number":87,"context_line":"        elif l \u003d\u003d 1:"},{"line_number":88,"context_line":"            n \u003d listeners[0]"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            # sort by timestamp and choose from the latest ones. This can"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_3be322a5","line":87,"range":{"start_line":87,"start_character":9,"end_line":87,"end_character":20},"in_reply_to":"3a71b18c_3b8fbf24","updated":"2016-12-02 06:08:14.000000000","message":"First, it is required. listeners[:len(listeners) / 2] returns None if len(listen) \u003d\u003d 0.\nSecond, for the order of the if/else clause I agree with you, good for performance.","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":13912,"name":"rajiv","email":"thenakliman@gmail.com","username":"rajiv.kumar"},"change_message_id":"9924bf02ff8b290413e733bb1f248de3a47d0254","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        t \u003d n.get_topic()"},{"line_number":95,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dt)"},{"line_number":96,"context_line":"        LOG.info(_LI(\"Publish to neutron %s\"), t)"},{"line_number":97,"context_line":"        self.nb_api.publisher.send_event(update)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def port_status_callback(self, table, key, action, value, topic\u003dNone):"},{"line_number":100,"context_line":"        if models.LogicalPort.table_name \u003d\u003d table and \u0027update\u0027 \u003d\u003d action:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_9b88d3e9","line":97,"updated":"2016-12-01 17:18:12.000000000","message":"If send event is failed we catch the exception here and try with different listener. If it does not impact performance and with other things. It is just an idea, it may not be good.\n\nHowever i am OK with existing code as well. :)","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"98e610eadade4584fabe34df22ea4ab7dc9eddad","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        t \u003d n.get_topic()"},{"line_number":95,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dt)"},{"line_number":96,"context_line":"        LOG.info(_LI(\"Publish to neutron %s\"), t)"},{"line_number":97,"context_line":"        self.nb_api.publisher.send_event(update)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def port_status_callback(self, table, key, action, value, topic\u003dNone):"},{"line_number":100,"context_line":"        if models.LogicalPort.table_name \u003d\u003d table and \u0027update\u0027 \u003d\u003d action:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_7b4f5a92","line":97,"in_reply_to":"3a71b18c_9b88d3e9","updated":"2016-12-02 06:08:14.000000000","message":"Unfortunately, even thought the listener is dead, the send_event will not throw an exception, but it is good idea","commit_id":"34d84aee3c0565799607c294528547283d372a2f"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.create_heart_beat_reporter(cfg.CONF.host)"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            if not cfg.CONF.df.enable_df_pub_sub:"},{"line_number":48,"context_line":"                LOG.warning(_LW(\"RedisPortStatusNotifier can not \""},{"line_number":49,"context_line":"                                \"work when enable_df_pub_subis disabled\"))"},{"line_number":50,"context_line":"                return"},{"line_number":51,"context_line":"            self.nb_api.publisher.initialize()"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_f8716945","line":48,"range":{"start_line":48,"start_character":57,"end_line":48,"end_character":64},"updated":"2016-12-05 03:41:14.000000000","message":"cannot","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            if not cfg.CONF.df.enable_df_pub_sub:"},{"line_number":48,"context_line":"                LOG.warning(_LW(\"RedisPortStatusNotifier can not \""},{"line_number":49,"context_line":"                                \"work when enable_df_pub_subis disabled\"))"},{"line_number":50,"context_line":"                return"},{"line_number":51,"context_line":"            self.nb_api.publisher.initialize()"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_5897bd39","line":49,"range":{"start_line":49,"start_character":43,"end_line":49,"end_character":62},"updated":"2016-12-05 03:41:14.000000000","message":"enable_df_pub_sub is","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _send_event(self, table, key, action, value):"},{"line_number":82,"context_line":"        listeners \u003d self.nb_api.get_all_neutron_listeners()"},{"line_number":83,"context_line":"        l \u003d len(listeners)"},{"line_number":84,"context_line":"        if l \u003e 1:"},{"line_number":85,"context_line":"            # sort by timestamp and choose from the latest ones. This can"},{"line_number":86,"context_line":"            # avoid a dead one is chosen as far as possible"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_b8a29197","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":9},"updated":"2016-12-05 03:41:14.000000000","message":"could it be num_of_listeners? the variable name is a little bit longer but it makes sense.","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":88,"context_line":"            n \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":89,"context_line":"        elif l \u003d\u003d 1:"},{"line_number":90,"context_line":"            n \u003d listeners[0]"},{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":93,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_18b8e5c7","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":13},"updated":"2016-12-05 03:41:14.000000000","message":"could be \u0027selected\u0027","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"82b85333a8be80a1617243f960815d2329b427a3","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            LOG.warning(_LW(\"No neutron listener found\"))"},{"line_number":93,"context_line":"            return"},{"line_number":94,"context_line":"        t \u003d n.get_topic()"},{"line_number":95,"context_line":"        update \u003d db_common.DbUpdate(table, key, action, value, topic\u003dt)"},{"line_number":96,"context_line":"        LOG.info(_LI(\"Publish to neutron %s\"), t)"},{"line_number":97,"context_line":"        self.nb_api.publisher.send_event(update)"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a71b18c_d8abcd73","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":9},"updated":"2016-12-05 03:41:14.000000000","message":"topic","commit_id":"b700a52e1d9c88fb7b32ed04d8c66f7d366d22b7"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            my_ppid \u003d os.getppid()"},{"line_number":61,"context_line":"            LOG.info(_LI(\"Listener %(l)s exists, my ppid is %(ppid)s\"),"},{"line_number":62,"context_line":"                     {\u0027l\u0027: listener, \u0027ppid\u0027: my_ppid})"},{"line_number":63,"context_line":"            # FIXME(wangjian): if api_worker is 1, the old ppid could is"},{"line_number":64,"context_line":"            # equal to my_ppid. I tried to set api_worker\u003d1, still multiple"},{"line_number":65,"context_line":"            # neutron-server processes were created."},{"line_number":66,"context_line":"            if ppid !\u003d my_ppid:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_b13a0c35","line":63,"range":{"start_line":63,"start_character":64,"end_line":63,"end_character":72},"updated":"2016-12-13 09:36:11.000000000","message":"reword?","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"26e3fe142e8061f38d83ac024ea96f50da74bb25","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        while True:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":132,"context_line":"                time.sleep(interval)"},{"line_number":133,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":134,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_6c0a5bd4","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":77},"updated":"2016-12-13 09:36:11.000000000","message":"You are using double random(random here and random at line 88), is that necessary?","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d067ea3ed6b18e114489e81558244a0e5a391c9f","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        while True:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":132,"context_line":"                time.sleep(interval)"},{"line_number":133,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":134,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_8a179250","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":77},"in_reply_to":"1a6eadb0_6c0a5bd4","updated":"2016-12-13 11:56:43.000000000","message":"Think about we have a big interval, line 88 can avoid we always choose the same listener in one singe interval. And line 131 can avoid network storm and reduce the pressure of df-db if we have a great number of listerners and they starts at the same time","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"891dcb63dabb358688d3d1e30a3b93e677c52d27","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        while True:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":132,"context_line":"                time.sleep(interval)"},{"line_number":133,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":134,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_d698301e","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":77},"in_reply_to":"1a6eadb0_76bafc24","updated":"2016-12-14 02:35:32.000000000","message":"We want to minimize the possibility a dead one is chosen.\nThe 2*interval way can work. But the 2*interval could be too long(the interval plus the delay is about 30s by default), and it increases the possibility a dead one is chosen.","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"fb9a9f2e072efd7acd24a9d8f7c6c7a7a25b1dc1","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        while True:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":132,"context_line":"                time.sleep(interval)"},{"line_number":133,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":134,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_76bafc24","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":77},"in_reply_to":"1a6eadb0_8a179250","updated":"2016-12-14 02:05:18.000000000","message":"What about just let neutron-server report its timestamp to nb db. And then random select one neutron server from the candidates whose timestamp are within 2*neutron_listener_report_interval.","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"53f6d1adcfe440043e2678691b37ee7c7761fd12","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        while True:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":132,"context_line":"                time.sleep(interval)"},{"line_number":133,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":134,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_2142003f","line":131,"range":{"start_line":131,"start_character":27,"end_line":131,"end_character":77},"in_reply_to":"1a6eadb0_d698301e","updated":"2016-12-14 02:44:00.000000000","message":"I see. Add some comments to explain the code here might be better.","commit_id":"82cd01f25cccc7f767b75f29e970d8c46841b6e3"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class HeartBeatReporter(object):"},{"line_number":109,"context_line":"    def __init__(self, api_nb):"},{"line_number":110,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":111,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_c1614caa","line":108,"range":{"start_line":108,"start_character":6,"end_line":108,"end_character":23},"updated":"2016-12-14 02:52:51.000000000","message":"I am thinking this should be common utils which could be used for all status notifier(though redis is the only implementation now). So, maybe you can move some common code to super class, after all, it is a refactor to existing code.","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4f5ab169f81b96c640ebfab2f01a5d77075e87fc","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            my_ppid \u003d os.getppid()"},{"line_number":61,"context_line":"            LOG.info(_LI(\"Listener %(l)s exists, my ppid is %(ppid)s\"),"},{"line_number":62,"context_line":"                     {\u0027l\u0027: listener, \u0027ppid\u0027: my_ppid})"},{"line_number":63,"context_line":"            # FIXME(wangjian): if api_worker is 1, the old ppid could is"},{"line_number":64,"context_line":"            # equal to my_ppid. I tried to set api_worker\u003d1, still multiple"},{"line_number":65,"context_line":"            # neutron-server processes were created."},{"line_number":66,"context_line":"            if ppid !\u003d my_ppid:"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_cd3fa4d4","line":63,"range":{"start_line":63,"start_character":70,"end_line":63,"end_character":72},"updated":"2016-12-14 14:26:53.000000000","message":"be","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4f5ab169f81b96c640ebfab2f01a5d77075e87fc","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            # FIXME(wangjian): if api_worker is 1, the old ppid could is"},{"line_number":64,"context_line":"            # equal to my_ppid. I tried to set api_worker\u003d1, still multiple"},{"line_number":65,"context_line":"            # neutron-server processes were created."},{"line_number":66,"context_line":"            if ppid !\u003d my_ppid:"},{"line_number":67,"context_line":"                self._create_heart_beat_reporter(host)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _create_heart_beat_reporter(self, host):"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_113616e6","line":66,"range":{"start_line":66,"start_character":12,"end_line":66,"end_character":31},"updated":"2016-12-14 14:26:53.000000000","message":"why not judge host equal as you mentioned that each host just have one register listener in your description.","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"664e2105254d56ef1f995a8ca3a1f5a35654b77c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            # FIXME(wangjian): if api_worker is 1, the old ppid could is"},{"line_number":64,"context_line":"            # equal to my_ppid. I tried to set api_worker\u003d1, still multiple"},{"line_number":65,"context_line":"            # neutron-server processes were created."},{"line_number":66,"context_line":"            if ppid !\u003d my_ppid:"},{"line_number":67,"context_line":"                self._create_heart_beat_reporter(host)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _create_heart_beat_reporter(self, host):"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_5654e5fd","line":66,"range":{"start_line":66,"start_character":12,"end_line":66,"end_character":31},"in_reply_to":"1a6eadb0_113616e6","updated":"2016-12-15 01:06:49.000000000","message":"When neutron restarts, the host info in df-db will not change, and we can not judge if we need to register the listener again","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4f5ab169f81b96c640ebfab2f01a5d77075e87fc","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _create_heart_beat_reporter(self, host):"},{"line_number":70,"context_line":"        self.nb_api.register_listener_callback(self.port_status_callback,"},{"line_number":71,"context_line":"                                               \u0027listener_\u0027 + host)"},{"line_number":72,"context_line":"        LOG.info(_LI(\"Register listener %s\"), host)"},{"line_number":73,"context_line":"        self.heart_beat_reporter \u003d HeartBeatReporter(self.nb_api)"},{"line_number":74,"context_line":"        self.heart_beat_reporter.daemonize()"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_11837699","line":71,"range":{"start_line":71,"start_character":47,"end_line":71,"end_character":65},"updated":"2016-12-14 14:26:53.000000000","message":"the topic is not equal to the topic defined in models??","commit_id":"e3fcc592d1051516786f5772498e6be7049b7efb"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9f3199a03608a9e5cfe6954d44d06e215d075248","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    @lock_db.wrap_db_lock(lock_db.RESOURCE_NEUTRON_LISTENER)"},{"line_number":54,"context_line":"    def create_heart_beat_reporter(self, host):"},{"line_number":55,"context_line":"        listener \u003d self.nb_api.get_neutron_listener(host)"},{"line_number":56,"context_line":"        if listener is None:"},{"line_number":57,"context_line":"            self._create_heart_beat_reporter(host)"},{"line_number":58,"context_line":"        else:"},{"line_number":59,"context_line":"            ppid \u003d listener.get_ppid()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a6eadb0_b9a05cf5","line":56,"range":{"start_line":56,"start_character":11,"end_line":56,"end_character":27},"updated":"2016-12-17 14:03:35.000000000","message":"maybe if not listener is more safe when there are no exception in get_key and the value is empty string or dict.","commit_id":"19284410a627ccbddcc12e627bc8ffd02e3e2e82"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9f3199a03608a9e5cfe6954d44d06e215d075248","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def run(self):"},{"line_number":127,"context_line":"        listener \u003d cfg.CONF.host"},{"line_number":128,"context_line":"        ppid \u003d os.getppid()"},{"line_number":129,"context_line":"        self.api_nb.create_neutron_listener(listener,"},{"line_number":130,"context_line":"                                            timestamp\u003dint(time.time()),"},{"line_number":131,"context_line":"                                            ppid\u003dppid)"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1a6eadb0_d93fd884","line":129,"range":{"start_line":129,"start_character":20,"end_line":129,"end_character":43},"updated":"2016-12-17 14:03:35.000000000","message":"it will raise exception when the code go into the line 58 branch because it still has the listener object in nb db.","commit_id":"19284410a627ccbddcc12e627bc8ffd02e3e2e82"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"fe1785c36aa9a8547b5aa9d70533071cc7ec408c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def daemonize(self):"},{"line_number":122,"context_line":"        return self._daemon.daemonize(self.run)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def stop(self):"},{"line_number":125,"context_line":"        return self._daemon.stop()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def run(self):"},{"line_number":128,"context_line":"        listener \u003d cfg.CONF.host"},{"line_number":129,"context_line":"        ppid \u003d os.getppid()"},{"line_number":130,"context_line":"        self.api_nb.create_neutron_listener(listener,"},{"line_number":131,"context_line":"                                            timestamp\u003dint(time.time()),"},{"line_number":132,"context_line":"                                            ppid\u003dppid)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        cfg_interval \u003d cfg.CONF.df.neutron_listener_report_interval"},{"line_number":135,"context_line":"        delay \u003d cfg.CONF.df.neutron_listener_report_delay"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        while True:"},{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                # We delay a random time to avoid a periodical peak of network"},{"line_number":140,"context_line":"                # throughput and pressure for df-db in a big scale"},{"line_number":141,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":142,"context_line":"                time.sleep(interval)"},{"line_number":143,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":144,"context_line":"                self.api_nb.update_neutron_listener(listener,"},{"line_number":145,"context_line":"                                                    timestamp\u003dtimestamp,"},{"line_number":146,"context_line":"                                                    ppid\u003dppid)"},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                LOG.exception(_LE("},{"line_number":149,"context_line":"                        \"Failed to report heart beat for %s\"), listener)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_022b7d34","line":149,"range":{"start_line":116,"start_character":0,"end_line":149,"end_character":72},"updated":"2016-12-19 10:09:05.000000000","message":"this does not look like redis specific, maybe worth to put it in separate module, so it can be reused by other DB flavors","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"8d6f2b4b74577e145b088e118d60c727688e0d28","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def daemonize(self):"},{"line_number":122,"context_line":"        return self._daemon.daemonize(self.run)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def stop(self):"},{"line_number":125,"context_line":"        return self._daemon.stop()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def run(self):"},{"line_number":128,"context_line":"        listener \u003d cfg.CONF.host"},{"line_number":129,"context_line":"        ppid \u003d os.getppid()"},{"line_number":130,"context_line":"        self.api_nb.create_neutron_listener(listener,"},{"line_number":131,"context_line":"                                            timestamp\u003dint(time.time()),"},{"line_number":132,"context_line":"                                            ppid\u003dppid)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        cfg_interval \u003d cfg.CONF.df.neutron_listener_report_interval"},{"line_number":135,"context_line":"        delay \u003d cfg.CONF.df.neutron_listener_report_delay"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        while True:"},{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                # We delay a random time to avoid a periodical peak of network"},{"line_number":140,"context_line":"                # throughput and pressure for df-db in a big scale"},{"line_number":141,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":142,"context_line":"                time.sleep(interval)"},{"line_number":143,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":144,"context_line":"                self.api_nb.update_neutron_listener(listener,"},{"line_number":145,"context_line":"                                                    timestamp\u003dtimestamp,"},{"line_number":146,"context_line":"                                                    ppid\u003dppid)"},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                LOG.exception(_LE("},{"line_number":149,"context_line":"                        \"Failed to report heart beat for %s\"), listener)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a6eadb0_d7f5c0cb","line":149,"range":{"start_line":116,"start_character":0,"end_line":149,"end_character":72},"in_reply_to":"1a6eadb0_022b7d34","updated":"2016-12-19 11:34:36.000000000","message":"For the port-status functionality, we want to supply variable solutions for different db backends, and the solutions need to be pluggable. For example, users may don\u0027t want to use dragonflow\u0027s pub/sub, or use zeroMQ, they may implement their own port status driver.\nThe Heartbeat as a part of the redis solution, I think it should be here, at least for now. If some future functionalities need it, we can move it to a separate module then.","commit_id":"0d98a7e341765d440be63dfda8ee360a814ddf08"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4ef925dd66eb292ebc6c8750c8f00519bbf13f50","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_e9d5af42","line":116,"updated":"2017-01-08 09:48:58.000000000","message":"In a future patch, this should be (partly) unified with the pulisher\u0027s timestamp update class.","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d64b17d3cb6fe965ba5aa4109b68003e7e1284da","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_3d16d4a7","line":116,"in_reply_to":"ba5201f7_e9d5af42","updated":"2017-01-10 12:26:31.000000000","message":"Yes, agree","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"fdcd068dc631ca4a87fa326f454a3c47fd0a2608","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a3905b3_2c1acb7d","line":116,"updated":"2017-01-21 13:30:52.000000000","message":"Why was the docstring from PS-51 removed?","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"9b6317217d4daab036ef804d06eb9fb1d62a9b8a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                self.mech_driver.set_port_status_down(key)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class HeartBeatReporter(object):"},{"line_number":117,"context_line":"    def __init__(self, api_nb):"},{"line_number":118,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":119,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":53,"id":"1a430d35_68235a06","line":116,"in_reply_to":"5a3905b3_2c1acb7d","updated":"2017-02-10 07:42:47.000000000","message":"Done","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"c2e271267a565354e545249a835ba74851d53b1c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            # one is chosen. For users, do not need to figure out what is"},{"line_number":93,"context_line":"            # the best report interval. A big interval increase the possility a"},{"line_number":94,"context_line":"            # dead one is chosen, while a small one may affect the performance"},{"line_number":95,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":96,"context_line":"            selected \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":97,"context_line":"        elif listeners_num \u003d\u003d 1:"},{"line_number":98,"context_line":"            selected \u003d listeners[0]"},{"line_number":99,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":63,"id":"fa31d9ce_466ca308","line":96,"range":{"start_line":95,"start_character":12,"end_line":96,"end_character":68},"updated":"2017-02-17 03:29:41.000000000","message":"what if there are still dead neutron listener in the 50% selected neutron listeners? So why not add a check logic to judge whether there are dead listeners in the selected 50% neutron listeners(for example, by judge the timestamp is aged over 75 seconds)","commit_id":"7b98d1e573288475e28d058d74feb7e238c23c4b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"433adbec825292d6047421994ae8ceb8138509a3","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            # one is chosen. For users, do not need to figure out what is"},{"line_number":93,"context_line":"            # the best report interval. A big interval increase the possility a"},{"line_number":94,"context_line":"            # dead one is chosen, while a small one may affect the performance"},{"line_number":95,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":96,"context_line":"            selected \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":97,"context_line":"        elif listeners_num \u003d\u003d 1:"},{"line_number":98,"context_line":"            selected \u003d listeners[0]"},{"line_number":99,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":63,"id":"fa31d9ce_f439bed9","line":96,"range":{"start_line":95,"start_character":12,"end_line":96,"end_character":68},"in_reply_to":"fa31d9ce_466ca308","updated":"2017-02-17 07:18:18.000000000","message":"Thx. @Hong Hui Xiao and I disscussed this with me in PS12, we decided to keep it this way :).","commit_id":"7b98d1e573288475e28d058d74feb7e238c23c4b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"474bd34fe3bb4d2c66965251d12cf845fb957c5a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            # one is chosen. For users, do not need to figure out what is"},{"line_number":93,"context_line":"            # the best report interval. A big interval increase the possility a"},{"line_number":94,"context_line":"            # dead one is chosen, while a small one may affect the performance"},{"line_number":95,"context_line":"            listeners.sort(key\u003dlambda l: l.get_timestamp(), reverse\u003dTrue)"},{"line_number":96,"context_line":"            selected \u003d random.choice(listeners[:len(listeners) / 2])"},{"line_number":97,"context_line":"        elif listeners_num \u003d\u003d 1:"},{"line_number":98,"context_line":"            selected \u003d listeners[0]"},{"line_number":99,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":63,"id":"fa31d9ce_5259bd8d","line":96,"range":{"start_line":95,"start_character":12,"end_line":96,"end_character":68},"in_reply_to":"fa31d9ce_466ca308","updated":"2017-02-17 06:56:06.000000000","message":"Well, after our discussion we could keep the code here in this patch:)","commit_id":"7b98d1e573288475e28d058d74feb7e238c23c4b"}],"dragonflow/neutron/ml2/mech_driver.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a7914db90651b2d7d021207b7ed60c6fceea796f","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        self.heart_beat_reporter.daemonize()"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"class HearBeatReporter(object):"},{"line_number":761,"context_line":"    def __init__(self, api_nb):"},{"line_number":762,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":763,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_0cd4aee9","line":760,"range":{"start_line":760,"start_character":6,"end_line":760,"end_character":22},"updated":"2016-11-21 02:37:03.000000000","message":"Why not just use an oslo_service.loopingcall.FixedIntervalLoopingCall","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"2f32762a73dab58efd0092191626707680888461","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        self.heart_beat_reporter.daemonize()"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"class HearBeatReporter(object):"},{"line_number":761,"context_line":"    def __init__(self, api_nb):"},{"line_number":762,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":763,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_7647b04b","line":760,"range":{"start_line":760,"start_character":6,"end_line":760,"end_character":22},"in_reply_to":"7a77a97e_0cd4aee9","updated":"2016-11-21 03:44:37.000000000","message":"Done","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"9d6db536dbf7a23171ab30a917529759d41a102d","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        self.heart_beat_reporter.daemonize()"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"class HearBeatReporter(object):"},{"line_number":761,"context_line":"    def __init__(self, api_nb):"},{"line_number":762,"context_line":"        self.api_nb \u003d api_nb"},{"line_number":763,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_9ee44fad","line":760,"range":{"start_line":760,"start_character":6,"end_line":760,"end_character":22},"in_reply_to":"7a77a97e_0cd4aee9","updated":"2016-11-21 15:12:50.000000000","message":"It seems FixedIntervalLoopingCall can not support random delay","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"16d90f560cf4e05d4f9a88f9581b9045638fd5dd","unresolved":false,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        while True:"},{"line_number":782,"context_line":"            try:"},{"line_number":783,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":784,"context_line":"                time.sleep(interval)"},{"line_number":785,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":786,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_caa61ec0","line":783,"range":{"start_line":783,"start_character":16,"end_line":783,"end_character":77},"updated":"2016-11-20 15:41:22.000000000","message":"Why do we sleep for a random value of seconds rather than just the configured interval?","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"488d71a6480c8e97e53b2c000383285b5cfab7b6","unresolved":false,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        while True:"},{"line_number":782,"context_line":"            try:"},{"line_number":783,"context_line":"                interval \u003d random.randint(cfg_interval, cfg_interval + delay)"},{"line_number":784,"context_line":"                time.sleep(interval)"},{"line_number":785,"context_line":"                timestamp \u003d int(time.time())"},{"line_number":786,"context_line":"                self.api_nb.update_neutron_listener(listener,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a77a97e_ac31faa3","line":783,"range":{"start_line":783,"start_character":16,"end_line":783,"end_character":77},"in_reply_to":"7a77a97e_caa61ec0","updated":"2016-11-21 02:21:46.000000000","message":"When df-controller needs to send a port-status notication, we hope it can choose different n-listern every time to do load balance. Without the delay, the df-controllers could always choose the same n-listener, or choose from the same serval controllers\nIn addition, it can help to avoid boot storm when a great number of neutron-server nodes starts at the same time","commit_id":"1dca2db3ac5e5b905dd6d91d7487a958f4ad7611"}],"dragonflow/tests/common/utils.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"288805d4ded1120678798f82157035308b079085","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import re"},{"line_number":14,"context_line":"import six"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.agent.common import utils as agent_utils"},{"line_number":17,"context_line":"from neutron.common import utils as n_utils"}],"source_content_type":"text/x-python","patch_set":60,"id":"fa31d9ce_c0b8b0ca","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":10},"updated":"2017-02-16 01:12:39.000000000","message":"six is not a py stdlib right?","commit_id":"691349943424a1f16048ad2bbaf38dde43e9303d"}],"dragonflow/tests/fullstack/test_api_nb.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4ef925dd66eb292ebc6c8750c8f00519bbf13f50","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertIn(fake_listener1, listeners)"},{"line_number":91,"context_line":"        self.assertIn(fake_listener2, listeners)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # test updating"},{"line_number":94,"context_line":"        self.nb_api.update_neutron_listener(\u0027fake_host2\u0027,"},{"line_number":95,"context_line":"                                            timestamp\u003d22,"},{"line_number":96,"context_line":"                                            ppid\u003d-22)"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_89bd0304","line":93,"updated":"2017-01-08 09:48:58.000000000","message":"Partial updates are not tested here. (e.g. not changing ppid, only timestamp)","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d64b17d3cb6fe965ba5aa4109b68003e7e1284da","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertIn(fake_listener1, listeners)"},{"line_number":91,"context_line":"        self.assertIn(fake_listener2, listeners)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # test updating"},{"line_number":94,"context_line":"        self.nb_api.update_neutron_listener(\u0027fake_host2\u0027,"},{"line_number":95,"context_line":"                                            timestamp\u003d22,"},{"line_number":96,"context_line":"                                            ppid\u003d-22)"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_f908d22f","line":93,"in_reply_to":"ba5201f7_89bd0304","updated":"2017-01-10 12:26:31.000000000","message":"Done","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"ae862a17b499aa73d40e857aa54189824e87209b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # test updating timestamp"},{"line_number":95,"context_line":"        self.nb_api.update_neutron_listener(\u0027fake_host1\u0027,"},{"line_number":96,"context_line":"                                            timestamp\u003d11,"},{"line_number":97,"context_line":"                                            ppid\u003d-1)"},{"line_number":98,"context_line":"        listener1 \u003d self.nb_api.get_neutron_listener(\u0027fake_host1\u0027)"},{"line_number":99,"context_line":"        self.assertEqual(listener1.get_timestamp(), 11)"},{"line_number":100,"context_line":"        self.assertEqual(listener1.get_ppid(), -1)"}],"source_content_type":"text/x-python","patch_set":51,"id":"ba5201f7_e862bb3c","line":97,"range":{"start_line":97,"start_character":44,"end_line":97,"end_character":51},"updated":"2017-01-10 12:46:18.000000000","message":"I think this should be removed.","commit_id":"2ed8c5588298ac7eae27bff91cf08de224b60beb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"fdcd068dc631ca4a87fa326f454a3c47fd0a2608","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.nb_api.update_neutron_listener(\u0027fake_host1\u0027,"},{"line_number":107,"context_line":"                                            timestamp\u003d11)"},{"line_number":108,"context_line":"        listener1 \u003d self.nb_api.get_neutron_listener(\u0027fake_host1\u0027)"},{"line_number":109,"context_line":"        self.assertEqual(listener1.get_timestamp(), 11)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # test updating timestamp and ppid"},{"line_number":112,"context_line":"        self.nb_api.update_neutron_listener(\u0027fake_host2\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a3905b3_8c157f4a","line":109,"updated":"2017-01-21 13:30:52.000000000","message":"Please return the assert from PS-51. It verifies ppid wasn\u0027t modified.","commit_id":"bc2ecbe81c1bb0116f0c58a26f9d5fbeb68e4ebd"}],"dragonflow/tests/unit/test_mech_driver.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"288805d4ded1120678798f82157035308b079085","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Unit testing for dragonflow mechanism driver.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from neutron.plugins.ml2 import config"},{"line_number":18,"context_line":"from neutron.tests.unit.extensions import test_portsecurity"},{"line_number":19,"context_line":"from neutron.tests.unit.plugins.ml2 import test_ext_portsecurity"},{"line_number":20,"context_line":"from neutron.tests.unit.plugins.ml2 import test_plugin"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from dragonflow.tests.common import utils"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"fa31d9ce_40fbe078","line":20,"range":{"start_line":15,"start_character":0,"end_line":20,"end_character":54},"updated":"2017-02-16 01:12:39.000000000","message":"These are all the third-party lib,right?","commit_id":"691349943424a1f16048ad2bbaf38dde43e9303d"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"5c197bb437b051a32e4eea5b3e9ada1935baf74d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.tests.unit.extensions import test_portsecurity"},{"line_number":17,"context_line":"from neutron.tests.unit.plugins.ml2 import test_ext_portsecurity"},{"line_number":18,"context_line":"from neutron.tests.unit.plugins.ml2 import test_plugin"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from dragonflow.tests.common import utils"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"fa31d9ce_016c8a06","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":11},"updated":"2017-02-16 02:57:43.000000000","message":"This is not alphabetical order, right?","commit_id":"de9447060d1aba5a56c0ce881c6d825c7cad6a8a"}],"dragonflow/tests/unit/test_redis_port_status.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8600a1b394691dca348279893d4c817cc949dbc1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":5,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_a19b70c8","line":2,"range":{"start_line":1,"start_character":0,"end_line":2,"end_character":1},"updated":"2016-12-14 02:52:51.000000000","message":"just remove these lines","commit_id":"9083fa662581b9fc4ce344282ae4aec244c80030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4ef925dd66eb292ebc6c8750c8f00519bbf13f50","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        mock.patch(\u0027dragonflow.db.neutron.lockedobjects_db.wrap_db_lock\u0027,"},{"line_number":32,"context_line":"                   side_effect\u003dutils.empty_wrapper).start()"},{"line_number":33,"context_line":"        super(TestRedisPortStatus, self).setUp()"},{"line_number":34,"context_line":"        self.notifier \u003d df_utils.load_driver(cfg.CONF.df.port_status_notifier,"},{"line_number":35,"context_line":"                                      df_utils.DF_PORT_STATUS_DRIVER_NAMESPACE)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_heart_beat_reporter(self):"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_09403306","line":34,"updated":"2017-01-08 09:48:58.000000000","message":"The test here should be of a specific class, not the one currently loaded via configuration. Maybe just import the relevant port notifier module?","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"d64b17d3cb6fe965ba5aa4109b68003e7e1284da","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        mock.patch(\u0027dragonflow.db.neutron.lockedobjects_db.wrap_db_lock\u0027,"},{"line_number":32,"context_line":"                   side_effect\u003dutils.empty_wrapper).start()"},{"line_number":33,"context_line":"        super(TestRedisPortStatus, self).setUp()"},{"line_number":34,"context_line":"        self.notifier \u003d df_utils.load_driver(cfg.CONF.df.port_status_notifier,"},{"line_number":35,"context_line":"                                      df_utils.DF_PORT_STATUS_DRIVER_NAMESPACE)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_heart_beat_reporter(self):"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_3de174d1","line":34,"in_reply_to":"ba5201f7_09403306","updated":"2017-01-10 12:26:31.000000000","message":"The configuration has been override in line 28, is it OK?","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d9fb9669b54d74e870eb43d2de99d9d66ffd0140","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        mock.patch(\u0027dragonflow.db.neutron.lockedobjects_db.wrap_db_lock\u0027,"},{"line_number":32,"context_line":"                   side_effect\u003dutils.empty_wrapper).start()"},{"line_number":33,"context_line":"        super(TestRedisPortStatus, self).setUp()"},{"line_number":34,"context_line":"        self.notifier \u003d df_utils.load_driver(cfg.CONF.df.port_status_notifier,"},{"line_number":35,"context_line":"                                      df_utils.DF_PORT_STATUS_DRIVER_NAMESPACE)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_heart_beat_reporter(self):"}],"source_content_type":"text/x-python","patch_set":50,"id":"ba5201f7_48d107fb","line":34,"in_reply_to":"ba5201f7_3de174d1","updated":"2017-01-10 12:43:08.000000000","message":"Yes. Sorry, I missed it.","commit_id":"677ea2f4776aeaeb71788c4868e6f9d49e61228e"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"288805d4ded1120678798f82157035308b079085","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import mock"},{"line_number":14,"context_line":"import os"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_config import cfg"},{"line_number":17,"context_line":"from oslo_serialization import jsonutils"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from dragonflow.common import utils as df_utils"},{"line_number":20,"context_line":"from dragonflow.db import models"}],"source_content_type":"text/x-python","patch_set":60,"id":"fa31d9ce_804878cd","line":17,"range":{"start_line":13,"start_character":0,"end_line":17,"end_character":39},"updated":"2017-02-16 01:12:39.000000000","message":"And the import order here.","commit_id":"691349943424a1f16048ad2bbaf38dde43e9303d"}]}
