]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
don't fail if purge recyclebin fails/mutex on registry
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 2 Feb 2021 16:26:55 +0000 (11:26 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 2 Feb 2021 18:44:55 +0000 (13:44 -0500)
the recyclebin purge is failing after SetInputSizesTest
on occasion.  try to reduce transaction overhead and don't
error out if the purge fails.

ensure _CONFIGURE_MUTEX is used when mutating or
iterating the _mapper_registries collection.

Change-Id: I9d9cd53b92419a2ad97bae5ee8bdd2657b6e408f

lib/sqlalchemy/dialects/oracle/provision.py
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/decl_api.py
lib/sqlalchemy/orm/mapper.py
test/dialect/oracle/test_types.py

index e0dadd58ea0e490d41ac05a3c9f8751f98d4918b..0a2c41009908ea84ff482af1f2151a9a22ea246c 100644 (file)
@@ -60,10 +60,13 @@ def _oracle_drop_db(cfg, eng, ident):
 @stop_test_class_outside_fixtures.for_db("oracle")
 def stop_test_class_outside_fixtures(config, db, cls):
 
-    with db.begin() as conn:
-        # run magic command to get rid of identity sequences
-        # https://floo.bar/2019/11/29/drop-the-underlying-sequence-of-an-identity-column/  # noqa E501
-        conn.exec_driver_sql("purge recyclebin")
+    try:
+        with db.begin() as conn:
+            # run magic command to get rid of identity sequences
+            # https://floo.bar/2019/11/29/drop-the-underlying-sequence-of-an-identity-column/  # noqa E501
+            conn.exec_driver_sql("purge recyclebin")
+    except exc.DatabaseError as err:
+        log.warning("purge recyclebin command failed: %s", err)
 
     # clear statement cache on all connections that were used
     # https://github.com/oracle/python-cx_Oracle/issues/519
index ffbe785032f82a8a5ccaaa362ad7c651bee0df3d..4793fc6386bfa2b7c8aeeeb2d303ada8a64e8a45 100644 (file)
@@ -268,9 +268,7 @@ def clear_mappers():
 
     """
 
-    with mapperlib._CONFIGURE_MUTEX:
-        all_regs = mapperlib._all_registries()
-        mapperlib._dispose_registries(all_regs, False)
+    mapperlib._dispose_registries(mapperlib._all_registries(), False)
 
 
 joinedload = strategy_options.joinedload._unbound_fn
index e6d41083f17c0abc264079377e7da482122ad24f..8afdb3a50bb8603b58d7360bf80ae3fd6c66d03b 100644 (file)
@@ -469,7 +469,8 @@ class registry(object):
 
         self._new_mappers = False
 
-        mapperlib._mapper_registries[self] = True
+        with mapperlib._CONFIGURE_MUTEX:
+            mapperlib._mapper_registries[self] = True
 
     @property
     def mappers(self):
index 66c0627243c1fa3d7dbddcdfa6e76d7e3afc278e..16a2c641602a371956b88262ee971b46a3ca4c2b 100644 (file)
@@ -62,11 +62,12 @@ _legacy_registry = None
 
 
 def _all_registries():
-    return set(_mapper_registries)
+    with _CONFIGURE_MUTEX:
+        return set(_mapper_registries)
 
 
 def _unconfigured_mappers():
-    for reg in _mapper_registries:
+    for reg in _all_registries():
         for mapper in reg._mappers_to_configure():
             yield mapper
 
@@ -3347,7 +3348,7 @@ def configure_mappers():
 
     """
 
-    _configure_registries(set(_mapper_registries), cascade=True)
+    _configure_registries(_all_registries(), cascade=True)
 
 
 def _configure_registries(registries, cascade):
index 3636dad13f83b2cc1b7d24781cad83db0a09112b..45a0fd4375d5e2bd36aad3b6cdf5e8d2dbcf9ac2 100644 (file)
@@ -1199,7 +1199,6 @@ class SetInputSizesTest(fixtures.TestBase):
             "t2", m, Column("foo", NullType().with_variant(datatype, "oracle"))
         )
         t3 = Table("t3", m, Column("foo", TestTypeDec()))
-        m.create_all(testing.db)
 
         class CursorWrapper(object):
             # cx_oracle cursor can't be modified so we have to
@@ -1222,7 +1221,11 @@ class SetInputSizesTest(fixtures.TestBase):
         else:
             engine = testing.db
 
-        with engine.begin() as conn:
+        with engine.connect() as conn:
+            conn.begin()
+
+            m.create_all(conn, checkfirst=False)
+
             connection_fairy = conn.connection
             for tab in [t1, t2, t3]:
                 with mock.patch.object(