)]}'
{"dragonflow/db/neutron/lockedobjects_db.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        with session.begin():"},{"line_number":57,"context_line":"            _create_db_row(session, oid\u003doid)"},{"line_number":58,"context_line":"    except orm_exc.MultipleResultsFound as e:"},{"line_number":59,"context_line":"        LOG.warning(e)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def delete_lock(context, oid):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_b1f2e604","line":59,"updated":"2016-03-06 07:07:13.000000000","message":"Consider logging exception with LOG.exception, or providing context to the exception message (e.g. source function).","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        with session.begin():"},{"line_number":57,"context_line":"            _create_db_row(session, oid\u003doid)"},{"line_number":58,"context_line":"    except orm_exc.MultipleResultsFound as e:"},{"line_number":59,"context_line":"        LOG.warning(e)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def delete_lock(context, oid):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_581bb21b","line":59,"in_reply_to":"7af24918_b1f2e604","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        with session.begin():"},{"line_number":66,"context_line":"            _delete_db_row(session, oid\u003doid)"},{"line_number":67,"context_line":"    except orm_exc.NoResultFound as e:"},{"line_number":68,"context_line":"        LOG.warning(e)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003ddb_api.MAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_91f7eaf4","line":68,"updated":"2016-03-06 07:07:13.000000000","message":"Same here re: exception logging.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        with session.begin():"},{"line_number":66,"context_line":"            _delete_db_row(session, oid\u003doid)"},{"line_number":67,"context_line":"    except orm_exc.NoResultFound as e:"},{"line_number":68,"context_line":"        LOG.warning(e)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003ddb_api.MAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_3818661d","line":68,"in_reply_to":"7af24918_91f7eaf4","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                           max_retry_interval\u003d10,"},{"line_number":75,"context_line":"                           retry_on_deadlock\u003dTrue,"},{"line_number":76,"context_line":"                           retry_on_request\u003dTrue)"},{"line_number":77,"context_line":"def _acquire_lock(context, oid):"},{"line_number":78,"context_line":"    sid \u003d _generate_session_id()"},{"line_number":79,"context_line":"    # NOTE(nick-ma-z): we disallow subtransactions because the"},{"line_number":80,"context_line":"    # retry logic will bust any parent transactions"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_1152badd","line":77,"updated":"2016-03-06 07:07:13.000000000","message":"Consider making this (and other functions in this module) into class methods. Access to class information (context, oid, later session) may be simpler than passing that info about.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c8817626dd6e162bbc69c7c9035007b5c13414bc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                           max_retry_interval\u003d10,"},{"line_number":75,"context_line":"                           retry_on_deadlock\u003dTrue,"},{"line_number":76,"context_line":"                           retry_on_request\u003dTrue)"},{"line_number":77,"context_line":"def _acquire_lock(context, oid):"},{"line_number":78,"context_line":"    sid \u003d _generate_session_id()"},{"line_number":79,"context_line":"    # NOTE(nick-ma-z): we disallow subtransactions because the"},{"line_number":80,"context_line":"    # retry logic will bust any parent transactions"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_d7593f5c","line":77,"in_reply_to":"5aef4532_d8b062e0","updated":"2016-03-09 07:16:31.000000000","message":"Sure.\n\nThere\u0027s a lot of code repeated here and in versionedobjects_db. In that patch, maybe an abstract class can also be used.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                           max_retry_interval\u003d10,"},{"line_number":75,"context_line":"                           retry_on_deadlock\u003dTrue,"},{"line_number":76,"context_line":"                           retry_on_request\u003dTrue)"},{"line_number":77,"context_line":"def _acquire_lock(context, oid):"},{"line_number":78,"context_line":"    sid \u003d _generate_session_id()"},{"line_number":79,"context_line":"    # NOTE(nick-ma-z): we disallow subtransactions because the"},{"line_number":80,"context_line":"    # retry logic will bust any parent transactions"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_d8b062e0","line":77,"in_reply_to":"7af24918_1152badd","updated":"2016-03-08 05:46:50.000000000","message":"if it is not necessary, we can revisit it later. OK?","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                         \"Wait here and retry.\"))"},{"line_number":97,"context_line":"            time.sleep(RETRY_INTERVAL)"},{"line_number":98,"context_line":"            wait_lock_retries \u003d wait_lock_retries - 1"},{"line_number":99,"context_line":"    return None"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003ddb_api.MAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_f1dc6e76","line":99,"updated":"2016-03-06 07:07:13.000000000","message":"Consider logging acquire_lock failure.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                         \"Wait here and retry.\"))"},{"line_number":97,"context_line":"            time.sleep(RETRY_INTERVAL)"},{"line_number":98,"context_line":"            wait_lock_retries \u003d wait_lock_retries - 1"},{"line_number":99,"context_line":"    return None"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003ddb_api.MAX_RETRIES,"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_98d37a38","line":99,"in_reply_to":"7af24918_f1dc6e76","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                     \"session %(sid)s.\"), {\u0027oid\u0027: oid, \u0027sid\u0027: sid})"},{"line_number":121,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":122,"context_line":"        LOG.warning(_LW(\"The lock is lost and obtained by other sessions. \""},{"line_number":123,"context_line":"                        \"Reraise exceptions here.\"))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def _generate_session_id():"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_11e47a39","line":123,"range":{"start_line":123,"start_character":25,"end_line":123,"end_character":49},"updated":"2016-03-06 07:07:13.000000000","message":"This part may be unclear. Consider rewording.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                     \"session %(sid)s.\"), {\u0027oid\u0027: oid, \u0027sid\u0027: sid})"},{"line_number":121,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":122,"context_line":"        LOG.warning(_LW(\"The lock is lost and obtained by other sessions. \""},{"line_number":123,"context_line":"                        \"Reraise exceptions here.\"))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def _generate_session_id():"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_d8e7c2e2","line":123,"range":{"start_line":123,"start_character":25,"end_line":123,"end_character":49},"in_reply_to":"7af24918_11e47a39","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    return random.randint(0, LOCK_SEED)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def _get_all_db_rows(session):"},{"line_number":131,"context_line":"    return session.query(models.DFLockedObjects).all()"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_11bbda0f","line":130,"updated":"2016-03-06 07:07:13.000000000","message":"This function is never called, but has a private function name. Is this intentional?","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    return random.randint(0, LOCK_SEED)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def _get_all_db_rows(session):"},{"line_number":131,"context_line":"    return session.query(models.DFLockedObjects).all()"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_f8cefe58","line":130,"in_reply_to":"7af24918_11bbda0f","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"f9eb9b14d1d7a13871e8950ce969afd43b63f230","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":82,"context_line":"                    ctxt.reraise \u003d True"},{"line_number":83,"context_line":"            finally:"},{"line_number":84,"context_line":"                if not within_wrapper:"},{"line_number":85,"context_line":"                    try:"},{"line_number":86,"context_line":"                        _release_lock(lock_id, session_id)"},{"line_number":87,"context_line":"                    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3afc51ec_9cffec00","line":84,"range":{"start_line":84,"start_character":23,"end_line":84,"end_character":37},"updated":"2016-03-13 13:28:53.000000000","message":"maybe need to test that session_id in not 0","commit_id":"78246f28921226bb01806a524f0a958fbe595663"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"d4e3b14c680cc2f086ed0e9abe07cbbc9e7cf027","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":82,"context_line":"                    ctxt.reraise \u003d True"},{"line_number":83,"context_line":"            finally:"},{"line_number":84,"context_line":"                if not within_wrapper:"},{"line_number":85,"context_line":"                    try:"},{"line_number":86,"context_line":"                        _release_lock(lock_id, session_id)"},{"line_number":87,"context_line":"                    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3afc51ec_9447bc4a","line":84,"range":{"start_line":84,"start_character":23,"end_line":84,"end_character":37},"in_reply_to":"3afc51ec_9cffec00","updated":"2016-03-14 01:25:41.000000000","message":"I understand your concern. At the current stage, the session\u003d0 means that the lock is timeout. If the lock cannot be acquired, I think it is not possible to continue. We can just throw an exception to API layer, although it is not friendly. The self-healing seems not possible when we meet this problem.","commit_id":"78246f28921226bb01806a524f0a958fbe595663"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"f9eb9b14d1d7a13871e8950ce969afd43b63f230","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            time.sleep(random.randint(0, RETRY_INTERVAL))"},{"line_number":122,"context_line":"            wait_lock_retries \u003d wait_lock_retries - 1"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    # NOTE(nick-ma-z): The lock cannot be acquired. We log this info"},{"line_number":125,"context_line":"    # but don\u0027t raise the exception here to block the operation."},{"line_number":126,"context_line":"    # This behavior will be revisited later."},{"line_number":127,"context_line":"    LOG.warning(_LW(\"Acquiring the lock for object %(oid)s failed in \""},{"line_number":128,"context_line":"                    \"session %(sid)s.\"), {\u0027oid\u0027: oid, \u0027sid\u0027: sid})"},{"line_number":129,"context_line":"    return 0"}],"source_content_type":"text/x-python","patch_set":27,"id":"3afc51ec_f909e232","line":126,"range":{"start_line":124,"start_character":6,"end_line":126,"end_character":44},"updated":"2016-03-13 13:28:53.000000000","message":"will this not be a problem when we call _release_lock","commit_id":"78246f28921226bb01806a524f0a958fbe595663"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"346e183432fedeea9c2f4e2c354cd657cb63d1a9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":168,"context_line":"        session \u003d db_api.get_session()"},{"line_number":169,"context_line":"        with session.begin():"},{"line_number":170,"context_line":"            _create_db_row(session, oid\u003did)"},{"line_number":171,"context_line":"        return True"},{"line_number":172,"context_line":"    return False"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3afc51ec_ed863cb8","line":170,"updated":"2016-03-13 20:44:45.000000000","message":"This may raise an exception if the same row is created by a different server at the same time. Consider catching and ignoring this exception, since as long as the lock object is created, the logic is maintained.","commit_id":"78246f28921226bb01806a524f0a958fbe595663"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"d4e3b14c680cc2f086ed0e9abe07cbbc9e7cf027","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":168,"context_line":"        session \u003d db_api.get_session()"},{"line_number":169,"context_line":"        with session.begin():"},{"line_number":170,"context_line":"            _create_db_row(session, oid\u003did)"},{"line_number":171,"context_line":"        return True"},{"line_number":172,"context_line":"    return False"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3afc51ec_74b03044","line":170,"in_reply_to":"3afc51ec_ed863cb8","updated":"2016-03-14 01:25:41.000000000","message":"The uuid of an object is unique. If an object uuid is not selected, meaning that the id has not been generated in the db side. The multiple record exception won\u0027t be thrown. But it is also OK to add the try-catch here.","commit_id":"78246f28921226bb01806a524f0a958fbe595663"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"a748dbf5fa435df68b5289eafa0dd87fb9681457","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        except orm_exc.NoResultFound:"},{"line_number":124,"context_line":"            LOG.info(_LI(\"Lock has been obtained by other sessions. \""},{"line_number":125,"context_line":"                         \"Wait here and retry.\"))"},{"line_number":126,"context_line":"            time.sleep(retry_interval)"},{"line_number":127,"context_line":"            wait_lock_retries \u003d wait_lock_retries - 1"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"            # dynamically increase the retry_interval until it reaches"}],"source_content_type":"text/x-python","patch_set":32,"id":"3afc51ec_dbfe4fad","line":126,"range":{"start_line":126,"start_character":12,"end_line":126,"end_character":16},"updated":"2016-03-15 08:16:14.000000000","message":"I think it is better to use eventlet.sleep(x)","commit_id":"5f579c5e9d9b0b068f738c6f950900783c45c5e2"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"ab150296d60e57e0372a1c14cd6bd9f9705524df","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        except orm_exc.NoResultFound:"},{"line_number":124,"context_line":"            LOG.info(_LI(\"Lock has been obtained by other sessions. \""},{"line_number":125,"context_line":"                         \"Wait here and retry.\"))"},{"line_number":126,"context_line":"            time.sleep(retry_interval)"},{"line_number":127,"context_line":"            wait_lock_retries \u003d wait_lock_retries - 1"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"            # dynamically increase the retry_interval until it reaches"}],"source_content_type":"text/x-python","patch_set":32,"id":"3afc51ec_6c5dc078","line":126,"range":{"start_line":126,"start_character":12,"end_line":126,"end_character":16},"in_reply_to":"3afc51ec_dbfe4fad","updated":"2016-03-15 11:12:31.000000000","message":"the neutron server is monkey-patched for all the modules.","commit_id":"5f579c5e9d9b0b068f738c6f950900783c45c5e2"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"a748dbf5fa435df68b5289eafa0dd87fb9681457","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    session.flush()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"def _delete_db_row(session, oid):"},{"line_number":205,"context_line":"    row \u003d session.query(models.DFLockedObjects).filter_by("},{"line_number":206,"context_line":"        object_uuid\u003doid).one()"},{"line_number":207,"context_line":"    session.delete(row)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3afc51ec_3bbc93db","line":204,"range":{"start_line":204,"start_character":4,"end_line":204,"end_character":18},"updated":"2016-03-15 08:16:14.000000000","message":"This method is unused \n\nAre we planning to use it in the futrure ?","commit_id":"5f579c5e9d9b0b068f738c6f950900783c45c5e2"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"ab150296d60e57e0372a1c14cd6bd9f9705524df","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    session.flush()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"def _delete_db_row(session, oid):"},{"line_number":205,"context_line":"    row \u003d session.query(models.DFLockedObjects).filter_by("},{"line_number":206,"context_line":"        object_uuid\u003doid).one()"},{"line_number":207,"context_line":"    session.delete(row)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3afc51ec_cc56945b","line":204,"range":{"start_line":204,"start_character":4,"end_line":204,"end_character":18},"in_reply_to":"3afc51ec_3bbc93db","updated":"2016-03-15 11:12:31.000000000","message":"no, i will remove it later.","commit_id":"5f579c5e9d9b0b068f738c6f950900783c45c5e2"}],"dragonflow/db/neutron/versionedobjects_db.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        with session.begin():"},{"line_number":51,"context_line":"            _delete_db_row(session, oid\u003doid)"},{"line_number":52,"context_line":"    except orm_exc.NoResultFound as e:"},{"line_number":53,"context_line":"        LOG.warning(e)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def create_version(context, oid, otype):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_b10e66e3","line":53,"updated":"2016-03-06 07:07:13.000000000","message":"Consider logging with LOG.exception, or providing context for the exception (e.g. function name)","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        with session.begin():"},{"line_number":51,"context_line":"            _delete_db_row(session, oid\u003doid)"},{"line_number":52,"context_line":"    except orm_exc.NoResultFound as e:"},{"line_number":53,"context_line":"        LOG.warning(e)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def create_version(context, oid, otype):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_b85f5671","line":53,"in_reply_to":"7af24918_b10e66e3","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        with session.begin():"},{"line_number":60,"context_line":"            _create_db_row(session, oid, otype)"},{"line_number":61,"context_line":"    except orm_exc.MultipleResultsFound as e:"},{"line_number":62,"context_line":"        LOG.warning(e)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def get_current_version(context, oid):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_f1f8eec6","line":62,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        with session.begin():"},{"line_number":60,"context_line":"            _create_db_row(session, oid, otype)"},{"line_number":61,"context_line":"    except orm_exc.MultipleResultsFound as e:"},{"line_number":62,"context_line":"        LOG.warning(e)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"def get_current_version(context, oid):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_1855aa4f","line":62,"in_reply_to":"7af24918_f1f8eec6","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        object_uuid\u003doid).first()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _get_all_db_rows(session):"},{"line_number":71,"context_line":"    return session.query(models.DFVersionedObjects).all()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_310376ba","line":70,"updated":"2016-03-06 07:07:13.000000000","message":"This method is named as private, but it not used. Is this intentional?","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        object_uuid\u003doid).first()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _get_all_db_rows(session):"},{"line_number":71,"context_line":"    return session.query(models.DFVersionedObjects).all()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_f851de63","line":70,"in_reply_to":"7af24918_310376ba","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _delete_db_row(session, row\u003dNone, oid\u003dNone):"},{"line_number":86,"context_line":"    if oid:"},{"line_number":87,"context_line":"        row \u003d session.query(models.DFVersionedObjects).filter_by("},{"line_number":88,"context_line":"            object_uuid\u003doid).one()"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_b125c65d","line":85,"updated":"2016-03-06 07:07:13.000000000","message":"Consider splitting to two methods - one for oid and one for row.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _delete_db_row(session, row\u003dNone, oid\u003dNone):"},{"line_number":86,"context_line":"    if oid:"},{"line_number":87,"context_line":"        row \u003d session.query(models.DFVersionedObjects).filter_by("},{"line_number":88,"context_line":"            object_uuid\u003doid).one()"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_584f32bd","line":85,"in_reply_to":"7af24918_b125c65d","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"}],"dragonflow/neutron/plugin.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        nb_lock \u003d lock_db.DFDBLock(context, sg_db.get(\u0027id\u0027))"},{"line_number":194,"context_line":"        with nb_lock:"},{"line_number":195,"context_line":"            vo_db.create_version(context, sg_db.get(\u0027id\u0027),"},{"line_number":196,"context_line":"                             df_common_const.VERSIONED_SECURITY_GROUP)"},{"line_number":197,"context_line":"            self.nb_api.create_security_group(name\u003dsg_name, topic\u003dtenant_id,"},{"line_number":198,"context_line":"                                              rules\u003drules)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_512f22f6","line":195,"updated":"2016-03-06 07:07:13.000000000","message":"Am I right in understanding that this create version takes both DF DB lock and Neutron DB lock? This behaviour was updated in the spec.\n(This repeats in other places in this file. I think it would be best to concentrate the discussion here.)\n\nAdditionally, don\u0027t we want create_version called under the same session as create_security_group? This means also a change in create_version to allow a non-locking/pre-locked invocation.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"c8817626dd6e162bbc69c7c9035007b5c13414bc","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        nb_lock \u003d lock_db.DFDBLock(context, sg_db.get(\u0027id\u0027))"},{"line_number":194,"context_line":"        with nb_lock:"},{"line_number":195,"context_line":"            vo_db.create_version(context, sg_db.get(\u0027id\u0027),"},{"line_number":196,"context_line":"                             df_common_const.VERSIONED_SECURITY_GROUP)"},{"line_number":197,"context_line":"            self.nb_api.create_security_group(name\u003dsg_name, topic\u003dtenant_id,"},{"line_number":198,"context_line":"                                              rules\u003drules)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_66f7adf5","line":195,"in_reply_to":"5aef4532_6e4fc492","updated":"2016-03-09 07:16:31.000000000","message":"I\u0027d like to see the exception. Maybe there is another solution.\n\nI thought the call \u0027with nb_lock:\u0027 takes a DF DB lock?\n\nI understand it would be better with sub-transactions, but I think the compromise of having both operations done in the same transaction should be considered and compared to two separate transactions (which may allow a race condition).","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        nb_lock \u003d lock_db.DFDBLock(context, sg_db.get(\u0027id\u0027))"},{"line_number":194,"context_line":"        with nb_lock:"},{"line_number":195,"context_line":"            vo_db.create_version(context, sg_db.get(\u0027id\u0027),"},{"line_number":196,"context_line":"                             df_common_const.VERSIONED_SECURITY_GROUP)"},{"line_number":197,"context_line":"            self.nb_api.create_security_group(name\u003dsg_name, topic\u003dtenant_id,"},{"line_number":198,"context_line":"                                              rules\u003drules)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_6e4fc492","line":195,"in_reply_to":"7af24918_512f22f6","updated":"2016-03-08 05:46:50.000000000","message":"This create_version function creates a version record for neutron object in neutron db only. At that moment, there\u0027s no record in DF DB. We update DF DB version in each operation of nb-api.\n\nThere\u0027s no DF DB lock. All the operations are protected by Neutron DB lock to prevent from race due to concurrency. The spec also reflects the design.\n\nThe create version and lock in Neutron DB have to be in a new transaction, not subtransaction of neutron operations. This will make API failed due to some exceptions from sqlalchemy. For example, when we create subnet, we will create dhcp port inside the main neutron transaction. In PS16-20, I fixed this problem. I will find the exact exception about it.","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":270,"context_line":"                        gateway_ip\u003dnew_subnet[\u0027gateway_ip\u0027],"},{"line_number":271,"context_line":"                        dns_nameservers\u003dnew_subnet.get(\u0027dns_nameservers\u0027, []))"},{"line_number":272,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":273,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":274,"context_line":"        return new_subnet"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def update_subnet(self, context, id, subnet):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_f1258e0a","line":273,"updated":"2016-03-06 07:07:13.000000000","message":"Consider logging with LOG.exception or adding context to warning (e.g. function name).","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":270,"context_line":"                        gateway_ip\u003dnew_subnet[\u0027gateway_ip\u0027],"},{"line_number":271,"context_line":"                        dns_nameservers\u003dnew_subnet.get(\u0027dns_nameservers\u0027, []))"},{"line_number":272,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":273,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":274,"context_line":"        return new_subnet"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def update_subnet(self, context, id, subnet):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_22bcad04","line":273,"in_reply_to":"7af24918_f1258e0a","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                        gateway_ip\u003dnew_subnet[\u0027gateway_ip\u0027],"},{"line_number":302,"context_line":"                        dns_nameservers\u003dnew_subnet.get(\u0027dns_nameservers\u0027, []))"},{"line_number":303,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":304,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":305,"context_line":"        return new_subnet"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def delete_subnet(self, context, id):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_312096f7","line":304,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                        gateway_ip\u003dnew_subnet[\u0027gateway_ip\u0027],"},{"line_number":302,"context_line":"                        dns_nameservers\u003dnew_subnet.get(\u0027dns_nameservers\u0027, []))"},{"line_number":303,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":304,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":305,"context_line":"        return new_subnet"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def delete_subnet(self, context, id):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_823781af","line":304,"in_reply_to":"7af24918_312096f7","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    LOG.debug(\"network %s is not found in DB, might have \""},{"line_number":323,"context_line":"                              \"been deleted concurrently\" % net_id)"},{"line_number":324,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":325,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def create_network(self, context, network):"},{"line_number":328,"context_line":"        with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_111d9abd","line":325,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    LOG.debug(\"network %s is not found in DB, might have \""},{"line_number":323,"context_line":"                              \"been deleted concurrently\" % net_id)"},{"line_number":324,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":325,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: net_id})"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def create_network(self, context, network):"},{"line_number":328,"context_line":"        with db_api.autonested_transaction(context.session):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_623cf593","line":325,"in_reply_to":"7af24918_111d9abd","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":402,"context_line":"                                           network[\u0027network\u0027][\u0027name\u0027],"},{"line_number":403,"context_line":"                                           old_version)"},{"line_number":404,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":405,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: network_id})"},{"line_number":406,"context_line":"        return result"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def update_port(self, context, id, port):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_71785ef9","line":405,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":402,"context_line":"                                           network[\u0027network\u0027][\u0027name\u0027],"},{"line_number":403,"context_line":"                                           old_version)"},{"line_number":404,"context_line":"                except df_exceptions.DBKeyBadVersionException:"},{"line_number":405,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: network_id})"},{"line_number":406,"context_line":"        return result"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def update_port(self, context, id, port):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_c241890d","line":405,"in_reply_to":"7af24918_71785ef9","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                                             \u0027device_owner\u0027, None),"},{"line_number":469,"context_line":"                                         security_groups\u003dsecurity_groups)"},{"line_number":470,"context_line":"            except df_exceptions.DBKeyBadVersionException:"},{"line_number":471,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027:"},{"line_number":472,"context_line":"                                                       updated_port[\u0027id\u0027]})"},{"line_number":473,"context_line":"        return updated_port"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_517d62e6","line":471,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                                             \u0027device_owner\u0027, None),"},{"line_number":469,"context_line":"                                         security_groups\u003dsecurity_groups)"},{"line_number":470,"context_line":"            except df_exceptions.DBKeyBadVersionException:"},{"line_number":471,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027:"},{"line_number":472,"context_line":"                                                       updated_port[\u0027id\u0027]})"},{"line_number":473,"context_line":"        return updated_port"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_a246fd20","line":471,"in_reply_to":"7af24918_517d62e6","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"80584065c7f7da5ec1a5d880efd14146be722bce","unresolved":false,"context_lines":[{"line_number":712,"context_line":"                                             network\u003dnetwork,"},{"line_number":713,"context_line":"                                             tunnel_key\u003dtunnel_key)"},{"line_number":714,"context_line":"            except df_exceptions.DBKeyBadVersionException:"},{"line_number":715,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: router_id})"},{"line_number":716,"context_line":"        return result"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"    def remove_router_interface(self, context, router_id, interface_info):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7af24918_b182e6c6","line":715,"updated":"2016-03-06 07:07:13.000000000","message":"See above re: exception logging","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"52d96e5b01940a0e7e983150391f707343897fac","unresolved":false,"context_lines":[{"line_number":712,"context_line":"                                             network\u003dnetwork,"},{"line_number":713,"context_line":"                                             tunnel_key\u003dtunnel_key)"},{"line_number":714,"context_line":"            except df_exceptions.DBKeyBadVersionException:"},{"line_number":715,"context_line":"                    LOG.warning(BAD_VERSION_MESSAGE % {\u0027id\u0027: router_id})"},{"line_number":716,"context_line":"        return result"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"    def remove_router_interface(self, context, router_id, interface_info):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5aef4532_024c1141","line":715,"in_reply_to":"7af24918_b182e6c6","updated":"2016-03-08 05:46:50.000000000","message":"Done","commit_id":"3744b95bb9a1add41b2263a6a07e80b2e24a8968"}]}
