)]}'
{"oslo/db/concurrency.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f3320b16a664ca99b6d1ab9d75dbfbbfabe4e6b5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":"from oslo.db import api"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"tpool_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_5342d83e","line":20,"updated":"2014-05-29 17:55:43.000000000","message":"Since this is in oslo.db, this import would qualify as a project import and should be separate from the oslo.config third party import.","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":"from oslo.db import api"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"tpool_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_56c86374","line":20,"in_reply_to":"3ae8d1ca_5342d83e","updated":"2014-05-30 12:58:58.000000000","message":"Done","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f3320b16a664ca99b6d1ab9d75dbfbbfabe4e6b5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, conf, backend_mapping):"},{"line_number":42,"context_line":"        self.__db_api \u003d None"},{"line_number":43,"context_line":"        self.__backend_mapping \u003d backend_mapping"},{"line_number":44,"context_line":"        self.__conf \u003d conf"},{"line_number":45,"context_line":"        self.__conf.register_opts(tpool_opts, \u0027database\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_d0197e89","line":42,"updated":"2014-05-29 17:55:43.000000000","message":"Is there a reason these variables are named with the double _ prefix?  This is going to invoke name mangling on these variables, which I don\u0027t think we need.  Just a single _ is sufficient to mark them as private.","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, conf, backend_mapping):"},{"line_number":42,"context_line":"        self.__db_api \u003d None"},{"line_number":43,"context_line":"        self.__backend_mapping \u003d backend_mapping"},{"line_number":44,"context_line":"        self.__conf \u003d conf"},{"line_number":45,"context_line":"        self.__conf.register_opts(tpool_opts, \u0027database\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_b6a607c0","line":42,"in_reply_to":"1ae5cdf2_b06e14c8","updated":"2014-05-30 12:58:58.000000000","message":"renamed","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"788e142a3026eedde2270eb5f11af24db94e08b5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, conf, backend_mapping):"},{"line_number":42,"context_line":"        self.__db_api \u003d None"},{"line_number":43,"context_line":"        self.__backend_mapping \u003d backend_mapping"},{"line_number":44,"context_line":"        self.__conf \u003d conf"},{"line_number":45,"context_line":"        self.__conf.register_opts(tpool_opts, \u0027database\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_b06e14c8","line":42,"in_reply_to":"3ae8d1ca_d0197e89","updated":"2014-05-30 08:58:09.000000000","message":"+1 :)","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f3320b16a664ca99b6d1ab9d75dbfbbfabe4e6b5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.__conf.register_opts(tpool_opts, \u0027database\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @property"},{"line_number":48,"context_line":"    def _db_api(self):"},{"line_number":49,"context_line":"        if not self.__db_api:"},{"line_number":50,"context_line":"            db_api \u003d api.DBAPI(self.__conf.database.backend,"},{"line_number":51,"context_line":"                               backend_mapping\u003dself.__backend_mapping)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_137e906b","line":48,"updated":"2014-05-29 17:55:43.000000000","message":"Oh, I see.  I still think I\u0027d rather deal with the name conflict a different way - neither of these are public, so it isn\u0027t important that they be named any specific thing.","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"788e142a3026eedde2270eb5f11af24db94e08b5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    @property"},{"line_number":48,"context_line":"    def _db_api(self):"},{"line_number":49,"context_line":"        if not self.__db_api:"},{"line_number":50,"context_line":"            db_api \u003d api.DBAPI(self.__conf.database.backend,"},{"line_number":51,"context_line":"                               backend_mapping\u003dself.__backend_mapping)"},{"line_number":52,"context_line":"            if self.__conf.database.use_tpool:"},{"line_number":53,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_ae21fcfc","line":50,"updated":"2014-05-30 08:58:09.000000000","message":"please rebase this patch on I1a00db7a4200ebdc96f17256ecbad430477e868f and use DBAPI.from_config() class method here","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    @property"},{"line_number":48,"context_line":"    def _db_api(self):"},{"line_number":49,"context_line":"        if not self.__db_api:"},{"line_number":50,"context_line":"            db_api \u003d api.DBAPI(self.__conf.database.backend,"},{"line_number":51,"context_line":"                               backend_mapping\u003dself.__backend_mapping)"},{"line_number":52,"context_line":"            if self.__conf.database.use_tpool:"},{"line_number":53,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_1695fb3f","line":50,"in_reply_to":"3ae8d1ca_ae21fcfc","updated":"2014-05-30 12:58:58.000000000","message":"Done","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f3320b16a664ca99b6d1ab9d75dbfbbfabe4e6b5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                try:"},{"line_number":54,"context_line":"                    from eventlet import tpool"},{"line_number":55,"context_line":"                except ImportError:"},{"line_number":56,"context_line":"                    sys.stderr.write("},{"line_number":57,"context_line":"                        \"\u0027eventlet\u0027 is required for this DB API wrapper.\")"},{"line_number":58,"context_line":"                    raise"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_5003ae41","line":56,"updated":"2014-05-29 17:55:43.000000000","message":"Can\u0027t we use standard Python logging for this?","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                try:"},{"line_number":54,"context_line":"                    from eventlet import tpool"},{"line_number":55,"context_line":"                except ImportError:"},{"line_number":56,"context_line":"                    sys.stderr.write("},{"line_number":57,"context_line":"                        \"\u0027eventlet\u0027 is required for this DB API wrapper.\")"},{"line_number":58,"context_line":"                    raise"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_d6ab9387","line":56,"in_reply_to":"3ae8d1ca_5003ae41","updated":"2014-05-30 12:58:58.000000000","message":"Done","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"84414e4ce5e6b790f1a418f629589238dc7d529b","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def _api(self):"},{"line_number":52,"context_line":"        if not self._db_api:"},{"line_number":53,"context_line":"            db_api \u003d api.DBAPI.from_config("},{"line_number":54,"context_line":"                conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":55,"context_line":"            if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_6f7e62b0","line":52,"updated":"2014-05-30 14:32:11.000000000","message":"please add a test case, which shows, that we will use same ``_db_api`` attribute on the second (and so on) __getattr__() call","commit_id":"9c56a130dbe5552bd41c635f8df743f22d295169"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"638799b764da84c74f221d468ed8efcab31af4b6","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def _api(self):"},{"line_number":52,"context_line":"        if not self._db_api:"},{"line_number":53,"context_line":"            db_api \u003d api.DBAPI.from_config("},{"line_number":54,"context_line":"                conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":55,"context_line":"            if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_203e29b9","line":52,"in_reply_to":"1ae5cdf2_6f7e62b0","updated":"2014-05-30 15:13:01.000000000","message":"Done","commit_id":"9c56a130dbe5552bd41c635f8df743f22d295169"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"84414e4ce5e6b790f1a418f629589238dc7d529b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                except ImportError:"},{"line_number":59,"context_line":"                    LOG.exception("},{"line_number":60,"context_line":"                        _LE(\"\u0027eventlet\u0027 is required for TpoolDbapiWrapper.\"))"},{"line_number":61,"context_line":"                    raise"},{"line_number":62,"context_line":"                self._db_api \u003d tpool.Proxy(db_api)"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                self._db_api \u003d db_api"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_4f77e602","line":61,"updated":"2014-05-30 14:32:11.000000000","message":"can you please add a test for this case?","commit_id":"9c56a130dbe5552bd41c635f8df743f22d295169"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"638799b764da84c74f221d468ed8efcab31af4b6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                except ImportError:"},{"line_number":59,"context_line":"                    LOG.exception("},{"line_number":60,"context_line":"                        _LE(\"\u0027eventlet\u0027 is required for TpoolDbapiWrapper.\"))"},{"line_number":61,"context_line":"                    raise"},{"line_number":62,"context_line":"                self._db_api \u003d tpool.Proxy(db_api)"},{"line_number":63,"context_line":"            else:"},{"line_number":64,"context_line":"                self._db_api \u003d db_api"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_404b3559","line":61,"in_reply_to":"1ae5cdf2_4f77e602","updated":"2014-05-30 15:13:01.000000000","message":"Done","commit_id":"9c56a130dbe5552bd41c635f8df743f22d295169"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"dd3aba1d7014b0d7cad756678dd900699d036ced","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def _api(self):"},{"line_number":52,"context_line":"        if not self._db_api:"},{"line_number":53,"context_line":"            db_api \u003d api.DBAPI.from_config("},{"line_number":54,"context_line":"                conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":55,"context_line":"            if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_cedb934d","line":52,"updated":"2014-06-03 12:28:27.000000000","message":"Ok, so one thing left. A race condition is possible here: consider the case when we are trying to call a DB API method when the backend hasn\u0027t been initialized yet from 2 or more green threads concurrently - 2 backend instances will be created.\n\nIt should probably be harmless, but it\u0027s a race nevertheless. Can  we ensure the execution of everything inside this if statement block is protected by a lock?","commit_id":"09b88048942d1e5063705de21a26661f1742d1c3"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"20adae5d9968a13614daa088581f8d4e29b1b211","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @property"},{"line_number":51,"context_line":"    def _api(self):"},{"line_number":52,"context_line":"        if not self._db_api:"},{"line_number":53,"context_line":"            db_api \u003d api.DBAPI.from_config("},{"line_number":54,"context_line":"                conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":55,"context_line":"            if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_345d2648","line":52,"in_reply_to":"1ae5cdf2_cedb934d","updated":"2014-06-03 13:44:41.000000000","message":"Done","commit_id":"09b88048942d1e5063705de21a26661f1742d1c3"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"efa3ff55811a6c4d3507d8fb8a50a2693172760e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo.db import api"},{"line_number":23,"context_line":"from oslo.db.openstack.common.gettextutils import _LE"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOCK \u003d threading.Lock()"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"tpool_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_3f941f42","line":25,"updated":"2014-06-03 14:05:16.000000000","message":"This should not be a global lock. I think we should store it as a TpoolDbapiWrapper instance (not class) attribute.","commit_id":"5e1317fe2fc69cebed4a775036090d75f5a5fb38"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"54efbae1f49584a9a36bfd49e6a118d10ce985f8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo.db import api"},{"line_number":23,"context_line":"from oslo.db.openstack.common.gettextutils import _LE"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOCK \u003d threading.Lock()"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"tpool_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_a04f306a","line":25,"in_reply_to":"1ae5cdf2_3f941f42","updated":"2014-06-03 14:57:23.000000000","message":"Done","commit_id":"5e1317fe2fc69cebed4a775036090d75f5a5fb38"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"4452d080215e00a99a3e91c8d08efa76e95425a9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def _api(self):"},{"line_number":55,"context_line":"        if not self._db_api:"},{"line_number":56,"context_line":"            with self._lock:"},{"line_number":57,"context_line":"                if not self._db_api:"},{"line_number":58,"context_line":"                    db_api \u003d api.DBAPI.from_config("},{"line_number":59,"context_line":"                        conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":60,"context_line":"                    if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_9d2d31ab","line":57,"updated":"2014-06-03 21:55:29.000000000","message":"Why is this condition being checked twice (inside and outside of the context manager)?","commit_id":"be2ea6d126dee0d76bf08de1aadcef4df3256ef8"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"3d2675d1e18cbe21f729f4ba62f1c3a24aa95c6f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def _api(self):"},{"line_number":55,"context_line":"        if not self._db_api:"},{"line_number":56,"context_line":"            with self._lock:"},{"line_number":57,"context_line":"                if not self._db_api:"},{"line_number":58,"context_line":"                    db_api \u003d api.DBAPI.from_config("},{"line_number":59,"context_line":"                        conf\u003dself._conf, backend_mapping\u003dself._backend_mapping)"},{"line_number":60,"context_line":"                    if self._conf.database.use_tpool:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_b153f637","line":57,"in_reply_to":"1ae5cdf2_9d2d31ab","updated":"2014-06-03 23:04:55.000000000","message":"Two checks are used to reduce the overhead of locking(double-checked locking pattern)","commit_id":"be2ea6d126dee0d76bf08de1aadcef4df3256ef8"}],"setup.cfg":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"788e142a3026eedde2270eb5f11af24db94e08b5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"[entry_points]"},{"line_number":28,"context_line":"oslo.config.opts \u003d"},{"line_number":29,"context_line":"    oslo.db \u003d oslo.db.options:list_opts"},{"line_number":30,"context_line":"    oslo.concurrency.opts \u003d oslo.db.concurrency:list_opts"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"oslo.db.migration \u003d"},{"line_number":33,"context_line":"    alembic \u003d oslo.db.sqlalchemy.migration_cli.ext_alembic:AlembicExtension"}],"source_content_type":"text/x-ttcn-cfg","patch_set":2,"id":"3ae8d1ca_ee906445","line":30,"updated":"2014-05-30 08:58:09.000000000","message":"this should probably be:\n\n   oslo.db.concurrency \u003d oslo.db.concurrency:list_opts\n\nbut let\u0027s wait on Doug\u0027s input on this first :)","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":27,"context_line":"[entry_points]"},{"line_number":28,"context_line":"oslo.config.opts \u003d"},{"line_number":29,"context_line":"    oslo.db \u003d oslo.db.options:list_opts"},{"line_number":30,"context_line":"    oslo.concurrency.opts \u003d oslo.db.concurrency:list_opts"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"oslo.db.migration \u003d"},{"line_number":33,"context_line":"    alembic \u003d oslo.db.sqlalchemy.migration_cli.ext_alembic:AlembicExtension"}],"source_content_type":"text/x-ttcn-cfg","patch_set":2,"id":"1ae5cdf2_769c7f6a","line":30,"in_reply_to":"3ae8d1ca_ee906445","updated":"2014-05-30 12:58:58.000000000","message":"Done","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"}],"tests/test_concurrency.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"788e142a3026eedde2270eb5f11af24db94e08b5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.db import concurrency"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_8ef44088","line":16,"updated":"2014-05-30 08:58:09.000000000","message":"So I\u0027d really like us not to depend on eventlet even in tests (this is actually how I documented this in spec, hehe). I mean, we don\u0027t need to test eventlet.tpool.Proxy works, we could easily mock it to test it\u0027s instance is created correctly.\n\nAgain, let\u0027s wait for other reviewers input on this and tweak patch/spec accordingly.","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f288223e57eb34e2bea358bfd4f497e20e59fc14","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.db import concurrency"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_d682b3ff","line":16,"in_reply_to":"3ae8d1ca_8ef44088","updated":"2014-05-30 12:58:58.000000000","message":"Done","commit_id":"663638f7d12e4ee65aaf80d3cca8c1b35ffdde17"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"03c6c447ba32e54056c7d870789e7fae14a38803","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":34,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":37,"context_line":"    def test_db_api_common(self, mock_db_api):"},{"line_number":38,"context_line":"        # test context:"},{"line_number":39,"context_line":"        #     CONF.database.use_tpool \u003d\u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_c1ac79a3","line":36,"updated":"2014-06-02 08:56:54.000000000","message":"why not oslo.db.api here?","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"d01f6acf62033a1747407a183b90da320304caf6","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":34,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":37,"context_line":"    def test_db_api_common(self, mock_db_api):"},{"line_number":38,"context_line":"        # test context:"},{"line_number":39,"context_line":"        #     CONF.database.use_tpool \u003d\u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_ffeca5f5","line":36,"in_reply_to":"1ae5cdf2_c1ac79a3","updated":"2014-06-02 12:20:14.000000000","message":"mock for `oslo.db.api` doesn\u0027t work for me.\n\nhttp://paste.openstack.org/show/82420/","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"03c6c447ba32e54056c7d870789e7fae14a38803","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.db_api.fake2"},{"line_number":50,"context_line":"        self.assertEqual(self.db_api._db_api, mock_db_api.DBAPI.from_config())"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":53,"context_line":"    def test_db_api_config_change(self, mock_db_api):"},{"line_number":54,"context_line":"        # test context:"},{"line_number":55,"context_line":"        #     CONF.database.use_tpool \u003d\u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_81899128","line":52,"updated":"2014-06-02 08:56:54.000000000","message":"ditto","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"03c6c447ba32e54056c7d870789e7fae14a38803","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.db_api.fake"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # CONF.database.use_tpool is True, so we get tpool proxy in this case"},{"line_number":66,"context_line":"        self.assertEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":69,"context_line":"    def test_db_api_without_installed_eventlet(self, mock_db_api):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_21ab5dd7","line":66,"updated":"2014-06-02 08:56:54.000000000","message":"could you please instead test here eventlet.tpool.Proxy has been called and that the mock instance it returns is not the same DBAPI.from_config() returns?","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"d01f6acf62033a1747407a183b90da320304caf6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.db_api.fake"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        # CONF.database.use_tpool is True, so we get tpool proxy in this case"},{"line_number":66,"context_line":"        self.assertEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":69,"context_line":"    def test_db_api_without_installed_eventlet(self, mock_db_api):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_da4b7757","line":66,"in_reply_to":"1ae5cdf2_21ab5dd7","updated":"2014-06-02 12:20:14.000000000","message":"Done","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"03c6c447ba32e54056c7d870789e7fae14a38803","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.assertRaises(ImportError, getattr, self.db_api, \u0027fake\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        # \"sys.modules\" should contain \"eventlet\" item for correct cleanup"},{"line_number":82,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_016e612f","line":82,"updated":"2014-06-02 08:56:54.000000000","message":"nit: you should probably make this use self.addCleanup()","commit_id":"3e63eb585f0e704d870da8eda8137f57d7049659"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"76935c5dcd61fd33b6e707c2c65a9867e35d4b3c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":34,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":37,"context_line":"    def test_db_api_common(self, mock_db_api):"},{"line_number":38,"context_line":"        # test context:"},{"line_number":39,"context_line":"        #     CONF.database.use_tpool \u003d\u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_91363551","line":36,"updated":"2014-06-02 13:49:09.000000000","message":"You must have missed my comment to the previous patch set.\n\nWhy not oslo.db.api here?","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ff9e2b23d4063a6c0f9e747d40e14cc82be8fab9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":34,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":37,"context_line":"    def test_db_api_common(self, mock_db_api):"},{"line_number":38,"context_line":"        # test context:"},{"line_number":39,"context_line":"        #     CONF.database.use_tpool \u003d\u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e46339db","line":36,"in_reply_to":"1ae5cdf2_91363551","updated":"2014-06-02 13:54:27.000000000","message":"I have already answered in previous patch-set:)\n\n\u003emock for `oslo.db.api` doesn\u0027t work for me.\n\u003ehttp://paste.openstack.org/show/82420/","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"76935c5dcd61fd33b6e707c2c65a9867e35d4b3c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # get access to some db-api method"},{"line_number":45,"context_line":"        self.db_api.fake"},{"line_number":46,"context_line":"        self.assertEqual(self.db_api._db_api, mock_db_api.DBAPI.from_config())"},{"line_number":47,"context_line":"        self.assertNotEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        # get access to other db-api method to be sure that api didn\u0027t changed"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_51c82d22","line":46,"updated":"2014-06-02 13:49:09.000000000","message":"Something I missed last time.\n\nI\u0027d something like:\n  \n  mocked_dbapi \u003d mock.MagicMock()\n  mock_db_api.DBAPI.from_config.return_value \u003d mocked_dbapi\n  mock_db_api.DBAPI.from_config.assert_called_once_with(...)\n  self.assertFalse(self.eventlet.tpool.Proxy.called)","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"14a3d4759f1ac8c85bf0c9d68e61faef68a57c78","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # get access to some db-api method"},{"line_number":45,"context_line":"        self.db_api.fake"},{"line_number":46,"context_line":"        self.assertEqual(self.db_api._db_api, mock_db_api.DBAPI.from_config())"},{"line_number":47,"context_line":"        self.assertNotEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        # get access to other db-api method to be sure that api didn\u0027t changed"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_277d23b2","line":46,"in_reply_to":"1ae5cdf2_51c82d22","updated":"2014-06-02 14:33:18.000000000","message":"Done","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"76935c5dcd61fd33b6e707c2c65a9867e35d4b3c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.db_api.fake2"},{"line_number":51,"context_line":"        self.assertEqual(self.db_api._db_api, mock_db_api.DBAPI.from_config())"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":54,"context_line":"    def test_db_api_config_change(self, mock_db_api):"},{"line_number":55,"context_line":"        # test context:"},{"line_number":56,"context_line":"        #     CONF.database.use_tpool \u003d\u003d True"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_b1397143","line":53,"updated":"2014-06-02 13:49:09.000000000","message":"ditto","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"76935c5dcd61fd33b6e707c2c65a9867e35d4b3c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.db_api.fake"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # CONF.database.use_tpool is True, so we get tpool proxy in this case"},{"line_number":67,"context_line":"        self.eventlet.tpool.Proxy.assert_called_once_with("},{"line_number":68,"context_line":"            mock_db_api.DBAPI.from_config())"},{"line_number":69,"context_line":"        self.assertEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":70,"context_line":"        self.assertNotEqual(self.db_api._db_api,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_318f21ce","line":67,"updated":"2014-06-02 13:49:09.000000000","message":"Can we do something similar to my comment to 46 here?","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"14a3d4759f1ac8c85bf0c9d68e61faef68a57c78","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.db_api.fake"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # CONF.database.use_tpool is True, so we get tpool proxy in this case"},{"line_number":67,"context_line":"        self.eventlet.tpool.Proxy.assert_called_once_with("},{"line_number":68,"context_line":"            mock_db_api.DBAPI.from_config())"},{"line_number":69,"context_line":"        self.assertEqual(self.db_api._db_api, self.eventlet.tpool.Proxy())"},{"line_number":70,"context_line":"        self.assertNotEqual(self.db_api._db_api,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_474b0f87","line":67,"in_reply_to":"1ae5cdf2_318f21ce","updated":"2014-06-02 14:33:18.000000000","message":"Done","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"76935c5dcd61fd33b6e707c2c65a9867e35d4b3c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertNotEqual(self.db_api._db_api,"},{"line_number":71,"context_line":"                            mock_db_api.DBAPI.from_config())"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @mock.patch(\u0027oslo.db.concurrency.api\u0027)"},{"line_number":74,"context_line":"    def test_db_api_without_installed_eventlet(self, mock_db_api):"},{"line_number":75,"context_line":"        # test context:"},{"line_number":76,"context_line":"        #     CONF.database.use_tpool \u003d\u003d True"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_51bd8d67","line":73,"updated":"2014-06-02 13:49:09.000000000","message":"ditto","commit_id":"e07c24f37c07625f5286c826f1800afa1157755f"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"6328f42793c6ce9b66cef4ffed8190b64b7522c4","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.db_api \u003d concurrency.TpoolDbapiWrapper("},{"line_number":31,"context_line":"            conf\u003dself.conf, backend_mapping\u003dFAKE_BACKEND_MAPPING)"},{"line_number":32,"context_line":"        self.proxy \u003d mock.MagicMock()"},{"line_number":33,"context_line":"        self.eventlet \u003d mock.MagicMock()"},{"line_number":34,"context_line":"        self.eventlet.tpool.Proxy.return_value \u003d self.proxy"},{"line_number":35,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":36,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027, None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_b6af1a7c","line":33,"updated":"2014-06-05 19:21:50.000000000","message":"This approach is OK, but could use a comment explaining why it is here.","commit_id":"be2ea6d126dee0d76bf08de1aadcef4df3256ef8"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"7eeaf82d4ebf354487b9f415efe7c31beb2ecb88","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.db_api \u003d concurrency.TpoolDbapiWrapper("},{"line_number":31,"context_line":"            conf\u003dself.conf, backend_mapping\u003dFAKE_BACKEND_MAPPING)"},{"line_number":32,"context_line":"        self.proxy \u003d mock.MagicMock()"},{"line_number":33,"context_line":"        self.eventlet \u003d mock.MagicMock()"},{"line_number":34,"context_line":"        self.eventlet.tpool.Proxy.return_value \u003d self.proxy"},{"line_number":35,"context_line":"        sys.modules[\u0027eventlet\u0027] \u003d self.eventlet"},{"line_number":36,"context_line":"        self.addCleanup(sys.modules.pop, \u0027eventlet\u0027, None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_2181ea4d","line":33,"in_reply_to":"1ae5cdf2_b6af1a7c","updated":"2014-06-06 14:28:29.000000000","message":"Done","commit_id":"be2ea6d126dee0d76bf08de1aadcef4df3256ef8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"45537817121e261d1868bf48be5db14e87a0525f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        # NOTE(akurilin): We are not  going to add `eventlet` to `oslo.db` in"},{"line_number":34,"context_line":"        # requirements (`requirements.txt` and `test-requirements.txt`) due to"},{"line_number":35,"context_line":"        # such reasons:"},{"line_number":36,"context_line":"        #  - supporting of eventlet\u0027s thread pooling is totally optional;"},{"line_number":37,"context_line":"        #  - we don\u0027t need to test `tpool.Proxy` functionality itself,"},{"line_number":38,"context_line":"        #    because it\u0027s a tool from the third party library;"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_e460f0d1","line":35,"updated":"2014-06-06 14:51:19.000000000","message":"s/such/the following","commit_id":"4c7ec17308805e4900fd7a8f59d88d4a3b4594bf"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"714a8e5d93bf0337f19e7543073f33f634f01468","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        # NOTE(akurilin): We are not  going to add `eventlet` to `oslo.db` in"},{"line_number":34,"context_line":"        # requirements (`requirements.txt` and `test-requirements.txt`) due to"},{"line_number":35,"context_line":"        # such reasons:"},{"line_number":36,"context_line":"        #  - supporting of eventlet\u0027s thread pooling is totally optional;"},{"line_number":37,"context_line":"        #  - we don\u0027t need to test `tpool.Proxy` functionality itself,"},{"line_number":38,"context_line":"        #    because it\u0027s a tool from the third party library;"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_0f16d5f1","line":35,"in_reply_to":"1ae5cdf2_e460f0d1","updated":"2014-06-06 15:17:17.000000000","message":"Done","commit_id":"4c7ec17308805e4900fd7a8f59d88d4a3b4594bf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"45537817121e261d1868bf48be5db14e87a0525f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        #  - `eventlet` would prevent us from running unit tests on Python 3.x"},{"line_number":40,"context_line":"        #    versions, because it doesn\u0027t support them yet."},{"line_number":41,"context_line":"        #"},{"line_number":42,"context_line":"        # As we don\u0027t test `tpool.Proxy`, we could safely mock it in tests."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.proxy \u003d mock.MagicMock()"},{"line_number":45,"context_line":"        self.eventlet \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_c43cd4c2","line":42,"updated":"2014-06-06 14:51:19.000000000","message":"s/could/can","commit_id":"4c7ec17308805e4900fd7a8f59d88d4a3b4594bf"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"714a8e5d93bf0337f19e7543073f33f634f01468","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        #  - `eventlet` would prevent us from running unit tests on Python 3.x"},{"line_number":40,"context_line":"        #    versions, because it doesn\u0027t support them yet."},{"line_number":41,"context_line":"        #"},{"line_number":42,"context_line":"        # As we don\u0027t test `tpool.Proxy`, we could safely mock it in tests."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.proxy \u003d mock.MagicMock()"},{"line_number":45,"context_line":"        self.eventlet \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ae5cdf2_2fd2b134","line":42,"in_reply_to":"1ae5cdf2_c43cd4c2","updated":"2014-06-06 15:17:17.000000000","message":"Done","commit_id":"4c7ec17308805e4900fd7a8f59d88d4a3b4594bf"}]}
