)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"2e26ff25cee5e13323287cc9064899999479c6cd","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"    context.session.add(event_ref)"},{"line_number":6220,"context_line":""},{"line_number":6221,"context_line":"    # Update action updated_at."},{"line_number":6222,"context_line":"    action_values \u003d {\u0027updated_at\u0027: values[\u0027start_time\u0027]}"},{"line_number":6223,"context_line":"    action.update(action_values)"},{"line_number":6224,"context_line":"    action.save(context.session)"},{"line_number":6225,"context_line":""},{"line_number":6226,"context_line":"    return event_ref"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f515b1d_c7ddee70","line":6223,"range":{"start_line":6222,"start_character":0,"end_line":6223,"end_character":32},"updated":"2017-10-09 03:33:07.000000000","message":"don\u0027t need to introduce new action_values var, it\u0027s used only one time","commit_id":"f8720b9b02bcd8eeb78005c83676f13f73d7be0f"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"6221fe350f76e1a4135a95c55b7f7ab60d5ce54e","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"    context.session.add(event_ref)"},{"line_number":6220,"context_line":""},{"line_number":6221,"context_line":"    # Update action updated_at."},{"line_number":6222,"context_line":"    action_values \u003d {\u0027updated_at\u0027: values[\u0027start_time\u0027]}"},{"line_number":6223,"context_line":"    action.update(action_values)"},{"line_number":6224,"context_line":"    action.save(context.session)"},{"line_number":6225,"context_line":""},{"line_number":6226,"context_line":"    return event_ref"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f515b1d_67675ab9","line":6223,"range":{"start_line":6222,"start_character":0,"end_line":6223,"end_character":32},"in_reply_to":"7f515b1d_c7ddee70","updated":"2017-10-09 07:25:36.000000000","message":"yep, thanks.","commit_id":"f8720b9b02bcd8eeb78005c83676f13f73d7be0f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":6205,"context_line":""},{"line_number":6206,"context_line":"@pick_context_manager_writer"},{"line_number":6207,"context_line":"def action_start(context, values):"},{"line_number":6208,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027)"},{"line_number":6209,"context_line":"    action_ref \u003d models.InstanceAction()"},{"line_number":6210,"context_line":"    action_ref.update(values)"},{"line_number":6211,"context_line":"    action_ref.save(context.session)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_9fb6c1dc","line":6208,"updated":"2017-11-30 22:12:04.000000000","message":"The object is passing down \u0027updated_at\u0027 now, so shouldn\u0027t that also go through this conversion?","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":6205,"context_line":""},{"line_number":6206,"context_line":"@pick_context_manager_writer"},{"line_number":6207,"context_line":"def action_start(context, values):"},{"line_number":6208,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027)"},{"line_number":6209,"context_line":"    action_ref \u003d models.InstanceAction()"},{"line_number":6210,"context_line":"    action_ref.update(values)"},{"line_number":6211,"context_line":"    action_ref.save(context.session)"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_7dc5fb8d","line":6208,"in_reply_to":"ff82abbf_9fb6c1dc","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":6214,"context_line":""},{"line_number":6215,"context_line":"@pick_context_manager_writer"},{"line_number":6216,"context_line":"def action_finish(context, values):"},{"line_number":6217,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027, \u0027finish_time\u0027)"},{"line_number":6218,"context_line":"    query \u003d model_query(context, models.InstanceAction).\\"},{"line_number":6219,"context_line":"                        filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":6220,"context_line":"                        filter_by(request_id\u003dvalues[\u0027request_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_3fc77548","line":6217,"updated":"2017-11-30 22:12:04.000000000","message":"Same, shouldn\u0027t this include updated_at now?","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":6214,"context_line":""},{"line_number":6215,"context_line":"@pick_context_manager_writer"},{"line_number":6216,"context_line":"def action_finish(context, values):"},{"line_number":6217,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027, \u0027finish_time\u0027)"},{"line_number":6218,"context_line":"    query \u003d model_query(context, models.InstanceAction).\\"},{"line_number":6219,"context_line":"                        filter_by(instance_uuid\u003dvalues[\u0027instance_uuid\u0027]).\\"},{"line_number":6220,"context_line":"                        filter_by(request_id\u003dvalues[\u0027request_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_9dc23f85","line":6217,"in_reply_to":"ff82abbf_3fc77548","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":6261,"context_line":"@pick_context_manager_writer"},{"line_number":6262,"context_line":"def action_event_start(context, values):"},{"line_number":6263,"context_line":"    \"\"\"Start an event on an instance action.\"\"\""},{"line_number":6264,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027)"},{"line_number":6265,"context_line":"    action \u003d _action_get_by_request_id(context, values[\u0027instance_uuid\u0027],"},{"line_number":6266,"context_line":"                                       values[\u0027request_id\u0027])"},{"line_number":6267,"context_line":"    # When nova-compute restarts, the context is generated again in"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_3f79b52e","line":6264,"updated":"2017-11-30 22:12:04.000000000","message":"So we don\u0027t need to do this conversion again because this method modifies the values dict by reference, so using start_time directly below is OK.","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":6261,"context_line":"@pick_context_manager_writer"},{"line_number":6262,"context_line":"def action_event_start(context, values):"},{"line_number":6263,"context_line":"    \"\"\"Start an event on an instance action.\"\"\""},{"line_number":6264,"context_line":"    convert_objects_related_datetimes(values, \u0027start_time\u0027)"},{"line_number":6265,"context_line":"    action \u003d _action_get_by_request_id(context, values[\u0027instance_uuid\u0027],"},{"line_number":6266,"context_line":"                                       values[\u0027request_id\u0027])"},{"line_number":6267,"context_line":"    # When nova-compute restarts, the context is generated again in"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_3dbf73fc","line":6264,"in_reply_to":"ff82abbf_3f79b52e","updated":"2017-12-04 02:17:58.000000000","message":"OK","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e1abb1582b750c5b03690deb4c49f8149c2bf14f","unresolved":false,"context_lines":[{"line_number":6306,"context_line":"    # init_instance can continue to finish the recovery action, like:"},{"line_number":6307,"context_line":"    # powering_off, unpausing, and so on."},{"line_number":6308,"context_line":"    if not action and not context.project_id:"},{"line_number":6309,"context_line":"        action \u003d _action_get_last_created_by_instance_uuid("},{"line_number":6310,"context_line":"            context, values[\u0027instance_uuid\u0027])"},{"line_number":6311,"context_line":""},{"line_number":6312,"context_line":"    if not action:"},{"line_number":6313,"context_line":"        raise exception.InstanceActionNotFound("}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_0387f763","line":6310,"range":{"start_line":6309,"start_character":8,"end_line":6310,"end_character":45},"updated":"2017-12-11 14:39:26.000000000","message":"Unrelated to the deadlock issue, but Jay pointed out this type of action when we don\u0027t have a user request context, like when we restart a compute service. We should probably *not* update these types of actions, since they aren\u0027t actually tied to an *active* user request. So we should set some type of update_action boolean variable in this method and not update the action for these types of lookups.","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f17559a2ac910bea289e3b1346c2a314abf2c74e","unresolved":false,"context_lines":[{"line_number":6306,"context_line":"    # init_instance can continue to finish the recovery action, like:"},{"line_number":6307,"context_line":"    # powering_off, unpausing, and so on."},{"line_number":6308,"context_line":"    if not action and not context.project_id:"},{"line_number":6309,"context_line":"        action \u003d _action_get_last_created_by_instance_uuid("},{"line_number":6310,"context_line":"            context, values[\u0027instance_uuid\u0027])"},{"line_number":6311,"context_line":""},{"line_number":6312,"context_line":"    if not action:"},{"line_number":6313,"context_line":"        raise exception.InstanceActionNotFound("}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_a70ba58b","line":6310,"range":{"start_line":6309,"start_character":8,"end_line":6310,"end_character":45},"in_reply_to":"df87a7cf_0387f763","updated":"2017-12-12 02:18:55.000000000","message":"Yes, good point, thanks for your help. :)","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"c28d72660dd73769d6ef68c0a6ee79d84f0356b9","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_a6d2decf","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"updated":"2017-12-11 12:03:37.000000000","message":"I found all cases with deadlock failed call action_event_finish method, and we can see [1] and [2] in api\u0026super-cond, the deadlock was occured on the time of concurrent updated_at field update.\n\n[1] http://logs.openstack.org/73/507473/15/check/legacy-tempest-dsvm-neutron-multinode-full/2696478/logs/screen-n-super-cond.txt.gz?level\u003dERROR#_Dec_04_02_48_36_132446\n\n[2] http://logs.openstack.org/73/507473/15/check/legacy-tempest-dsvm-neutron-multinode-full/2696478/logs/screen-n-api.txt.gz?level\u003dERROR#_Dec_04_02_48_36_167180","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f17559a2ac910bea289e3b1346c2a314abf2c74e","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_07fcd16d","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"in_reply_to":"df87a7cf_03ecd727","updated":"2017-12-12 02:18:55.000000000","message":"Yes, agreed.","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9ce3306459384934662108eb9ed0d7ec955a6958","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_80769d6f","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"in_reply_to":"df87a7cf_0caac917","updated":"2017-12-11 14:05:59.000000000","message":"Good investigation. I\u0027ll ask Jay Pipes what he thinks we should do, like maybe we are doing the single commit transaction incorrectly, otherwise we can decorate this method with a retry_on_deadlock decorator, but I\u0027d normally like to avoid that if possible since it\u0027s kind of a hack.","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e1abb1582b750c5b03690deb4c49f8149c2bf14f","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_03ecd727","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"in_reply_to":"df87a7cf_80769d6f","updated":"2017-12-11 14:39:26.000000000","message":"This seems to always fail in a resize test, and it\u0027s probably due to prep_resize updates it on the dest compute, rpc casts to resize_instance on the source compute which updates it again, which rpc casts back to the dest compute to finish_resize which updates the action again - so we have 3 updates in a short window and we hit a deadlock, so we probably need to use the retry_on_deadlock decorator here for a case like that.","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"147bf5d2c19156734f615bd64e3c405e51f26c81","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_0caac917","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"in_reply_to":"df87a7cf_8c0c9994","updated":"2017-12-11 13:42:56.000000000","message":"\u003e When modifying multiple tables within a transaction, or different sets of rows in the same table, do those operations in a consistent order each time. Then transactions form well-defined queues and do not deadlock. For example, organize database operations into functions within your application, or call stored routines, rather than coding multiple similar sequences of INSERT, UPDATE, and DELETE statements in different places.\n\nREF: https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks-handling.html","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"a1922767ac2babbdc8826a5480cfe142392ae081","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"    if values[\u0027result\u0027].lower() \u003d\u003d \u0027error\u0027:"},{"line_number":6328,"context_line":"        action.update({\u0027message\u0027: \u0027Error\u0027})"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"    # Update action updated_at."},{"line_number":6331,"context_line":"    action.update({\u0027updated_at\u0027: values[\u0027finish_time\u0027]})"},{"line_number":6332,"context_line":"    action.save(context.session)"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"    return event_ref"},{"line_number":6335,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_8c0c9994","line":6332,"range":{"start_line":6330,"start_character":0,"end_line":6332,"end_character":32},"in_reply_to":"df87a7cf_a6d2decf","updated":"2017-12-11 13:33:45.000000000","message":"http://paste.openstack.org/show/628609\n\nI dump the sql using connection_debug \u003d 100 from api and cond, I noticed that the update order of event_ref and action in transaction is unstable.\n\nMaybe it\u0027s the reason of deadlock.:(\n\nBut I don\u0027t know how to address this problem. T_T","commit_id":"0faad21bd5581dc1bd80da9ed769bfd96b76bc19"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"922b1b6081f5ab52e7d3899d74769dff6b073f85","unresolved":false,"context_lines":[{"line_number":6275,"context_line":"    if not action and not context.project_id:"},{"line_number":6276,"context_line":"        action \u003d _action_get_last_created_by_instance_uuid("},{"line_number":6277,"context_line":"            context, values[\u0027instance_uuid\u0027])"},{"line_number":6278,"context_line":"        # If we couldn\u0027t find an action by the request_id, we don\u0027t want to"},{"line_number":6279,"context_line":"        # update this action since it likely represents an inactive action."},{"line_number":6280,"context_line":"        update_action \u003d False"},{"line_number":6281,"context_line":""},{"line_number":6282,"context_line":"    if not action:"},{"line_number":6283,"context_line":"        raise exception.InstanceActionNotFound("}],"source_content_type":"text/x-python","patch_set":16,"id":"df87a7cf_320c9041","line":6280,"range":{"start_line":6278,"start_character":0,"end_line":6280,"end_character":29},"updated":"2017-12-13 10:55:24.000000000","message":"If we don\u0027t want to update the action in this case then why we connect a new event to this action below a L6287?","commit_id":"1a4ae60e1b48efb3d80cd36a285eda7ef5620f12"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9a5f764548ac410fbfa8c17ef3f958fbe36e11f","unresolved":false,"context_lines":[{"line_number":6275,"context_line":"    if not action and not context.project_id:"},{"line_number":6276,"context_line":"        action \u003d _action_get_last_created_by_instance_uuid("},{"line_number":6277,"context_line":"            context, values[\u0027instance_uuid\u0027])"},{"line_number":6278,"context_line":"        # If we couldn\u0027t find an action by the request_id, we don\u0027t want to"},{"line_number":6279,"context_line":"        # update this action since it likely represents an inactive action."},{"line_number":6280,"context_line":"        update_action \u003d False"},{"line_number":6281,"context_line":""},{"line_number":6282,"context_line":"    if not action:"},{"line_number":6283,"context_line":"        raise exception.InstanceActionNotFound("}],"source_content_type":"text/x-python","patch_set":16,"id":"df87a7cf_3846aa51","line":6280,"range":{"start_line":6278,"start_character":0,"end_line":6280,"end_character":29},"in_reply_to":"df87a7cf_320c9041","updated":"2017-12-13 14:09:58.000000000","message":"That\u0027s just the way this has always worked per the comment above about inst_host. Personally I don\u0027t think it makes a lot of sense but someone probably added it to get around InstanceActionNotFound errors in periodic tasks and init_host. I think a better solution would be to handle the not found in the calling code (which might be a decorator) and figure out if it should be ignored or reraised. But that\u0027s a more complicated change than what we want to do in this series.","commit_id":"1a4ae60e1b48efb3d80cd36a285eda7ef5620f12"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"922b1b6081f5ab52e7d3899d74769dff6b073f85","unresolved":false,"context_lines":[{"line_number":6298,"context_line":"    return event_ref"},{"line_number":6299,"context_line":""},{"line_number":6300,"context_line":""},{"line_number":6301,"context_line":"# NOTE: We need the retry_on_deadlock decorator for cases like resize where"},{"line_number":6302,"context_line":"# a lot of events are happening at once between multiple hosts trying to"},{"line_number":6303,"context_line":"# update the same action record in a small time window."},{"line_number":6304,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003d5, retry_on_deadlock\u003dTrue)"},{"line_number":6305,"context_line":"@pick_context_manager_writer"},{"line_number":6306,"context_line":"def action_event_finish(context, values):"}],"source_content_type":"text/x-python","patch_set":16,"id":"df87a7cf_952546ae","line":6303,"range":{"start_line":6301,"start_character":0,"end_line":6303,"end_character":55},"updated":"2017-12-13 10:55:24.000000000","message":"Is this congestion only affects action_event_finish but not action_event_start?","commit_id":"1a4ae60e1b48efb3d80cd36a285eda7ef5620f12"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9a5f764548ac410fbfa8c17ef3f958fbe36e11f","unresolved":false,"context_lines":[{"line_number":6298,"context_line":"    return event_ref"},{"line_number":6299,"context_line":""},{"line_number":6300,"context_line":""},{"line_number":6301,"context_line":"# NOTE: We need the retry_on_deadlock decorator for cases like resize where"},{"line_number":6302,"context_line":"# a lot of events are happening at once between multiple hosts trying to"},{"line_number":6303,"context_line":"# update the same action record in a small time window."},{"line_number":6304,"context_line":"@oslo_db_api.wrap_db_retry(max_retries\u003d5, retry_on_deadlock\u003dTrue)"},{"line_number":6305,"context_line":"@pick_context_manager_writer"},{"line_number":6306,"context_line":"def action_event_finish(context, values):"}],"source_content_type":"text/x-python","patch_set":16,"id":"df87a7cf_b8739ab1","line":6303,"range":{"start_line":6301,"start_character":0,"end_line":6303,"end_character":55},"in_reply_to":"df87a7cf_952546ae","updated":"2017-12-13 14:09:58.000000000","message":"Yes, because the finish gets called when wrap_instance_event context managers in the compute manager code exit, which we could have several of those in short order, but we should only have one start to create the event. We could add the decorator to the start method later if we find that it\u0027s a problem, but when this was failing in CI before we added this, it was only on the finish method.","commit_id":"1a4ae60e1b48efb3d80cd36a285eda7ef5620f12"}],"nova/objects/instance_action.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"922b1b6081f5ab52e7d3899d74769dff6b073f85","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                  \u0027project_id\u0027: context.project_id,"},{"line_number":57,"context_line":"                  \u0027action\u0027: action_name,"},{"line_number":58,"context_line":"                  \u0027start_time\u0027: context.timestamp,"},{"line_number":59,"context_line":"                  \u0027updated_at\u0027: context.timestamp}"},{"line_number":60,"context_line":"        return values"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"df87a7cf_95f6a6f9","line":59,"updated":"2017-12-13 10:55:24.000000000","message":"The updated_at field in TimestampMixin defined as\n\n    updated_at \u003d Column(DateTime, onupdate\u003dlambda: timeutils.utcnow())\n\nSo I\u0027m wondering that defining the value directly here to context.timestamp will be really persisted or the onupdate\u0027s utcnow() call will overwrite this value to the actual time.\n\n...\n\nI tried it out and it seems that the defined value has precedence over the onupdate call so we are safe here.","commit_id":"1a4ae60e1b48efb3d80cd36a285eda7ef5620f12"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":3964,"context_line":"            \u0027request_id\u0027: ctxt.request_id,"},{"line_number":3965,"context_line":"            \u0027user_id\u0027: ctxt.user_id,"},{"line_number":3966,"context_line":"            \u0027project_id\u0027: ctxt.project_id,"},{"line_number":3967,"context_line":"            \u0027start_time\u0027: timeutils.utcnow(),"},{"line_number":3968,"context_line":"            \u0027message\u0027: \u0027action-message\u0027"},{"line_number":3969,"context_line":"        }"},{"line_number":3970,"context_line":"        if extra is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_5fe599db","line":3967,"updated":"2017-11-30 22:12:04.000000000","message":"To match what the object is doing, we should included updated_at here, correct?","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":3964,"context_line":"            \u0027request_id\u0027: ctxt.request_id,"},{"line_number":3965,"context_line":"            \u0027user_id\u0027: ctxt.user_id,"},{"line_number":3966,"context_line":"            \u0027project_id\u0027: ctxt.project_id,"},{"line_number":3967,"context_line":"            \u0027start_time\u0027: timeutils.utcnow(),"},{"line_number":3968,"context_line":"            \u0027message\u0027: \u0027action-message\u0027"},{"line_number":3969,"context_line":"        }"},{"line_number":3970,"context_line":"        if extra is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_7d4adb27","line":3967,"in_reply_to":"ff82abbf_5fe599db","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":4297,"context_line":""},{"line_number":4298,"context_line":"    def test_instance_action_updated_with_event_start_and_finish_action(self):"},{"line_number":4299,"context_line":"        uuid \u003d uuidsentinel.uuid1"},{"line_number":4300,"context_line":"        db.action_start(self.ctxt, self._create_action_values(uuid))"},{"line_number":4301,"context_line":"        event_values \u003d self._create_event_values(uuid)"},{"line_number":4302,"context_line":"        # event start action"},{"line_number":4303,"context_line":"        time_start \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d5)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_bf2e25f8","line":4300,"updated":"2017-11-30 22:12:04.000000000","message":"Shouldn\u0027t we assert that updated_at is not None once the action is created, since we weren\u0027t doing that before? The InstanceAction object passes down updated_at which is context.timestamp.","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":4297,"context_line":""},{"line_number":4298,"context_line":"    def test_instance_action_updated_with_event_start_and_finish_action(self):"},{"line_number":4299,"context_line":"        uuid \u003d uuidsentinel.uuid1"},{"line_number":4300,"context_line":"        db.action_start(self.ctxt, self._create_action_values(uuid))"},{"line_number":4301,"context_line":"        event_values \u003d self._create_event_values(uuid)"},{"line_number":4302,"context_line":"        # event start action"},{"line_number":4303,"context_line":"        time_start \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d5)"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_9dd79fc0","line":4300,"in_reply_to":"ff82abbf_bf2e25f8","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":4300,"context_line":"        db.action_start(self.ctxt, self._create_action_values(uuid))"},{"line_number":4301,"context_line":"        event_values \u003d self._create_event_values(uuid)"},{"line_number":4302,"context_line":"        # event start action"},{"line_number":4303,"context_line":"        time_start \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d5)"},{"line_number":4304,"context_line":"        event_values[\u0027start_time\u0027] \u003d time_start"},{"line_number":4305,"context_line":"        db.action_event_start(self.ctxt, event_values)"},{"line_number":4306,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_3fcc5560","line":4303,"updated":"2017-11-30 22:12:04.000000000","message":"Why would the event start 5 seconds before the action was created? That doesn\u0027t make sense.\n\nMaybe do +5 seconds to start, and +10 seconds to finish.","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":4300,"context_line":"        db.action_start(self.ctxt, self._create_action_values(uuid))"},{"line_number":4301,"context_line":"        event_values \u003d self._create_event_values(uuid)"},{"line_number":4302,"context_line":"        # event start action"},{"line_number":4303,"context_line":"        time_start \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d5)"},{"line_number":4304,"context_line":"        event_values[\u0027start_time\u0027] \u003d time_start"},{"line_number":4305,"context_line":"        db.action_event_start(self.ctxt, event_values)"},{"line_number":4306,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_3de453ac","line":4303,"in_reply_to":"ff82abbf_3fcc5560","updated":"2017-12-04 02:17:58.000000000","message":"Yes, will udpate","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":4305,"context_line":"        db.action_event_start(self.ctxt, event_values)"},{"line_number":4306,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"},{"line_number":4307,"context_line":"                                             self.ctxt.request_id)"},{"line_number":4308,"context_line":"        self.assertEqual(time_start.isoformat(),"},{"line_number":4309,"context_line":"                         action[\u0027updated_at\u0027].isoformat())"},{"line_number":4310,"context_line":"        # event finish action"},{"line_number":4311,"context_line":"        time_finish \u003d timeutils.utcnow() + datetime.timedelta(seconds\u003d5)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_1f3dd12b","line":4308,"updated":"2017-11-30 22:12:04.000000000","message":"Shouldn\u0027t we also assert that the action.updated_at is \u003e the original action.updated_at?","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":4305,"context_line":"        db.action_event_start(self.ctxt, event_values)"},{"line_number":4306,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"},{"line_number":4307,"context_line":"                                             self.ctxt.request_id)"},{"line_number":4308,"context_line":"        self.assertEqual(time_start.isoformat(),"},{"line_number":4309,"context_line":"                         action[\u0027updated_at\u0027].isoformat())"},{"line_number":4310,"context_line":"        # event finish action"},{"line_number":4311,"context_line":"        time_finish \u003d timeutils.utcnow() + datetime.timedelta(seconds\u003d5)"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_fdefcb84","line":4308,"in_reply_to":"ff82abbf_1f3dd12b","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb0be53130bd5f64d6b19dd0831f42f63cc9320b","unresolved":false,"context_lines":[{"line_number":4317,"context_line":"        db.action_event_finish(self.ctxt, event_values)"},{"line_number":4318,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"},{"line_number":4319,"context_line":"                                             self.ctxt.request_id)"},{"line_number":4320,"context_line":"        self.assertEqual(time_finish.isoformat(),"},{"line_number":4321,"context_line":"                         action[\u0027updated_at\u0027].isoformat())"},{"line_number":4322,"context_line":""},{"line_number":4323,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_9f1241b4","line":4320,"updated":"2017-11-30 22:12:04.000000000","message":"Same, the action.updated_at should be \u003e the event start time \u003e the action create time.","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f5b95984e2df0b7f8b8e66fabfd91279d7937abe","unresolved":false,"context_lines":[{"line_number":4317,"context_line":"        db.action_event_finish(self.ctxt, event_values)"},{"line_number":4318,"context_line":"        action \u003d db.action_get_by_request_id(self.ctxt, uuid,"},{"line_number":4319,"context_line":"                                             self.ctxt.request_id)"},{"line_number":4320,"context_line":"        self.assertEqual(time_finish.isoformat(),"},{"line_number":4321,"context_line":"                         action[\u0027updated_at\u0027].isoformat())"},{"line_number":4322,"context_line":""},{"line_number":4323,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_bde94381","line":4320,"in_reply_to":"ff82abbf_9f1241b4","updated":"2017-12-04 02:17:58.000000000","message":"Done","commit_id":"6cbfa2dba3947b592949d3c7f3437e338a477903"}]}
