)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ee656153ed1ea271baedf4a0bf07e368779054a5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"while maintaining atomic update. [1]"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"We implement this kind of lock-free mechanism for our db-lock."},{"line_number":17,"context_line":"As a result, the db-lock is much more efficient for galera."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[1] https://blueprints.launchpad.net/nova/+spec/lock-free-quota-management"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dab17558_4f8cd2d9","line":17,"updated":"2016-05-12 02:37:05.000000000","message":"do you have numbers?","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"5bf10a70f1fff784607870c5146c04ee63556525","unresolved":false,"context_lines":[{"line_number":14,"context_line":"while maintaining atomic update. [1]"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"We implement this kind of lock-free mechanism for our db-lock."},{"line_number":17,"context_line":"As a result, the db-lock is much more efficient for galera."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[1] https://blueprints.launchpad.net/nova/+spec/lock-free-quota-management"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dab17558_7b8fd874","line":17,"in_reply_to":"dab17558_4f8cd2d9","updated":"2016-05-12 04:17:16.000000000","message":"Theoretically, when the select-for-update is conducted for a given row, the Galera will wait for certification failure of the cluster if one of the node finds it is locked, and when it identifies the failure, it will raise a Deadlock exception to the API layer. So, we catch the exception and issue a retry in a loop to obtain the lock.\n\nIn this implementation, we use update constraint to identify the failure immediately after the sql command is issued to one of the Galera node. It prevents from the wait-deadlock procedure during each loop. It is working in Nova. I think it also works for Dragonflow.","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"}],"dragonflow/db/neutron/lockedobjects_db.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ee656153ed1ea271baedf4a0bf07e368779054a5","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                # reset the lock if it is timeout"},{"line_number":156,"context_line":"                LOG.warning(_LW(\u0027The lock for object %(id)s is reset \u0027"},{"line_number":157,"context_line":"                                \u0027due to timeout.\u0027), {\u0027id\u0027: id})"},{"line_number":158,"context_line":"                _update_lock(session, row, False, 0)"},{"line_number":159,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":160,"context_line":"        try:"},{"line_number":161,"context_line":"            session \u003d db_api.get_session()"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_0282a1c7","line":158,"updated":"2016-05-12 02:37:05.000000000","message":"it\u0027s safer to make this update use _lock_free_update as well.","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"5bf10a70f1fff784607870c5146c04ee63556525","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                # reset the lock if it is timeout"},{"line_number":156,"context_line":"                LOG.warning(_LW(\u0027The lock for object %(id)s is reset \u0027"},{"line_number":157,"context_line":"                                \u0027due to timeout.\u0027), {\u0027id\u0027: id})"},{"line_number":158,"context_line":"                _update_lock(session, row, False, 0)"},{"line_number":159,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":160,"context_line":"        try:"},{"line_number":161,"context_line":"            session \u003d db_api.get_session()"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_408ca1d9","line":158,"in_reply_to":"dab17558_0282a1c7","updated":"2016-05-12 04:17:16.000000000","message":"Yes, I forgot to change it. Thanks.","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ee656153ed1ea271baedf4a0bf07e368779054a5","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            pass"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"def _lock_free_update(session, id, state, session_id):"},{"line_number":170,"context_line":"    if not state:"},{"line_number":171,"context_line":"        # acquire lock"},{"line_number":172,"context_line":"        params \u003d {\u0027lock\u0027: not state, \u0027session_id\u0027: session_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_c239b9a5","line":169,"range":{"start_line":169,"start_character":35,"end_line":169,"end_character":40},"updated":"2016-05-12 02:37:05.000000000","message":"i guess it\u0027s more straightforward to flip the meaning of the argument.\nie. state -\u003e lock","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"5bf10a70f1fff784607870c5146c04ee63556525","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            pass"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"def _lock_free_update(session, id, state, session_id):"},{"line_number":170,"context_line":"    if not state:"},{"line_number":171,"context_line":"        # acquire lock"},{"line_number":172,"context_line":"        params \u003d {\u0027lock\u0027: not state, \u0027session_id\u0027: session_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_2087ddb5","line":169,"range":{"start_line":169,"start_character":35,"end_line":169,"end_character":40},"in_reply_to":"dab17558_c239b9a5","updated":"2016-05-12 04:17:16.000000000","message":"Done","commit_id":"9dec17b916157e0a0d6ee11b8a6827785ef635ab"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"00b199de1e8a42d51a7269b9ad0c73ff53d1c428","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    return random.randint(0, LOCK_SEED)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"def _test_and_create_object(id):"},{"line_number":147,"context_line":"    try:"},{"line_number":148,"context_line":"        session \u003d db_api.get_session()"},{"line_number":149,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_f442b667","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":27},"updated":"2016-05-12 07:45:07.000000000","message":"i guess this method needs to be decorated with wrap_db_retry.","commit_id":"b9edb9721dabfd02e276c57a3941c7a3b2ac72a6"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"760cb7562058c571895c7ac3b9930878b571fe2e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    return random.randint(0, LOCK_SEED)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"def _test_and_create_object(id):"},{"line_number":147,"context_line":"    try:"},{"line_number":148,"context_line":"        session \u003d db_api.get_session()"},{"line_number":149,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_e544be1c","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":27},"in_reply_to":"dab17558_f442b667","updated":"2016-05-12 08:33:39.000000000","message":"Thanks, I\u0027m trying to refactor it. I\u0027ll update a new patch soon.","commit_id":"b9edb9721dabfd02e276c57a3941c7a3b2ac72a6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"00b199de1e8a42d51a7269b9ad0c73ff53d1c428","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                # reset the lock if it is timeout"},{"line_number":156,"context_line":"                LOG.warning(_LW(\u0027The lock for object %(id)s is reset \u0027"},{"line_number":157,"context_line":"                                \u0027due to timeout.\u0027), {\u0027id\u0027: id})"},{"line_number":158,"context_line":"                _lock_free_update(session, id, lock_state\u003dTrue, is_reset\u003dTrue)"},{"line_number":159,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":160,"context_line":"        try:"},{"line_number":161,"context_line":"            session \u003d db_api.get_session()"}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_34af1e2d","line":158,"range":{"start_line":158,"start_character":64,"end_line":158,"end_character":77},"updated":"2016-05-12 07:45:07.000000000","message":"is this special case necessary?\nisn\u0027t session_id\u003drow.session_id enough?","commit_id":"b9edb9721dabfd02e276c57a3941c7a3b2ac72a6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"00b199de1e8a42d51a7269b9ad0c73ff53d1c428","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    :type session_id:  string"},{"line_number":181,"context_line":"    :param is_reset:   to determine if the lock needs to be reset"},{"line_number":182,"context_line":"    :type is_reset:    boolean"},{"line_number":183,"context_line":"    :raises:           RetryRequest() if the lock has been acquired"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    if not state:"},{"line_number":186,"context_line":"        # acquire lock"}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_774a4857","line":183,"range":{"start_line":183,"start_character":38,"end_line":183,"end_character":67},"updated":"2016-05-12 07:45:07.000000000","message":"whehn failed to update?","commit_id":"b9edb9721dabfd02e276c57a3941c7a3b2ac72a6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"00b199de1e8a42d51a7269b9ad0c73ff53d1c428","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    :type is_reset:    boolean"},{"line_number":183,"context_line":"    :raises:           RetryRequest() if the lock has been acquired"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    if not state:"},{"line_number":186,"context_line":"        # acquire lock"},{"line_number":187,"context_line":"        update_params \u003d {\u0027lock\u0027: not lock_state, \u0027session_id\u0027: session_id,"},{"line_number":188,"context_line":"                         \u0027created_at\u0027: func.now()}"}],"source_content_type":"text/x-python","patch_set":3,"id":"dab17558_37128059","line":185,"range":{"start_line":185,"start_character":11,"end_line":185,"end_character":16},"updated":"2016-05-12 07:45:07.000000000","message":"lock_state","commit_id":"b9edb9721dabfd02e276c57a3941c7a3b2ac72a6"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"90dbb0fb566f71bbf64f584009a769df924d76d9","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    :type session:     DB Session object"},{"line_number":181,"context_line":"    :param id:         the lock uuid"},{"line_number":182,"context_line":"    :type id:          string"},{"line_number":183,"context_line":"    :param lock_state: the lock state to update"},{"line_number":184,"context_line":"    :type lock_state:  boolean"},{"line_number":185,"context_line":"    :param session_id: the API session ID to update"},{"line_number":186,"context_line":"    :type session_id:  string"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_21ee3f8b","line":183,"updated":"2016-05-15 17:15:03.000000000","message":"Consider stressing this is the *old* lock, and that the *new* lock is \u0027not lock_state\u0027.","commit_id":"90e1ebabf1da49ce15670d336eaf2ae582c2f1cc"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"90dbb0fb566f71bbf64f584009a769df924d76d9","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        raise db_exc.RetryRequest(df_exc.DBLockFailed(oid\u003did, sid\u003dsession_id))"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def _update_lock(session, row, lock, session_id):"},{"line_number":212,"context_line":"    row.lock \u003d lock"},{"line_number":213,"context_line":"    row.session_id \u003d session_id"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_81fd6b3d","line":211,"updated":"2016-05-15 17:15:03.000000000","message":"Is this private method in use?","commit_id":"90e1ebabf1da49ce15670d336eaf2ae582c2f1cc"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"c7352e3058f8b602a378e6792db920730de32e9c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        raise db_exc.RetryRequest(df_exc.DBLockFailed(oid\u003did, sid\u003dsession_id))"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def _update_lock(session, row, lock, session_id):"},{"line_number":212,"context_line":"    row.lock \u003d lock"},{"line_number":213,"context_line":"    row.session_id \u003d session_id"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dab17558_2a3293a7","line":211,"in_reply_to":"dab17558_81fd6b3d","updated":"2016-05-16 00:49:05.000000000","message":"this is not used any more, but i\u0027m just leaving it there.","commit_id":"90e1ebabf1da49ce15670d336eaf2ae582c2f1cc"}]}
