)]}'
{"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d877d87b282394f944ef316202c17a84247d1d8d","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":308,"context_line":"                      lport.get_id())"},{"line_number":309,"context_line":"            return"},{"line_number":310,"context_line":"        if lport.get_remote_vtep() and self._add_remote_port_on_chassis(lport):"},{"line_number":311,"context_line":"            return"},{"line_number":312,"context_line":"        self._logical_port_process(lport)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def logical_port_updated(self, lport):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a95cdbc_60b48334","line":311,"range":{"start_line":310,"start_character":0,"end_line":311,"end_character":18},"updated":"2016-10-09 07:10:18.000000000","message":"How can you be sure that, when the code comes back here, the tunnel port will be ready. It is still asynchronous procedure without synchronization.\n\nMaybe we should just block the chassis_created from return, and wait for the tunnel port being ready.","commit_id":"18c9142a77b3b459ac20f87fd7bac55c31df1636"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"8fe0b41dcfa724a12de858323d06f17278c831c2","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            LOG.debug((\"Port %s has not been bound or it is a vPort\") %"},{"line_number":308,"context_line":"                      lport.get_id())"},{"line_number":309,"context_line":"            return"},{"line_number":310,"context_line":"        if lport.get_remote_vtep() and self._add_remote_port_on_chassis(lport):"},{"line_number":311,"context_line":"            return"},{"line_number":312,"context_line":"        self._logical_port_process(lport)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def logical_port_updated(self, lport):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a95cdbc_ea1a25c5","line":311,"range":{"start_line":310,"start_character":0,"end_line":311,"end_character":18},"in_reply_to":"1a95cdbc_60b48334","updated":"2016-10-10 07:32:42.000000000","message":"Indeed it\u0027s a common problem in dragonflow, you can assume that df will process two continuous events(chassis_create and add_remote_lport) and the remote port belong to the chassis, when process add_remote_lport, the corresponding tunnel port is expected to be ready, between the two events there will have sleep operation and will happen greenthread changed, the idl blocked greenthread will do the commit which create the tunnel port, and in our integrate test it works well, I\u0027m not sure whether there are synchronous interface to help us to confirm the tunnel port created.","commit_id":"18c9142a77b3b459ac20f87fd7bac55c31df1636"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"86e4c9d27c03c939acfd631683295a56d174a2a0","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                if original_lport.get_remote_vtep():"},{"line_number":329,"context_line":"                    self._delete_remote_port_from_chassis(original_lport)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"                if lport.get_remote_vtep() and\\"},{"line_number":332,"context_line":"                        self._add_remote_port_on_chassis(lport):"},{"line_number":333,"context_line":"                    return"},{"line_number":334,"context_line":"        self._logical_port_process(lport, original_lport)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a95cdbc_67b2c64d","line":331,"range":{"start_line":331,"start_character":46,"end_line":331,"end_character":47},"updated":"2016-10-10 10:52:46.000000000","message":"Please put the condition in brackets, rather than break lines with \u0027\\\u0027.","commit_id":"18c9142a77b3b459ac20f87fd7bac55c31df1636"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a488fb75d9ec83b0e7c71033885276f0b68dcc26","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        if chassis \u003d\u003d self.chassis_name:"},{"line_number":261,"context_line":"            lport.set_external_value(\u0027is_local\u0027, True)"},{"line_number":262,"context_line":"            self.db_store.set_port(lport.get_id(), lport, True)"},{"line_number":263,"context_line":"            ofport \u003d self.vswitch_api.get_port_ofport_by_id(lport.get_id())"},{"line_number":264,"context_line":"            if ofport:"},{"line_number":265,"context_line":"                lport.set_external_value(\u0027ofport\u0027, ofport)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_4e7d686d","line":262,"range":{"start_line":262,"start_character":0,"end_line":262,"end_character":63},"updated":"2016-10-12 11:17:47.000000000","message":"This might not be required, as local port is out of consideration for the fix of the bug. And the ofport of local port is different from tunnel port.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a488fb75d9ec83b0e7c71033885276f0b68dcc26","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                      lport.get_id())"},{"line_number":341,"context_line":"            return"},{"line_number":342,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":343,"context_line":"        if original_lport and not original_lport.get_external_value(\"ofport\"):"},{"line_number":344,"context_line":"            original_lport \u003d None"},{"line_number":345,"context_line":"        if not original_lport:"},{"line_number":346,"context_line":"            if lport.get_remote_vtep():"},{"line_number":347,"context_line":"                self._add_remote_port_on_chassis(lport)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_f31c67c3","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":33},"updated":"2016-10-12 11:17:47.000000000","message":"It looks like you are going to set original_lport to None, when the remote port don\u0027t have ofport. The code here is a bit tricky, because you wanna use it at topology.py(right?). I think it is not a good way, because, for me, if I myself will forget why I write such code after 7 days. It makes the code harder to read for others.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"120ef1349882f6c30a6f6d9f11e2d1f3b4e5dd45","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                      lport.get_id())"},{"line_number":341,"context_line":"            return"},{"line_number":342,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":343,"context_line":"        if original_lport and not original_lport.get_external_value(\"ofport\"):"},{"line_number":344,"context_line":"            original_lport \u003d None"},{"line_number":345,"context_line":"        if not original_lport:"},{"line_number":346,"context_line":"            if lport.get_remote_vtep():"},{"line_number":347,"context_line":"                self._add_remote_port_on_chassis(lport)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_f46e5ffe","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":33},"in_reply_to":"ba5da102_21951032","updated":"2016-11-04 02:42:03.000000000","message":"@Omer, I set original_lport to None here is not used for the line 345, because this patch allows the db_store cache the lport which has no ofport, so if we got the none-ofport original_lport and invoke logical_port_process() to notify to every app, the version of original_lport is same as the new lport, so that app will ignore the new lport and no corresponding flow entried will be sent to ovs, so I must set the original_lport None if there\u0027s no ofport which could also make sense because no ofport is meaningless for a lport and for apps, and I have discussed with xiaohhui face to face, so he change the downvote to no-vote:)","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"9688a94afdfc8e82bd50f385ebcdafd1c17df9f6","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                      lport.get_id())"},{"line_number":341,"context_line":"            return"},{"line_number":342,"context_line":"        original_lport \u003d self.db_store.get_port(lport.get_id())"},{"line_number":343,"context_line":"        if original_lport and not original_lport.get_external_value(\"ofport\"):"},{"line_number":344,"context_line":"            original_lport \u003d None"},{"line_number":345,"context_line":"        if not original_lport:"},{"line_number":346,"context_line":"            if lport.get_remote_vtep():"},{"line_number":347,"context_line":"                self._add_remote_port_on_chassis(lport)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_21951032","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":33},"in_reply_to":"fa6399be_f31c67c3","updated":"2016-11-03 15:11:33.000000000","message":"@xiaohhui +1. hujie, maybe create a boolean (e.g. is_original_lport_set_up) and use it instead?","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"}],"dragonflow/controller/topology.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a488fb75d9ec83b0e7c71033885276f0b68dcc26","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        remote_chassis \u003d ovs_port.get_remote_chassis()"},{"line_number":138,"context_line":"        if not remote_chassis:"},{"line_number":139,"context_line":"            return"},{"line_number":140,"context_line":"        lports \u003d self.db_store.get_ports_by_chassis(remote_chassis)"},{"line_number":141,"context_line":"        for lport in lports:"},{"line_number":142,"context_line":"            try:"},{"line_number":143,"context_line":"                if action \u003d\u003d \"set\":"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_6e394c41","line":140,"range":{"start_line":140,"start_character":17,"end_line":140,"end_character":67},"updated":"2016-10-12 11:17:47.000000000","message":"You may just want to get ports from nb db. We don\u0027t expect the tunnel port online events too much, so it will not hurt the performance.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"06a02fc42fb875849980f75a6b17263d0c7cfbd2","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        for lport in lports:"},{"line_number":142,"context_line":"            try:"},{"line_number":143,"context_line":"                if action \u003d\u003d \"set\":"},{"line_number":144,"context_line":"                    self.controller.logical_port_updated(lport)"},{"line_number":145,"context_line":"                else:"},{"line_number":146,"context_line":"                    self.controller.logical_port_deleted(lport.get_id())"},{"line_number":147,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_a1d920f5","line":144,"updated":"2016-11-03 15:12:33.000000000","message":"We may want to consider a \u0027tunnel_port_updated\u0027 rather than logical_port_updated. Not a -1, but I would like to hear your opinion.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"}],"dragonflow/db/db_store.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"9688a94afdfc8e82bd50f385ebcdafd1c17df9f6","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        return self.values(\u0027ports\u0027, topic)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def get_ports_by_chassis(self, chassis_id, topic\u003dNone):"},{"line_number":166,"context_line":"        lports \u003d self.values(\u0027ports\u0027, topic)"},{"line_number":167,"context_line":"        ret_lports \u003d []"},{"line_number":168,"context_line":"        for lport in lports:"},{"line_number":169,"context_line":"            if lport.get_chassis() \u003d\u003d chassis_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_e1ecf8bc","line":166,"range":{"start_line":166,"start_character":0,"end_line":166,"end_character":44},"updated":"2016-11-03 15:11:33.000000000","message":"I think it would be better to use self.get_ports.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"120ef1349882f6c30a6f6d9f11e2d1f3b4e5dd45","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        return self.values(\u0027ports\u0027, topic)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def get_ports_by_chassis(self, chassis_id, topic\u003dNone):"},{"line_number":166,"context_line":"        lports \u003d self.values(\u0027ports\u0027, topic)"},{"line_number":167,"context_line":"        ret_lports \u003d []"},{"line_number":168,"context_line":"        for lport in lports:"},{"line_number":169,"context_line":"            if lport.get_chassis() \u003d\u003d chassis_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_b44f8790","line":166,"range":{"start_line":166,"start_character":0,"end_line":166,"end_character":44},"in_reply_to":"ba5da102_e1ecf8bc","updated":"2016-11-04 02:42:03.000000000","message":"Done","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"a488fb75d9ec83b0e7c71033885276f0b68dcc26","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        lports \u003d self.values(\u0027ports\u0027, topic)"},{"line_number":167,"context_line":"        ret_lports \u003d []"},{"line_number":168,"context_line":"        for lport in lports:"},{"line_number":169,"context_line":"            if lport.get_chassis() \u003d\u003d chassis_id:"},{"line_number":170,"context_line":"                ret_lports.append(lport)"},{"line_number":171,"context_line":"        return ret_lports"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa6399be_6ed5ccb7","line":169,"range":{"start_line":169,"start_character":0,"end_line":169,"end_character":49},"updated":"2016-10-12 11:17:47.000000000","message":"You may also want to check if the port is a remote port, because the reported bug is for the recently added remote port functionality.\n\nA normal remote port(inside the topology) will not have the problem, as the tunnel port has been created when startup df controller.","commit_id":"a7a4aeaffae8c5f5848395c2cb95f2ad6405c14a"}]}
