diff options
Diffstat (limited to 'lib/sqlalchemy/testing/provision.py')
-rw-r--r-- | lib/sqlalchemy/testing/provision.py | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index ba9754d90..6615eabaf 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -5,6 +5,8 @@ from sqlalchemy.util import compat from . import config, engines import os import time +import logging +log = logging.getLogger(__name__) FOLLOWER_IDENT = None @@ -255,18 +257,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: - for row in conn.execute( - "select sid, serial# from v$session " - "where username='%s'" % ident.upper()): - sid, serial = row - conn.execute("alter system disconnect session '%s, %s' immediate" % (sid, serial)) - # conn.execute("alter system kill session '%s, %s'" % (sid, serial)) - 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") |