summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing/provision.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-02-08 22:57:02 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2016-02-09 11:49:35 -0500
commitde027d0fba165c63147a868bf6f1ff4843e566f4 (patch)
tree453996f0bc972774583233e30aa1bb236a2bc117 /lib/sqlalchemy/testing/provision.py
parent3182bcfc2ddc6aa001936f9de331b0134e4c3b97 (diff)
downloadsqlalchemy-de027d0fba165c63147a868bf6f1ff4843e566f4.tar.gz
- Testing reveals that we have *no* weak references to any cx_Oracle connections at all,
yet cx_Oracle still has open sessions that cannot be killed until process dies. Oracle wins! Add a completely separate DB reaper script that runs after py.test is done. (cherry picked from commit 11a8440bc43aa9f7eb6f2cb7b7f43e0cf6680f41)
Diffstat (limited to 'lib/sqlalchemy/testing/provision.py')
-rw-r--r--lib/sqlalchemy/testing/provision.py35
1 files changed, 32 insertions, 3 deletions
diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py
index b998b7f78..b928d006d 100644
--- a/lib/sqlalchemy/testing/provision.py
+++ b/lib/sqlalchemy/testing/provision.py
@@ -4,6 +4,8 @@ from sqlalchemy import exc
from sqlalchemy.util import compat
from . import config, engines
import time
+import logging
+log = logging.getLogger(__name__)
FOLLOWER_IDENT = None
@@ -229,12 +231,39 @@ def _oracle_configure_follower(config, ident):
config.test_schema_2 = "%s_ts2" % ident
+def _ora_drop_ignore(conn, dbname):
+ try:
+ conn.execute("drop user %s cascade" % dbname)
+ log.info("Reaped db: %s" % dbname)
+ return True
+ except exc.DatabaseError as err:
+ log.warn("couldn't drop db: %s" % err)
+ return False
+
@_drop_db.for_db("oracle")
def _oracle_drop_db(cfg, eng, ident):
with eng.connect() as conn:
- conn.execute("drop user %s cascade" % ident)
- conn.execute("drop user %s_ts1 cascade" % ident)
- conn.execute("drop user %s_ts2 cascade" % ident)
+ # cx_Oracle seems to occasionally leak open connections when a large
+ # suite it run, even if we confirm we have zero references to
+ # connection objects.
+ # while there is a "kill session" command in Oracle,
+ # it unfortunately does not release the connection sufficiently.
+ _ora_drop_ignore(conn, ident)
+ _ora_drop_ignore(conn, "%s_ts1" % ident)
+ _ora_drop_ignore(conn, "%s_ts2" % ident)
+
+def reap_oracle_dbs(eng):
+ log.info("Reaping Oracle dbs...")
+ with eng.connect() as conn:
+ to_reap = conn.execute(
+ "select u.username from all_users u where username "
+ "like 'TEST_%' and not exists (select username "
+ "from v$session where username=u.username)")
+ dropped = 0
+ for total, (username, ) in enumerate(to_reap, 1):
+ if _ora_drop_ignore(conn, username):
+ dropped += 1
+ log.info("Dropped %d out of %d stale databases detected", dropped, total)
@_follower_url_from_main.for_db("oracle")