)]}'
{"neutron/db/sqlalchemyutils.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"0772dc5050e69483db64aeea65e80f4d6d4ac929","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return query"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_mysql_session_tx_isolation(session):"},{"line_number":113,"context_line":"    sql \u003d \"SELECT @@tx_isolation;\""},{"line_number":114,"context_line":"    res \u003d session.connection().execute(sql)"},{"line_number":115,"context_line":"    # the result is not a list, so not directly indexable"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_caa6720f","line":112,"updated":"2015-01-20 05:09:44.000000000","message":"Why is this method reimplementing engine.dialect.get_isolation_level()?  Is sqlalchemy\u0027s way of doing it not compatible with your intent?  If so, that should probably be documented here.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"69b519ab701bad703632c9fdba8630f7915e4e5d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return query"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_mysql_session_tx_isolation(session):"},{"line_number":113,"context_line":"    sql \u003d \"SELECT @@tx_isolation;\""},{"line_number":114,"context_line":"    res \u003d session.connection().execute(sql)"},{"line_number":115,"context_line":"    # the result is not a list, so not directly indexable"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_05477a7b","line":112,"in_reply_to":"3a961159_53579a27","updated":"2015-01-20 15:18:15.000000000","message":"it would not have to be another connection, since the DBAPI connection is also a publicly accessible (and documented) member of Connection:\n\nhttp://docs.sqlalchemy.org/en/rel_0_9/core/connections.html?highlight\u003dconnection#sqlalchemy.engine.Connection.connection\n\nas far as why this is missed I can theorize that this isn\u0027t mentioned in the section \"Working with Raw DBAPI Connections\" which could be misleading.  I will edit that now.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"4ed818a156f25db4249b0a392305342a8e5cd819","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return query"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_mysql_session_tx_isolation(session):"},{"line_number":113,"context_line":"    sql \u003d \"SELECT @@tx_isolation;\""},{"line_number":114,"context_line":"    res \u003d session.connection().execute(sql)"},{"line_number":115,"context_line":"    # the result is not a list, so not directly indexable"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_53579a27","line":112,"in_reply_to":"3a961159_caa6720f","updated":"2015-01-20 07:48:12.000000000","message":"As I commented in the other patch:\n\ndialect.get_isolation_level requires raw_connection that could be created using engine.raw_connection() - it would be just other connection than we use to run transaction in, so we might not retrieve correct isolation level.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"0772dc5050e69483db64aeea65e80f4d6d4ac929","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":126,"context_line":"        previous_level \u003d get_mysql_session_tx_isolation(session)"},{"line_number":127,"context_line":"        if level !\u003d previous_level:"},{"line_number":128,"context_line":"            session.connection().execution_options("},{"line_number":129,"context_line":"                isolation_level\u003dlevel)"},{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_2ab53632","line":128,"updated":"2015-01-20 05:09:44.000000000","message":"Please document why engine.dialect.set_isolation_level() is not compatible with your intent.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"45743994bca48fcf2e5926abcf572cb2dacc2516","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":126,"context_line":"        previous_level \u003d get_mysql_session_tx_isolation(session)"},{"line_number":127,"context_line":"        if level !\u003d previous_level:"},{"line_number":128,"context_line":"            session.connection().execution_options("},{"line_number":129,"context_line":"                isolation_level\u003dlevel)"},{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f7977c9a","line":128,"in_reply_to":"3a961159_05921afc","updated":"2015-01-20 17:04:52.000000000","message":"Ok, thanks for pointing out","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"a1ef67f88e753462dc0a2f9a322861277dfda626","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":126,"context_line":"        previous_level \u003d get_mysql_session_tx_isolation(session)"},{"line_number":127,"context_line":"        if level !\u003d previous_level:"},{"line_number":128,"context_line":"            session.connection().execution_options("},{"line_number":129,"context_line":"                isolation_level\u003dlevel)"},{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_4408b22e","line":128,"in_reply_to":"3a961159_2ab53632","updated":"2015-01-20 09:52:44.000000000","message":"Done","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"085c2dc21743a06b0efd7ec6464c881104975361","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":126,"context_line":"        previous_level \u003d get_mysql_session_tx_isolation(session)"},{"line_number":127,"context_line":"        if level !\u003d previous_level:"},{"line_number":128,"context_line":"            session.connection().execution_options("},{"line_number":129,"context_line":"                isolation_level\u003dlevel)"},{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ba008a01","line":128,"in_reply_to":"3a961159_4408b22e","updated":"2015-01-20 11:39:36.000000000","message":"I dug into sqlalchemy code and docs, it appeared that everything related to engine.dialect is an undocumented (or poorly documented) implementation detail and its usage should be avoided IMO.\n\nI don\u0027t think it worth mentioning it in the comments here, because \nexecution_options is recommended way of changing isolation level per sqlalchemy docs: http://docs.sqlalchemy.org/en/rel_0_8/core/connections.html","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"69b519ab701bad703632c9fdba8630f7915e4e5d","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":126,"context_line":"        previous_level \u003d get_mysql_session_tx_isolation(session)"},{"line_number":127,"context_line":"        if level !\u003d previous_level:"},{"line_number":128,"context_line":"            session.connection().execution_options("},{"line_number":129,"context_line":"                isolation_level\u003dlevel)"},{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_05921afc","line":128,"in_reply_to":"3a961159_ba008a01","updated":"2015-01-20 15:18:15.000000000","message":"you don\u0027t need to get the isolation level here, but it is a public, documented method:  http://docs.sqlalchemy.org/en/rel_0_9/core/internals.html?highlight\u003dget_isolation_level#sqlalchemy.engine.interfaces.Dialect.get_isolation_level","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"0772dc5050e69483db64aeea65e80f4d6d4ac929","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":132,"context_line":"        session.connection().execution_options("},{"line_number":133,"context_line":"            isolation_level\u003dget_mysql_session_tx_isolation(session))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_aa1cc667","line":133,"updated":"2015-01-20 05:09:44.000000000","message":"I\u0027m assuming your intent was isolation_level\u003dprevious_level?","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"69b519ab701bad703632c9fdba8630f7915e4e5d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":132,"context_line":"        session.connection().execution_options("},{"line_number":133,"context_line":"            isolation_level\u003dget_mysql_session_tx_isolation(session))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_c51c92c5","line":133,"in_reply_to":"3a961159_64fbee48","updated":"2015-01-20 15:18:15.000000000","message":"here are the docs:\n\nhttp://docs.sqlalchemy.org/en/rel_0_9/core/connections.html?highlight\u003dexecution_options#sqlalchemy.engine.Connection.execution_options.params.isolation_level\n\n\u003e Available on: Connection. Set the transaction isolation level for the lifespan of this connection. Valid values include those string values accepted by the isolation_level parameter passed to create_engine(), and are database specific, including those for SQLite, PostgreSQL - see those dialect’s documentation for further info.\n\n\u003e  Note that this option necessarily affects the underlying DBAPI connection for the lifespan of the originating Connection, and is not per-execution. This setting is not removed until the underlying DBAPI connection is returned to the connection pool, i.e. the Connection.close() method is called.\n\nThe fact that the isolation level is reset is stated within this documentation section twice.    I will make the change now to ensure that the word \"connection\" in \"lifespan of this connection\" is a hyperlink to the sqlalchemy Connection and add an extra qualifier regarding DBAPI connection.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"4ed818a156f25db4249b0a392305342a8e5cd819","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":132,"context_line":"        session.connection().execution_options("},{"line_number":133,"context_line":"            isolation_level\u003dget_mysql_session_tx_isolation(session))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f337a6fc","line":133,"in_reply_to":"3a961159_aa1cc667","updated":"2015-01-20 07:48:12.000000000","message":"doh! correct","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"fd3993f23ea3b77eec060df8d4c6fe19c093fb2e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":132,"context_line":"        session.connection().execution_options("},{"line_number":133,"context_line":"            isolation_level\u003dget_mysql_session_tx_isolation(session))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_aba837da","line":133,"in_reply_to":"3a961159_c51c92c5","updated":"2015-01-20 15:38:27.000000000","message":"Right, that\u0027s the docs i\u0027m referring to, what is unclear to me here is at which point session checks out new connection from the pool. (I mean I have to look at sqlalchemy code to know that, not docs)\nWhether execution_options should be called before starting a transaction or after (within), should the level be reset or not.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"a1ef67f88e753462dc0a2f9a322861277dfda626","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    yield"},{"line_number":131,"context_line":"    if engine.name \u003d\u003d \"mysql\":"},{"line_number":132,"context_line":"        session.connection().execution_options("},{"line_number":133,"context_line":"            isolation_level\u003dget_mysql_session_tx_isolation(session))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_64fbee48","line":133,"in_reply_to":"3a961159_f337a6fc","updated":"2015-01-20 09:52:44.000000000","message":"going again over the logic and why the test didn\u0027t catch this obvious logical mistake, it appears that isolation level for transactions is automatically reset by sqlalchemy when connection is returned to connection pool.\nThat happens after transaction commit/rollback.\n\nSo I think it makes sense to remove \u0027resetting logic\u0027. It\u0027s quite poorly documented on sqlalchemy side, so I\u0027ll add a comment here.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"da93493f25ebf3f238d0b6812fa6526c88f76af3","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        session \u003d context.session"},{"line_number":542,"context_line":"        with contextlib.nested("},{"line_number":543,"context_line":"            session.begin(subtransactions\u003dTrue),"},{"line_number":544,"context_line":"            sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")"},{"line_number":545,"context_line":"        ):"},{"line_number":546,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":547,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b705037b","line":544,"updated":"2015-01-20 11:27:48.000000000","message":"This will COMMIT the already started transaction.\nUsing subtransactions\u003dTrue here is confusing, maybe even wrong.\n\n\nhttps://github.com/zzzeek/sqlalchemy/blob/28d0b8d1d1b135c2d6974f4d31e56b8d49c8ef09/lib/sqlalchemy/dialects/mysql/base.py#L2394\n\n  File \"/opt/stack/new/neutron/neutron/plugins/ml2/plugin.py\", line 544, in _create_network_db\n    sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")\n  File \"/usr/lib64/python2.7/contextlib.py\", line 17, in __enter__\n    return self.gen.next()\n  File \"/usr/lib64/python2.7/contextlib.py\", line 112, in nested\n    vars.append(enter())\n  File \"/usr/lib64/python2.7/contextlib.py\", line 17, in __enter__\n    return self.gen.next()\n  File \"/opt/stack/new/neutron/neutron/db/sqlalchemyutils.py\", line 129, in set_mysql_tx_isolation_level\n    isolation_level\u003dlevel)\n  File \"/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py\", line 213, in execution_options\n    self.dialect.set_connection_execution_options(c, opt)\n  File \"/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py\", line 395, in set_connection_execution_options\n    self._set_connection_isolation(connection, opts[\u0027isolation_level\u0027])\n  File \"/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py\", line 398, in _set_connection_isolation\n    self.set_isolation_level(connection.connection, level)\n  File \"/usr/lib64/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py\", line 2323, in set_isolation_level\n    tb \u003d traceback.format_stack()","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"173cfeabe0a768a3c6662d0a2385e131ce6617f4","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        session \u003d context.session"},{"line_number":542,"context_line":"        with contextlib.nested("},{"line_number":543,"context_line":"            session.begin(subtransactions\u003dTrue),"},{"line_number":544,"context_line":"            sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")"},{"line_number":545,"context_line":"        ):"},{"line_number":546,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":547,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_eb6f9f5e","line":544,"in_reply_to":"3a961159_48a279fd","updated":"2015-01-20 15:47:56.000000000","message":"That\u0027s interesting. Why? Do you have ML or blog post about getting rid of that pattern?\n\nCould you comment on afazekas\u0027s comment regarding COMMIT?\nIndeed COMMIT is issued, but why? Should then changing isolation level moved outside of transaction?","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"085c2dc21743a06b0efd7ec6464c881104975361","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        session \u003d context.session"},{"line_number":542,"context_line":"        with contextlib.nested("},{"line_number":543,"context_line":"            session.begin(subtransactions\u003dTrue),"},{"line_number":544,"context_line":"            sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")"},{"line_number":545,"context_line":"        ):"},{"line_number":546,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":547,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_daac768b","line":544,"in_reply_to":"3a961159_b705037b","updated":"2015-01-20 11:39:36.000000000","message":"No. that doesn\u0027t commit started transaction.\nConnection object commits started transaction, not cursor object.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"69b519ab701bad703632c9fdba8630f7915e4e5d","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        session \u003d context.session"},{"line_number":542,"context_line":"        with contextlib.nested("},{"line_number":543,"context_line":"            session.begin(subtransactions\u003dTrue),"},{"line_number":544,"context_line":"            sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")"},{"line_number":545,"context_line":"        ):"},{"line_number":546,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":547,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_48a279fd","line":544,"in_reply_to":"3a961159_daac768b","updated":"2015-01-20 15:18:15.000000000","message":"note that the entire Openstack pattern of using \"begin(subtransactions\u003dTrue)\" is something I am working hard to get rid of, via the enginefacade system of maintaining connectivity state.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"70647ade3781791dad350471c7bb36eae643ec40","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        session \u003d context.session"},{"line_number":542,"context_line":"        with contextlib.nested("},{"line_number":543,"context_line":"            session.begin(subtransactions\u003dTrue),"},{"line_number":544,"context_line":"            sqla.set_mysql_tx_isolation_level(session, \"READ COMMITTED\")"},{"line_number":545,"context_line":"        ):"},{"line_number":546,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":547,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_17332814","line":544,"in_reply_to":"3a961159_eb6f9f5e","updated":"2015-01-20 17:24:14.000000000","message":"So regarding afazekas\u0027s comment: i\u0027ve tested \u0027transactionnes\u0027 of the code block, despite COMMIT statement is really issued here, logic works as expected: transaction is committed or rolled back on error always leaving DB in consistent state.\n\nI\u0027d be glad to see Michael\u0027s comment on that. But so far I think there is no issues with this approach.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"}],"neutron/tests/functional/db/test_sqla_utils.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"0772dc5050e69483db64aeea65e80f4d6d4ac929","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        cfg.CONF.set_override(\u0027connection\u0027,"},{"line_number":34,"context_line":"                              self.engine.url,"},{"line_number":35,"context_line":"                              group\u003d\u0027database\u0027)"},{"line_number":36,"context_line":"        api._FACADE \u003d None"},{"line_number":37,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ea0ece32","line":36,"updated":"2015-01-20 05:09:44.000000000","message":"Ah, module-level variables. :/  If we run into any more problems with this we might need a better abstraction around engine initialization.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"4ed818a156f25db4249b0a392305342a8e5cd819","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        cfg.CONF.set_override(\u0027connection\u0027,"},{"line_number":34,"context_line":"                              self.engine.url,"},{"line_number":35,"context_line":"                              group\u003d\u0027database\u0027)"},{"line_number":36,"context_line":"        api._FACADE \u003d None"},{"line_number":37,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_732bb695","line":36,"in_reply_to":"3a961159_ea0ece32","updated":"2015-01-20 07:48:12.000000000","message":"agree","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"0772dc5050e69483db64aeea65e80f4d6d4ac929","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        api._FACADE \u003d None"},{"line_number":37,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def tearDown(self):"},{"line_number":40,"context_line":"        api._FACADE \u003d None"},{"line_number":41,"context_line":"        super(TestSettingTXIsolationLevel, self).tearDown()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_0f05ec14","line":39,"updated":"2015-01-20 05:09:44.000000000","message":"Please register a cleanup function with addCleanup instead, and avoid using tearDown without good reason.","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"4ed818a156f25db4249b0a392305342a8e5cd819","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        api._FACADE \u003d None"},{"line_number":37,"context_line":"        self.ctx \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def tearDown(self):"},{"line_number":40,"context_line":"        api._FACADE \u003d None"},{"line_number":41,"context_line":"        super(TestSettingTXIsolationLevel, self).tearDown()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b3143e51","line":39,"in_reply_to":"3a961159_0f05ec14","updated":"2015-01-20 07:48:12.000000000","message":"ok","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"c19be8b68e661577e73c78aff0490a2f6c74b545","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                self.ctx.session)"},{"line_number":55,"context_line":"            self.assertEqual(other_level, res)"},{"line_number":56,"context_line":"        #check that context manager changes tx isolation level back"},{"line_number":57,"context_line":"        res \u003d sqlalchemyutils.get_mysql_session_tx_isolation(self.ctx.session)"},{"line_number":58,"context_line":"        self.assertEqual(default_level, res)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_530cfa39","line":57,"updated":"2015-01-20 07:16:27.000000000","message":"It seems the result has nothing to do with these codes under yield:\n\t    yield\t130\n    if engine.name \u003d\u003d \"mysql\":\t131\n        session.connection().execution_options(\t132\n\t\t\t            isolation_level\u003dget_mysql_session_tx_isolation(session))","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"4ed818a156f25db4249b0a392305342a8e5cd819","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                self.ctx.session)"},{"line_number":55,"context_line":"            self.assertEqual(other_level, res)"},{"line_number":56,"context_line":"        #check that context manager changes tx isolation level back"},{"line_number":57,"context_line":"        res \u003d sqlalchemyutils.get_mysql_session_tx_isolation(self.ctx.session)"},{"line_number":58,"context_line":"        self.assertEqual(default_level, res)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_5305da13","line":57,"in_reply_to":"3a961159_530cfa39","updated":"2015-01-20 07:48:12.000000000","message":"what do you mean?","commit_id":"60e9c4c78d104dd8fda7725f7513640173cf3e83"}]}
