You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cromwell启动失败:Liquibase无法获取变更日志锁问题求助

Cromwell Liquibase锁异常问题及解决方案

背景与环境

我正在使用生物信息学Java程序Cromwell,它通过Liquibase和本地文件型HSQLDB存储数据,HSQLDB的JDBC配置如下:

jdbc:hsqldb:file:cromwell-executions/cromwell-db/cromwell-db;
shutdown=false;
hsqldb.default_table_type=cached;hsqldb.tx=mvcc;
hsqldb.result_max_memory_rows=10000;
hsqldb.large_data=true;
hsqldb.applog=3;
hsqldb.lob_compressed=true;
hsqldb.script_format=3

每次执行启动命令:

java  -Dconfig.file=${PWD}/app.conf -jar  ${CROMWELL_JAR} run test.wdl --inputs input.json

都会触发Liquibase锁异常,堆栈错误如下:

[2023-02-08 16:32:11,54] [info] checkpointClose synched
[2023-02-08 16:32:11,57] [info] checkpointClose script done
[2023-02-08 16:32:11,57] [info] dataFileCache commit start
[2023-02-08 16:32:11,57] [info] dataFileCache commit end
[2023-02-08 16:32:11,69] [info] checkpointClose end
[2023-02-08 16:32:11,69] [info] Checkpoint end - txts: 5342
[2023-02-08 16:32:21,70] [info] Checkpoint start
[2023-02-08 16:32:21,70] [info] checkpointClose start
[2023-02-08 16:32:21,70] [info] checkpointClose synched
[2023-02-08 16:32:21,74] [info] checkpointClose script done
[2023-02-08 16:32:21,74] [info] dataFileCache commit start
[2023-02-08 16:32:21,76] [info] dataFileCache commit end
[2023-02-08 16:32:21,82] [info] checkpointClose end
[2023-02-08 16:32:21,82] [info] Checkpoint end - txts: 5348
[2023-02-08 16:32:21,89] [error] Failed to instantiate Cromwell System. Shutting down Cromwell.
liquibase.exception.LockException: Could not acquire change log lock.  Currently locked by fdb0:cafe:d0d0:ceb4:ba59:9fff:fec3:33de%p1p1 (fdb0:cafe:d0d0:ceb4:ba59:9fff:fec3:33de%p1p1) since 2/8/23, 4:23 PM
    at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:270)
    at liquibase.Liquibase.lambda$update$1(Liquibase.java:214)
    at liquibase.Scope.lambda$child$0(Scope.java:180)
    at liquibase.Scope.child(Scope.java:189)
    at liquibase.Scope.child(Scope.java:179)
    at liquibase.Scope.child(Scope.java:158)
    at liquibase.Liquibase.runInScope(Liquibase.java:2405)
    at liquibase.Liquibase.update(Liquibase.java:211)
    at liquibase.Liquibase.update(Liquibase.java:197)
    at cromwell.database.migration.liquibase.LiquibaseUtils$.updateSchema(LiquibaseUtils.scala:74)
    at cromwell.database.migration.liquibase.LiquibaseUtils$.updateSchema(LiquibaseUtils.scala:46)
    at cromwell.services.ServicesStore$EnhancedSqlDatabase$.$anonfun$initialized$1(ServicesStore.scala:11)
    at cromwell.services.ServicesStore$EnhancedSqlDatabase$.$anonfun$initialized$1$adapted(ServicesStore.scala:11)
    at cromwell.database.slick.SlickDatabase.$anonfun$withConnection$1(SlickDatabase.scala:156)
    at slick.jdbc.SimpleJdbcAction.run(StreamingInvokerAction.scala:70)
    at slick.jdbc.SimpleJdbcAction.run(StreamingInvokerAction.scala:69)
    at slick.basic.BasicBackend$DatabaseDef$$anon$3.liftedTree1$1(BasicBackend.scala:276)
    at slick.basic.BasicBackend$DatabaseDef$$anon$3.run(BasicBackend.scala:276)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1589)

已删除工作目录所有文件(含隐藏文件),但问题依旧,针对以下问题给出解决方案:


1. 若不关心数据库版本,是否有通用方法(如Java属性)禁用Liquibase?

Cromwell官方未提供直接禁用Liquibase的Java系统属性或配置项。Liquibase负责维护Cromwell数据库的schema版本一致性,禁用后可能导致数据库结构与程序预期不匹配,引发未知错误。如果非要尝试,可通过修改Cromwell源码跳过迁移逻辑,但属于非官方操作,风险极高,不建议这么做。

2. Liquibase的锁文件存储在何处(比如用户主目录)?

Liquibase的锁信息并非存储在独立文件中,而是保存在数据库内部的DATABASECHANGELOGLOCK表中。对于你使用的HSQLDB,这个表的数据和其他数据库内容一起,存放在cromwell-executions/cromwell-db/目录下的HSQLDB相关文件(如.script、.data、.log等)中。之前删除工作目录文件未解决问题,可能是残留的数据库进程未关闭,导致文件未被彻底清理。

3. 如何解决该锁异常问题?

可按以下步骤逐一尝试:

  • 终止残留进程:检查是否有未关闭的Cromwell或HSQLDB进程,执行ps aux | grep -E 'cromwell|hsqldb'查找相关进程,并用kill -9 <进程ID>终止。
  • 手动解锁数据库:通过HSQLDB工具连接数据库,手动修改锁表状态:
    1. 执行命令启动HSQLDB可视化管理工具(确保Cromwell JAR包含HSQLDB驱动,否则需单独下载HSQLDB的jar包):
      java -cp ${CROMWELL_JAR} org.hsqldb.util.DatabaseManagerSwing --url jdbc:hsqldb:file:cromwell-executions/cromwell-db/cromwell-db
      
    2. 连接后执行SQL语句释放锁:
      UPDATE DATABASECHANGELOGLOCK SET LOCKED = FALSE, LOCKGRANTED = NULL, LOCKEDBY = NULL WHERE ID = 1;
      
    3. 提交修改后断开连接。
  • 彻底重置数据库:若上述方法无效,删除cromwell-executions/cromwell-db/目录下的所有HSQLDB文件,重新启动Cromwell,程序会自动初始化新的数据库和Liquibase日志。

内容的提问来源于stack exchange,提问作者Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:20:52