]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- limit oracle DB reaps to identifiers generated from this
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 2 Jun 2016 21:42:51 +0000 (17:42 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 2 Jun 2016 21:42:51 +0000 (17:42 -0400)
run to prevent race conditions against concurrent runs

Change-Id: I065d1cec346ea7af03792c3cc2f30766f73c2bd3

lib/sqlalchemy/testing/plugin/plugin_base.py
lib/sqlalchemy/testing/plugin/pytestplugin.py
lib/sqlalchemy/testing/provision.py
reap_oracle_dbs.py
tox.ini

index fd33c56a0c6666829d8a9dd3df70af2195ee4f53..fc9d71165b928c3c494acf42ad28cb68dcf08c6b 100644 (file)
@@ -67,6 +67,9 @@ def setup_options(make_option):
                 dest="low_connections",
                 help="Use a low number of distinct connections - "
                 "i.e. for Oracle TNS")
+    make_option("--write-idents", type="string", dest="write_idents",
+                help="write out generated follower idents to <file>, "
+                "when -n<num> is used")
     make_option("--reversetop", action="store_true",
                 dest="reversetop", default=False,
                 help="Use a random-ordering set implementation in the ORM "
index 0bd79eea04b88553bd016acd18d61f48b2ea7f48..d7da73828a5b3e19a99d9fb6a51e6b7e71315f5f 100644 (file)
@@ -9,7 +9,7 @@ import pytest
 import argparse
 import inspect
 import collections
-import itertools
+import os
 
 try:
     import xdist  # noqa
@@ -43,6 +43,14 @@ def pytest_configure(config):
             config.slaveinput["follower_ident"]
         )
 
+        if config.option.write_idents:
+            with open(config.option.write_idents, "a") as file_:
+                file_.write(config.slaveinput["follower_ident"] + "\n")
+    else:
+        if config.option.write_idents and \
+                os.path.exists(config.option.write_idents):
+            os.remove(config.option.write_idents)
+
     plugin_base.pre_begin(config.option)
 
     plugin_base.set_coverage_flag(bool(getattr(config.option,
@@ -58,6 +66,7 @@ def pytest_sessionstart(session):
 def pytest_sessionfinish(session):
     plugin_base.final_process_cleanup()
 
+
 if has_xdist:
     import uuid
 
index 65a3c10a6e2f24a26f345af76accb25461852547..23d504b848649ae09d681747423f82871275f97e 100644 (file)
@@ -40,7 +40,6 @@ class register(object):
 
 
 def create_follower_db(follower_ident):
-
     for cfg in _configs_for_db_operation():
         _create_db(cfg, cfg.db, follower_ident)
 
@@ -271,9 +270,14 @@ def _oracle_drop_db(cfg, eng, ident):
         _ora_drop_ignore(conn, "%s_ts2" % ident)
 
 
-def reap_oracle_dbs(eng):
+def reap_oracle_dbs(eng, idents_file):
     log.info("Reaping Oracle dbs...")
     with eng.connect() as conn:
+        with open(idents_file) as file_:
+            idents = set(line.strip() for line in file_)
+
+        log.info("identifiers in file: %s", ", ".join(idents))
+
         to_reap = conn.execute(
             "select u.username from all_users u where username "
             "like 'TEST_%' and not exists (select username "
@@ -283,7 +287,7 @@ def reap_oracle_dbs(eng):
         for name in all_names:
             if name.endswith("_ts1") or name.endswith("_ts2"):
                 continue
-            else:
+            elif name in idents:
                 to_drop.add(name)
                 if "%s_ts1" % name in all_names:
                     to_drop.add("%s_ts1" % name)
index ff638a01ed599568922dd2549aa9c5541173dd20..4762faac55afd41f118659ea4b0f9a90ce8dab16 100644 (file)
@@ -1,4 +1,4 @@
-"""Drop Oracle databases that are left over from a 
+"""Drop Oracle databases that are left over from a
 multiprocessing test run.
 
 Currently the cx_Oracle driver seems to sometimes not release a
@@ -10,6 +10,7 @@ from sqlalchemy.testing.plugin import plugin_base
 from sqlalchemy.testing import engines
 from sqlalchemy.testing import provision
 import logging
+import sys
 
 logging.basicConfig()
 logging.getLogger(provision.__name__).setLevel(logging.INFO)
@@ -19,6 +20,6 @@ oracle = plugin_base.file_config.get('db', 'oracle')
 from sqlalchemy.testing import provision
 
 engine = engines.testing_engine(oracle, {})
-provision.reap_oracle_dbs(engine)
+provision.reap_oracle_dbs(engine, sys.argv[1])
 
 
diff --git a/tox.ini b/tox.ini
index d5c3b670b146f29bc812f1ea260ba9fb4d79f6af..3c577eb0de7cb30493a3f0c7a7110f60e3984e93 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -52,7 +52,7 @@ setenv=
     sqlite: SQLITE=--db sqlite
     postgresql: POSTGRESQL=--db postgresql
     mysql: MYSQL=--db mysql --db pymysql
-    oracle: ORACLE=--db oracle --low-connections
+    oracle: ORACLE=--db oracle --low-connections --write-idents oracle_idents.txt
     mssql: MSSQL=--db pyodbc --db pymssql
     backendonly: BACKENDONLY=--backend-only
 
@@ -65,7 +65,7 @@ passenv=ORACLE_HOME NLS_LANG
 commands=
   {nocext}: sh -c "rm -f lib/sqlalchemy/*.so"
   {env:BASECOMMAND} {env:WORKERS} {env:SQLITE:} {env:POSTGRESQL:} {env:MYSQL:} {env:ORACLE:} {env:MSSQL:} {env:BACKENDONLY:} {env:COVERAGE:} {posargs}
-  {oracle}: python reap_oracle_dbs.py
+  {oracle}: python reap_oracle_dbs.py oracle_idents.txt
 
 
 [testenv:pep8]