)]}'
{"oslo_db/tests/__init__.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"4a54cde057aecd6dc6b471ae71c0908b0c7530d5","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def RunEventletTests():"},{"line_number":20,"context_line":"    return bool(int(os.environ.get(\u0027TEST_EVENTLET\u0027) or \u00270\u0027))"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3afb71cf_269e3607","line":19,"updated":"2015-06-10 22:00:57.000000000","message":"This function is named like a class. Was that intentional?","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"2c38ff46e6adbbd7781db6276110cda363957ba1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def RunEventletTests():"},{"line_number":20,"context_line":"    return bool(int(os.environ.get(\u0027TEST_EVENTLET\u0027) or \u00270\u0027))"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1af86dd1_9daf5394","line":19,"in_reply_to":"3afb71cf_269e3607","updated":"2015-06-12 02:47:21.000000000","message":"I forget ;)\nI\u0027m guessing it was incorrect finger-memory from previous $employer conventions and I\u0027ll change it now ...","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"}],"oslo_db/tests/sqlalchemy/test_async_eventlet.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"4a54cde057aecd6dc6b471ae71c0908b0c7530d5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def test_concurrent_transaction(self):"},{"line_number":49,"context_line":"        # Uncomment to cause sqlalchemy to log executed SQL statements."},{"line_number":50,"context_line":"        # Useful to determine exactly what and when was sent to DB."},{"line_number":51,"context_line":"        # logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def operate_on_row(name, ready\u003dNone, proceed\u003dNone):"},{"line_number":54,"context_line":"            logging.debug(\u0027%s starting\u0027, name)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3afb71cf_e6b37e96","line":51,"updated":"2015-06-10 22:00:57.000000000","message":"Should we leave this enabled and rely on the test fixtures to capture the log output and only show it when the test fails?","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"2c38ff46e6adbbd7781db6276110cda363957ba1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def test_concurrent_transaction(self):"},{"line_number":49,"context_line":"        # Uncomment to cause sqlalchemy to log executed SQL statements."},{"line_number":50,"context_line":"        # Useful to determine exactly what and when was sent to DB."},{"line_number":51,"context_line":"        # logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def operate_on_row(name, ready\u003dNone, proceed\u003dNone):"},{"line_number":54,"context_line":"            logging.debug(\u0027%s starting\u0027, name)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1af86dd1_ac71c2e2","line":51,"in_reply_to":"3afb71cf_e6b37e96","updated":"2015-06-12 02:47:21.000000000","message":"Good suggestion, done.","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"4a54cde057aecd6dc6b471ae71c0908b0c7530d5","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            logging.debug(\u0027%s terminating\u0027, name)"},{"line_number":71,"context_line":"            return True"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if not tests.RunEventletTests():"},{"line_number":74,"context_line":"            return self.skip(\u0027eventlet tests disabled unless TEST_EVENTLET\u003d1\u0027)"},{"line_number":75,"context_line":"        eventlet \u003d importutils.try_import(\u0027eventlet\u0027)"},{"line_number":76,"context_line":"        if eventlet is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3afb71cf_c65c024d","line":73,"updated":"2015-06-10 22:00:57.000000000","message":"I think you\u0027re doing this check here inside the test function so that the eventlet import doesn\u0027t happen unless it\u0027s enabled, but I could be wrong. Either way, could you add a comment about why the skip is here instead of a decorator?","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"2c38ff46e6adbbd7781db6276110cda363957ba1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            logging.debug(\u0027%s terminating\u0027, name)"},{"line_number":71,"context_line":"            return True"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if not tests.RunEventletTests():"},{"line_number":74,"context_line":"            return self.skip(\u0027eventlet tests disabled unless TEST_EVENTLET\u003d1\u0027)"},{"line_number":75,"context_line":"        eventlet \u003d importutils.try_import(\u0027eventlet\u0027)"},{"line_number":76,"context_line":"        if eventlet is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1af86dd1_ac166253","line":73,"in_reply_to":"3afb71cf_c65c024d","updated":"2015-06-12 02:47:21.000000000","message":"Yes the intention is to avoid importing eventlet unless we\u0027re asked to run the eventlet tests.  There\u0027s no reason this couldn\u0027t be a decorator however, and that indeed looks clearer - moved.","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ab52e4365a2009523669e733a143abcd98448892","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"Unit tests for SQLAlchemy and eventlet interaction.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import logging"},{"line_number":19,"context_line":"import unittest2"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_utils import importutils"},{"line_number":22,"context_line":"import sqlalchemy as sa"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_a8cae94d","line":19,"updated":"2015-07-20 08:12:00.000000000","message":"nit: we usually use testtools instead","commit_id":"112aa3dd00551c832d8e74d021ad5f06d39af4b9"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ab52e4365a2009523669e733a143abcd98448892","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        class TmpTable(BASE, models.ModelBase):"},{"line_number":38,"context_line":"            __tablename__ \u003d \u0027test_async_eventlet\u0027"},{"line_number":39,"context_line":"            id \u003d sa.Column(\u0027id\u0027, sa.Integer, primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":40,"context_line":"            foo \u003d sa.Column(\u0027foo\u0027, sa.Integer)"},{"line_number":41,"context_line":"            __table_args__ \u003d ("},{"line_number":42,"context_line":"                sa.UniqueConstraint(\u0027foo\u0027, name\u003d\u0027uniq_foo\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_e8b31109","line":39,"updated":"2015-07-20 08:12:00.000000000","message":"nit: nullable\u003dFalse is redundant here","commit_id":"112aa3dd00551c832d8e74d021ad5f06d39af4b9"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ab52e4365a2009523669e733a143abcd98448892","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self.test_table \u003d TmpTable"},{"line_number":46,"context_line":"        TmpTable.__table__.create(self.engine)"},{"line_number":47,"context_line":"        self.addCleanup(lambda: TmpTable.__table__.drop(self.engine))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @unittest2.skipIf(not tests.should_run_eventlet_tests(),"},{"line_number":50,"context_line":"                      \u0027eventlet tests disabled unless TEST_EVENTLET\u003d1\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_a87c2921","line":47,"updated":"2015-07-20 08:12:00.000000000","message":"nit: you could simply do\n\n  self.addCleanup(TmpTable.__table__.drop, self.engine)","commit_id":"112aa3dd00551c832d8e74d021ad5f06d39af4b9"}],"test-requirements-py2.txt":[{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"234238afc83ec3ed05e0dcefc3daf3b631d77fd9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"coverage\u003e\u003d3.6"},{"line_number":8,"context_line":"discover"},{"line_number":9,"context_line":"doc8  # Apache-2.0"},{"line_number":10,"context_line":"eventlet\u003e\u003d0.13.0"},{"line_number":11,"context_line":"fixtures\u003e\u003d0.3.14"},{"line_number":12,"context_line":"MySQL-python"},{"line_number":13,"context_line":"psycopg2"}],"source_content_type":"text/plain","patch_set":11,"id":"1aca2d91_d60942df","line":10,"updated":"2015-05-06 01:36:14.000000000","message":"Looks like global requirements has:\neventlet\u003e\u003d0.17.3\n\nCan you please use that? http://git.openstack.org/cgit/openstack/requirements/tree/global-requirements.txt#n32","commit_id":"9149fbaf4f84adcb60a4dc0ba2a119b1ff40e3e4"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"da3e00c77385a04223397995161ff6cf82006622","unresolved":false,"context_lines":[{"line_number":7,"context_line":"coverage\u003e\u003d3.6"},{"line_number":8,"context_line":"discover"},{"line_number":9,"context_line":"doc8  # Apache-2.0"},{"line_number":10,"context_line":"eventlet\u003e\u003d0.13.0"},{"line_number":11,"context_line":"fixtures\u003e\u003d0.3.14"},{"line_number":12,"context_line":"MySQL-python"},{"line_number":13,"context_line":"psycopg2"}],"source_content_type":"text/plain","patch_set":11,"id":"1aca2d91_62d868f0","line":10,"in_reply_to":"1aca2d91_d60942df","updated":"2015-05-06 05:49:07.000000000","message":"Done","commit_id":"9149fbaf4f84adcb60a4dc0ba2a119b1ff40e3e4"}],"tests/__init__.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"240228fd2730fcda85bb9ded7a35195aa455ecbb","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if os.environ.get(\u0027TEST_EVENTLET\u0027):"},{"line_number":19,"context_line":"    import eventlet"},{"line_number":20,"context_line":"    eventlet.monkey_patch()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_61bd4b02","line":20,"updated":"2015-01-05 13:35:15.000000000","message":"Should we patch MySQLdb here as well? Something like\n\n eventlet.monkey_patch(MySQLdb\u003dTrue) \n\nSee also [1]\n\n[1] https://github.com/eventlet/eventlet/blob/v0.16/eventlet/patcher.py#L234-L237","commit_id":"7674d19173ca01775bd43cd50f0831e2ff96ff80"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"6389c9a7454d13727eddcdaa30e28da5ffb06e38","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if os.environ.get(\u0027TEST_EVENTLET\u0027):"},{"line_number":19,"context_line":"    import eventlet"},{"line_number":20,"context_line":"    eventlet.monkey_patch()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_eef58651","line":20,"in_reply_to":"3a961159_2e0cf9eb","updated":"2015-01-06 12:03:08.000000000","message":"The long time ago we decided, that it\u0027s not oslo.db\u0027s deal - how another projects play with concurrency - do they uses eventlet, gevent, native threads or processes. But I agree, that the lot of projects uses eventlet by default for it, so we should do our best to support it.\n\nThese unittests patches psycopg2 - default PostgreSQL db driver, and passes ok in this case. I\u0027m pretty sure, that if we will not monkeypatch psycopg2, tests on postrges will fail - that is what we have with MySQL at the moment.\n\n\u003e\u003e we don\u0027t monkey_patch mysqldb specifically in OpenStack. (? perhaps we should)\nIMO, it can be a good idea, but I believe, that there is a some reason, why this wasn\u0027t done already","commit_id":"7674d19173ca01775bd43cd50f0831e2ff96ff80"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"fe7ad1a6efa7d9b73661a7990c5d297064eaa2ed","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if os.environ.get(\u0027TEST_EVENTLET\u0027):"},{"line_number":19,"context_line":"    import eventlet"},{"line_number":20,"context_line":"    eventlet.monkey_patch()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_2e0cf9eb","line":20,"in_reply_to":"3a961159_61bd4b02","updated":"2015-01-06 03:12:31.000000000","message":"I think we should do whatever is \"normal\" for other OpenStack projects - since the goal with this test is to verify/reproduce an oslo.db issue that arises with the way it is used in regular OpenStack projects.\n\nAfaics from some simple git grepping, we don\u0027t monkey_patch mysqldb specifically in OpenStack. (? perhaps we should)","commit_id":"7674d19173ca01775bd43cd50f0831e2ff96ff80"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"a8631a360f0c09d28533984422112c77b3a46e14","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if os.environ.get(\u0027TEST_EVENTLET\u0027):"},{"line_number":19,"context_line":"    import eventlet"},{"line_number":20,"context_line":"    eventlet.monkey_patch()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_85bcf8b6","line":20,"in_reply_to":"3a961159_eef58651","updated":"2015-01-14 15:00:53.000000000","message":"Please see patch to Nova, which adds MySQLdb to monkey_patch() - https://review.openstack.org/#/c/145217/","commit_id":"7674d19173ca01775bd43cd50f0831e2ff96ff80"}],"tests/sqlalchemy/test_async_eventlet.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"954a2a2af45eb8ceb61c80268bb0667d70592c54","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# encoding\u003dUTF8"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2014 Rackspace Hosting"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_a0e27ed2","line":1,"updated":"2014-07-15 03:10:41.000000000","message":"is this necessary?\nnote that test_sqlalchemy.py actually has non-ascii chars.","commit_id":"8822719796d401b4b50e97f0c5abfed9acfb2c4f"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"03812fcfad6eec54b821b68b6537bc53a50b81d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# encoding\u003dUTF8"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2014 Rackspace Hosting"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_1bce3b5a","line":1,"in_reply_to":"baada198_a0e27ed2","updated":"2014-07-15 03:56:59.000000000","message":"Thanks!  I did indeed just copy this header from test_sqlalchemy without sufficient thought.\n\nFixed.","commit_id":"8822719796d401b4b50e97f0c5abfed9acfb2c4f"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"Unit tests for SQLAlchemy and eventlet interaction.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_EVENTLET_IMPORTED \u003d False"},{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    import eventlet"},{"line_number":21,"context_line":"    eventlet.monkey_patch()"},{"line_number":22,"context_line":"    _EVENTLET_IMPORTED \u003d True"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_0cf746f6","line":19,"updated":"2014-08-20 16:16:51.000000000","message":"super-nit: try/except the \"import eventlet\", put the next two lines in an \"else:\" block :)","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"41773b1c70a7d94c4f875bcc33d72a5117c485a9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"Unit tests for SQLAlchemy and eventlet interaction.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_EVENTLET_IMPORTED \u003d False"},{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    import eventlet"},{"line_number":21,"context_line":"    eventlet.monkey_patch()"},{"line_number":22,"context_line":"    _EVENTLET_IMPORTED \u003d True"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_e03ad097","line":19,"in_reply_to":"1abeadc6_0cf746f6","updated":"2014-08-22 03:44:09.000000000","message":"Huh, try has an else clause too :)  Done.","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    eventlet.monkey_patch()"},{"line_number":22,"context_line":"    _EVENTLET_IMPORTED \u003d True"},{"line_number":23,"context_line":"except ImportError:"},{"line_number":24,"context_line":"    pass"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import logging"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_8cb99617","line":24,"updated":"2014-08-20 16:16:51.000000000","message":"also, is there any concern that eventlet is monkey-patching the whole interpreter and possibly affecting other tests?  can this monkey-patch be done in a test setup/teardown?","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"9560dd86a27df15d84e2d48bee431fc0f8b11631","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    eventlet.monkey_patch()"},{"line_number":22,"context_line":"    _EVENTLET_IMPORTED \u003d True"},{"line_number":23,"context_line":"except ImportError:"},{"line_number":24,"context_line":"    pass"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import logging"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_74753d31","line":24,"in_reply_to":"1abeadc6_604ec03c","updated":"2014-08-26 00:46:33.000000000","message":"alrighty","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"41773b1c70a7d94c4f875bcc33d72a5117c485a9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    eventlet.monkey_patch()"},{"line_number":22,"context_line":"    _EVENTLET_IMPORTED \u003d True"},{"line_number":23,"context_line":"except ImportError:"},{"line_number":24,"context_line":"    pass"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import logging"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_604ec03c","line":24,"in_reply_to":"1abeadc6_8cb99617","updated":"2014-08-22 03:44:09.000000000","message":"I don\u0027t think we have an alternative.\n- there is no unpatch() function\n- the monkey_patch needs to be done \"as early as possible\" to catch any classes that might derive from a monkey_patched base class (eg: socket.socket specialisations).\n\nSee http://eventlet.net/doc/patching.html#eventlet.patcher.monkey_patch","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"BASE \u003d declarative_base()"},{"line_number":38,"context_line":"_TABLE_NAME \u003d \u0027__tmp__test_async_eventlet\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TmpTable(BASE, models.ModelBase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_6c535ae2","line":38,"updated":"2014-08-20 16:16:51.000000000","message":"why do we use these __very__uncomfortable_table_names_ ?   these tests all run in totally transitory databases.  I vote we get over the \"__tmp__\" thing.","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"41773b1c70a7d94c4f875bcc33d72a5117c485a9","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"BASE \u003d declarative_base()"},{"line_number":38,"context_line":"_TABLE_NAME \u003d \u0027__tmp__test_async_eventlet\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TmpTable(BASE, models.ModelBase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_c04f9432","line":38,"in_reply_to":"1abeadc6_6c535ae2","updated":"2014-08-22 03:44:09.000000000","message":"Agreed!","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"_TABLE_NAME \u003d \u0027__tmp__test_async_eventlet\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TmpTable(BASE, models.ModelBase):"},{"line_number":42,"context_line":"    __tablename__ \u003d _TABLE_NAME"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    foo \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_2c224252","line":41,"updated":"2014-08-20 16:16:51.000000000","message":"Let\u0027s use a simple ad-hoc declarative_base here and let\u0027s make this class local to the test, e.g. just put it in setUp()","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"41773b1c70a7d94c4f875bcc33d72a5117c485a9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"_TABLE_NAME \u003d \u0027__tmp__test_async_eventlet\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TmpTable(BASE, models.ModelBase):"},{"line_number":42,"context_line":"    __tablename__ \u003d _TABLE_NAME"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    foo \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_00f50c56","line":41,"in_reply_to":"1abeadc6_2c224252","updated":"2014-08-22 03:44:09.000000000","message":"Done (and below)","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TmpTable(BASE, models.ModelBase):"},{"line_number":42,"context_line":"    __tablename__ \u003d _TABLE_NAME"},{"line_number":43,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":44,"context_line":"    foo \u003d Column(Integer)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_4c1f7e08","line":42,"updated":"2014-08-20 16:16:51.000000000","message":"__tablename__ \u003d \u0027test_async_eventlet\u0027, no need for _TABLE_NAME verbosity","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        super(EventletTestMixin, self).setUp()"},{"line_number":53,"context_line":"        meta \u003d MetaData()"},{"line_number":54,"context_line":"        meta.bind \u003d self.engine"},{"line_number":55,"context_line":"        test_table \u003d Table(_TABLE_NAME, meta,"},{"line_number":56,"context_line":"                           Column(\u0027id\u0027, Integer, primary_key\u003dTrue,"},{"line_number":57,"context_line":"                                  nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_ccc1ce55","line":54,"updated":"2014-08-20 16:16:51.000000000","message":"remove this","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        super(EventletTestMixin, self).setUp()"},{"line_number":53,"context_line":"        meta \u003d MetaData()"},{"line_number":54,"context_line":"        meta.bind \u003d self.engine"},{"line_number":55,"context_line":"        test_table \u003d Table(_TABLE_NAME, meta,"},{"line_number":56,"context_line":"                           Column(\u0027id\u0027, Integer, primary_key\u003dTrue,"},{"line_number":57,"context_line":"                                  nullable\u003dFalse),"},{"line_number":58,"context_line":"                           Column(\u0027foo\u0027, Integer),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_8c1516e7","line":55,"updated":"2014-08-20 16:16:51.000000000","message":"this will just be self.TestTable \u003d TestTable (e.g. the class)","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                  nullable\u003dFalse),"},{"line_number":58,"context_line":"                           Column(\u0027foo\u0027, Integer),"},{"line_number":59,"context_line":"                           UniqueConstraint(\u0027foo\u0027, name\u003d\u0027uniq_foo\u0027))"},{"line_number":60,"context_line":"        test_table.create()"},{"line_number":61,"context_line":"        self.addCleanup(test_table.drop)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_concurrent_transaction(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_6cefdae9","line":60,"updated":"2014-08-20 16:16:51.000000000","message":"TestTable.__table__.create(self.engine)","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                           Column(\u0027foo\u0027, Integer),"},{"line_number":59,"context_line":"                           UniqueConstraint(\u0027foo\u0027, name\u003d\u0027uniq_foo\u0027))"},{"line_number":60,"context_line":"        test_table.create()"},{"line_number":61,"context_line":"        self.addCleanup(test_table.drop)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_concurrent_transaction(self):"},{"line_number":64,"context_line":"        # Uncomment to cause sqlalchemy to log executed SQL statements."}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_aca3b2b0","line":61,"updated":"2014-08-20 16:16:51.000000000","message":"lambda: TestTable.__table__.drop(self.engine)    \n\n:)","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            logging.debug(\u0027%s terminating\u0027, name)"},{"line_number":86,"context_line":"            return True"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        a_ready \u003d eventlet.event.Event()"},{"line_number":89,"context_line":"        a_proceed \u003d eventlet.event.Event()"},{"line_number":90,"context_line":"        b_proceed \u003d eventlet.event.Event()"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_6c47dabc","line":88,"updated":"2014-08-20 16:16:51.000000000","message":"I don\u0027t know the mechanics of eventlet so would be good if someone could comment on this part.","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"8546a76680297d0cc00fd1445fa6eca0938b1a4a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# mentioned below."},{"line_number":121,"context_line":"# ie: This file performs no tests by default."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":124,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":125,"context_line":"    pass"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_ec976a38","line":123,"updated":"2014-08-20 16:16:51.000000000","message":"so.  when we use mysql-python, it fails, and mysqlconnector, it succeeds, right?   When we get https://review.openstack.org/#/c/110170/ finally merged it will be easier to play with this.","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"9560dd86a27df15d84e2d48bee431fc0f8b11631","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# mentioned below."},{"line_number":121,"context_line":"# ie: This file performs no tests by default."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":124,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":125,"context_line":"    pass"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_b4b515d2","line":123,"in_reply_to":"1abeadc6_00326c5e","updated":"2014-08-26 00:46:33.000000000","message":"derr....how is this test passing on the gate then?  aren\u0027t they using mysqldb on the gates?    *mystified*","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"41773b1c70a7d94c4f875bcc33d72a5117c485a9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# mentioned below."},{"line_number":121,"context_line":"# ie: This file performs no tests by default."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":124,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":125,"context_line":"    pass"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_00326c5e","line":123,"in_reply_to":"1abeadc6_ec976a38","updated":"2014-08-22 03:44:09.000000000","message":"Yep mysqlconnector and pymysql pass; mysqldb (explicit or as default) fails.\n\nAt the moment I have to hand-hack utils.get_connect_string in order to test different scenarios :(","commit_id":"d68f8e225844c0311a0af9715810ca0be3f2e6e5"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"79e0a72847312a59177932df5d4c1f7be251544b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                logging.debug(\u0027%s ready\u0027, name)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"                # Modify the same row, inside transaction"},{"line_number":70,"context_line":"                tbl \u003d self.test_table()"},{"line_number":71,"context_line":"                tbl.update({\u0027foo\u0027: 10})"},{"line_number":72,"context_line":"                tbl.save(_session)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_b4dc351a","line":70,"updated":"2014-08-26 00:48:43.000000000","message":"this is great.  i love that this worked!","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"79e0a72847312a59177932df5d4c1f7be251544b","unresolved":false,"context_lines":[{"line_number":116,"context_line":"# ie: This file performs no tests by default."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":119,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":120,"context_line":"    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_34d025f7","line":119,"updated":"2014-08-26 00:48:43.000000000","message":"in case you missed my question on the other patch set, how is this passing on gate?  is it running against mysqldb opportunistic?","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"9087ae3bc1503bb754e1b5e194ce79b621cc4778","unresolved":false,"context_lines":[{"line_number":116,"context_line":"# ie: This file performs no tests by default."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":119,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":120,"context_line":"    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_8fbac408","line":119,"in_reply_to":"1abeadc6_34d025f7","updated":"2014-08-26 01:48:39.000000000","message":"Yeah, this is probably a bit undesirable.\n\nThe gate tests are set up to run explicit tox environments.  Currently there is no setup to run the py27-eventlet env, so in jenkins this test only runs in situations without eventlet installed and skips.\n\nHowever, I have included py27-eventlet in the default tox.ini environment list in this change, so when a human runs \"tox\" with default args, they *will* run this test.  This test will then skip (for a different reason) if they don\u0027t have the expected mysql opportunistic testcase environment.\n\nI think we should add this test to the oslo.db opportunistic gate tests, but I\u0027m not sure what order we want to submit the changes.\n\n- 1. Create the environment but don\u0027t run it anywhere by default.\n- 2. Create gate non-voting job\n- 3. Create gate voting job\n- 4. Add environment to tox envlist\n\nNote (4) is independent from and ignored by gate tests.\nNote (2,3) must be in separate changes to (1,4) since they go to a separate git repo.\n\nMy main question is whether we do (4) last or first. and currently I have (1+4) combined in this change.  Since it can take months for each review cycle, my desire is obviously to merge those above steps wherever possible ;)\n\nThe other option of course is to not create a separate venv, and just add eventlet to the regular py27 environment.\n\nDear +2 reviewers, please dictate the approach you would be willing to approve.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"526d473ee503e802dba44a1c4083fe559565b5ee","unresolved":false,"context_lines":[{"line_number":116,"context_line":"# ie: This file performs no tests by default."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":119,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":120,"context_line":"    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_0f776603","line":119,"in_reply_to":"1abeadc6_64fe53b0","updated":"2014-08-27 00:07:24.000000000","message":"Yep, if there was such a change, this should indeed be dependent on it.\n\nI think the new eventlet dependency is the real issue driving the new environment however - and the new environment drives the need for a change to the oslo.db gate config.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2ee792401da7e5a37e2b6b6a68f4242019ba953d","unresolved":false,"context_lines":[{"line_number":116,"context_line":"# ie: This file performs no tests by default."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class MySQLEventletTestCase(EventletTestMixin,"},{"line_number":119,"context_line":"                            test_base.MySQLOpportunisticTestCase):"},{"line_number":120,"context_line":"    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_64fe53b0","line":119,"in_reply_to":"1abeadc6_8fbac408","updated":"2014-08-26 15:03:45.000000000","message":"why wouldn\u0027t the whole patch be dependent on changing the requirements to mysql-connector (is that what we decided?)","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"48d8d6c1abdf654e091356475318bd05ac6e7257","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"Unit tests for SQLAlchemy and eventlet interaction.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_EVENTLET_IMPORTED \u003d False"},{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    import eventlet"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_ced5a2ba","line":19,"updated":"2014-10-10 11:08:50.000000000","message":"from oslo.utils import importutils\n\n    eventlet \u003d importutils.try_import(eventlet)\n    _EVENTLET_IMPORTED \u003d bool(eventlet)\n\n    if _EVENTLET_IMPORTED:\n        eventlet.monkey_patch()\n\n\nnit: it is a little bit more aesthetic for me and we have an util for such of cases.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a8ab2f11c22c0008d288c72750b23ba6174c717","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\"Unit tests for SQLAlchemy and eventlet interaction.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_EVENTLET_IMPORTED \u003d False"},{"line_number":19,"context_line":"try:"},{"line_number":20,"context_line":"    import eventlet"},{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_23f459ce","line":19,"in_reply_to":"baa201ad_ced5a2ba","updated":"2014-10-13 12:19:05.000000000","message":"Thanks, I use importutils in the next revision.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"01460764831e485ce685dd608bff40fe3778f184","unresolved":false,"context_lines":[{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":"else:"},{"line_number":24,"context_line":"    eventlet.monkey_patch()"},{"line_number":25,"context_line":"    _EVENTLET_IMPORTED \u003d True"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_9120f69c","line":24,"updated":"2014-10-13 01:11:32.000000000","message":"This basically makes any other test now using eventlet also. I\u0027d prefer a different way of doing this, maybe done like in oslo.concurrency...\n\nSee:\n\nhttps://github.com/openstack/oslo.concurrency/commit/8483811889baa2c9f839c1ccbf74d2c14174bd67 and review https://review.openstack.org/#/c/126097/\n\nIf this isn\u0027t done eventlet is now used for all subsequent tests, even when its not wanted, which is bad.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a8ab2f11c22c0008d288c72750b23ba6174c717","unresolved":false,"context_lines":[{"line_number":21,"context_line":"except ImportError:"},{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":"else:"},{"line_number":24,"context_line":"    eventlet.monkey_patch()"},{"line_number":25,"context_line":"    _EVENTLET_IMPORTED \u003d True"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_c3dd4d44","line":24,"in_reply_to":"baa201ad_9120f69c","updated":"2014-10-13 12:19:05.000000000","message":"Yeah, the separate py27-eventlet environment ensured that it didn\u0027t pollute other tests (or rather other environments) - however it seems the new environment was an unpopular suggestion.\n\nI\u0027ve rewritten it to combine both into py27, but with separate test runs - following your suggestion here.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"48d8d6c1abdf654e091356475318bd05ac6e7257","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        TmpTable.__table__.create(self.engine)"},{"line_number":56,"context_line":"        self.addCleanup(lambda: TmpTable.__table__.drop(self.engine))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_concurrent_transaction(self):"},{"line_number":59,"context_line":"        # Uncomment to cause sqlalchemy to log executed SQL statements."},{"line_number":60,"context_line":"        # Useful to determine exactly what and when was sent to DB."},{"line_number":61,"context_line":"        # logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_0c25f3aa","line":58,"updated":"2014-10-10 11:08:50.000000000","message":"Please, provide a docstring with description of how to use it.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a8ab2f11c22c0008d288c72750b23ba6174c717","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        TmpTable.__table__.create(self.engine)"},{"line_number":56,"context_line":"        self.addCleanup(lambda: TmpTable.__table__.drop(self.engine))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_concurrent_transaction(self):"},{"line_number":59,"context_line":"        # Uncomment to cause sqlalchemy to log executed SQL statements."},{"line_number":60,"context_line":"        # Useful to determine exactly what and when was sent to DB."},{"line_number":61,"context_line":"        # logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_838fc522","line":58,"in_reply_to":"baa201ad_0c25f3aa","updated":"2014-10-13 12:19:05.000000000","message":"I haven\u0027t written a docstring for this yet ..\n\nIt should \"just work\" for mysql and postgres \"opportunistic\" cases (see test_base.MySQLOpportunisticTestCase, etc for the database environment that these tests expect).\n\nI believe Mike Bayer is working on a way to manually specify a different sqlalchemy connection URI to run the test suite against.\n\nNote that \"just work\" here includes correctly detecting an issue and failing when mysql://... is used.  If mysql+mysqlconnector:// or one of the other drivers that doesn\u0027t exhibit the bug is used, then it should run and succeed.","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"}],"tox.ini":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"6d86d89f1f705c1132367ac670b8eb1e4cc6b815","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":4,"id":"baada198_1113de5c","line":3,"updated":"2014-07-18 09:16:39.000000000","message":"suggestion - I\u0027m really, not sure, that we should add this env here also. But lets wait for the more eyes on this","commit_id":"c693412541b2994d6c0cc275a17201d2b69b84b8"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"88cbb455ef30b72c5b0ac3a579270730608f216c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":4,"id":"baada198_b853d56a","line":3,"in_reply_to":"baada198_1113de5c","updated":"2014-07-19 05:39:41.000000000","message":"Yeah, I\u0027m not sure either.  I can remove it from envlist, but then the test will approximately never be run.\n\nAnother alternative would be to make the py27 env always include eventlet (and therefore run the test), but a hypothetical py33 env would run without it.  Given how important it seemed to ensure oslo.db could run without eventlet, I went with clearly separated py27 and py27-eventlet environments.","commit_id":"c693412541b2994d6c0cc275a17201d2b69b84b8"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d726499fdc8e9835f137799a57e47f19ab66ad85","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"1abeadc6_0fb954e9","line":3,"updated":"2014-08-26 01:26:09.000000000","message":"I am curious, why add a py27-eventlet target that we apparently want to developers to run by default when they are already running the py27 target? Can\u0027t we just add the tests and run them under py27? If you list eventlet as a test-requirement it won\u0027t be installed by default when you pip install.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"e59d7b924453b4c11007d188ab78e0a8bd691499","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"1abeadc6_12d09452","line":3,"in_reply_to":"1abeadc6_0fb954e9","updated":"2014-08-26 05:22:51.000000000","message":"Yep, I\u0027m fine with rolling py27-eventlet into the standard py27 env too.  I only broke it out because early comments from oslo.db cores implied it was important to avoid dependencies on eventlet.\n\noslo.db folks: Happy to be guided here.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"633bdc699f9f5bba07886f9f9939daf29958b5c3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"1abeadc6_5ce69617","line":3,"in_reply_to":"1abeadc6_12d09452","updated":"2014-08-26 10:59:03.000000000","message":"I\u0027m still don\u0027t feel happy with eventlet in requirements, but someone else will suggest.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2ee792401da7e5a37e2b6b6a68f4242019ba953d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"1abeadc6_84a1afab","line":3,"in_reply_to":"1abeadc6_5ce69617","updated":"2014-08-26 15:03:45.000000000","message":"I think we need to be testing database patterns against eventlet in oslo.db.  oslo.db is where everything database gets decided, and eventlet integration is essential.","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"55a4b135dba1c110629f1792d3386d709d462429","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"fa98f980_40211dfa","line":3,"in_reply_to":"1abeadc6_84a1afab","updated":"2014-09-02 22:26:54.000000000","message":"I know we want to avoid having oslo.db depend on eventlet, but we do still need to test with it by default. \n\nIs it technically possible to do the testing we want, with and without eventlet, in a single tox environment? Or do we need to add the new environment and a separate test job for oslo.db so we can run all of the tests in both configurations?","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"d4bc756cddb728e9d177d0f5383e96ba503614ab","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"envlist \u003d py26,py27,py27-eventlet,pep8"},{"line_number":4,"context_line":"# NOTE(dhellmann): We cannot set skipdist\u003dTrue"},{"line_number":5,"context_line":"# for oslo libraries because of the namespace package."},{"line_number":6,"context_line":"#skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":7,"id":"fa98f980_8b5085d5","line":3,"in_reply_to":"fa98f980_40211dfa","updated":"2014-09-03 00:18:48.000000000","message":"Aiui:\n- isolation requires the eventlet tests to be in a different python process from non-eventlet.\n- using the same tox env for both test runs is easily possible, however it would then be possible for something to \"incorrectly\" import eventlet without causing an immediate import error.\n\nI think the latter is something we can deal with by reviewer diligence and occasional audits, so isn\u0027t a big deal.  The former just requires adding eventlet to test-requirements.txt and two test commands - looking a lot like the setup in oslo-incubator/testenv.\n\nIt\u0027s an easy change to make, but given the differing views expressed above can I get some consensus between the core reviewers before embarking?","commit_id":"079542674b7d1c67cecaa2e547999bb64efbaf4d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"02ee0d24e769497020e8fe03650b65730b9e144c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":33,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[testenv:py27-eventlet]"},{"line_number":36,"context_line":"basepython \u003d python2.7"},{"line_number":37,"context_line":"deps \u003d"},{"line_number":38,"context_line":"     {[testenv]deps}"}],"source_content_type":"text/x-properties","patch_set":8,"id":"baa201ad_d1399ed9","line":35,"updated":"2014-10-13 01:13:38.000000000","message":"Will automated CI be running this, or will it be up to someone to run it every now and then (if the later, thats not so good).\n\nPerhaps follow a similar approach as in https://review.openstack.org/#/c/126097/","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"7a8ab2f11c22c0008d288c72750b23ba6174c717","unresolved":false,"context_lines":[{"line_number":32,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":33,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[testenv:py27-eventlet]"},{"line_number":36,"context_line":"basepython \u003d python2.7"},{"line_number":37,"context_line":"deps \u003d"},{"line_number":38,"context_line":"     {[testenv]deps}"}],"source_content_type":"text/x-properties","patch_set":8,"id":"baa201ad_43addd87","line":35,"in_reply_to":"baa201ad_d1399ed9","updated":"2014-10-13 12:19:05.000000000","message":"Done","commit_id":"4f02f652fa3bb8fbffb760e9477da37ee33bcc11"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"4a54cde057aecd6dc6b471ae71c0908b0c7530d5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"[testenv:py27]"},{"line_number":30,"context_line":"commands \u003d"},{"line_number":31,"context_line":"    env TEST_EVENTLET\u003d0 python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"},{"line_number":32,"context_line":"    env TEST_EVENTLET\u003d1 python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"[testenv:py34]"},{"line_number":35,"context_line":"setenv \u003d"}],"source_content_type":"text/x-properties","patch_set":12,"id":"3afb71cf_661b0e82","line":32,"updated":"2015-06-10 22:00:57.000000000","message":"This is going to effectively double the time it takes to run tests in the gate. Are we in any danger of hitting the timeout limit? I have no idea how long the tests take to run...","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"2c38ff46e6adbbd7781db6276110cda363957ba1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"[testenv:py27]"},{"line_number":30,"context_line":"commands \u003d"},{"line_number":31,"context_line":"    env TEST_EVENTLET\u003d0 python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"},{"line_number":32,"context_line":"    env TEST_EVENTLET\u003d1 python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"[testenv:py34]"},{"line_number":35,"context_line":"setenv \u003d"}],"source_content_type":"text/x-properties","patch_set":12,"id":"1af86dd1_ecc0dae2","line":32,"in_reply_to":"3afb71cf_661b0e82","updated":"2015-06-12 02:47:21.000000000","message":"This was originally just the eventlet-version, then I split it into a separate tox env early on from review comments on eventlet, then combined it back into this version following wider reviewer consensus.  If you have some new way you\u0027d like me to arrange it, just ask ;)\n\nRunning it locally (with default testr concurrency), the unittests take about 10s to run, and this change makes it take twice that long (about 20s).\n\nI don\u0027t understand enough of the JJB yaml config, but I _think_ the timeout for py27 is currently set to 50s (although that doesn\u0027t make sense because the neutron unittests take _way_ longer than that).  Regardless, I would be surprised if the timeout would be set anywhere near low enough for us to hit it with such a tiny test suite.","commit_id":"d0e4230dd72b4d0816832ad989d82bf8c6476616"}]}
