)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"5f1beacc678bd8b9dcfa8a5aec2aff14db7d412b","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    if session is None:"},{"line_number":4194,"context_line":"        session \u003d get_session()"},{"line_number":4195,"context_line":""},{"line_number":4196,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":4197,"context_line":"        try:"},{"line_number":4198,"context_line":"            default_group \u003d _security_group_get_by_names(context,"},{"line_number":4199,"context_line":"                                                         session,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba63e191_2b879ad8","side":"PARENT","line":4196,"updated":"2016-01-19 19:43:32.000000000","message":"Can you explain why it\u0027s ok to remove this.  According to the comment on line #1613 doing this in a separate transaction is necessary to safeguard against a race causing a failure.  Is this still taken into account here?","commit_id":"9cd93c4736c8a4de064c9a7d9b21995943d22a37"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"12ad56b8f5a8c69b263737dd4009ebd619f52fca","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    if session is None:"},{"line_number":4194,"context_line":"        session \u003d get_session()"},{"line_number":4195,"context_line":""},{"line_number":4196,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":4197,"context_line":"        try:"},{"line_number":4198,"context_line":"            default_group \u003d _security_group_get_by_names(context,"},{"line_number":4199,"context_line":"                                                         session,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_ad172ea2","side":"PARENT","line":4196,"in_reply_to":"9a68dd71_bc86b511","updated":"2016-01-21 10:31:21.000000000","message":"Pavel, you\u0027ll need either independent() or savepoint() here - https://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/enginefacade.py#L675-L682 to create a separate transaction or make a  savepoint before calling _security_group_ensure(). Otherwise, a duplicate error will leave the transaction unusable until you issue a ROLLBACK explicitly","commit_id":"9cd93c4736c8a4de064c9a7d9b21995943d22a37"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"c24535be56bec0a154d669753cc96423f007dfa8","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    if session is None:"},{"line_number":4194,"context_line":"        session \u003d get_session()"},{"line_number":4195,"context_line":""},{"line_number":4196,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":4197,"context_line":"        try:"},{"line_number":4198,"context_line":"            default_group \u003d _security_group_get_by_names(context,"},{"line_number":4199,"context_line":"                                                         session,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_bc86b511","side":"PARENT","line":4196,"in_reply_to":"ba63e191_2b879ad8","updated":"2016-01-20 14:01:17.000000000","message":"Andrew, good question. Calling rpodolyaka)","commit_id":"9cd93c4736c8a4de064c9a7d9b21995943d22a37"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c0459668f17649dcbee1a5586341cefe01f5322a","unresolved":false,"context_lines":[{"line_number":4187,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":4188,"context_line":""},{"line_number":4189,"context_line":"    try:"},{"line_number":4190,"context_line":"        return _security_group_ensure_default(context)"},{"line_number":4191,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4192,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"},{"line_number":4193,"context_line":"        # suppress the error and proceed"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_95825aff","line":4190,"updated":"2016-01-21 16:49:18.000000000","message":"I\u0027m really sorry for pointing you to the wrong direction:  I just remembered the last time we tried to refactor this using savepoints - please see my comment to https://review.openstack.org/#/c/136409/\n\nWe\u0027ll need to use an independent transaction here instead of a savepoint, otherwise there might be a problem with REPEATABLE READ, when we won\u0027t see a new entry in the corner case.","commit_id":"a16e1dacac7a3cabd40c2ed3976be99fd859a163"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":1610,"context_line":"    values - dict containing column values."},{"line_number":1611,"context_line":"    \"\"\""},{"line_number":1612,"context_line":""},{"line_number":1613,"context_line":"    # NOTE(rpodolyaka): create the default security group, if it doesn\u0027t exist."},{"line_number":1614,"context_line":"    # This must be done in a separate transaction, so that this one is not"},{"line_number":1615,"context_line":"    # aborted in case a concurrent one succeeds first and the unique constraint"},{"line_number":1616,"context_line":"    # for security group names is violated by a concurrent INSERT"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_3ca33251","line":1613,"updated":"2016-01-22 09:56:01.000000000","message":"let\u0027s move this comment to security_group_ensure_default() where independent() will be used","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":1610,"context_line":"    values - dict containing column values."},{"line_number":1611,"context_line":"    \"\"\""},{"line_number":1612,"context_line":""},{"line_number":1613,"context_line":"    # NOTE(rpodolyaka): create the default security group, if it doesn\u0027t exist."},{"line_number":1614,"context_line":"    # This must be done in a separate transaction, so that this one is not"},{"line_number":1615,"context_line":"    # aborted in case a concurrent one succeeds first and the unique constraint"},{"line_number":1616,"context_line":"    # for security group names is violated by a concurrent INSERT"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_a61b8872","line":1613,"in_reply_to":"9a68dd71_3ca33251","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4036,"context_line":"    security_group_ref.rules"},{"line_number":4037,"context_line":"    security_group_ref.update(values)"},{"line_number":4038,"context_line":"    try:"},{"line_number":4039,"context_line":"        with main_context_manager.writer.savepoint.using(context):"},{"line_number":4040,"context_line":"            security_group_ref.save(context.session)"},{"line_number":4041,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":4042,"context_line":"        raise exception.SecurityGroupExists("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_dc03f640","line":4039,"updated":"2016-01-22 09:56:01.000000000","message":"we handle this up the stack, so this must not be needed as of now, but it must not harm either, especially if we decide reuse this method in new places in the code later","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4036,"context_line":"    security_group_ref.rules"},{"line_number":4037,"context_line":"    security_group_ref.update(values)"},{"line_number":4038,"context_line":"    try:"},{"line_number":4039,"context_line":"        with main_context_manager.writer.savepoint.using(context):"},{"line_number":4040,"context_line":"            security_group_ref.save(context.session)"},{"line_number":4041,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":4042,"context_line":"        raise exception.SecurityGroupExists("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_6bc9d925","line":4039,"in_reply_to":"9a68dd71_dc03f640","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    return security_group_ref"},{"line_number":4194,"context_line":""},{"line_number":4195,"context_line":""},{"line_number":4196,"context_line":"@main_context_manager.writer"},{"line_number":4197,"context_line":"def security_group_ensure_default(context):"},{"line_number":4198,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":4199,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_5c05c677","line":4196,"updated":"2016-01-22 09:56:01.000000000","message":"let\u0027s remove this","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    return security_group_ref"},{"line_number":4194,"context_line":""},{"line_number":4195,"context_line":""},{"line_number":4196,"context_line":"@main_context_manager.writer"},{"line_number":4197,"context_line":"def security_group_ensure_default(context):"},{"line_number":4198,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":4199,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_eb04e94a","line":4196,"in_reply_to":"9a68dd71_5c05c677","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4198,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":4199,"context_line":""},{"line_number":4200,"context_line":"    try:"},{"line_number":4201,"context_line":"        return _security_group_ensure_default(context)"},{"line_number":4202,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4203,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"},{"line_number":4204,"context_line":"        # suppress the error and proceed"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_7c08ca91","line":4201,"updated":"2016-01-22 09:56:01.000000000","message":"call this within the context of independent()","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4198,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":4199,"context_line":""},{"line_number":4200,"context_line":"    try:"},{"line_number":4201,"context_line":"        return _security_group_ensure_default(context)"},{"line_number":4202,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4203,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"},{"line_number":4204,"context_line":"        # suppress the error and proceed"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_4bebb578","line":4201,"in_reply_to":"9a68dd71_7c08ca91","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4202,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4203,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"},{"line_number":4204,"context_line":"        # suppress the error and proceed"},{"line_number":4205,"context_line":"        return security_group_get_by_name(context, context.project_id,"},{"line_number":4206,"context_line":"                                          \u0027default\u0027)"},{"line_number":4207,"context_line":""},{"line_number":4208,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_3c025270","line":4205,"updated":"2016-01-22 09:56:01.000000000","message":"and this within the context of reader()","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4202,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4203,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"},{"line_number":4204,"context_line":"        # suppress the error and proceed"},{"line_number":4205,"context_line":"        return security_group_get_by_name(context, context.project_id,"},{"line_number":4206,"context_line":"                                          \u0027default\u0027)"},{"line_number":4207,"context_line":""},{"line_number":4208,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_4ba2d54c","line":4205,"in_reply_to":"9a68dd71_3c025270","updated":"2016-01-22 13:10:15.000000000","message":"this method is already reader","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4206,"context_line":"                                          \u0027default\u0027)"},{"line_number":4207,"context_line":""},{"line_number":4208,"context_line":""},{"line_number":4209,"context_line":"def _security_group_ensure_default(context):"},{"line_number":4210,"context_line":"    try:"},{"line_number":4211,"context_line":"        default_group \u003d _security_group_get_by_names(context,"},{"line_number":4212,"context_line":"                                                     context.project_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_5c2ce601","line":4209,"updated":"2016-01-22 09:56:01.000000000","message":"let\u0027s mark this as a potential writer()","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4206,"context_line":"                                          \u0027default\u0027)"},{"line_number":4207,"context_line":""},{"line_number":4208,"context_line":""},{"line_number":4209,"context_line":"def _security_group_ensure_default(context):"},{"line_number":4210,"context_line":"    try:"},{"line_number":4211,"context_line":"        default_group \u003d _security_group_get_by_names(context,"},{"line_number":4212,"context_line":"                                                     context.project_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_ab2d91a9","line":4209,"in_reply_to":"9a68dd71_5c2ce601","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efaf50d0b45cc28dfd701c4b131d4d3dde7110ca","unresolved":false,"context_lines":[{"line_number":4212,"context_line":"                                                     context.project_id,"},{"line_number":4213,"context_line":"                                                     [\u0027default\u0027])[0]"},{"line_number":4214,"context_line":"    except exception.NotFound:"},{"line_number":4215,"context_line":"        with main_context_manager.writer.savepoint.using(context):"},{"line_number":4216,"context_line":"            values \u003d {\u0027name\u0027: \u0027default\u0027,"},{"line_number":4217,"context_line":"                      \u0027description\u0027: \u0027default\u0027,"},{"line_number":4218,"context_line":"                      \u0027user_id\u0027: context.user_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_bcee42b2","line":4215,"updated":"2016-01-22 09:56:01.000000000","message":"let\u0027s remove this","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"ebe78a47e9a62c95661540cc8347cdc1f1a92015","unresolved":false,"context_lines":[{"line_number":4212,"context_line":"                                                     context.project_id,"},{"line_number":4213,"context_line":"                                                     [\u0027default\u0027])[0]"},{"line_number":4214,"context_line":"    except exception.NotFound:"},{"line_number":4215,"context_line":"        with main_context_manager.writer.savepoint.using(context):"},{"line_number":4216,"context_line":"            values \u003d {\u0027name\u0027: \u0027default\u0027,"},{"line_number":4217,"context_line":"                      \u0027description\u0027: \u0027default\u0027,"},{"line_number":4218,"context_line":"                      \u0027user_id\u0027: context.user_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_e6150040","line":4215,"in_reply_to":"9a68dd71_bcee42b2","updated":"2016-01-22 13:10:15.000000000","message":"Done","commit_id":"d630f75947e9db3185e4169229b97b5fd3c3a170"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e386ee8b4336ac14fea5a831f3e6d4e318271757","unresolved":false,"context_lines":[{"line_number":4194,"context_line":"        # this one is not aborted in case a concurrent one succeeds first"},{"line_number":4195,"context_line":"        # and the unique constraint for security group names is violated"},{"line_number":4196,"context_line":"        # by a concurrent INSERT"},{"line_number":4197,"context_line":"        with main_context_manager.writer.independent.using(context):"},{"line_number":4198,"context_line":"            return _security_group_ensure_default(context)"},{"line_number":4199,"context_line":"    except exception.SecurityGroupExists:"},{"line_number":4200,"context_line":"        # NOTE(rpodolyaka): a concurrent transaction has succeeded first,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_a256dd59","line":4197,"updated":"2016-01-24 15:25:37.000000000","message":"Nice.","commit_id":"8b352091df70152c40004b306354edae6a4094d1"}]}
