删除或创建Datomic数据库时(使用Datomic Pro 0.9.4899),我收到以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: :db.error/read-transactor-location-failed Could not read transactor location from storage
at datomic.error$arg.invoke(error.clj:55)
at datomic.coordination$check_peer_version.invoke(coordination.clj:138)
at datomic.coordination$lookup_compatible_transactor_endpoint.invoke(coordination.clj:149)
at datomic.peer$send_admin_request$fn__8594.invoke(peer.clj:713)
at datomic.peer$send_admin_request.invoke(peer.clj:707)
at datomic.peer$delete_database.invoke(peer.clj:745)
at clojure.lang.Var.invoke(Var.java:379)
at datomic.Peer.deleteDatabase(Peer.java:142)
at datomic.api$delete_database.invoke(api.clj:23)
...
这个例外是什么意思?它可能出现的常见原因是什么?
答案 0 :(得分:5)
当交易者启动时,他们会将其位置写入存储。他们实际上用每个心跳消息写出他们的位置。如果在对等方尝试连接时看到此消息,则表示没有写入处理器位置,或者它们无法从存储中读取(并且在尝试执行此操作时首先遇到此错误)。
AWS配置的原因 - 比如AWS CloudFormation和DynamoDB作为您的存储 - 将使用未正确配置为写入存储的transactor属性文件启动。当对等方尝试连接到存储时,它们将无法读取交易者的位置。这可能是因为交易者和同行指向不同的存储。您还可能遇到权限问题,例如transactor没有权限写入您指定的存储(安全组配置等)
无论哪种方式,这种情况的一般原因就是错误消息所说的 - 无法从存储中读取交易者位置。看起来这里缺少的细节是当系统健康且正确配置时如何发生这种情况:对等体从存储中读取交易者位置,并且交易者将其位置写为心跳的一部分(以及故障转移事件,备用交易者)将在接管时写下它的位置)。有各种系统配置问题可能会导致这种情况。
答案 1 :(得分:0)
我遇到这个问题已经过了几个星期了。我想我找到了答案,但我不确定我是否正确记得它。所以,如果我错了,我会把它变成一个社区维基。
:db.error/read-transactor-location-failed
表示在Datomic中配置的位置没有有效的后端存储服务。
我在AWS CloudFormation中遇到此错误。我有一个transactor(在EC2实例上运行)和后端存储(DynamoDB表)。我认为发生此错误是因为在创建DynamoDB表之前,transactor已启动。 (向事务处理器实例添加DependsOn
子句解决了问题。)
答案 2 :(得分:0)
当我在没有数据库 uri 中的密码的情况下连接时出现此错误
datomic:dev://transactor:4334/mydb?password=XxXxXx