diff --git a/nomad/infrastructure.py b/nomad/infrastructure.py index d6286fca6df56ffbb3d4d670b895e1d05e57f9a4..32ce5a20d344601d996598eb25568b81c4fc61f8 100644 --- a/nomad/infrastructure.py +++ b/nomad/infrastructure.py @@ -143,18 +143,30 @@ def setup_repository_db(): global repository_db global repository_db_conn + repository_db_conn, repository_db = sqlalchemy_repository_db(readonly=False) + logger.info('setup repository db') + - url = 'postgresql://%s:%s@%s:%d/%s' % ( - config.repository_db.user, - config.repository_db.password, - config.repository_db.host, - config.repository_db.port, - config.repository_db.dbname) +def sqlalchemy_repository_db(readonly=True, **kwargs): + """ + Returns SQLAlchemy connection and session for the given db parameters. + It uses the regular `config.repository_db` parameters updated with the given + `**kwargs`. + """ + def no_flush(): + pass + + params = config.repository_db._asdict() + params.update(**kwargs) + url = 'postgresql://%s:%s@%s:%d/%s' % utils.to_tuple(params, 'user', 'password', 'host', 'port', 'dbname') engine = create_engine(url, echo=False) repository_db_conn = engine.connect() repository_db = Session(bind=repository_db_conn, autocommit=True) - logger.info('setup repository db') + if readonly: + repository_db.flush = no_flush + + return repository_db_conn, repository_db def reset(): @@ -261,7 +273,7 @@ def repository_db_connection(dbname=None, with_trans=True): logger.error('Unhandled exception within repository db connection.', exc_info=e) conn.rollback() conn.close() - return + raise e conn.commit() conn.close() @@ -276,7 +288,7 @@ def reset_repository_db(): repository_db.expunge_all() repository_db.invalidate() if repository_db_conn is not None: - repository_db_conn.close() + repository_db_conn.close_all() # perform the reset with repository_db_connection(with_trans=False) as conn: diff --git a/nomad/processing/data.py b/nomad/processing/data.py index a3c2998fce58fcfa61fcebc8e7e992ac24ec7b0d..98f7b651944df094e38bbabffad8ba40f82d0218 100644 --- a/nomad/processing/data.py +++ b/nomad/processing/data.py @@ -346,8 +346,6 @@ class Upload(Chord, datamodel.Upload): with utils.timer( logger, 'staged upload deleted', step='delete', upload_size=self.upload_files.size): - import time - time.sleep(10) self.upload_files.delete() self.delete() diff --git a/nomad/utils.py b/nomad/utils.py index f028d8572ade6f4ca26ae93ccdf014406d851633..507a5c053737555863f1d5e0ca597961ede192dc 100644 --- a/nomad/utils.py +++ b/nomad/utils.py @@ -253,3 +253,7 @@ class archive: @staticmethod def upload_id(archive_id: str) -> str: return archive.item(archive_id, 0) + + +def to_tuple(self, *args): + return tuple(self[arg] for arg in args) diff --git a/tests/conftest.py b/tests/conftest.py index b9d2b1f5097de8cfd5876a977288426e49f72405..6b23f7b30621351f04140594530f72d84759d8ab 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -114,7 +114,9 @@ def repository_db(monkeysession): monkeysession.setattr('nomad.infrastructure.repository_db', session) yield infrastructure.repository_db trans.rollback() - session.close() + session.expunge_all() + session.invalidate() + session.close_all() @pytest.fixture(scope='function') @@ -142,38 +144,6 @@ def admin_user(repository_db): return coe_repo.admin_user() -# @pytest.fixture(scope='function') -# def mocksearch(monkeypatch): -# uploads_by_id = {} -# by_archive_id = {} - -# def persist(calc): -# uploads_by_id.setdefault(calc.upload_id, []).append(calc) -# by_archive_id[calc.calc_id] = calc - -# def upload_exists(self): -# return self.upload_id in uploads_by_id - -# def upload_delete(self): -# upload_id = self.upload_id -# if upload_id in uploads_by_id: -# for calc in uploads_by_id[upload_id]: -# del(by_archive_id[calc.calc_id]) -# del(uploads_by_id[upload_id]) - -# @property -# def upload_calcs(self): -# return uploads_by_id.get(self.upload_id, []) - -# monkeypatch.setattr('nomad.repo.RepoCalc.persist', persist) -# monkeypatch.setattr('nomad.repo.RepoUpload.exists', upload_exists) -# monkeypatch.setattr('nomad.repo.RepoUpload.delete', upload_delete) -# monkeypatch.setattr('nomad.repo.RepoUpload.calcs', upload_calcs) -# monkeypatch.setattr('nomad.repo.RepoUpload.commit', lambda *args, **kwargs: None) - -# return by_archive_id - - @pytest.fixture(scope='function') def no_warn(caplog): yield caplog