)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bb443283c86e7989a1932529f7255c514b7ef0d5","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement db consistency logic in df local controller"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Iafe306116d6ad738a75cae2a640135411169ac2a"},{"line_number":10,"context_line":"Closes-bug: #1596455"},{"line_number":11,"context_line":"Implements: blueprint keep-db-consistency"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"ba5da102_231a2318","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":10},"updated":"2016-11-07 07:57:28.000000000","message":"Partial?","commit_id":"06cfe4660902bfaf9fbe2a16b843691b12a311e6"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"18becab5f873d9da65d4eb5d7ff57b6affa8db1b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement db consistency logic in df local controller"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Iafe306116d6ad738a75cae2a640135411169ac2a"},{"line_number":10,"context_line":"Closes-bug: #1596455"},{"line_number":11,"context_line":"Implements: blueprint keep-db-consistency"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"ba5da102_c387a7d5","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":10},"in_reply_to":"ba5da102_231a2318","updated":"2016-11-07 08:12:42.000000000","message":"the bug is in the df controller which make the data in topology consistency","commit_id":"06cfe4660902bfaf9fbe2a16b843691b12a311e6"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"875b56bbcd425de43535f56aa617e67d27703e71","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement db consistency logic in df local controller"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Iafe306116d6ad738a75cae2a640135411169ac2a"},{"line_number":10,"context_line":"Closes-bug: #1596455"},{"line_number":11,"context_line":"Implements: blueprint keep-db-consistency"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"ba5da102_06652de0","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":10},"in_reply_to":"ba5da102_c387a7d5","updated":"2016-11-07 08:32:20.000000000","message":"ok","commit_id":"06cfe4660902bfaf9fbe2a16b843691b12a311e6"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"bb443283c86e7989a1932529f7255c514b7ef0d5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Iafe306116d6ad738a75cae2a640135411169ac2a"},{"line_number":10,"context_line":"Closes-bug: #1596455"},{"line_number":11,"context_line":"Implements: blueprint keep-db-consistency"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"ba5da102_c32a472c","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":10},"updated":"2016-11-07 07:57:28.000000000","message":"Partially?","commit_id":"06cfe4660902bfaf9fbe2a16b843691b12a311e6"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"18becab5f873d9da65d4eb5d7ff57b6affa8db1b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Iafe306116d6ad738a75cae2a640135411169ac2a"},{"line_number":10,"context_line":"Closes-bug: #1596455"},{"line_number":11,"context_line":"Implements: blueprint keep-db-consistency"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"ba5da102_e36cab38","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":10},"in_reply_to":"ba5da102_c32a472c","updated":"2016-11-07 08:12:42.000000000","message":"ok, you are right:)","commit_id":"06cfe4660902bfaf9fbe2a16b843691b12a311e6"}],"dragonflow/common/common_params.py":[{"author":{"_account_id":21239,"name":"Alex Szarka","email":"szarka@inf.u-szeged.hu","username":"xavvior"},"change_message_id":"3984b52404f6bbd558bcf4fb613d6b96040a193a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    cfg.IntOpt("},{"line_number":92,"context_line":"        \u0027db_sync_time\u0027,"},{"line_number":93,"context_line":"        default\u003d300,"},{"line_number":94,"context_line":"        help\u003d_(\u0027periodically db comparison time\u0027)"},{"line_number":95,"context_line":"    ),"},{"line_number":96,"context_line":"    cfg.IntOpt("},{"line_number":97,"context_line":"        \u0027publisher_rate_limit_timeout\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_ef8d9d7c","line":94,"range":{"start_line":94,"start_character":16,"end_line":94,"end_character":17},"updated":"2016-07-04 07:08:10.000000000","message":"Please start with uppercase.","commit_id":"15143b9db5956ed491ee123f1619e347a2d9e8e2"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.topology \u003d Topology(self, self.enable_selective_topo_dist)"},{"line_number":79,"context_line":"        self.db_consistent \u003d db_consistent.DBConsistent("},{"line_number":80,"context_line":"                self.topology, self.nb_api, self.db_store, self)"},{"line_number":81,"context_line":"        self.nb_api.set_db_consistent(self.db_consistent)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.vswitch_api.sync()"},{"line_number":84,"context_line":"        # both set_controller and del_controller will delete flows."}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_25015d6b","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":57},"updated":"2016-07-09 15:21:52.000000000","message":"Should this be done in NB plugins ? And pls consider that multiple nb_api instances in neutron side? For example\nhttps://review.openstack.org/#/c/331932/","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.topology \u003d Topology(self, self.enable_selective_topo_dist)"},{"line_number":79,"context_line":"        self.db_consistent \u003d db_consistent.DBConsistent("},{"line_number":80,"context_line":"                self.topology, self.nb_api, self.db_store, self)"},{"line_number":81,"context_line":"        self.nb_api.set_db_consistent(self.db_consistent)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.vswitch_api.sync()"},{"line_number":84,"context_line":"        # both set_controller and del_controller will delete flows."}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_ae6ac517","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":57},"in_reply_to":"1aa78d24_25015d6b","updated":"2016-07-13 02:53:43.000000000","message":"Currently, the db consistency logic implemented in this patch is on local controller, in Neutron side, there will be another similar logic, and of course I will consider the multiple nb-api situation, thx","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                self.integration_bridge, \u0027secure\u0027).execute()"},{"line_number":99,"context_line":"        self.open_flow_app.start()"},{"line_number":100,"context_line":"        self.db_sync_loop()"},{"line_number":101,"context_line":"        self.db_consistent.daemonize()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def db_sync_loop(self):"},{"line_number":104,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_a571cd46","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":38},"updated":"2016-07-09 15:21:52.000000000","message":"Can this statement be invoked after the loop?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                self.integration_bridge, \u0027secure\u0027).execute()"},{"line_number":99,"context_line":"        self.open_flow_app.start()"},{"line_number":100,"context_line":"        self.db_sync_loop()"},{"line_number":101,"context_line":"        self.db_consistent.daemonize()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def db_sync_loop(self):"},{"line_number":104,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_b6009c67","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":38},"in_reply_to":"1aa78d24_a571cd46","updated":"2016-07-12 06:39:30.000000000","message":"+1. db_sync_loop never returns.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                self.integration_bridge, \u0027secure\u0027).execute()"},{"line_number":99,"context_line":"        self.open_flow_app.start()"},{"line_number":100,"context_line":"        self.db_sync_loop()"},{"line_number":101,"context_line":"        self.db_consistent.daemonize()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def db_sync_loop(self):"},{"line_number":104,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_2ebff5d0","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":38},"in_reply_to":"1aa78d24_b6009c67","updated":"2016-07-13 02:53:43.000000000","message":"oh, sorry, thx:)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.vswitch_api.initialize()"},{"line_number":78,"context_line":"        self.topology \u003d Topology(self, self.enable_selective_topo_dist)"},{"line_number":79,"context_line":"        self.db_consistent \u003d db_consistent.DBConsistentManager("},{"line_number":80,"context_line":"                self.topology, self.nb_api, self.db_store, self)"},{"line_number":81,"context_line":"        self.nb_api.set_db_consistent(self.db_consistent)"},{"line_number":82,"context_line":"        self.db_consistent.daemonize()"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_9b63db41","line":80,"range":{"start_line":80,"start_character":59,"end_line":80,"end_character":63},"updated":"2016-07-21 08:55:24.000000000","message":"why we pass self object to db consistency manager?\nit is not suggested. if you do it, you don\u0027t need to pass any local objects like topology, nb_api or db_store.","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"79d8607f0d7c8be96cd209f35b7e43d060478fb3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.vswitch_api.initialize()"},{"line_number":78,"context_line":"        self.topology \u003d Topology(self, self.enable_selective_topo_dist)"},{"line_number":79,"context_line":"        self.db_consistent \u003d db_consistent.DBConsistentManager("},{"line_number":80,"context_line":"                self.topology, self.nb_api, self.db_store, self)"},{"line_number":81,"context_line":"        self.nb_api.set_db_consistent(self.db_consistent)"},{"line_number":82,"context_line":"        self.db_consistent.daemonize()"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_ef4327ad","line":80,"range":{"start_line":80,"start_character":59,"end_line":80,"end_character":63},"in_reply_to":"dada55a8_9b63db41","updated":"2016-07-21 11:47:05.000000000","message":"ok, you are right, I just need to pass the self arg","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"21705c174f8e47eabe9e33a855acf9ef58ed424d","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":103,"context_line":"        self.db_consistency_manager \u003d db_consistent.DBConsistencyManager(self)"},{"line_number":104,"context_line":"        self.nb_api.set_db_consistency_manager(self.db_consistency_manager)"},{"line_number":105,"context_line":"        self.db_consistency_manager.daemonize()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # both set_controller and del_controller will delete flows."},{"line_number":108,"context_line":"        # for reliability, here we should check if controller is set for OVS,"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_aa5a764e","line":105,"updated":"2016-10-24 09:17:15.000000000","message":"The DFDaemon is an eventlet implementation. It is not suitable for this situation. DB consistency comparison/check is a kind of heavy I/O procedure which will consuming much resources and cause local controller unable to respond with other requests. It should be run in a dedicated OS process, for example, a kind of Neutron Worker.\n\nIt could be a further improvement.","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b299c8900c1e4eef47ad32b3af8f7f8d166e078c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":103,"context_line":"        self.db_consistency_manager \u003d db_consistent.DBConsistencyManager(self)"},{"line_number":104,"context_line":"        self.nb_api.set_db_consistency_manager(self.db_consistency_manager)"},{"line_number":105,"context_line":"        self.db_consistency_manager.daemonize()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # both set_controller and del_controller will delete flows."},{"line_number":108,"context_line":"        # for reliability, here we should check if controller is set for OVS,"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_4721bf4c","line":105,"in_reply_to":"da6895a0_aa5a764e","updated":"2016-10-25 03:03:17.000000000","message":"Done","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                             is_neutron_server\u003dFalse)"},{"line_number":101,"context_line":"        self.topology \u003d topology.Topology(self,"},{"line_number":102,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":103,"context_line":"        self.db_consistency_manager \u003d db_consistent.DBConsistencyManager(self)"},{"line_number":104,"context_line":"        self.nb_api.set_db_consistency_manager(self.db_consistency_manager)"},{"line_number":105,"context_line":"        self.db_consistency_manager.daemonize()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # both set_controller and del_controller will delete flows."},{"line_number":108,"context_line":"        # for reliability, here we should check if controller is set for OVS,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_6235bcf5","line":105,"range":{"start_line":103,"start_character":8,"end_line":105,"end_character":47},"updated":"2016-11-01 02:31:42.000000000","message":"suggest to provide an option to enable/disable db consistency.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                             is_neutron_server\u003dFalse)"},{"line_number":101,"context_line":"        self.topology \u003d topology.Topology(self,"},{"line_number":102,"context_line":"                                          self.enable_selective_topo_dist)"},{"line_number":103,"context_line":"        self.db_consistency_manager \u003d db_consistent.DBConsistencyManager(self)"},{"line_number":104,"context_line":"        self.nb_api.set_db_consistency_manager(self.db_consistency_manager)"},{"line_number":105,"context_line":"        self.db_consistency_manager.daemonize()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # both set_controller and del_controller will delete flows."},{"line_number":108,"context_line":"        # for reliability, here we should check if controller is set for OVS,"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_285f250f","line":105,"range":{"start_line":103,"start_character":8,"end_line":105,"end_character":47},"in_reply_to":"ba5da102_6235bcf5","updated":"2016-11-01 03:44:59.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def run_db_poll(self):"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            self.nb_api.sync()"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"            self.register_chassis()"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_c2158a40","line":144,"range":{"start_line":144,"start_character":12,"end_line":144,"end_character":30},"updated":"2016-11-26 02:54:15.000000000","message":"I guess this need to be removed.or you need to use this api","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4b17355fee8d8a4f003dad9a2fe7264463a8ff5d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def run_db_poll(self):"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            self.nb_api.sync()"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"            self.register_chassis()"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_a2b96e7b","line":144,"range":{"start_line":144,"start_character":12,"end_line":144,"end_character":30},"in_reply_to":"5a74a57a_c2158a40","updated":"2016-11-26 04:52:34.000000000","message":"I think if this is useless, it should be removed in another patch, and currently it do nothing so I do not need to use it:)","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"}],"dragonflow/controller/topology.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _vm_port_updated(self, ovs_port):"},{"line_number":145,"context_line":"        lport_id \u003d ovs_port.get_iface_id()"},{"line_number":146,"context_line":"        lport \u003d self.get_lport(lport_id)"},{"line_number":147,"context_line":"        if lport is None:"},{"line_number":148,"context_line":"            LOG.warning(_LW(\"No logical port found for ovs port: %s\")"},{"line_number":149,"context_line":"                        % str(ovs_port))"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_823c90e3","line":146,"range":{"start_line":146,"start_character":21,"end_line":146,"end_character":30},"updated":"2016-11-01 02:31:42.000000000","message":"is it related with this spec? Why changing the function name?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _vm_port_updated(self, ovs_port):"},{"line_number":145,"context_line":"        lport_id \u003d ovs_port.get_iface_id()"},{"line_number":146,"context_line":"        lport \u003d self.get_lport(lport_id)"},{"line_number":147,"context_line":"        if lport is None:"},{"line_number":148,"context_line":"            LOG.warning(_LW(\"No logical port found for ovs port: %s\")"},{"line_number":149,"context_line":"                        % str(ovs_port))"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_48d1b956","line":146,"range":{"start_line":146,"start_character":21,"end_line":146,"end_character":30},"in_reply_to":"ba5da102_823c90e3","updated":"2016-11-01 03:44:59.000000000","message":"In previous patch this method(also below methods) is not a private method because db consistent module will invoke it, after I move the check_topology_info method back to this file, the method became private method again and I should add \"_\" back:)","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        return lport"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def check_topology_info(self):"},{"line_number":288,"context_line":"        new_ovs_to_lport_mapping \u003d {}"},{"line_number":289,"context_line":"        add_ovs_to_lport_mapping \u003d {}"},{"line_number":290,"context_line":"        delete_ovs_to_lport_mapping \u003d self.ovs_to_lport_mapping"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_81cf75af","line":287,"range":{"start_line":287,"start_character":8,"end_line":287,"end_character":27},"updated":"2016-11-08 07:19:42.000000000","message":"better to add some doc string for this method.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        return lport"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def check_topology_info(self):"},{"line_number":288,"context_line":"        new_ovs_to_lport_mapping \u003d {}"},{"line_number":289,"context_line":"        add_ovs_to_lport_mapping \u003d {}"},{"line_number":290,"context_line":"        delete_ovs_to_lport_mapping \u003d self.ovs_to_lport_mapping"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_26048c48","line":287,"range":{"start_line":287,"start_character":8,"end_line":287,"end_character":27},"in_reply_to":"9a629dbe_81cf75af","updated":"2016-11-10 09:34:29.000000000","message":"Done","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                lport \u003d self._get_lport(lport_id)"},{"line_number":295,"context_line":"                if lport is None:"},{"line_number":296,"context_line":"                    LOG.warning(_LW(\"No logical port found for ovs port: %s\"),"},{"line_number":297,"context_line":"                                str(ovs_port))"},{"line_number":298,"context_line":"                    continue"},{"line_number":299,"context_line":"                topic \u003d lport.get_topic()"},{"line_number":300,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e14bd157","line":297,"range":{"start_line":297,"start_character":32,"end_line":297,"end_character":35},"updated":"2016-11-08 07:19:42.000000000","message":"although there are lots of existing using of str inside Log, I think we should avoid using it in new code.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                lport \u003d self._get_lport(lport_id)"},{"line_number":295,"context_line":"                if lport is None:"},{"line_number":296,"context_line":"                    LOG.warning(_LW(\"No logical port found for ovs port: %s\"),"},{"line_number":297,"context_line":"                                str(ovs_port))"},{"line_number":298,"context_line":"                    continue"},{"line_number":299,"context_line":"                topic \u003d lport.get_topic()"},{"line_number":300,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e6e534a4","line":297,"range":{"start_line":297,"start_character":32,"end_line":297,"end_character":35},"in_reply_to":"9a629dbe_e14bd157","updated":"2016-11-10 09:34:29.000000000","message":"Done","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                if not delete_ovs_to_lport_mapping.pop(key, None):"},{"line_number":303,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {"},{"line_number":304,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"},{"line_number":305,"context_line":"        self.ovs_to_lport_mapping \u003d new_ovs_to_lport_mapping"},{"line_number":306,"context_line":"        for value in add_ovs_to_lport_mapping.values():"},{"line_number":307,"context_line":"            lport_id \u003d value[\u0027lport_id\u0027]"},{"line_number":308,"context_line":"            topic \u003d value[\u0027topic\u0027]"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_410abdd3","line":305,"range":{"start_line":305,"start_character":13,"end_line":305,"end_character":33},"updated":"2016-11-08 07:19:42.000000000","message":"you have re-construct the self.ovs_to_lport_mapping here from self.ovs_ports. But they should be consistent, so in which case they will not be consistent? If there is something in the doc string, I will not have this question...","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                if not delete_ovs_to_lport_mapping.pop(key, None):"},{"line_number":303,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {"},{"line_number":304,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"},{"line_number":305,"context_line":"        self.ovs_to_lport_mapping \u003d new_ovs_to_lport_mapping"},{"line_number":306,"context_line":"        for value in add_ovs_to_lport_mapping.values():"},{"line_number":307,"context_line":"            lport_id \u003d value[\u0027lport_id\u0027]"},{"line_number":308,"context_line":"            topic \u003d value[\u0027topic\u0027]"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_293c5dc7","line":305,"range":{"start_line":305,"start_character":13,"end_line":305,"end_character":33},"in_reply_to":"9a629dbe_410abdd3","updated":"2016-11-10 09:34:29.000000000","message":"yes, I\u0027ll add some description for this func which I have written them into the bug description.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                                ovs_port)"},{"line_number":329,"context_line":"                    continue"},{"line_number":330,"context_line":"                topic \u003d lport.get_topic()"},{"line_number":331,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {"},{"line_number":332,"context_line":"                    \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"},{"line_number":333,"context_line":"                if not delete_ovs_to_lport_mapping.pop(key, None):"},{"line_number":334,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {"},{"line_number":335,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_8ac2a032","line":332,"range":{"start_line":331,"start_character":48,"end_line":332,"end_character":57},"updated":"2016-11-28 16:22:54.000000000","message":"This dict is created twice. Why not create one variable, and then assign it to two different locations?","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                                ovs_port)"},{"line_number":329,"context_line":"                    continue"},{"line_number":330,"context_line":"                topic \u003d lport.get_topic()"},{"line_number":331,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {"},{"line_number":332,"context_line":"                    \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"},{"line_number":333,"context_line":"                if not delete_ovs_to_lport_mapping.pop(key, None):"},{"line_number":334,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {"},{"line_number":335,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_3361d605","line":332,"range":{"start_line":331,"start_character":48,"end_line":332,"end_character":57},"in_reply_to":"5a74a57a_8ac2a032","updated":"2016-11-29 12:47:15.000000000","message":"Done","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.process_ha()"},{"line_number":85,"context_line":"        self.publisher.process_ha()"},{"line_number":86,"context_line":"        self.subscriber.process_ha()"},{"line_number":87,"context_line":"        self.db_consistent.process(True)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _get_publisher(self):"},{"line_number":90,"context_line":"        if cfg.CONF.df.pub_sub_use_multiproc:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_c5aa1919","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":40},"updated":"2016-07-09 15:21:52.000000000","message":"I don\u0027t see neutron-server set db_consistent, it could be None?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.process_ha()"},{"line_number":85,"context_line":"        self.publisher.process_ha()"},{"line_number":86,"context_line":"        self.subscriber.process_ha()"},{"line_number":87,"context_line":"        self.db_consistent.process(True)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _get_publisher(self):"},{"line_number":90,"context_line":"        if cfg.CONF.df.pub_sub_use_multiproc:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_25867ddb","line":87,"range":{"start_line":87,"start_character":7,"end_line":87,"end_character":40},"updated":"2016-07-09 15:21:52.000000000","message":"I think a lock is needed to avoid race condition between db recover process and db consistent thread","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.process_ha()"},{"line_number":85,"context_line":"        self.publisher.process_ha()"},{"line_number":86,"context_line":"        self.subscriber.process_ha()"},{"line_number":87,"context_line":"        self.db_consistent.process(True)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _get_publisher(self):"},{"line_number":90,"context_line":"        if cfg.CONF.df.pub_sub_use_multiproc:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_f6006436","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":40},"in_reply_to":"1aa78d24_c5aa1919","updated":"2016-07-12 06:39:30.000000000","message":"Is calling set_db_consistent now mandatory when setting up nb_api? What if a client wants to use nb_api without the db consistency feature?\n\nConsider testing that self.db_consistent exists before calling self.db_consistent.process.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.process_ha()"},{"line_number":85,"context_line":"        self.publisher.process_ha()"},{"line_number":86,"context_line":"        self.subscriber.process_ha()"},{"line_number":87,"context_line":"        self.db_consistent.process(True)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _get_publisher(self):"},{"line_number":90,"context_line":"        if cfg.CONF.df.pub_sub_use_multiproc:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_aeada532","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":40},"in_reply_to":"1aa78d24_c5aa1919","updated":"2016-07-13 02:53:43.000000000","message":"the green thread will make the event be processed one by one and no need to lock it, currently it does not support set db_consistent on Neutron side.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.driver.process_ha()"},{"line_number":85,"context_line":"        self.publisher.process_ha()"},{"line_number":86,"context_line":"        self.subscriber.process_ha()"},{"line_number":87,"context_line":"        self.db_consistent.process(True)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _get_publisher(self):"},{"line_number":90,"context_line":"        if cfg.CONF.df.pub_sub_use_multiproc:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_6e3c5de1","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":40},"in_reply_to":"1aa78d24_f6006436","updated":"2016-07-13 02:53:43.000000000","message":"yes, I should do the judgement before using it, and I have modified in my local environment and do not commit it here in time:)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"a367013b7a00419bf155327aade5086cbdc70df6","unresolved":false,"context_lines":[{"line_number":1156,"context_line":"    def get_last_activity_timestamp(self):"},{"line_number":1157,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1158,"context_line":""},{"line_number":1159,"context_line":"    def get_version(self):"},{"line_number":1160,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"    def __str__(self):"},{"line_number":1163,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_2ac4735d","line":1160,"range":{"start_line":1159,"start_character":4,"end_line":1160,"end_character":63},"updated":"2016-07-11 08:37:34.000000000","message":"get last activity timestamp?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":1156,"context_line":"    def get_last_activity_timestamp(self):"},{"line_number":1157,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1158,"context_line":""},{"line_number":1159,"context_line":"    def get_version(self):"},{"line_number":1160,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"    def __str__(self):"},{"line_number":1163,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_3928dd85","line":1160,"range":{"start_line":1159,"start_character":4,"end_line":1160,"end_character":63},"in_reply_to":"1aa78d24_2ac4735d","updated":"2016-07-13 02:53:43.000000000","message":"yes, currently there are no version field in publisher object, so I use last activity timestamp field as version value:)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.use_pubsub \u003d use_pubsub"},{"line_number":48,"context_line":"        self.publisher \u003d None"},{"line_number":49,"context_line":"        self.subscriber \u003d None"},{"line_number":50,"context_line":"        self.db_consistent \u003d None"},{"line_number":51,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":52,"context_line":"        self.db_table_monitors \u003d None"},{"line_number":53,"context_line":"        self.enable_selective_topo_dist \u003d \\"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_1b436bb3","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":26},"updated":"2016-07-21 08:55:24.000000000","message":"db_consistency_manager","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                    self.db_change_callback)"},{"line_number":77,"context_line":"                self.subscriber.register_hamsg_for_db()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_db_consistent(self, db_consistent):"},{"line_number":80,"context_line":"        self.db_consistent \u003d db_consistent"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def db_recover_callback(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_9b7c7bed","line":79,"range":{"start_line":79,"start_character":32,"end_line":79,"end_character":45},"updated":"2016-07-21 08:55:24.000000000","message":"ditto","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                    self.db_change_callback)"},{"line_number":77,"context_line":"                self.subscriber.register_hamsg_for_db()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_db_consistent(self, db_consistent):"},{"line_number":80,"context_line":"        self.db_consistent \u003d db_consistent"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def db_recover_callback(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_3b1bcfcb","line":79,"range":{"start_line":79,"start_character":25,"end_line":79,"end_character":26},"updated":"2016-07-21 08:55:24.000000000","message":"set_db_consistency_manager","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                self.subscriber.register_hamsg_for_db()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_db_consistent(self, db_consistent):"},{"line_number":80,"context_line":"        self.db_consistent \u003d db_consistent"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def db_recover_callback(self):"},{"line_number":83,"context_line":"        # only db with HA func can go in here"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_bb0e9f89","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":42},"updated":"2016-07-21 08:55:24.000000000","message":"ditto","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"d40d755f9b0f05e2e56a8822c7a44eb54b7aa177","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.subscriber.process_ha()"},{"line_number":107,"context_line":"        if not self.db_consistency_manager:"},{"line_number":108,"context_line":"            return"},{"line_number":109,"context_line":"        if not self.is_neutron_server:"},{"line_number":110,"context_line":"            self.db_consistency_manager.process(True)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _get_publisher(self):"}],"source_content_type":"text/x-python","patch_set":36,"id":"da6895a0_5d526fde","line":109,"range":{"start_line":109,"start_character":20,"end_line":109,"end_character":37},"updated":"2016-10-25 08:35:10.000000000","message":"Can these two if statements be merged?","commit_id":"f501ef9e7b0284fc81ded4dbb118f021cb0d75b0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"    def get_version(self):"},{"line_number":1228,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __str__(self):"},{"line_number":1231,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_c22688cd","line":1228,"range":{"start_line":1228,"start_character":8,"end_line":1228,"end_character":63},"updated":"2016-11-01 02:31:42.000000000","message":"why using timestamp as version?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"05be986aa346d894c8ab7caacb0b3053b1b423a5","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"    def get_version(self):"},{"line_number":1228,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __str__(self):"},{"line_number":1231,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_f0fcddb9","line":1228,"range":{"start_line":1228,"start_character":8,"end_line":1228,"end_character":63},"in_reply_to":"ba5da102_a845f517","updated":"2016-11-03 01:54:38.000000000","message":"the publisher seems not needing this version. you can just return 0. returning the timestamp seems strange.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"    def get_version(self):"},{"line_number":1228,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __str__(self):"},{"line_number":1231,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_a845f517","line":1228,"range":{"start_line":1228,"start_character":8,"end_line":1228,"end_character":63},"in_reply_to":"ba5da102_c22688cd","updated":"2016-11-01 03:44:59.000000000","message":"because the publisher obj has no version attribute, maybe we should add it in the df_publisher_service?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b2b450fd1cef227cae9e62ce4cb5b583d9e9d5e6","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, None)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"    def get_version(self):"},{"line_number":1228,"context_line":"        return self.publisher.get(\u0027last_activity_timestamp\u0027, 0)"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __str__(self):"},{"line_number":1231,"context_line":"        return str(self.publisher)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_f41c71c3","line":1228,"range":{"start_line":1228,"start_character":8,"end_line":1228,"end_character":63},"in_reply_to":"ba5da102_f0fcddb9","updated":"2016-11-06 03:25:37.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"}],"dragonflow/db/db_consistent.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"a367013b7a00419bf155327aade5086cbdc70df6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 OpenStack Foundation.\r"},{"line_number":2,"context_line":"# All Rights Reserved.\r"},{"line_number":3,"context_line":"#\r"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_8aa127ac","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2016-07-11 08:37:34.000000000","message":"2016","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            except Exception as e:\r"},{"line_number":73,"context_line":"                LOG.error(_LE(\"Exception occurred : %s\") % e)\r"},{"line_number":74,"context_line":"            finally:\r"},{"line_number":75,"context_line":"                time.sleep(self.db_sync_time)\r"},{"line_number":76,"context_line":"\r"},{"line_number":77,"context_line":"    def daemonize(self):\r"},{"line_number":78,"context_line":"        return self._daemon.daemonize(self.run)\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_37d198ce","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":45},"updated":"2016-07-09 15:21:52.000000000","message":"sleep twice?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            except Exception as e:\r"},{"line_number":73,"context_line":"                LOG.error(_LE(\"Exception occurred : %s\") % e)\r"},{"line_number":74,"context_line":"            finally:\r"},{"line_number":75,"context_line":"                time.sleep(self.db_sync_time)\r"},{"line_number":76,"context_line":"\r"},{"line_number":77,"context_line":"    def daemonize(self):\r"},{"line_number":78,"context_line":"        return self._daemon.daemonize(self.run)\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d95b9920","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":45},"in_reply_to":"1aa78d24_37d198ce","updated":"2016-07-13 02:53:43.000000000","message":"I\u0027ll modify here","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        for key, ovs_port in six.iteritems(self.topology.ovs_ports):\r"},{"line_number":88,"context_line":"            if ovs_port.get_type() \u003d\u003d OvsPort.TYPE_VM:\r"},{"line_number":89,"context_line":"                lport_id \u003d ovs_port.get_iface_id()\r"},{"line_number":90,"context_line":"                lport \u003d self.topology._get_lport(lport_id)\r"},{"line_number":91,"context_line":"                if lport is None:\r"},{"line_number":92,"context_line":"                    LOG.warning(_LW(\"No logical port found for ovs port: %s\")\r"},{"line_number":93,"context_line":"                                % str(ovs_port))\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_0cc99c59","line":90,"range":{"start_line":90,"start_character":38,"end_line":90,"end_character":48},"updated":"2016-07-12 06:39:30.000000000","message":"This is a private method. If it can be used in this way, please make it public.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        for key, ovs_port in six.iteritems(self.topology.ovs_ports):\r"},{"line_number":88,"context_line":"            if ovs_port.get_type() \u003d\u003d OvsPort.TYPE_VM:\r"},{"line_number":89,"context_line":"                lport_id \u003d ovs_port.get_iface_id()\r"},{"line_number":90,"context_line":"                lport \u003d self.topology._get_lport(lport_id)\r"},{"line_number":91,"context_line":"                if lport is None:\r"},{"line_number":92,"context_line":"                    LOG.warning(_LW(\"No logical port found for ovs port: %s\")\r"},{"line_number":93,"context_line":"                                % str(ovs_port))\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_3939fda4","line":90,"range":{"start_line":90,"start_character":38,"end_line":90,"end_character":48},"in_reply_to":"1aa78d24_0cc99c59","updated":"2016-07-13 02:53:43.000000000","message":"ok","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                topic \u003d lport.get_topic()\r"},{"line_number":96,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {\r"},{"line_number":97,"context_line":"                    \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}\r"},{"line_number":98,"context_line":"                if delete_ovs_to_lport_mapping.get(key):\r"},{"line_number":99,"context_line":"                    del delete_ovs_to_lport_mapping[key]\r"},{"line_number":100,"context_line":"                else:\r"},{"line_number":101,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {\r"},{"line_number":102,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}\r"},{"line_number":103,"context_line":"        self.topology.ovs_to_lport_mapping \u003d new_ovs_to_lport_mapping\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_2c28d8e1","line":100,"range":{"start_line":98,"start_character":0,"end_line":100,"end_character":21},"updated":"2016-07-12 06:39:30.000000000","message":"Consider replacing with:\nif delete_ovs_to_lport_mapping.pop(key):\n    add_ovs_....\n\nThis way, the key is looked up only once.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                topic \u003d lport.get_topic()\r"},{"line_number":96,"context_line":"                new_ovs_to_lport_mapping[key] \u003d {\r"},{"line_number":97,"context_line":"                    \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}\r"},{"line_number":98,"context_line":"                if delete_ovs_to_lport_mapping.get(key):\r"},{"line_number":99,"context_line":"                    del delete_ovs_to_lport_mapping[key]\r"},{"line_number":100,"context_line":"                else:\r"},{"line_number":101,"context_line":"                    add_ovs_to_lport_mapping[key] \u003d {\r"},{"line_number":102,"context_line":"                        \u0027lport_id\u0027: lport_id, \u0027topic\u0027: topic}\r"},{"line_number":103,"context_line":"        self.topology.ovs_to_lport_mapping \u003d new_ovs_to_lport_mapping\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_39d57d1b","line":100,"range":{"start_line":98,"start_character":0,"end_line":100,"end_character":21},"in_reply_to":"1aa78d24_2c28d8e1","updated":"2016-07-13 02:53:43.000000000","message":"ok","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        for value in add_ovs_to_lport_mapping.values():\r"},{"line_number":105,"context_line":"            lport_id \u003d value[\u0027lport_id\u0027]\r"},{"line_number":106,"context_line":"            topic \u003d value[\u0027topic\u0027]\r"},{"line_number":107,"context_line":"            self.topology._add_to_topic_subscribed(topic, lport_id)\r"},{"line_number":108,"context_line":"\r"},{"line_number":109,"context_line":"        for value in delete_ovs_to_lport_mapping.values():\r"},{"line_number":110,"context_line":"            lport_id \u003d value[\u0027lport_id\u0027]\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_8c310c5d","line":107,"range":{"start_line":107,"start_character":26,"end_line":107,"end_character":51},"updated":"2016-07-12 06:39:30.000000000","message":"Same here re: private method.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        for value in delete_ovs_to_lport_mapping.values():\r"},{"line_number":110,"context_line":"            lport_id \u003d value[\u0027lport_id\u0027]\r"},{"line_number":111,"context_line":"            topic \u003d value[\u0027topic\u0027]\r"},{"line_number":112,"context_line":"            self.topology._del_from_topic_subscribed(topic, lport_id)\r"},{"line_number":113,"context_line":"\r"},{"line_number":114,"context_line":"    def process_db_tables_comparison(self, direct):\r"},{"line_number":115,"context_line":"        self.controller.register_chassis()\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_effb6279","line":112,"range":{"start_line":112,"start_character":26,"end_line":112,"end_character":53},"updated":"2016-07-12 06:39:30.000000000","message":"and here.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.controller.register_chassis()\r"},{"line_number":116,"context_line":"        self.controller.create_tunnels()\r"},{"line_number":117,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()\r"},{"line_number":118,"context_line":"        for table in df_controller_db_tables:\r"},{"line_number":119,"context_line":"            try:\r"},{"line_number":120,"context_line":"                self.handle_data_comparison(tenants, table, direct)\r"},{"line_number":121,"context_line":"            except Exception as e:\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_0c887cc4","line":118,"range":{"start_line":118,"start_character":21,"end_line":118,"end_character":45},"updated":"2016-07-12 06:39:30.000000000","message":"Why can\u0027t you use _table_name_mapping.keys() (or six.iterkeys) here?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.controller.register_chassis()\r"},{"line_number":116,"context_line":"        self.controller.create_tunnels()\r"},{"line_number":117,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()\r"},{"line_number":118,"context_line":"        for table in df_controller_db_tables:\r"},{"line_number":119,"context_line":"            try:\r"},{"line_number":120,"context_line":"                self.handle_data_comparison(tenants, table, direct)\r"},{"line_number":121,"context_line":"            except Exception as e:\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d9c1d94f","line":118,"range":{"start_line":118,"start_character":21,"end_line":118,"end_character":45},"in_reply_to":"1aa78d24_0c887cc4","updated":"2016-07-13 02:53:43.000000000","message":"ok, in my previous thinking, I just want to keep a separate list to store the table names :)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                LOG.error(_LE(\"Exception occurred when\"\r"},{"line_number":123,"context_line":"                              \"handling db comparison: %s\") % e)\r"},{"line_number":124,"context_line":"\r"},{"line_number":125,"context_line":"    def _process_object(self, table, action, df_object, local_object):\r"},{"line_number":126,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":127,"context_line":"            if action \u003d\u003d \u0027delete\u0027:\r"},{"line_number":128,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_4f18b675","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":70},"updated":"2016-07-12 06:39:30.000000000","message":"This method looks very similar to apply_db_change in NbApi. Can you use that method instead?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                LOG.error(_LE(\"Exception occurred when\"\r"},{"line_number":123,"context_line":"                              \"handling db comparison: %s\") % e)\r"},{"line_number":124,"context_line":"\r"},{"line_number":125,"context_line":"    def _process_object(self, table, action, df_object, local_object):\r"},{"line_number":126,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":127,"context_line":"            if action \u003d\u003d \u0027delete\u0027:\r"},{"line_number":128,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_b9b20d92","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":70},"in_reply_to":"1aa78d24_4f18b675","updated":"2016-07-13 02:53:43.000000000","message":"In that case, I\u0027ll translation the df_object to json string according to different table by json.dumps method, it still need the if...elif....elif, and the apply_db_change will use json.loads method to build the json object again, I think it is unnecessary.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                self.controller.publisher_updated(df_object)\r"},{"line_number":158,"context_line":"\r"},{"line_number":159,"context_line":"    def _build_cache_obj(self, table, action, df_version, local_version):\r"},{"line_number":160,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":161,"context_line":"            retObj \u003d LogicSwitchCacheObj(action, df_version, local_version)\r"},{"line_number":162,"context_line":"        elif table \u003d\u003d \u0027port\u0027:\r"},{"line_number":163,"context_line":"            retObj \u003d PortCacheObj(action, df_version, local_version)\r"},{"line_number":164,"context_line":"        elif table \u003d\u003d \u0027router\u0027:\r"},{"line_number":165,"context_line":"            retObj \u003d RouterCacheObj(action, df_version, local_version)\r"},{"line_number":166,"context_line":"        elif table \u003d\u003d \u0027secgroup\u0027:\r"},{"line_number":167,"context_line":"            retObj \u003d SecGroupCacheObj(action, df_version, local_version)\r"},{"line_number":168,"context_line":"        elif table \u003d\u003d \u0027floatingip\u0027:\r"},{"line_number":169,"context_line":"            retObj \u003d FloatingIpCacheObj(action, df_version, local_version)\r"},{"line_number":170,"context_line":"        elif table \u003d\u003d \u0027publisher\u0027:\r"},{"line_number":171,"context_line":"            retObj \u003d PublisherCacheObj(action, df_version, local_version)\r"},{"line_number":172,"context_line":"        return retObj\r"},{"line_number":173,"context_line":"\r"},{"line_number":174,"context_line":"    def _verify_object(self, table, id, action, df_object, local_object):\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_7d965f95","line":171,"range":{"start_line":160,"start_character":8,"end_line":171,"end_character":73},"updated":"2016-07-09 15:21:52.000000000","message":"Can we just use the super class CacheObject? And why do we need those sub classes?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                self.controller.publisher_updated(df_object)\r"},{"line_number":158,"context_line":"\r"},{"line_number":159,"context_line":"    def _build_cache_obj(self, table, action, df_version, local_version):\r"},{"line_number":160,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":161,"context_line":"            retObj \u003d LogicSwitchCacheObj(action, df_version, local_version)\r"},{"line_number":162,"context_line":"        elif table \u003d\u003d \u0027port\u0027:\r"},{"line_number":163,"context_line":"            retObj \u003d PortCacheObj(action, df_version, local_version)\r"},{"line_number":164,"context_line":"        elif table \u003d\u003d \u0027router\u0027:\r"},{"line_number":165,"context_line":"            retObj \u003d RouterCacheObj(action, df_version, local_version)\r"},{"line_number":166,"context_line":"        elif table \u003d\u003d \u0027secgroup\u0027:\r"},{"line_number":167,"context_line":"            retObj \u003d SecGroupCacheObj(action, df_version, local_version)\r"},{"line_number":168,"context_line":"        elif table \u003d\u003d \u0027floatingip\u0027:\r"},{"line_number":169,"context_line":"            retObj \u003d FloatingIpCacheObj(action, df_version, local_version)\r"},{"line_number":170,"context_line":"        elif table \u003d\u003d \u0027publisher\u0027:\r"},{"line_number":171,"context_line":"            retObj \u003d PublisherCacheObj(action, df_version, local_version)\r"},{"line_number":172,"context_line":"        return retObj\r"},{"line_number":173,"context_line":"\r"},{"line_number":174,"context_line":"    def _verify_object(self, table, id, action, df_object, local_object):\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_8f53be16","line":171,"range":{"start_line":160,"start_character":8,"end_line":171,"end_character":73},"in_reply_to":"1aa78d24_7d965f95","updated":"2016-07-12 06:39:30.000000000","message":"+1","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                self.controller.publisher_updated(df_object)\r"},{"line_number":158,"context_line":"\r"},{"line_number":159,"context_line":"    def _build_cache_obj(self, table, action, df_version, local_version):\r"},{"line_number":160,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":161,"context_line":"            retObj \u003d LogicSwitchCacheObj(action, df_version, local_version)\r"},{"line_number":162,"context_line":"        elif table \u003d\u003d \u0027port\u0027:\r"},{"line_number":163,"context_line":"            retObj \u003d PortCacheObj(action, df_version, local_version)\r"},{"line_number":164,"context_line":"        elif table \u003d\u003d \u0027router\u0027:\r"},{"line_number":165,"context_line":"            retObj \u003d RouterCacheObj(action, df_version, local_version)\r"},{"line_number":166,"context_line":"        elif table \u003d\u003d \u0027secgroup\u0027:\r"},{"line_number":167,"context_line":"            retObj \u003d SecGroupCacheObj(action, df_version, local_version)\r"},{"line_number":168,"context_line":"        elif table \u003d\u003d \u0027floatingip\u0027:\r"},{"line_number":169,"context_line":"            retObj \u003d FloatingIpCacheObj(action, df_version, local_version)\r"},{"line_number":170,"context_line":"        elif table \u003d\u003d \u0027publisher\u0027:\r"},{"line_number":171,"context_line":"            retObj \u003d PublisherCacheObj(action, df_version, local_version)\r"},{"line_number":172,"context_line":"        return retObj\r"},{"line_number":173,"context_line":"\r"},{"line_number":174,"context_line":"    def _verify_object(self, table, id, action, df_object, local_object):\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d9a39941","line":171,"range":{"start_line":160,"start_character":8,"end_line":171,"end_character":73},"in_reply_to":"1aa78d24_8f53be16","updated":"2016-07-13 02:53:43.000000000","message":"+1 :)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            table_cache[id] \u003d cache_obj\r"},{"line_number":191,"context_line":"            return\r"},{"line_number":192,"context_line":"\r"},{"line_number":193,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"},{"line_number":194,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()\r"},{"line_number":195,"context_line":"        if action \u003d\u003d \u0027create\u0027:\r"},{"line_number":196,"context_line":"            if df_version \u003e\u003d old_df_version:\r"},{"line_number":197,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_ef0c02ee","line":194,"range":{"start_line":193,"start_character":0,"end_line":194,"end_character":61},"updated":"2016-07-12 06:39:30.000000000","message":"Can old_cache_obj be None here?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            table_cache[id] \u003d cache_obj\r"},{"line_number":191,"context_line":"            return\r"},{"line_number":192,"context_line":"\r"},{"line_number":193,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"},{"line_number":194,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()\r"},{"line_number":195,"context_line":"        if action \u003d\u003d \u0027create\u0027:\r"},{"line_number":196,"context_line":"            if df_version \u003e\u003d old_df_version:\r"},{"line_number":197,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_995bd153","line":194,"range":{"start_line":193,"start_character":0,"end_line":194,"end_character":61},"in_reply_to":"1aa78d24_ef0c02ee","updated":"2016-07-13 02:53:43.000000000","message":"yes, but I have judge it:\nif not old_cache_obj or old_cache_obj.get_action() !\u003d action:\n            cache_obj \u003d self._build_cache_obj(\n                    table, action, df_version, local_version)\n            table_cache[id] \u003d cache_obj\n            return","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":237,"context_line":"\r"},{"line_number":238,"context_line":"    def _compare_df_and_local_data(\r"},{"line_number":239,"context_line":"            self, table, df_objects, local_objects, direct):\r"},{"line_number":240,"context_line":"        for df_object in df_objects[:]:\r"},{"line_number":241,"context_line":"            find_same_obj \u003d False\r"},{"line_number":242,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":243,"context_line":"            df_version \u003d df_object.get_version()\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_ec9c1010","line":240,"range":{"start_line":240,"start_character":35,"end_line":240,"end_character":39},"updated":"2016-07-12 06:39:30.000000000","message":"Why is this needed?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":237,"context_line":"\r"},{"line_number":238,"context_line":"    def _compare_df_and_local_data(\r"},{"line_number":239,"context_line":"            self, table, df_objects, local_objects, direct):\r"},{"line_number":240,"context_line":"        for df_object in df_objects[:]:\r"},{"line_number":241,"context_line":"            find_same_obj \u003d False\r"},{"line_number":242,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":243,"context_line":"            df_version \u003d df_object.get_version()\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_391a9d7d","line":240,"range":{"start_line":240,"start_character":35,"end_line":240,"end_character":39},"in_reply_to":"1aa78d24_ec9c1010","updated":"2016-07-13 02:53:43.000000000","message":"because I will remove element from df_objects, and in this situation list[:] is more safe that list.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            find_same_obj \u003d False\r"},{"line_number":242,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":243,"context_line":"            df_version \u003d df_object.get_version()\r"},{"line_number":244,"context_line":"            for local_object in local_objects[:]:\r"},{"line_number":245,"context_line":"                local_id \u003d local_object.get_id()\r"},{"line_number":246,"context_line":"                if df_id !\u003d local_id:\r"},{"line_number":247,"context_line":"                    continue\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_cfb666f8","line":244,"range":{"start_line":244,"start_character":45,"end_line":244,"end_character":48},"updated":"2016-07-12 06:39:30.000000000","message":"Same here.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                    local_version \u003d local_object.get_version()\r"},{"line_number":251,"context_line":"                    if df_version \u003e local_version:\r"},{"line_number":252,"context_line":"                        if direct:\r"},{"line_number":253,"context_line":"                            self._process_object(\r"},{"line_number":254,"context_line":"                                    table, \u0027update\u0027, df_object, None)\r"},{"line_number":255,"context_line":"                        else:\r"},{"line_number":256,"context_line":"                            self._verify_object(\r"},{"line_number":257,"context_line":"                                    table, df_id, \u0027update\u0027,\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_806d9f9b","line":254,"range":{"start_line":253,"start_character":28,"end_line":254,"end_character":69},"updated":"2016-07-09 15:21:52.000000000","message":"Any lock to avoid race condition with local controller?","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"3783679d6745aec4e21782140e324c5cea475060","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                                    df_object, local_object)\r"},{"line_number":259,"context_line":"                    local_objects.remove(local_object)\r"},{"line_number":260,"context_line":"                    break\r"},{"line_number":261,"context_line":"            if not find_same_obj:\r"},{"line_number":262,"context_line":"                if direct:\r"},{"line_number":263,"context_line":"                    self._process_object(table, \u0027create\u0027, df_object, None)\r"},{"line_number":264,"context_line":"                else:\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_72c4ce91","line":261,"range":{"start_line":261,"start_character":19,"end_line":261,"end_character":32},"updated":"2016-07-09 15:21:52.000000000","message":"We can remove find_same_obj, use \nfor ...\n...\nelse","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                                    df_object, local_object)\r"},{"line_number":259,"context_line":"                    local_objects.remove(local_object)\r"},{"line_number":260,"context_line":"                    break\r"},{"line_number":261,"context_line":"            if not find_same_obj:\r"},{"line_number":262,"context_line":"                if direct:\r"},{"line_number":263,"context_line":"                    self._process_object(table, \u0027create\u0027, df_object, None)\r"},{"line_number":264,"context_line":"                else:\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d4b7e01e","line":261,"range":{"start_line":261,"start_character":19,"end_line":261,"end_character":32},"in_reply_to":"1aa78d24_72c4ce91","updated":"2016-07-13 02:53:43.000000000","message":"ok","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e938cdb7d0770ff55122a3263be37fb7ce54f9a9","unresolved":false,"context_lines":[{"line_number":304,"context_line":"\r"},{"line_number":305,"context_line":"\r"},{"line_number":306,"context_line":"class LogicSwitchCacheObj(CacheObject):\r"},{"line_number":307,"context_line":"    def __init__(self, action, df_version, local_version):\r"},{"line_number":308,"context_line":"        super(LogicSwitchCacheObj, self).__init__(\r"},{"line_number":309,"context_line":"                action, df_version, local_version)\r"},{"line_number":310,"context_line":"\r"},{"line_number":311,"context_line":"\r"},{"line_number":312,"context_line":"class PortCacheObj(CacheObject):\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_8fe3bed8","line":309,"range":{"start_line":307,"start_character":0,"end_line":309,"end_character":50},"updated":"2016-07-12 06:39:30.000000000","message":"You don\u0027t need to override this method if you only call the parent implementation.\nYou can just put \u0027pass\u0027 (with no function definition) in the class body.","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"334ca6ebad1ef63ec0914697b00522cd79d23276","unresolved":false,"context_lines":[{"line_number":304,"context_line":"\r"},{"line_number":305,"context_line":"\r"},{"line_number":306,"context_line":"class LogicSwitchCacheObj(CacheObject):\r"},{"line_number":307,"context_line":"    def __init__(self, action, df_version, local_version):\r"},{"line_number":308,"context_line":"        super(LogicSwitchCacheObj, self).__init__(\r"},{"line_number":309,"context_line":"                action, df_version, local_version)\r"},{"line_number":310,"context_line":"\r"},{"line_number":311,"context_line":"\r"},{"line_number":312,"context_line":"class PortCacheObj(CacheObject):\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_3460e4a4","line":309,"range":{"start_line":307,"start_character":0,"end_line":309,"end_character":50},"in_reply_to":"1aa78d24_8fe3bed8","updated":"2016-07-13 02:53:43.000000000","message":"ok, but the super class is no need anymore:)","commit_id":"ccc3cd3b651ab271491de69af993cc730cf3e69b"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5f407d09e5235e4fa9bcb75e4ce18ed63eedacc4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.process_db_tables_comparison(direct)\r"},{"line_number":56,"context_line":"\r"},{"line_number":57,"context_line":"    def run(self):\r"},{"line_number":58,"context_line":"        time.sleep(self.db_sync_time)\r"},{"line_number":59,"context_line":"        while True:\r"},{"line_number":60,"context_line":"            try:\r"},{"line_number":61,"context_line":"                self.process(False)\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_d8270ac8","line":58,"range":{"start_line":58,"start_character":7,"end_line":58,"end_character":37},"updated":"2016-07-13 09:41:03.000000000","message":"why not put it after the \u0027try\u0027 statement and remove the finally block","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"64918dedd3362f754750a4e9546664acc77dc8a8","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.process_db_tables_comparison(direct)\r"},{"line_number":56,"context_line":"\r"},{"line_number":57,"context_line":"    def run(self):\r"},{"line_number":58,"context_line":"        time.sleep(self.db_sync_time)\r"},{"line_number":59,"context_line":"        while True:\r"},{"line_number":60,"context_line":"            try:\r"},{"line_number":61,"context_line":"                self.process(False)\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_b19146f4","line":58,"range":{"start_line":58,"start_character":7,"end_line":58,"end_character":37},"in_reply_to":"1aa78d24_d8270ac8","updated":"2016-07-14 02:47:34.000000000","message":"ok","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d10aa958bea0397d0769c5ea819650a137803053","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                LOG.error(_LE(\"Exception occurred when\"\r"},{"line_number":111,"context_line":"                              \"handling db comparison: %s\") % e)\r"},{"line_number":112,"context_line":"\r"},{"line_number":113,"context_line":"    def _process_object(self, table, action, df_object, local_object):\r"},{"line_number":114,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:\r"},{"line_number":115,"context_line":"            if action \u003d\u003d \u0027delete\u0027:\r"},{"line_number":116,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_c2d8bdf1","line":113,"updated":"2016-07-13 07:33:55.000000000","message":"I understand.","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5f407d09e5235e4fa9bcb75e4ce18ed63eedacc4","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        old_cache_obj \u003d table_cache.get(id)\r"},{"line_number":160,"context_line":"        if not old_cache_obj or old_cache_obj.get_action() !\u003d action:\r"},{"line_number":161,"context_line":"            cache_obj \u003d CacheObject(action, df_version, local_version)\r"},{"line_number":162,"context_line":"            table_cache[id] \u003d cache_obj\r"},{"line_number":163,"context_line":"            return\r"},{"line_number":164,"context_line":"\r"},{"line_number":165,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_e0d96c23","line":162,"range":{"start_line":162,"start_character":12,"end_line":162,"end_character":39},"updated":"2016-07-13 09:41:03.000000000","message":"What if there is no unconsistency later? It will cause memory leaking, we will have no chance to delete this entry","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"64918dedd3362f754750a4e9546664acc77dc8a8","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        old_cache_obj \u003d table_cache.get(id)\r"},{"line_number":160,"context_line":"        if not old_cache_obj or old_cache_obj.get_action() !\u003d action:\r"},{"line_number":161,"context_line":"            cache_obj \u003d CacheObject(action, df_version, local_version)\r"},{"line_number":162,"context_line":"            table_cache[id] \u003d cache_obj\r"},{"line_number":163,"context_line":"            return\r"},{"line_number":164,"context_line":"\r"},{"line_number":165,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_ec5bf5f7","line":162,"range":{"start_line":162,"start_character":12,"end_line":162,"end_character":39},"in_reply_to":"1aa78d24_e0d96c23","updated":"2016-07-14 02:47:34.000000000","message":"yes, I have consider this before, we should add a overtime mechanism for example add ttl for each entry, but maybe we can add this mechanism in another patch:)","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d10aa958bea0397d0769c5ea819650a137803053","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return\r"},{"line_number":164,"context_line":"\r"},{"line_number":165,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"},{"line_number":166,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()\r"},{"line_number":167,"context_line":"        if action \u003d\u003d \u0027create\u0027:\r"},{"line_number":168,"context_line":"            if df_version \u003e\u003d old_df_version:\r"},{"line_number":169,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_42f32d73","line":166,"updated":"2016-07-13 07:33:55.000000000","message":"Missed the return statement :)","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5f407d09e5235e4fa9bcb75e4ce18ed63eedacc4","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"},{"line_number":166,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()\r"},{"line_number":167,"context_line":"        if action \u003d\u003d \u0027create\u0027:\r"},{"line_number":168,"context_line":"            if df_version \u003e\u003d old_df_version:\r"},{"line_number":169,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)\r"},{"line_number":170,"context_line":"                del table_cache[id]\r"},{"line_number":171,"context_line":"            return\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_600d7ce7","line":168,"range":{"start_line":168,"start_character":15,"end_line":168,"end_character":44},"updated":"2016-07-13 09:41:03.000000000","message":"Consider df_version or local_version is None.\nAnd I am not sure they are strings or int, if they are strings we need transfer them to int.","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"64918dedd3362f754750a4e9546664acc77dc8a8","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()\r"},{"line_number":166,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()\r"},{"line_number":167,"context_line":"        if action \u003d\u003d \u0027create\u0027:\r"},{"line_number":168,"context_line":"            if df_version \u003e\u003d old_df_version:\r"},{"line_number":169,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)\r"},{"line_number":170,"context_line":"                del table_cache[id]\r"},{"line_number":171,"context_line":"            return\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_9744fab7","line":168,"range":{"start_line":168,"start_character":15,"end_line":168,"end_character":44},"in_reply_to":"1aa78d24_600d7ce7","updated":"2016-07-14 02:47:34.000000000","message":"Indeed, if the df_object or local_object is not None, the version should not be None, but to make the code more valid, I\u0027ll add version None process outside this method, BTW, the version is int.","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"d10aa958bea0397d0769c5ea819650a137803053","unresolved":false,"context_lines":[{"line_number":208,"context_line":"\r"},{"line_number":209,"context_line":"    def _compare_df_and_local_data(\r"},{"line_number":210,"context_line":"            self, table, df_objects, local_objects, direct):\r"},{"line_number":211,"context_line":"        for df_object in df_objects[:]:\r"},{"line_number":212,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":213,"context_line":"            df_version \u003d df_object.get_version()\r"},{"line_number":214,"context_line":"            for local_object in local_objects[:]:\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_82a07543","line":211,"range":{"start_line":211,"start_character":35,"end_line":211,"end_character":38},"updated":"2016-07-13 07:33:55.000000000","message":"I see. All right.","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5f407d09e5235e4fa9bcb75e4ce18ed63eedacc4","unresolved":false,"context_lines":[{"line_number":208,"context_line":"\r"},{"line_number":209,"context_line":"    def _compare_df_and_local_data(\r"},{"line_number":210,"context_line":"            self, table, df_objects, local_objects, direct):\r"},{"line_number":211,"context_line":"        for df_object in df_objects[:]:\r"},{"line_number":212,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":213,"context_line":"            df_version \u003d df_object.get_version()\r"},{"line_number":214,"context_line":"            for local_object in local_objects[:]:\r"},{"line_number":215,"context_line":"                local_id \u003d local_object.get_id()\r"},{"line_number":216,"context_line":"                if df_id !\u003d local_id:\r"},{"line_number":217,"context_line":"                    continue\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_d77fd8a8","line":214,"range":{"start_line":211,"start_character":0,"end_line":214,"end_character":49},"updated":"2016-07-13 09:41:03.000000000","message":"Can we make local_objects a dictionary so that we can do it this way:\nfor df_object in df_objects[:]:\n    df_id \u003d df_object.get_id()\n    local_object \u003d local_objects.get(df_id)","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"64918dedd3362f754750a4e9546664acc77dc8a8","unresolved":false,"context_lines":[{"line_number":208,"context_line":"\r"},{"line_number":209,"context_line":"    def _compare_df_and_local_data(\r"},{"line_number":210,"context_line":"            self, table, df_objects, local_objects, direct):\r"},{"line_number":211,"context_line":"        for df_object in df_objects[:]:\r"},{"line_number":212,"context_line":"            df_id \u003d df_object.get_id()\r"},{"line_number":213,"context_line":"            df_version \u003d df_object.get_version()\r"},{"line_number":214,"context_line":"            for local_object in local_objects[:]:\r"},{"line_number":215,"context_line":"                local_id \u003d local_object.get_id()\r"},{"line_number":216,"context_line":"                if df_id !\u003d local_id:\r"},{"line_number":217,"context_line":"                    continue\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_d797a2e9","line":214,"range":{"start_line":211,"start_character":0,"end_line":214,"end_character":49},"in_reply_to":"1aa78d24_d77fd8a8","updated":"2016-07-14 02:47:34.000000000","message":"looks a good ideal, thx:)","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5f407d09e5235e4fa9bcb75e4ce18ed63eedacc4","unresolved":false,"context_lines":[{"line_number":244,"context_line":"\r"},{"line_number":245,"context_line":"    def handle_data_comparison(self, tenants, table, direct):\r"},{"line_number":246,"context_line":"        if table \u003d\u003d \u0027publisher\u0027:\r"},{"line_number":247,"context_line":"            df_objects, local_objects \u003d self._get_df_and_local_objects(\r"},{"line_number":248,"context_line":"                    None, table)\r"},{"line_number":249,"context_line":"            self._compare_df_and_local_data(\r"},{"line_number":250,"context_line":"                    table, df_objects, local_objects, direct)\r"},{"line_number":251,"context_line":"            return\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_37a0dc41","line":248,"range":{"start_line":247,"start_character":12,"end_line":248,"end_character":32},"updated":"2016-07-13 09:41:03.000000000","message":"Can we make df_objects or local_objects a dictionary ? So that we improve the efficiency of _compare_df_and_local_data.","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"64918dedd3362f754750a4e9546664acc77dc8a8","unresolved":false,"context_lines":[{"line_number":244,"context_line":"\r"},{"line_number":245,"context_line":"    def handle_data_comparison(self, tenants, table, direct):\r"},{"line_number":246,"context_line":"        if table \u003d\u003d \u0027publisher\u0027:\r"},{"line_number":247,"context_line":"            df_objects, local_objects \u003d self._get_df_and_local_objects(\r"},{"line_number":248,"context_line":"                    None, table)\r"},{"line_number":249,"context_line":"            self._compare_df_and_local_data(\r"},{"line_number":250,"context_line":"                    table, df_objects, local_objects, direct)\r"},{"line_number":251,"context_line":"            return\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_b7a81622","line":248,"range":{"start_line":247,"start_character":12,"end_line":248,"end_character":32},"in_reply_to":"1aa78d24_37a0dc41","updated":"2016-07-14 02:47:34.000000000","message":"df_objects do not need to be a dict because it just need to be iterated","commit_id":"d8f0dbeb53effad68607e833af9368970747812e"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"8e5cc7974933f4e7d9ed6d6876283769e5b9a41e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"class DBConsistent(object):\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def __init__(self, topology, nb_api, db_store, controller):\r"},{"line_number":32,"context_line":"        self.topology \u003d topology\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_525e2546","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":18},"updated":"2016-07-18 03:16:29.000000000","message":"is DBConsistencyManager more suitable for this class?","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d22ced16fea04b056401f30c6b314250236eaead","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"class DBConsistent(object):\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def __init__(self, topology, nb_api, db_store, controller):\r"},{"line_number":32,"context_line":"        self.topology \u003d topology\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_34f406f1","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":18},"in_reply_to":"dada55a8_525e2546","updated":"2016-07-19 03:03:29.000000000","message":"ok","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"8e5cc7974933f4e7d9ed6d6876283769e5b9a41e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            topic \u003d value[\u0027topic\u0027]\r"},{"line_number":98,"context_line":"            self.topology.del_from_topic_subscribed(topic, lport_id)\r"},{"line_number":99,"context_line":"\r"},{"line_number":100,"context_line":"    def process_db_tables_comparison(self, direct):\r"},{"line_number":101,"context_line":"        self.controller.register_chassis()\r"},{"line_number":102,"context_line":"        self.controller.create_tunnels()\r"},{"line_number":103,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_35ac3bed","line":100,"range":{"start_line":100,"start_character":43,"end_line":100,"end_character":49},"updated":"2016-07-18 03:16:29.000000000","message":"what\u0027s the meaning of \u0027direct\u0027?","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d22ced16fea04b056401f30c6b314250236eaead","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            topic \u003d value[\u0027topic\u0027]\r"},{"line_number":98,"context_line":"            self.topology.del_from_topic_subscribed(topic, lport_id)\r"},{"line_number":99,"context_line":"\r"},{"line_number":100,"context_line":"    def process_db_tables_comparison(self, direct):\r"},{"line_number":101,"context_line":"        self.controller.register_chassis()\r"},{"line_number":102,"context_line":"        self.controller.create_tunnels()\r"},{"line_number":103,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_145c62ec","line":100,"range":{"start_line":100,"start_character":43,"end_line":100,"end_character":49},"in_reply_to":"dada55a8_35ac3bed","updated":"2016-07-19 03:03:29.000000000","message":"if the redis HA notify a recover event, the db consistency logic will do the table comparison directly(the direct will be true), just compare the data once and do the corresponding operations, as to the periodically green thread(the direct will be false), it depends on the verification mechanism which will do the db comparison twice and then do the corresponding operations","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"8e5cc7974933f4e7d9ed6d6876283769e5b9a41e","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            if local_object:\r"},{"line_number":220,"context_line":"                local_version \u003d local_object.get_version()\r"},{"line_number":221,"context_line":"                if not local_version:\r"},{"line_number":222,"context_line":"                    #if local_version is None, update the obj directly\r"},{"line_number":223,"context_line":"                    self._process_object(\r"},{"line_number":224,"context_line":"                                table, \u0027update\u0027, df_object, None)\r"},{"line_number":225,"context_line":"                elif df_version \u003e local_version:\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_35655be1","line":222,"range":{"start_line":222,"start_character":20,"end_line":222,"end_character":70},"updated":"2016-07-18 03:16:29.000000000","message":"please remove this comment, because the code tells the truth.","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d22ced16fea04b056401f30c6b314250236eaead","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            if local_object:\r"},{"line_number":220,"context_line":"                local_version \u003d local_object.get_version()\r"},{"line_number":221,"context_line":"                if not local_version:\r"},{"line_number":222,"context_line":"                    #if local_version is None, update the obj directly\r"},{"line_number":223,"context_line":"                    self._process_object(\r"},{"line_number":224,"context_line":"                                table, \u0027update\u0027, df_object, None)\r"},{"line_number":225,"context_line":"                elif df_version \u003e local_version:\r"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_74731e81","line":222,"range":{"start_line":222,"start_character":20,"end_line":222,"end_character":70},"in_reply_to":"dada55a8_35655be1","updated":"2016-07-19 03:03:29.000000000","message":"ok","commit_id":"2519d56955307a554908f3ad92bb0c24ed473a09"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"\r"},{"line_number":29,"context_line":"class DBConsistentManager(object):\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def __init__(self, topology, nb_api, db_store, controller):\r"},{"line_number":32,"context_line":"        self.topology \u003d topology\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_1b240b5c","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":25},"updated":"2016-07-21 08:55:24.000000000","message":"Consistent -\u003e Consistency","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.controller \u003d controller\r"},{"line_number":36,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time\r"},{"line_number":37,"context_line":"        self._daemon \u003d df_utils.DFDaemon()\r"},{"line_number":38,"context_line":"        self.lswitch_cache \u003d {}\r"},{"line_number":39,"context_line":"        self.port_cache \u003d {}\r"},{"line_number":40,"context_line":"        self.router_cache \u003d {}\r"},{"line_number":41,"context_line":"        self.secgroup_cache \u003d {}\r"},{"line_number":42,"context_line":"        self.fip_cache \u003d {}\r"},{"line_number":43,"context_line":"        self.publisher_cache \u003d {}\r"},{"line_number":44,"context_line":"        self._table_name_mapping \u003d {\r"},{"line_number":45,"context_line":"            \u0027lswitch\u0027: self.lswitch_cache,\r"},{"line_number":46,"context_line":"            \u0027port\u0027: self.port_cache,\r"},{"line_number":47,"context_line":"            \u0027router\u0027: self.router_cache,\r"},{"line_number":48,"context_line":"            \u0027floatingip\u0027: self.fip_cache,\r"},{"line_number":49,"context_line":"            \u0027secgroup\u0027: self.secgroup_cache,\r"},{"line_number":50,"context_line":"            \u0027publisher\u0027: self.publisher_cache\r"},{"line_number":51,"context_line":"        }\r"},{"line_number":52,"context_line":"\r"},{"line_number":53,"context_line":"    def process(self, direct):\r"},{"line_number":54,"context_line":"        self.check_topology_info()\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_9b2f5b3e","line":51,"range":{"start_line":38,"start_character":8,"end_line":51,"end_character":9},"updated":"2016-07-21 08:55:24.000000000","message":"suggest to abstract a cache manager for all these data.\n\nclass CacheManager(object):\n    def __init__(self):\n        self._port_cache \u003d {}\n        ...\n        self._table_name_mapping \u003d {...}\n\n    def get_cache(self, key):\n        return self._table_name_mapping[key]\n\n    def update_cache(self, key, value):\n        self._table_name_mapping[key].append(value)\n\n    def remove_cache(self, ...):\n        ...\n\nThis is just pseudo-code.","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"79d8607f0d7c8be96cd209f35b7e43d060478fb3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.controller \u003d controller\r"},{"line_number":36,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time\r"},{"line_number":37,"context_line":"        self._daemon \u003d df_utils.DFDaemon()\r"},{"line_number":38,"context_line":"        self.lswitch_cache \u003d {}\r"},{"line_number":39,"context_line":"        self.port_cache \u003d {}\r"},{"line_number":40,"context_line":"        self.router_cache \u003d {}\r"},{"line_number":41,"context_line":"        self.secgroup_cache \u003d {}\r"},{"line_number":42,"context_line":"        self.fip_cache \u003d {}\r"},{"line_number":43,"context_line":"        self.publisher_cache \u003d {}\r"},{"line_number":44,"context_line":"        self._table_name_mapping \u003d {\r"},{"line_number":45,"context_line":"            \u0027lswitch\u0027: self.lswitch_cache,\r"},{"line_number":46,"context_line":"            \u0027port\u0027: self.port_cache,\r"},{"line_number":47,"context_line":"            \u0027router\u0027: self.router_cache,\r"},{"line_number":48,"context_line":"            \u0027floatingip\u0027: self.fip_cache,\r"},{"line_number":49,"context_line":"            \u0027secgroup\u0027: self.secgroup_cache,\r"},{"line_number":50,"context_line":"            \u0027publisher\u0027: self.publisher_cache\r"},{"line_number":51,"context_line":"        }\r"},{"line_number":52,"context_line":"\r"},{"line_number":53,"context_line":"    def process(self, direct):\r"},{"line_number":54,"context_line":"        self.check_topology_info()\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_7211e003","line":51,"range":{"start_line":38,"start_character":8,"end_line":51,"end_character":9},"in_reply_to":"dada55a8_9b2f5b3e","updated":"2016-07-21 11:47:05.000000000","message":"ok, np","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"538ca918c1e21b1ad12947a34789db48ab7f4422","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\r"},{"line_number":75,"context_line":"    def run(self):\r"},{"line_number":76,"context_line":"        while True:\r"},{"line_number":77,"context_line":"            time.sleep(self.db_sync_time)\r"},{"line_number":78,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")\r"},{"line_number":79,"context_line":"\r"},{"line_number":80,"context_line":"    def daemonize(self):\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_96819492","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":41},"updated":"2016-10-21 08:59:53.000000000","message":"eventlet.sleep()","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"664d9be363660f32e656a27c6efc0db29590ef4d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\r"},{"line_number":75,"context_line":"    def run(self):\r"},{"line_number":76,"context_line":"        while True:\r"},{"line_number":77,"context_line":"            time.sleep(self.db_sync_time)\r"},{"line_number":78,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")\r"},{"line_number":79,"context_line":"\r"},{"line_number":80,"context_line":"    def daemonize(self):\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_b0dcae13","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":41},"in_reply_to":"da6895a0_357df06e","updated":"2016-10-24 06:43:59.000000000","message":"but I still found many places to import eventlet explicitly in current code, do we need to modify them too?","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"e6de8638faf6e8dd0e77a0ffe7dc2eb9f51b6f73","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\r"},{"line_number":75,"context_line":"    def run(self):\r"},{"line_number":76,"context_line":"        while True:\r"},{"line_number":77,"context_line":"            time.sleep(self.db_sync_time)\r"},{"line_number":78,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")\r"},{"line_number":79,"context_line":"\r"},{"line_number":80,"context_line":"    def daemonize(self):\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_357df06e","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":41},"in_reply_to":"da6895a0_364c1fc7","updated":"2016-10-24 03:54:28.000000000","message":"The whole process is monkey-patched. Please see dragonflow/dragonflow/cmd. Please do not explicitly import eventlet and use standard library instead.","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"ab1a1aaaa70ef1ddbfff21bbe0243f7005de5044","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\r"},{"line_number":75,"context_line":"    def run(self):\r"},{"line_number":76,"context_line":"        while True:\r"},{"line_number":77,"context_line":"            time.sleep(self.db_sync_time)\r"},{"line_number":78,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")\r"},{"line_number":79,"context_line":"\r"},{"line_number":80,"context_line":"    def daemonize(self):\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_364c1fc7","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":41},"in_reply_to":"da6895a0_96819492","updated":"2016-10-23 13:16:18.000000000","message":"Done","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"fdf8dae7c607c7b6815ecebc9218cd5fc12d54dc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"\r"},{"line_number":75,"context_line":"    def run(self):\r"},{"line_number":76,"context_line":"        while True:\r"},{"line_number":77,"context_line":"            time.sleep(self.db_sync_time)\r"},{"line_number":78,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")\r"},{"line_number":79,"context_line":"\r"},{"line_number":80,"context_line":"    def daemonize(self):\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_8a7db21e","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":41},"in_reply_to":"da6895a0_b0dcae13","updated":"2016-10-24 08:58:09.000000000","message":"I grep \u0027eventlet\u0027 in the current code base and the only situation that imports eventlet is using sleep function. I\u0027ve already submitted a patch to deal with all of them: https://review.openstack.org/#/c/387781/","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"21705c174f8e47eabe9e33a855acf9ef58ed424d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def stop(self):"},{"line_number":83,"context_line":"        return self._daemon.stop()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def check_topology_info(self):"},{"line_number":86,"context_line":"        new_ovs_to_lport_mapping \u003d {}"},{"line_number":87,"context_line":"        add_ovs_to_lport_mapping \u003d {}"},{"line_number":88,"context_line":"        delete_ovs_to_lport_mapping \u003d self.topology.ovs_to_lport_mapping"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_ad92909d","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":27},"updated":"2016-10-24 09:17:15.000000000","message":"_check_topology_info? private method?","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b299c8900c1e4eef47ad32b3af8f7f8d166e078c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def stop(self):"},{"line_number":83,"context_line":"        return self._daemon.stop()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def check_topology_info(self):"},{"line_number":86,"context_line":"        new_ovs_to_lport_mapping \u003d {}"},{"line_number":87,"context_line":"        add_ovs_to_lport_mapping \u003d {}"},{"line_number":88,"context_line":"        delete_ovs_to_lport_mapping \u003d self.topology.ovs_to_lport_mapping"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_a7ed3bf1","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":27},"in_reply_to":"da6895a0_ad92909d","updated":"2016-10-25 03:03:17.000000000","message":"used in ut","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"21705c174f8e47eabe9e33a855acf9ef58ed424d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            topic \u003d value[\u0027topic\u0027]"},{"line_number":112,"context_line":"            self.topology.del_from_topic_subscribed(topic, lport_id)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def process_db_tables_comparison(self, direct):"},{"line_number":115,"context_line":"        self.controller.register_chassis()"},{"line_number":116,"context_line":"        self.controller.create_tunnels()"},{"line_number":117,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_ed8c8881","line":114,"range":{"start_line":114,"start_character":8,"end_line":114,"end_character":36},"updated":"2016-10-24 09:17:15.000000000","message":"_process_db_tables_comparison? private method?","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b299c8900c1e4eef47ad32b3af8f7f8d166e078c","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            topic \u003d value[\u0027topic\u0027]"},{"line_number":112,"context_line":"            self.topology.del_from_topic_subscribed(topic, lport_id)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def process_db_tables_comparison(self, direct):"},{"line_number":115,"context_line":"        self.controller.register_chassis()"},{"line_number":116,"context_line":"        self.controller.create_tunnels()"},{"line_number":117,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_e7bd73d8","line":114,"range":{"start_line":114,"start_character":8,"end_line":114,"end_character":36},"in_reply_to":"da6895a0_ed8c8881","updated":"2016-10-25 03:03:17.000000000","message":"Done","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"21705c174f8e47eabe9e33a855acf9ef58ed424d","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        self._compare_df_and_local_data("},{"line_number":257,"context_line":"                table, df_objects, local_objects, direct)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def handle_data_comparison(self, tenants, table, direct):"},{"line_number":260,"context_line":"        if table \u003d\u003d \u0027publisher\u0027:"},{"line_number":261,"context_line":"            self._get_and_compare_df_and_local_data(table, direct)"},{"line_number":262,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_8db06c45","line":259,"range":{"start_line":259,"start_character":8,"end_line":259,"end_character":30},"updated":"2016-10-24 09:17:15.000000000","message":"_handle_data_comparison? private method?","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b299c8900c1e4eef47ad32b3af8f7f8d166e078c","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        self._compare_df_and_local_data("},{"line_number":257,"context_line":"                table, df_objects, local_objects, direct)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def handle_data_comparison(self, tenants, table, direct):"},{"line_number":260,"context_line":"        if table \u003d\u003d \u0027publisher\u0027:"},{"line_number":261,"context_line":"            self._get_and_compare_df_and_local_data(table, direct)"},{"line_number":262,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_07b507ed","line":259,"range":{"start_line":259,"start_character":8,"end_line":259,"end_character":30},"in_reply_to":"da6895a0_8db06c45","updated":"2016-10-25 03:03:17.000000000","message":"used in ut","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"d40d755f9b0f05e2e56a8822c7a44eb54b7aa177","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def remove(self, table, key):"},{"line_number":53,"context_line":"        del self._table_name_mapping[table][key]"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def keys(self):"},{"line_number":56,"context_line":"        return self._table_name_mapping.keys()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"da6895a0_fd6ee32d","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":12},"updated":"2016-10-25 08:35:10.000000000","message":"name such as get_tables maybe better","commit_id":"f501ef9e7b0284fc81ded4dbb118f021cb0d75b0"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"d40d755f9b0f05e2e56a8822c7a44eb54b7aa177","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def process(self, direct):"},{"line_number":71,"context_line":"        self.check_topology_info()"},{"line_number":72,"context_line":"        self._process_db_tables_comparison(direct)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def run(self):"},{"line_number":75,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":36,"id":"da6895a0_5d4b4fb0","line":72,"range":{"start_line":72,"start_character":43,"end_line":72,"end_character":49},"updated":"2016-10-25 08:35:10.000000000","message":"what\u0027s the meaning of direct, it\u0027s somewhat hard to understand. Suggest you adding some explanation for this para.","commit_id":"f501ef9e7b0284fc81ded4dbb118f021cb0d75b0"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"d40d755f9b0f05e2e56a8822c7a44eb54b7aa177","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def stop(self):"},{"line_number":83,"context_line":"        return self._daemon.stop()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def check_topology_info(self):"},{"line_number":86,"context_line":"        new_ovs_to_lport_mapping \u003d {}"},{"line_number":87,"context_line":"        add_ovs_to_lport_mapping \u003d {}"},{"line_number":88,"context_line":"        delete_ovs_to_lport_mapping \u003d self.topology.ovs_to_lport_mapping"}],"source_content_type":"text/x-python","patch_set":36,"id":"da6895a0_7dde5312","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":27},"updated":"2016-10-25 08:35:10.000000000","message":"this method is deeply coupled with topology, consider move it to topology.","commit_id":"f501ef9e7b0284fc81ded4dbb118f021cb0d75b0"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"d40d755f9b0f05e2e56a8822c7a44eb54b7aa177","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            try:"},{"line_number":120,"context_line":"                self.handle_data_comparison(tenants, table, direct)"},{"line_number":121,"context_line":"            except Exception as e:"},{"line_number":122,"context_line":"                LOG.error(_LE(\"Exception occurred when\""},{"line_number":123,"context_line":"                              \"handling db comparison: %s\"), e)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _process_object(self, table, action, df_object, local_object):"}],"source_content_type":"text/x-python","patch_set":36,"id":"da6895a0_bdff0b66","line":122,"range":{"start_line":122,"start_character":20,"end_line":122,"end_character":25},"updated":"2016-10-25 08:35:10.000000000","message":"LOG.exception is better, for it can record the calling stack.","commit_id":"f501ef9e7b0284fc81ded4dbb118f021cb0d75b0"},{"author":{"_account_id":20405,"name":"liuhaixia","email":"liuhaixia315@huawei.com","username":"liuhaixia"},"change_message_id":"d5cf7a1d96a1ad69830ea466f7ebcb1234c0cee8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.nb_api \u003d controller.nb_api"},{"line_number":62,"context_line":"        self.db_store \u003d controller.db_store"},{"line_number":63,"context_line":"        self.controller \u003d controller"},{"line_number":64,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time"},{"line_number":65,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":66,"context_line":"        self.cache_manager \u003d CacheManager()"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"ba5da102_9b738fb4","line":64,"range":{"start_line":64,"start_character":2,"end_line":64,"end_character":52},"updated":"2016-10-26 07:19:26.000000000","message":"This should be given a default value if this  is missing from configuration file ,or the value is 0 or a negative value.","commit_id":"9925296e61796297a7ecbbc80ec95c6781719f6a"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"65a92488457f134c322c49eae6215bddc3f47732","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.nb_api \u003d controller.nb_api"},{"line_number":62,"context_line":"        self.db_store \u003d controller.db_store"},{"line_number":63,"context_line":"        self.controller \u003d controller"},{"line_number":64,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time"},{"line_number":65,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":66,"context_line":"        self.cache_manager \u003d CacheManager()"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"ba5da102_ae5f280d","line":64,"range":{"start_line":64,"start_character":2,"end_line":64,"end_character":52},"in_reply_to":"ba5da102_9b738fb4","updated":"2016-10-26 13:58:44.000000000","message":"If it is missing it will be the default value defined in common_params.py, it\u0027s good ideal to prevent the negative value.","commit_id":"9925296e61796297a7ecbbc80ec95c6781719f6a"},{"author":{"_account_id":20405,"name":"liuhaixia","email":"liuhaixia315@huawei.com","username":"liuhaixia"},"change_message_id":"d5cf7a1d96a1ad69830ea466f7ebcb1234c0cee8","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                self.controller.security_group_deleted(local_object.get_id())"},{"line_number":123,"context_line":"            else:"},{"line_number":124,"context_line":"                self.controller.security_group_updated(df_object)"},{"line_number":125,"context_line":"        elif table \u003d\u003d \u0027floatingip\u0027:"},{"line_number":126,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":127,"context_line":"                self.controller.floatingip_deleted(local_object.get_id())"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                self.controller.floatingip_updated(df_object)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ba5da102_5b1ad718","line":126,"range":{"start_line":125,"start_character":3,"end_line":126,"end_character":34},"updated":"2016-10-26 07:19:26.000000000","message":"Can these use reflect method?\nThus if adding a new object, these codes don\u0027t  need to change correspondingly.","commit_id":"9925296e61796297a7ecbbc80ec95c6781719f6a"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"65a92488457f134c322c49eae6215bddc3f47732","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                self.controller.security_group_deleted(local_object.get_id())"},{"line_number":123,"context_line":"            else:"},{"line_number":124,"context_line":"                self.controller.security_group_updated(df_object)"},{"line_number":125,"context_line":"        elif table \u003d\u003d \u0027floatingip\u0027:"},{"line_number":126,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":127,"context_line":"                self.controller.floatingip_deleted(local_object.get_id())"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                self.controller.floatingip_updated(df_object)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ba5da102_2eecf8c6","line":126,"range":{"start_line":125,"start_character":3,"end_line":126,"end_character":34},"in_reply_to":"ba5da102_5b1ad718","updated":"2016-10-26 13:58:44.000000000","message":"good point! I\u0027ll commit another patch to uniform all the method name which create/update/delete/get resource object, thx:)","commit_id":"9925296e61796297a7ecbbc80ec95c6781719f6a"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from dragonflow._i18n import _LE"},{"line_number":22,"context_line":"from dragonflow.common import utils as df_utils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":"MIN_SYNC_INTERVAL_TIME \u003d 300"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_3d83e557","line":24,"updated":"2016-11-01 02:31:42.000000000","message":"insert a blank line.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from dragonflow._i18n import _LE"},{"line_number":22,"context_line":"from dragonflow.common import utils as df_utils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":"MIN_SYNC_INTERVAL_TIME \u003d 300"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_c84ce944","line":24,"in_reply_to":"ba5da102_3d83e557","updated":"2016-11-01 03:44:59.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        :param direct:  Indicate the process mode, if True, it will sync"},{"line_number":91,"context_line":"                         the data immediately once it found the difference,"},{"line_number":92,"context_line":"                         if False, it will do the sync job after twice data"},{"line_number":93,"context_line":"                         comparisons."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        self.controller.register_chassis()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_e221ccb5","line":92,"range":{"start_line":92,"start_character":65,"end_line":92,"end_character":70},"updated":"2016-11-01 02:31:42.000000000","message":"why twice?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        :param direct:  Indicate the process mode, if True, it will sync"},{"line_number":91,"context_line":"                         the data immediately once it found the difference,"},{"line_number":92,"context_line":"                         if False, it will do the sync job after twice data"},{"line_number":93,"context_line":"                         comparisons."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        self.controller.register_chassis()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_2852c5dd","line":92,"range":{"start_line":92,"start_character":65,"end_line":92,"end_character":70},"in_reply_to":"ba5da102_e221ccb5","updated":"2016-11-01 03:44:59.000000000","message":"first time store in the cache, and second time find in the cache again to verify it is create/update/delete, which is described in the spec:)","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                self.controller.publisher_updated(df_object)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _verify_object(self, table, id, action, df_object, local_object):"},{"line_number":140,"context_line":"        df_version \u003d df_object.get_version() if df_object else None"},{"line_number":141,"context_line":"        local_version \u003d local_object.get_version() if local_object else None"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_dd0f492c","line":139,"updated":"2016-11-01 02:31:42.000000000","message":"suggest to add a docstring for this method, df_object means the object from df db; local_object means the object from local memory cache. when I first read about this method, I had to identify the difference.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                self.controller.publisher_updated(df_object)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _verify_object(self, table, id, action, df_object, local_object):"},{"line_number":140,"context_line":"        df_version \u003d df_object.get_version() if df_object else None"},{"line_number":141,"context_line":"        local_version \u003d local_object.get_version() if local_object else None"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_88591101","line":139,"in_reply_to":"ba5da102_dd0f492c","updated":"2016-11-01 03:44:59.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()"},{"line_number":150,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()"},{"line_number":151,"context_line":"        if action \u003d\u003d \u0027create\u0027:"},{"line_number":152,"context_line":"            if df_version \u003e\u003d old_df_version:"},{"line_number":153,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)"},{"line_number":154,"context_line":"                self.cache_manager.remove(table, id)"},{"line_number":155,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_5d2a597f","line":152,"range":{"start_line":152,"start_character":27,"end_line":152,"end_character":28},"updated":"2016-11-01 02:31:42.000000000","message":"can we remove this condition?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"06df0d587bdc61f4e6bfeee35625b7604fd21fcb","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()"},{"line_number":150,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()"},{"line_number":151,"context_line":"        if action \u003d\u003d \u0027create\u0027:"},{"line_number":152,"context_line":"            if df_version \u003e\u003d old_df_version:"},{"line_number":153,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)"},{"line_number":154,"context_line":"                self.cache_manager.remove(table, id)"},{"line_number":155,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_7061ada8","line":152,"range":{"start_line":152,"start_character":27,"end_line":152,"end_character":28},"in_reply_to":"ba5da102_480619cf","updated":"2016-11-03 01:52:39.000000000","message":"if the version is unchanged, do we still need to process the object with the same version and value?","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        old_df_version \u003d old_cache_obj.get_df_version()"},{"line_number":150,"context_line":"        old_local_version \u003d old_cache_obj.get_local_version()"},{"line_number":151,"context_line":"        if action \u003d\u003d \u0027create\u0027:"},{"line_number":152,"context_line":"            if df_version \u003e\u003d old_df_version:"},{"line_number":153,"context_line":"                self._process_object(table, \u0027create\u0027, df_object, None)"},{"line_number":154,"context_line":"                self.cache_manager.remove(table, id)"},{"line_number":155,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_480619cf","line":152,"range":{"start_line":152,"start_character":27,"end_line":152,"end_character":28},"in_reply_to":"ba5da102_5d2a597f","updated":"2016-11-01 03:44:59.000000000","message":"\u003d\u003d situation is possible, for example, in first comparison the df version of a network is 1, and if the network is unchanged, in the second comparison the df version is still 1, so df_version\u003d\u003dold_df_version","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        elif action \u003d\u003d \u0027update\u0027:"},{"line_number":157,"context_line":"            if df_version \u003c old_df_version:"},{"line_number":158,"context_line":"                return"},{"line_number":159,"context_line":"            if local_version \u003c\u003d old_local_version:"},{"line_number":160,"context_line":"                self._process_object(table, \u0027update\u0027, df_object, None)"},{"line_number":161,"context_line":"                self.cache_manager.remove(table, id)"},{"line_number":162,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_bd3b75d0","line":159,"range":{"start_line":159,"start_character":30,"end_line":159,"end_character":31},"updated":"2016-11-01 02:31:42.000000000","message":"ditto","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            else:"},{"line_number":163,"context_line":"                cache_obj \u003d CacheObject(action, df_version, local_version)"},{"line_number":164,"context_line":"                self.cache_manager.set(table, id, cache_obj)"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            self._process_object(table, \u0027delete\u0027, None, local_object)"},{"line_number":167,"context_line":"            self.cache_manager.remove(table, id)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_fd35edd9","line":165,"range":{"start_line":165,"start_character":8,"end_line":165,"end_character":13},"updated":"2016-11-01 02:31:42.000000000","message":"\u0027else if\u0027 is better. then add an \u0027else\u0027 condition for dealing with exception.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            else:"},{"line_number":163,"context_line":"                cache_obj \u003d CacheObject(action, df_version, local_version)"},{"line_number":164,"context_line":"                self.cache_manager.set(table, id, cache_obj)"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            self._process_object(table, \u0027delete\u0027, None, local_object)"},{"line_number":167,"context_line":"            self.cache_manager.remove(table, id)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_a813350c","line":165,"range":{"start_line":165,"start_character":8,"end_line":165,"end_character":13},"in_reply_to":"ba5da102_fd35edd9","updated":"2016-11-01 03:44:59.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6da56981252417eb14873e27090d7917369d976a","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        return df_objects, local_objects"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _compare_df_and_local_data("},{"line_number":194,"context_line":"            self, table, df_objects, local_objects, direct):"},{"line_number":195,"context_line":"        local_object_map \u003d {}"},{"line_number":196,"context_line":"        for local_object in local_objects:"},{"line_number":197,"context_line":"            local_object_map[local_object.get_id()] \u003d local_object"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_dd3d89bc","line":194,"updated":"2016-11-01 02:31:42.000000000","message":"docstring is needed.","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"cccb7af30770f3cb36961159af36f178fa767bb4","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        return df_objects, local_objects"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _compare_df_and_local_data("},{"line_number":194,"context_line":"            self, table, df_objects, local_objects, direct):"},{"line_number":195,"context_line":"        local_object_map \u003d {}"},{"line_number":196,"context_line":"        for local_object in local_objects:"},{"line_number":197,"context_line":"            local_object_map[local_object.get_id()] \u003d local_object"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba5da102_e8f52dcb","line":194,"in_reply_to":"ba5da102_dd3d89bc","updated":"2016-11-01 03:44:59.000000000","message":"Done","commit_id":"55df27fdac6dd2f43d772df2546e7665294bac72"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class CacheManager(object):"},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        self.lswitch_cache \u003d {}"},{"line_number":32,"context_line":"        self.port_cache \u003d {}"},{"line_number":33,"context_line":"        self.router_cache \u003d {}"},{"line_number":34,"context_line":"        self.secgroup_cache \u003d {}"},{"line_number":35,"context_line":"        self.fip_cache \u003d {}"},{"line_number":36,"context_line":"        self.publisher_cache \u003d {}"},{"line_number":37,"context_line":"        self._table_name_mapping \u003d {"},{"line_number":38,"context_line":"            \u0027lswitch\u0027: self.lswitch_cache,"},{"line_number":39,"context_line":"            \u0027port\u0027: self.port_cache,"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_81d695c3","line":36,"range":{"start_line":31,"start_character":0,"end_line":36,"end_character":33},"updated":"2016-11-08 07:19:42.000000000","message":"This is actually not needed to be attribute, just assign empty dict at line 38~43 should be fine.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class CacheManager(object):"},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        self.lswitch_cache \u003d {}"},{"line_number":32,"context_line":"        self.port_cache \u003d {}"},{"line_number":33,"context_line":"        self.router_cache \u003d {}"},{"line_number":34,"context_line":"        self.secgroup_cache \u003d {}"},{"line_number":35,"context_line":"        self.fip_cache \u003d {}"},{"line_number":36,"context_line":"        self.publisher_cache \u003d {}"},{"line_number":37,"context_line":"        self._table_name_mapping \u003d {"},{"line_number":38,"context_line":"            \u0027lswitch\u0027: self.lswitch_cache,"},{"line_number":39,"context_line":"            \u0027port\u0027: self.port_cache,"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_89b9e917","line":36,"range":{"start_line":31,"start_character":0,"end_line":36,"end_character":33},"in_reply_to":"9a629dbe_81d695c3","updated":"2016-11-10 09:34:29.000000000","message":"Done","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.db_store \u003d controller.db_store"},{"line_number":65,"context_line":"        self.controller \u003d controller"},{"line_number":66,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time"},{"line_number":67,"context_line":"        if self.db_sync_time \u003c MIN_SYNC_INTERVAL_TIME:"},{"line_number":68,"context_line":"            self.db_sync_time \u003d MIN_SYNC_INTERVAL_TIME"},{"line_number":69,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":70,"context_line":"        self.cache_manager \u003d CacheManager()"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_81edb58d","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":54},"updated":"2016-11-08 07:19:42.000000000","message":"This behaviors should be in the help message of config, for example, tell user the value should be greater than 300(S)","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.db_store \u003d controller.db_store"},{"line_number":65,"context_line":"        self.controller \u003d controller"},{"line_number":66,"context_line":"        self.db_sync_time \u003d cfg.CONF.df.db_sync_time"},{"line_number":67,"context_line":"        if self.db_sync_time \u003c MIN_SYNC_INTERVAL_TIME:"},{"line_number":68,"context_line":"            self.db_sync_time \u003d MIN_SYNC_INTERVAL_TIME"},{"line_number":69,"context_line":"        self._daemon \u003d df_utils.DFDaemon()"},{"line_number":70,"context_line":"        self.cache_manager \u003d CacheManager()"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e95505c2","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":54},"in_reply_to":"9a629dbe_81edb58d","updated":"2016-11-10 09:34:29.000000000","message":"Done","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                         if False, it will do the sync job after twice data"},{"line_number":94,"context_line":"                         comparisons."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.controller.register_chassis()"},{"line_number":97,"context_line":"        self.controller.create_tunnels()"},{"line_number":98,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"},{"line_number":99,"context_line":"        for table in self.cache_manager.get_tables():"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_a17719d3","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":42},"updated":"2016-11-08 07:19:42.000000000","message":"Is this necessary? I can only see local chassis create/update when update config file and restart df controller.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                         if False, it will do the sync job after twice data"},{"line_number":94,"context_line":"                         comparisons."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.controller.register_chassis()"},{"line_number":97,"context_line":"        self.controller.create_tunnels()"},{"line_number":98,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"},{"line_number":99,"context_line":"        for table in self.cache_manager.get_tables():"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_a9894d28","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":42},"in_reply_to":"9a629dbe_a17719d3","updated":"2016-11-10 09:34:29.000000000","message":"here is to prevent the df db lost chassis info by its own restart or failover, and another situation is when this df controller plans to register itself to df db, the connection is lost, so it will have no chance to register itself again.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.controller.register_chassis()"},{"line_number":97,"context_line":"        self.controller.create_tunnels()"},{"line_number":98,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"},{"line_number":99,"context_line":"        for table in self.cache_manager.get_tables():"},{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                self.handle_data_comparison(tenants, table, direct)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e1811191","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":15},"updated":"2016-11-08 07:19:42.000000000","message":"should be topics to keep neutral?","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        self.controller.register_chassis()"},{"line_number":97,"context_line":"        self.controller.create_tunnels()"},{"line_number":98,"context_line":"        tenants \u003d self.topology.topic_subscribed.keys()"},{"line_number":99,"context_line":"        for table in self.cache_manager.get_tables():"},{"line_number":100,"context_line":"            try:"},{"line_number":101,"context_line":"                self.handle_data_comparison(tenants, table, direct)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e97fc514","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":15},"in_reply_to":"9a629dbe_e1811191","updated":"2016-11-10 09:34:29.000000000","message":"Done","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                LOG.exception(_LE(\"Exception occurred when\""},{"line_number":104,"context_line":"                              \"handling db comparison: %s\"), e)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _process_object(self, table, action, df_object, local_object):"},{"line_number":107,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:"},{"line_number":108,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":109,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_05b0d042","line":106,"range":{"start_line":106,"start_character":56,"end_line":106,"end_character":68},"updated":"2016-11-08 07:19:42.000000000","message":"This parameter is not needed. It only be used to retrieve the object\u0027s id, but the id can also be gotten from df_object","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                LOG.exception(_LE(\"Exception occurred when\""},{"line_number":104,"context_line":"                              \"handling db comparison: %s\"), e)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _process_object(self, table, action, df_object, local_object):"},{"line_number":107,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:"},{"line_number":108,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":109,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_49c99158","line":106,"range":{"start_line":106,"start_character":56,"end_line":106,"end_character":68},"in_reply_to":"9a629dbe_05b0d042","updated":"2016-11-10 09:34:29.000000000","message":"No, if the action is \"delete\", the df_object is None.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        :param df_object:  Object from df db"},{"line_number":151,"context_line":"        :param local_object:  Object from local cache"},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        df_version \u003d df_object.get_version() if df_object else None"},{"line_number":154,"context_line":"        local_version \u003d local_object.get_version() if local_object else None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        old_cache_obj \u003d self.cache_manager.get(table, id)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_65e50c36","line":153,"range":{"start_line":153,"start_character":48,"end_line":153,"end_character":57},"updated":"2016-11-08 07:19:42.000000000","message":"_verify_object is a private method from its name, I don\u0027t see any case the df_object will be none, so I think this check should be not needed.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        :param df_object:  Object from df db"},{"line_number":151,"context_line":"        :param local_object:  Object from local cache"},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        df_version \u003d df_object.get_version() if df_object else None"},{"line_number":154,"context_line":"        local_version \u003d local_object.get_version() if local_object else None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        old_cache_obj \u003d self.cache_manager.get(table, id)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e932655d","line":153,"range":{"start_line":153,"start_character":48,"end_line":153,"end_character":57},"in_reply_to":"9a629dbe_65e50c36","updated":"2016-11-10 09:34:29.000000000","message":"if the action is \"delete\", the df_object is None and the local_object is not None, and then they both are stored in the cache, when the second comparison, the df_object will be None.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        for df_object in df_objects[:]:"},{"line_number":225,"context_line":"            df_id \u003d df_object.get_id()"},{"line_number":226,"context_line":"            df_version \u003d df_object.get_version()"},{"line_number":227,"context_line":"            if not df_version:"},{"line_number":228,"context_line":"                LOG.error(_LE(\"Version is None in df_object:%s\"), df_object)"},{"line_number":229,"context_line":"                continue"},{"line_number":230,"context_line":"            local_object \u003d local_object_map.pop(df_id, None)"},{"line_number":231,"context_line":"            if local_object:"},{"line_number":232,"context_line":"                local_version \u003d local_object.get_version()"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_25f794d4","line":229,"range":{"start_line":227,"start_character":0,"end_line":229,"end_character":24},"updated":"2016-11-08 07:19:42.000000000","message":"The publisher will always have version 0, so the publisher table are not going to be updated here, right?","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        for df_object in df_objects[:]:"},{"line_number":225,"context_line":"            df_id \u003d df_object.get_id()"},{"line_number":226,"context_line":"            df_version \u003d df_object.get_version()"},{"line_number":227,"context_line":"            if not df_version:"},{"line_number":228,"context_line":"                LOG.error(_LE(\"Version is None in df_object:%s\"), df_object)"},{"line_number":229,"context_line":"                continue"},{"line_number":230,"context_line":"            local_object \u003d local_object_map.pop(df_id, None)"},{"line_number":231,"context_line":"            if local_object:"},{"line_number":232,"context_line":"                local_version \u003d local_object.get_version()"}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_496c3135","line":229,"range":{"start_line":227,"start_character":0,"end_line":229,"end_character":24},"in_reply_to":"9a629dbe_25f794d4","updated":"2016-11-10 09:34:29.000000000","message":"yeah, I will create and delete publisher, not update.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7c604430fb449a85d3af3286bc5618613a588cd1","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            local_object \u003d local_object_map.pop(df_id, None)"},{"line_number":231,"context_line":"            if local_object:"},{"line_number":232,"context_line":"                local_version \u003d local_object.get_version()"},{"line_number":233,"context_line":"                if not local_version:"},{"line_number":234,"context_line":"                    self._process_object("},{"line_number":235,"context_line":"                                table, \u0027update\u0027, df_object, None)"},{"line_number":236,"context_line":"                elif df_version \u003e local_version:"},{"line_number":237,"context_line":"                    if direct:"},{"line_number":238,"context_line":"                        self._process_object("}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_e55cbc27","line":235,"range":{"start_line":233,"start_character":0,"end_line":235,"end_character":65},"updated":"2016-11-08 07:19:42.000000000","message":"Why this don\u0027t use the direct parameter? I see you use it in all other cases.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"63aa1bc941c68e06d2c971fe43c2d76347883297","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            local_object \u003d local_object_map.pop(df_id, None)"},{"line_number":231,"context_line":"            if local_object:"},{"line_number":232,"context_line":"                local_version \u003d local_object.get_version()"},{"line_number":233,"context_line":"                if not local_version:"},{"line_number":234,"context_line":"                    self._process_object("},{"line_number":235,"context_line":"                                table, \u0027update\u0027, df_object, None)"},{"line_number":236,"context_line":"                elif df_version \u003e local_version:"},{"line_number":237,"context_line":"                    if direct:"},{"line_number":238,"context_line":"                        self._process_object("}],"source_content_type":"text/x-python","patch_set":46,"id":"9a629dbe_2c3c6bc7","line":235,"range":{"start_line":233,"start_character":0,"end_line":235,"end_character":65},"in_reply_to":"9a629dbe_e55cbc27","updated":"2016-11-10 09:34:29.000000000","message":"Indeed, this is a exception situation, because all local_objects should have version field, I have filter the non-version df_object in line 227-229, so if the version is None for local-object, I think there is no need to do two comparisons, just update obj directly.","commit_id":"a73a634964ff5f48a5f13838881a4ccdb8726622"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"33cd8b454b427092959b48e279fd17b4a54e3372","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def run(self):"},{"line_number":71,"context_line":"        while True:"},{"line_number":72,"context_line":"            time.sleep(self.db_sync_time)"},{"line_number":73,"context_line":"            self.nb_api.db_change_callback(None, None, \"db_sync\", \"db_sync\")"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def daemonize(self):"},{"line_number":76,"context_line":"        return self._daemon.daemonize(self.run)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7a77a97e_7c5d9feb","line":73,"updated":"2016-11-22 06:19:07.000000000","message":"suggest to add a debug log for this periodical task.","commit_id":"46bffa2cce4a074e3bbb59717eb15569ae5a5f3c"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"b9d326a42d99a1015561b825911ade15c17cf030","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        return df_objects, local_objects"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _compare_df_and_local_data("},{"line_number":203,"context_line":"            self, table, df_objects, local_objects, direct):"},{"line_number":204,"context_line":"        \"\"\"Compare specific resource type df objects and local objects"},{"line_number":205,"context_line":"        one by one, we could judge whether to create/update/delete"}],"source_content_type":"text/x-python","patch_set":49,"id":"7a77a97e_1c92eb57","line":202,"range":{"start_line":202,"start_character":8,"end_line":202,"end_character":34},"updated":"2016-11-22 06:23:30.000000000","message":"need to add enough logs when some inconsistent data is found.","commit_id":"46bffa2cce4a074e3bbb59717eb15569ae5a5f3c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                LOG.exception(_LE(\"Exception occurred when\""},{"line_number":99,"context_line":"                              \"handling db comparison: %s\"), e)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _process_object(self, table, action, df_object, local_object\u003dNone):"},{"line_number":102,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:"},{"line_number":103,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":104,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_2a850c06","line":101,"updated":"2016-11-28 16:22:54.000000000","message":"This call is very similar to one in nb_api. Is there a way to unify them?","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                LOG.exception(_LE(\"Exception occurred when\""},{"line_number":99,"context_line":"                              \"handling db comparison: %s\"), e)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _process_object(self, table, action, df_object, local_object\u003dNone):"},{"line_number":102,"context_line":"        if table \u003d\u003d \u0027lswitch\u0027:"},{"line_number":103,"context_line":"            if action \u003d\u003d \u0027delete\u0027:"},{"line_number":104,"context_line":"                self.controller.logical_switch_deleted(local_object.get_id())"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_2e3de9c3","line":101,"in_reply_to":"5a74a57a_2a850c06","updated":"2016-11-29 12:47:15.000000000","message":"ok, I\u0027ll try to unify them, and I was doing the job that uniform all the create/update/delete/get_xxx method name, and after that maybe the job is much more easier.","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        local_object_map \u003d {}"},{"line_number":217,"context_line":"        for local_object in local_objects:"},{"line_number":218,"context_line":"            local_object_map[local_object.get_id()] \u003d local_object"},{"line_number":219,"context_line":"        for df_object in df_objects[:]:"},{"line_number":220,"context_line":"            df_id \u003d df_object.get_id()"},{"line_number":221,"context_line":"            df_version \u003d df_object.get_version()"},{"line_number":222,"context_line":"            if not df_version:"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_8237e0fd","line":219,"updated":"2016-11-28 16:22:54.000000000","message":"In a future version, could we use ObjectRefresher here?","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        local_object_map \u003d {}"},{"line_number":217,"context_line":"        for local_object in local_objects:"},{"line_number":218,"context_line":"            local_object_map[local_object.get_id()] \u003d local_object"},{"line_number":219,"context_line":"        for df_object in df_objects[:]:"},{"line_number":220,"context_line":"            df_id \u003d df_object.get_id()"},{"line_number":221,"context_line":"            df_version \u003d df_object.get_version()"},{"line_number":222,"context_line":"            if not df_version:"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_ee6cd1d1","line":219,"in_reply_to":"5a74a57a_8237e0fd","updated":"2016-11-29 12:47:15.000000000","message":"ok","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"}],"dragonflow/db/models.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        return self.inner_obj.get(\u0027last_activity_timestamp\u0027)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def get_version(self):"},{"line_number":373,"context_line":"        return 0"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class OvsPort(object):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_a2dcdc46","line":373,"updated":"2016-11-28 16:22:54.000000000","message":"I think the timestamp would be better than 0 here.","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        return self.inner_obj.get(\u0027last_activity_timestamp\u0027)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def get_version(self):"},{"line_number":373,"context_line":"        return 0"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class OvsPort(object):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_aeebb911","line":373,"in_reply_to":"5a74a57a_a2dcdc46","updated":"2016-11-29 12:47:15.000000000","message":"In previous patch I have returned the timestamp value, and then LiMa suggests use 0 is ok here which I think is reasonable when we do not need to update publisher object.","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"}],"dragonflow/tests/fullstack/test_base.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"538ca918c1e21b1ad12947a34789db48ab7f4422","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                            \u0027/etc/neutron/neutron.conf\u0027])"},{"line_number":58,"context_line":"        self.conf \u003d cfg.CONF.df"},{"line_number":59,"context_line":"        self.integration_bridge \u003d self.conf.integration_bridge"},{"line_number":60,"context_line":"        self.db_sync_time \u003d self.conf.db_sync_time"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_017e1ce4","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":50},"updated":"2016-10-21 08:59:53.000000000","message":"pls use cfg.CONF.set_override","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"ab1a1aaaa70ef1ddbfff21bbe0243f7005de5044","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                            \u0027/etc/neutron/neutron.conf\u0027])"},{"line_number":58,"context_line":"        self.conf \u003d cfg.CONF.df"},{"line_number":59,"context_line":"        self.integration_bridge \u003d self.conf.integration_bridge"},{"line_number":60,"context_line":"        self.db_sync_time \u003d self.conf.db_sync_time"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_56c7d311","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":50},"in_reply_to":"da6895a0_017e1ce4","updated":"2016-10-23 13:16:18.000000000","message":"the db_sync_time value maybe different from the df controller startup config file if you set_override in the fullstack test.","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"}],"dragonflow/tests/fullstack/test_db_consistent.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"class TestDbConsistent(test_base.DFTestBase):\r"},{"line_number":25,"context_line":"    def setUp(self):\r"},{"line_number":26,"context_line":"        super(TestDbConsistent, self).setUp()\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"    def tearDown(self):\r"},{"line_number":29,"context_line":"        super(TestDbConsistent, self).tearDown()\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def check_l2_lookup_rule(self, flows, mac):\r"},{"line_number":32,"context_line":"        for flow in flows:\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_5be5e3a5","line":29,"range":{"start_line":25,"start_character":4,"end_line":29,"end_character":48},"updated":"2016-07-21 08:55:24.000000000","message":"remove them.","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def tearDown(self):\r"},{"line_number":29,"context_line":"        super(TestDbConsistent, self).tearDown()\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    def check_l2_lookup_rule(self, flows, mac):\r"},{"line_number":32,"context_line":"        for flow in flows:\r"},{"line_number":33,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u002717\u0027 and flow[\u0027actions\u0027] \u003d\u003d \u0027goto_table:64\u0027:\r"},{"line_number":34,"context_line":"                if \u0027dl_dst\u003d\u0027 + mac in flow[\u0027match\u0027]:\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_dbe713aa","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":28},"updated":"2016-07-21 08:55:24.000000000","message":"private function. please add \u0027_\u0027 at the beginning of the func name.","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                    return True\r"},{"line_number":36,"context_line":"        return False\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"    def check_lswitch_dhcp_rule(self, flows, dhcp_ip):\r"},{"line_number":39,"context_line":"        for flow in flows:\r"},{"line_number":40,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u00279\u0027 and flow[\u0027actions\u0027] \u003d\u003d \u0027goto_table:11\u0027:\r"},{"line_number":41,"context_line":"                if (\u0027nw_dst\u003d\u0027 + dhcp_ip + \u0027,tp_src\u003d68,tp_dst\u003d67\u0027\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_bbea1f72","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":31},"updated":"2016-07-21 08:55:24.000000000","message":"ditto","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                    return True\r"},{"line_number":44,"context_line":"        return False\r"},{"line_number":45,"context_line":"\r"},{"line_number":46,"context_line":"    def check_no_lswitch_dhcp_rule(self, flows, dhcp_ip):\r"},{"line_number":47,"context_line":"        if self.check_lswitch_dhcp_rule(flows, dhcp_ip):\r"},{"line_number":48,"context_line":"            return False\r"},{"line_number":49,"context_line":"        return True\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_fb001736","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":34},"updated":"2016-07-21 08:55:24.000000000","message":"ditto","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"7ef927af0f54e4dfce72b56ec5c94bad277b41a2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"\r"},{"line_number":67,"context_line":"        vm1 \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":68,"context_line":"        vm1.create(network\u003dnetwork)\r"},{"line_number":69,"context_line":"        self.assertIsNotNone(vm1.server.addresses[\u0027private\u0027])\r"},{"line_number":70,"context_line":"        mac1 \u003d vm1.server.addresses[\u0027private\u0027][0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]\r"},{"line_number":71,"context_line":"        self.assertIsNotNone(mac1)\r"},{"line_number":72,"context_line":"\r"},{"line_number":73,"context_line":"        ovs \u003d utils.OvsFlowsParser()\r"},{"line_number":74,"context_line":"        wait_until_true(\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_bb469f78","line":71,"range":{"start_line":69,"start_character":8,"end_line":71,"end_character":34},"updated":"2016-07-21 08:55:24.000000000","message":"I think you can just call similar functions defined in VM class.","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"79d8607f0d7c8be96cd209f35b7e43d060478fb3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"\r"},{"line_number":67,"context_line":"        vm1 \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":68,"context_line":"        vm1.create(network\u003dnetwork)\r"},{"line_number":69,"context_line":"        self.assertIsNotNone(vm1.server.addresses[\u0027private\u0027])\r"},{"line_number":70,"context_line":"        mac1 \u003d vm1.server.addresses[\u0027private\u0027][0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]\r"},{"line_number":71,"context_line":"        self.assertIsNotNone(mac1)\r"},{"line_number":72,"context_line":"\r"},{"line_number":73,"context_line":"        ovs \u003d utils.OvsFlowsParser()\r"},{"line_number":74,"context_line":"        wait_until_true(\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_52d3fc5f","line":71,"range":{"start_line":69,"start_character":8,"end_line":71,"end_character":34},"in_reply_to":"dada55a8_bb469f78","updated":"2016-07-21 11:47:05.000000000","message":"ok. I\u0027ll create a neutron port instead of vm","commit_id":"208ed27bcb9c79085722a40115a9b1976efb82c0"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"21705c174f8e47eabe9e33a855acf9ef58ed424d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertTrue(subnet.exists())"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))"},{"line_number":63,"context_line":"        vm.create(network\u003dnetwork)"},{"line_number":64,"context_line":"        self.assertIsNotNone(vm.server.addresses[\u0027private\u0027])"},{"line_number":65,"context_line":"        mac \u003d vm.server.addresses[\u0027private\u0027][0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]"},{"line_number":66,"context_line":"        self.assertIsNotNone(mac)"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_8a8a12be","line":63,"updated":"2016-10-24 09:17:15.000000000","message":"Suggest to sleep to wait for resource ready.","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"b299c8900c1e4eef47ad32b3af8f7f8d166e078c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.assertTrue(subnet.exists())"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))"},{"line_number":63,"context_line":"        vm.create(network\u003dnetwork)"},{"line_number":64,"context_line":"        self.assertIsNotNone(vm.server.addresses[\u0027private\u0027])"},{"line_number":65,"context_line":"        mac \u003d vm.server.addresses[\u0027private\u0027][0][\u0027OS-EXT-IPS-MAC:mac_addr\u0027]"},{"line_number":66,"context_line":"        self.assertIsNotNone(mac)"}],"source_content_type":"text/x-python","patch_set":35,"id":"da6895a0_47a45fa5","line":63,"in_reply_to":"da6895a0_8a8a12be","updated":"2016-10-25 03:03:17.000000000","message":"the create method has contained the logic to wait for resource ready, it will wait the server is ready and then return. And this is similar with other places which use VMTestObj:)","commit_id":"c6ab7e7beddf695bc1d3af53ea8757afefa31df0"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_db_consistent(self):"},{"line_number":47,"context_line":"        self.db_sync_time \u003d self.conf.db_sync_time"},{"line_number":48,"context_line":"        if self.db_sync_time \u003c db_consistent.MIN_SYNC_INTERVAL_TIME:"},{"line_number":49,"context_line":"            self.db_sync_time \u003d db_consistent.MIN_SYNC_INTERVAL_TIME"},{"line_number":50,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))"},{"line_number":51,"context_line":"        network_id \u003d network.create(network\u003d{\u0027name\u0027: \u0027private\u0027})"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_47beec65","line":48,"range":{"start_line":48,"start_character":10,"end_line":48,"end_character":28},"updated":"2016-11-26 02:54:15.000000000","message":"the min value is 5mins. To fullfill this test case, the following codes wait 3 times, each time 5mins at least. So this case need 15mins. Is it possible to shorten this case ?","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4b17355fee8d8a4f003dad9a2fe7264463a8ff5d","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_db_consistent(self):"},{"line_number":47,"context_line":"        self.db_sync_time \u003d self.conf.db_sync_time"},{"line_number":48,"context_line":"        if self.db_sync_time \u003c db_consistent.MIN_SYNC_INTERVAL_TIME:"},{"line_number":49,"context_line":"            self.db_sync_time \u003d db_consistent.MIN_SYNC_INTERVAL_TIME"},{"line_number":50,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))"},{"line_number":51,"context_line":"        network_id \u003d network.create(network\u003d{\u0027name\u0027: \u0027private\u0027})"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_424c1a9e","line":48,"range":{"start_line":48,"start_character":10,"end_line":48,"end_character":28},"in_reply_to":"5a74a57a_47beec65","updated":"2016-11-26 04:52:34.000000000","message":"OK","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        if self.db_sync_time \u003c db_consistent.MIN_SYNC_INTERVAL_TIME:"},{"line_number":49,"context_line":"            self.db_sync_time \u003d db_consistent.MIN_SYNC_INTERVAL_TIME"},{"line_number":50,"context_line":"        network \u003d self.store(objects.NetworkTestObj(self.neutron, self.nb_api))"},{"line_number":51,"context_line":"        network_id \u003d network.create(network\u003d{\u0027name\u0027: \u0027private\u0027})"},{"line_number":52,"context_line":"        topic \u003d network.get_topic()"},{"line_number":53,"context_line":"        subnet \u003d self.store(objects.SubnetTestObj(self.neutron, self.nb_api,"},{"line_number":54,"context_line":"                                                  network_id))"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_67f5a855","line":51,"range":{"start_line":51,"start_character":7,"end_line":51,"end_character":64},"updated":"2016-11-26 02:54:15.000000000","message":"better to wait a while","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \u0027name\u0027: \u0027private\u0027,"},{"line_number":60,"context_line":"            \u0027enable_dhcp\u0027: True}"},{"line_number":61,"context_line":"        subnet.create(subnet\u003dsubnet_body)"},{"line_number":62,"context_line":"        self.assertTrue(network.exists())"},{"line_number":63,"context_line":"        self.assertTrue(subnet.exists())"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))"},{"line_number":66,"context_line":"        vm.create(network\u003dnetwork)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_87e644ae","line":63,"range":{"start_line":62,"start_character":0,"end_line":63,"end_character":40},"updated":"2016-11-26 02:54:15.000000000","message":"better to wait a while before assert","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4b17355fee8d8a4f003dad9a2fe7264463a8ff5d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \u0027name\u0027: \u0027private\u0027,"},{"line_number":60,"context_line":"            \u0027enable_dhcp\u0027: True}"},{"line_number":61,"context_line":"        subnet.create(subnet\u003dsubnet_body)"},{"line_number":62,"context_line":"        self.assertTrue(network.exists())"},{"line_number":63,"context_line":"        self.assertTrue(subnet.exists())"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))"},{"line_number":66,"context_line":"        vm.create(network\u003dnetwork)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_8d074317","line":63,"range":{"start_line":62,"start_character":0,"end_line":63,"end_character":40},"in_reply_to":"5a74a57a_87e644ae","updated":"2016-11-26 04:52:34.000000000","message":"Done","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        df_network[\u0027subnets\u0027] \u003d [df_subnet]"},{"line_number":101,"context_line":"        df_network_json \u003d jsonutils.dumps(df_network)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        self.nb_api.driver.create_key("},{"line_number":104,"context_line":"                \u0027lswitch\u0027, net_id, df_network_json, topic)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        time.sleep(self.db_sync_time)"},{"line_number":107,"context_line":"        utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_6254b6fe","line":104,"range":{"start_line":103,"start_character":0,"end_line":104,"end_character":58},"updated":"2016-11-26 02:54:15.000000000","message":"This will publish a new event for some driver, e.g etcd, when pub_sub_enable is not enabled","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.nb_api.driver.create_key("},{"line_number":104,"context_line":"                \u0027lswitch\u0027, net_id, df_network_json, topic)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        time.sleep(self.db_sync_time)"},{"line_number":107,"context_line":"        utils.wait_until_true("},{"line_number":108,"context_line":"            lambda: self._check_lswitch_dhcp_rule("},{"line_number":109,"context_line":"                    ovs.dump(self.integration_bridge), \u002710.60.0.2\u0027),"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_c704bc4b","line":106,"range":{"start_line":106,"start_character":8,"end_line":106,"end_character":37},"updated":"2016-11-26 02:54:15.000000000","message":"Is this necessary ?　does line 107 have covered this?","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"4b17355fee8d8a4f003dad9a2fe7264463a8ff5d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.nb_api.driver.create_key("},{"line_number":104,"context_line":"                \u0027lswitch\u0027, net_id, df_network_json, topic)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        time.sleep(self.db_sync_time)"},{"line_number":107,"context_line":"        utils.wait_until_true("},{"line_number":108,"context_line":"            lambda: self._check_lswitch_dhcp_rule("},{"line_number":109,"context_line":"                    ovs.dump(self.integration_bridge), \u002710.60.0.2\u0027),"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_2d19cf79","line":106,"range":{"start_line":106,"start_character":8,"end_line":106,"end_character":37},"in_reply_to":"5a74a57a_c704bc4b","updated":"2016-11-26 04:52:34.000000000","message":"It\u0027s necessary, because the logic needs two time comparisons","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        df_network_json \u003d jsonutils.dumps(df_network)"},{"line_number":117,"context_line":"        self.nb_api.driver.set_key(\u0027lswitch\u0027, net_id, df_network_json, topic)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        time.sleep(self.db_sync_time)"},{"line_number":120,"context_line":"        utils.wait_until_true("},{"line_number":121,"context_line":"            lambda: self._check_lswitch_dhcp_rule("},{"line_number":122,"context_line":"                    ovs.dump(self.integration_bridge), \u002710.60.0.3\u0027),"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_e701b839","line":119,"range":{"start_line":119,"start_character":0,"end_line":119,"end_character":37},"updated":"2016-11-26 02:54:15.000000000","message":"ditto","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"5eb65ed4fc84b2440825c6f77862ae6bba7bdce8","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        )"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        self.nb_api.driver.delete_key(\u0027lswitch\u0027, net_id, topic)"},{"line_number":128,"context_line":"        time.sleep(self.db_sync_time)"},{"line_number":129,"context_line":"        utils.wait_until_true("},{"line_number":130,"context_line":"            lambda: self._check_no_lswitch_dhcp_rule("},{"line_number":131,"context_line":"                    ovs.dump(self.integration_bridge), \u002710.60.0.3\u0027),"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a74a57a_07fb1448","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":37},"updated":"2016-11-26 02:54:15.000000000","message":"ditto","commit_id":"26c05a5e868149b06cb4abe921cf90a308ceb25c"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def _check_l2_lookup_rule(self, flows, mac):"},{"line_number":28,"context_line":"        for flow in flows:"},{"line_number":29,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u002717\u0027 and \u0027goto_table:64\u0027 in flow[\u0027actions\u0027]:"},{"line_number":30,"context_line":"                if \u0027dl_dst\u003d\u0027 + mac in flow[\u0027match\u0027]:"},{"line_number":31,"context_line":"                    return True"},{"line_number":32,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_0253d06b","line":29,"updated":"2016-11-28 16:22:54.000000000","message":"It would have been better to take the constants from the constant values.","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def _check_l2_lookup_rule(self, flows, mac):"},{"line_number":28,"context_line":"        for flow in flows:"},{"line_number":29,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u002717\u0027 and \u0027goto_table:64\u0027 in flow[\u0027actions\u0027]:"},{"line_number":30,"context_line":"                if \u0027dl_dst\u003d\u0027 + mac in flow[\u0027match\u0027]:"},{"line_number":31,"context_line":"                    return True"},{"line_number":32,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_eef13102","line":29,"in_reply_to":"5a74a57a_0253d06b","updated":"2016-11-29 12:47:15.000000000","message":"Done","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"987aa9b7e3cdbaaed41d5b34cbaf5ac1a0ce149a","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _check_lswitch_dhcp_rule(self, flows, dhcp_ip):"},{"line_number":35,"context_line":"        for flow in flows:"},{"line_number":36,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u00279\u0027 and flow[\u0027actions\u0027] \u003d\u003d \u0027goto_table:11\u0027:"},{"line_number":37,"context_line":"                if (\u0027nw_dst\u003d\u0027 + dhcp_ip + \u0027,tp_src\u003d68,tp_dst\u003d67\u0027"},{"line_number":38,"context_line":"                    in flow[\u0027match\u0027]):"},{"line_number":39,"context_line":"                    return True"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_424948b6","line":36,"updated":"2016-11-28 16:22:54.000000000","message":"Same here","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"06d820f133248af5185226d8e1bd02e7341a0161","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _check_lswitch_dhcp_rule(self, flows, dhcp_ip):"},{"line_number":35,"context_line":"        for flow in flows:"},{"line_number":36,"context_line":"            if flow[\u0027table\u0027] \u003d\u003d \u00279\u0027 and flow[\u0027actions\u0027] \u003d\u003d \u0027goto_table:11\u0027:"},{"line_number":37,"context_line":"                if (\u0027nw_dst\u003d\u0027 + dhcp_ip + \u0027,tp_src\u003d68,tp_dst\u003d67\u0027"},{"line_number":38,"context_line":"                    in flow[\u0027match\u0027]):"},{"line_number":39,"context_line":"                    return True"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a74a57a_2ee08928","line":36,"in_reply_to":"5a74a57a_424948b6","updated":"2016-11-29 12:47:15.000000000","message":"Done","commit_id":"611e23c2833c6b9747ff99656ce79648d9426aa8"}],"dragonflow/tests/unit/test_db_consistent.py":[{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"538ca918c1e21b1ad12947a34789db48ab7f4422","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    def setUp(self):\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"        super(TestDBConsistent, self).setUp()\r"},{"line_number":25,"context_line":"        self.controller \u003d mock.Mock()\r"},{"line_number":26,"context_line":"        self.topology \u003d self.controller.topology\r"},{"line_number":27,"context_line":"        self.nb_api \u003d self.controller.nb_api\r"},{"line_number":28,"context_line":"        self.db_store \u003d self.controller.db_store\r"},{"line_number":29,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_018d3c31","line":26,"range":{"start_line":25,"start_character":0,"end_line":26,"end_character":48},"updated":"2016-10-21 08:59:53.000000000","message":"Pls follow test_app_base, do not mock class globally","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"ab1a1aaaa70ef1ddbfff21bbe0243f7005de5044","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    def setUp(self):\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"        super(TestDBConsistent, self).setUp()\r"},{"line_number":25,"context_line":"        self.controller \u003d mock.Mock()\r"},{"line_number":26,"context_line":"        self.topology \u003d self.controller.topology\r"},{"line_number":27,"context_line":"        self.nb_api \u003d self.controller.nb_api\r"},{"line_number":28,"context_line":"        self.db_store \u003d self.controller.db_store\r"},{"line_number":29,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":30,"id":"da6895a0_164f1bbe","line":26,"range":{"start_line":25,"start_character":0,"end_line":26,"end_character":48},"in_reply_to":"da6895a0_018d3c31","updated":"2016-10-23 13:16:18.000000000","message":"Done","commit_id":"a1c028f13635d5adf2b6417187d0429856de1642"}]}
