)]}'
{"dragonflow/controller/aging.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f12bc9aab07709a2a939317a3918e5f7cc990990","unresolved":false,"context_lines":[{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":6,"context_line":"#    a copy of the License at"},{"line_number":7,"context_line":"#"},{"line_number":8,"context_line":"#         http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":9,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_b0abc9d5","line":6,"updated":"2017-02-02 11:52:23.000000000","message":"maybe rename to aging_app like the rest of the apps?","commit_id":"8802956ecf50d1588d36f4ec0f5370c51bf1a3a8"}],"dragonflow/controller/aging_app.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"17c8b5445e612fc65c353c4e1b642f4aeb91a920","unresolved":false,"context_lines":[{"line_number":27,"context_line":"AGING_COOKIE_NAME \u003d \u0027aging\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Aging(df_base_app.DFlowApp):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":33,"context_line":"        super(Aging, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_20826fc8","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":11},"updated":"2017-02-09 02:33:44.000000000","message":"nit: Aging -\u003e AgingApp\nDo we need to load this Aging application? I cannot find any related code.","commit_id":"e09696f2574c9a417b8b32703ba5a7043369b7b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"84b4870846e30b3529f1879b0d5e1f9604010860","unresolved":false,"context_lines":[{"line_number":27,"context_line":"AGING_COOKIE_NAME \u003d \u0027aging\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Aging(df_base_app.DFlowApp):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":33,"context_line":"        super(Aging, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_371ff30a","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":11},"in_reply_to":"1a430d35_20826fc8","updated":"2017-02-09 17:14:45.000000000","message":"Will fix.\n\nI\u0027ve added the default loading in this patch: https://review.openstack.org/#/c/428057/ . I think this app still has some issues (e.g. the logic in ovs_sync_started should be done before any other flows from any app are installed)","commit_id":"e09696f2574c9a417b8b32703ba5a7043369b7b4"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b060bd9c785ccd4b526b0d9b3a7ee37205efe70f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            LOG.info(_LI(\"no canary table, don\u0027t do aging\"))"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            self.do_aging \u003d True"},{"line_number":59,"context_line":"            canary_cookie \u003d canary_flow.cookie"},{"line_number":60,"context_line":"            self._aging_cookie \u003d self._invert_cookie(canary_cookie)"},{"line_number":61,"context_line":"            LOG.info(_LI(\"renew cookie, old: %(old)x new: %(new)x\"),"},{"line_number":62,"context_line":"                     {\u0027old\u0027: canary_cookie, \u0027new\u0027: self._aging_cookie})"},{"line_number":63,"context_line":"        # NOTE(oanson) cookie will be set automatically with _aging_cookie"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_5422b102","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":67},"updated":"2017-02-16 11:53:50.000000000","message":"I think we need to mask out the relevant bits in case some other global modifiers are at work","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"876ce0501295459baa032af613ea2d62aa12179f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            LOG.info(_LI(\"no canary table, don\u0027t do aging\"))"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            self.do_aging \u003d True"},{"line_number":59,"context_line":"            canary_cookie \u003d canary_flow.cookie"},{"line_number":60,"context_line":"            self._aging_cookie \u003d self._invert_cookie(canary_cookie)"},{"line_number":61,"context_line":"            LOG.info(_LI(\"renew cookie, old: %(old)x new: %(new)x\"),"},{"line_number":62,"context_line":"                     {\u0027old\u0027: canary_cookie, \u0027new\u0027: self._aging_cookie})"},{"line_number":63,"context_line":"        # NOTE(oanson) cookie will be set automatically with _aging_cookie"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_00b38f0b","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":67},"in_reply_to":"fa31d9ce_5422b102","updated":"2017-02-16 13:16:43.000000000","message":"Yes. Will do.","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b060bd9c785ccd4b526b0d9b3a7ee37205efe70f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return 1 ^ cookie"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _start_aging(self):"},{"line_number":80,"context_line":"        inverted_cookie \u003d self._invert_cookie(self._aging_cookie)"},{"line_number":81,"context_line":"        old_cookie, old_mask \u003d cookies.get_cookie(AGING_COOKIE_NAME,"},{"line_number":82,"context_line":"                                                  inverted_cookie)"},{"line_number":83,"context_line":"        self._cleanup_flows(old_cookie, old_mask)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_b4776d07","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":65},"updated":"2017-02-16 11:53:50.000000000","message":"Second invert?","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"876ce0501295459baa032af613ea2d62aa12179f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return 1 ^ cookie"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _start_aging(self):"},{"line_number":80,"context_line":"        inverted_cookie \u003d self._invert_cookie(self._aging_cookie)"},{"line_number":81,"context_line":"        old_cookie, old_mask \u003d cookies.get_cookie(AGING_COOKIE_NAME,"},{"line_number":82,"context_line":"                                                  inverted_cookie)"},{"line_number":83,"context_line":"        self._cleanup_flows(old_cookie, old_mask)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_8075bf33","line":80,"range":{"start_line":80,"start_character":8,"end_line":80,"end_character":65},"in_reply_to":"fa31d9ce_b4776d07","updated":"2017-02-16 13:16:43.000000000","message":"Yes. _aging_cookie is the inverse of the old cookie. inverted_cookie is the invert of _aging_cookie, so inverted_cookie *is* the old cookie.\n\nI\u0027ll rename the variable to make it a bit clearer.","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"}],"dragonflow/controller/df_base_app.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"ea5245104ed38539c8359fb7bf741605aec92337","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        datapath.send_msg(message)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_flows(self, datapath\u003dNone, table_id\u003dNone, timeout\u003d20):"},{"line_number":130,"context_line":"        # TODO(heshan) should be configured in cfg file"},{"line_number":131,"context_line":"        if datapath is None:"},{"line_number":132,"context_line":"            datapath \u003d self.datapath"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_f4d009cc","line":129,"range":{"start_line":129,"start_character":62,"end_line":129,"end_character":64},"updated":"2017-02-03 04:17:35.000000000","message":"use a constant?","commit_id":"8802956ecf50d1588d36f4ec0f5370c51bf1a3a8"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f12bc9aab07709a2a939317a3918e5f7cc990990","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        datapath.send_msg(message)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_flows(self, datapath\u003dNone, table_id\u003dNone, timeout\u003d20):"},{"line_number":130,"context_line":"        # TODO(heshan) should be configured in cfg file"},{"line_number":131,"context_line":"        if datapath is None:"},{"line_number":132,"context_line":"            datapath \u003d self.datapath"},{"line_number":133,"context_line":"        if table_id is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_90c32d8a","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":55},"updated":"2017-02-02 11:52:23.000000000","message":"this comment is out of date, better remove or refer to timeout param explicitly","commit_id":"8802956ecf50d1588d36f4ec0f5370c51bf1a3a8"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b060bd9c785ccd4b526b0d9b3a7ee37205efe70f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            table_id \u003d datapath.ofproto.OFPTT_ALL"},{"line_number":136,"context_line":"        if not timeout:"},{"line_number":137,"context_line":"            timeout \u003d DEFAULT_GET_FLOWS_TIMEOUT"},{"line_number":138,"context_line":"        parser \u003d datapath.ofproto_parser"},{"line_number":139,"context_line":"        msg \u003d parser.OFPFlowStatsRequest(datapath, table_id\u003dtable_id)"},{"line_number":140,"context_line":"        try:"},{"line_number":141,"context_line":"            with eventlet.timeout.Timeout(seconds\u003dtimeout):"},{"line_number":142,"context_line":"                replies \u003d ofctl_api.send_msg("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_5450f15e","line":139,"range":{"start_line":138,"start_character":8,"end_line":139,"end_character":20},"updated":"2017-02-16 11:53:50.000000000","message":"Can just use self.parser","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"876ce0501295459baa032af613ea2d62aa12179f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            table_id \u003d datapath.ofproto.OFPTT_ALL"},{"line_number":136,"context_line":"        if not timeout:"},{"line_number":137,"context_line":"            timeout \u003d DEFAULT_GET_FLOWS_TIMEOUT"},{"line_number":138,"context_line":"        parser \u003d datapath.ofproto_parser"},{"line_number":139,"context_line":"        msg \u003d parser.OFPFlowStatsRequest(datapath, table_id\u003dtable_id)"},{"line_number":140,"context_line":"        try:"},{"line_number":141,"context_line":"            with eventlet.timeout.Timeout(seconds\u003dtimeout):"},{"line_number":142,"context_line":"                replies \u003d ofctl_api.send_msg("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_c0b417d6","line":139,"range":{"start_line":138,"start_character":8,"end_line":139,"end_character":20},"in_reply_to":"fa31d9ce_5450f15e","updated":"2017-02-16 13:16:43.000000000","message":"datapath can be provided as argument. It could be different than self.datapath. Therefore, we must take parser from `datapath`, since self.parser would assume datapath\u003d\u003dself.datapath.","commit_id":"bd2207e5ab5ce1a1cded38bd4b983c8609e3bcb1"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"b77503fb30fb95d601190401fa5c60f33a3036ec","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        app_mgr \u003d app_manager.AppManager.get_instance()"},{"line_number":75,"context_line":"        self.open_flow_app \u003d app_mgr.instantiate(ryu_base_app.RyuDFAdapter,"},{"line_number":76,"context_line":"                                                 **kwargs)"},{"line_number":77,"context_line":"        self.open_flow_service \u003d app_mgr.instantiate(service.OfctlService)"},{"line_number":78,"context_line":"        self.topology \u003d None"},{"line_number":79,"context_line":"        self.db_consistency_manager \u003d None"},{"line_number":80,"context_line":"        self.enable_db_consistency \u003d cfg.CONF.df.enable_df_db_consistency"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_fd61f4d3","line":77,"range":{"start_line":77,"start_character":0,"end_line":77,"end_character":74},"updated":"2017-02-25 03:19:32.000000000","message":"Has this ever been used?","commit_id":"173a2501236db9bdfa7f6c44d574fbb199359d50"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"90de9277d220f0b5f9241276c9d147a61b45c2e0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        app_mgr \u003d app_manager.AppManager.get_instance()"},{"line_number":75,"context_line":"        self.open_flow_app \u003d app_mgr.instantiate(ryu_base_app.RyuDFAdapter,"},{"line_number":76,"context_line":"                                                 **kwargs)"},{"line_number":77,"context_line":"        self.open_flow_service \u003d app_mgr.instantiate(service.OfctlService)"},{"line_number":78,"context_line":"        self.topology \u003d None"},{"line_number":79,"context_line":"        self.db_consistency_manager \u003d None"},{"line_number":80,"context_line":"        self.enable_db_consistency \u003d cfg.CONF.df.enable_df_db_consistency"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_2bcf81b4","line":77,"range":{"start_line":77,"start_character":0,"end_line":77,"end_character":74},"in_reply_to":"da36d5c6_fd61f4d3","updated":"2017-02-28 07:53:31.000000000","message":"This is necessary to support the \u0027get_flows\u0027 method in df_base_app. Otherwise, that method fails (I don\u0027t remember if it hangs or returns failure). Starting OfctlService makes that work. Taken from the removed ofswitch file.\n\nI\u0027ll add a comment to explain that.","commit_id":"173a2501236db9bdfa7f6c44d574fbb199359d50"}]}
