summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing/provision.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/testing/provision.py')
-rw-r--r--lib/sqlalchemy/testing/provision.py41
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")