Почему мои интеграционные тесты Postgres неожиданно вызывают исключение?
На прошлой неделе мои интеграционные тесты работали нормально. Сегодня это исключение выдается до того, как мои тесты будут запущены:
org.postgresql.util.PSQLException: FATAL: could not open file "base/12669/2601": No such file or directory
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2433)
at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2566)
at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:131)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:210)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
at org.postgresql.Driver.makeConnection(Driver.java:452)
at org.postgresql.Driver.connect(Driver.java:254)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at com.onzo.analytics.dal.PostgresForTesting.openConnection(PostgresForTesting.scala:111)
PostgresForTesting.scala: 111 - это тело этой функции в моем коде:
private def openConnection(): Unit = {
_connection = DriverManager.getConnection(_dbUrl)
}
DriverManager
является java.sql.DriverManager
,
_dbUrl
настроен здесь:
private def startPostgres(): Unit = {
val port = 5431 // standard port is 5432; use a non-standard port to avoid accidentally using a real Postgres
_postgres = new EmbeddedPostgres(Version.V9_6_8, "imadatadir") // I changed this
val config = sys.env.get("HOME") match {
case None => EmbeddedPostgres.defaultRuntimeConfig()
case Some(ndHome) =>
val cache = Paths.get(ndHome, ".cache", "embedded-postgres")
Files.createDirectories(cache)
EmbeddedPostgres.cachedRuntimeConfig(cache)
}
// downloads Postgres, caches it locally (101MB)
_dbUrl = _postgres.start(config, "localhost", port, _dbName, "username", "password", new util.ArrayList[String])
val executor = AsyncExecutor(
name = "pg-for-testing",
minThreads = this.postgresConfig.numThreads,
maxThreads = this.postgresConfig.numThreads,
maxConnections = this.postgresConfig.maxConnections,
queueSize = this.postgresConfig.queueSize
)
_db = Database.forURL(_dbUrl, driver = "org.postgresql.Driver", executor = executor)
}
EmbeddedPostgres
является ru.yandex.qatools.embed.postgresql.EmbeddedPostgres
, из postgresql-Embedded.
До того, как эта проблема подняла свою уродливую голову сегодня утром, я использовал временную директорию вместо жесткого imadatadir
каталог. (См. Строку, отмеченную I changed this
.) Я жестко закодировал imadatadir
каталог в попытке отладить эту проблему. (Так что это было не то, что вызвало проблему.)
Интересный факт: base/12669/2601
файл, который он жалуется на невозможность открыть, действительно существует:
$ ls -l imadatadir/base/12669/2601*
-rw------- 1 dave.hinton staff 8192 17 Dec 12:57 imadatadir/base/12669/2601
-rw------- 1 dave.hinton staff 24576 17 Dec 12:57 imadatadir/base/12669/2601_fsm
-rw------- 1 dave.hinton staff 8192 17 Dec 12:57 imadatadir/base/12669/2601_vm
Другие факты, которые могут иметь или не иметь отношение к делу:
- никто из моих коллег не может воспроизвести проблему; они на линуксе, я на macOS
- Я не обновлял macOS в выходные
Версии:
- Scala 2.12.4
- JVM: Oracle Java 8, обновление 191
- SBT 1.2.1
- Postgresql-Embedded 2.9 (я вижу, версия 2.10 вышла... но без изменений при обновлении, чтобы использовать его)
- macOS Mojave 10.14.1
Любые идеи о том, как я могу заставить это работать снова? Или, по крайней мере, исследовать дальше, что происходит не так?