Перезапуск leveldb при неудачной инициализации в Akka - PullRequest
0 голосов
/ 04 февраля 2019

Мое приложение разработано таким образом, что всякий раз, когда кто-то пытается его запустить, приложение закрывает другие экземпляры самого себя.(обратите внимание, что это работает должным образом и не должно быть изменено).

Я использую Akka, и один из моих Actor s - PersistentActor, который использует leveldb.

Когда приложение запускается, оно блокирует <path-to-lock>/LOCK, когда оно запускается снова, leveldb не может заблокировать файл, поэтому PersistentActor не может запуститься.

После некоторой проверки я обнаружил, что класс leveldb Actorимеет значение LeveldbJournal и начинается с system guardian с путем akka://actor-system/system/akka.persistence.journal.leveldb.

Я бы хотел, чтобы leveldb перезапустил себя, пока файл не может быть заблокирован или не достигнут максимальный предел попыток.

Журналы:

[ERROR] [02/04/2019 15:39:25.731] [operator-actor-system-akka.actor.default-dispatcher-5] [akka://operator-actor-system/system/akka.persistence.journal.leveldb] Unable to acquire lock on '<path-to-lock>/LOCK'
akka.actor.ActorInitializationException: akka://operator-actor-system/system/akka.persistence.journal.leveldb: exception during creation
    at akka.actor.ActorInitializationException$.apply(Actor.scala:180)
    at akka.actor.ActorCell.create(ActorCell.scala:607)
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:461)
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:483)
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282)
    at akka.dispatch.Mailbox.run(Mailbox.scala:223)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Unable to acquire lock on '<path-to-lock>/LOCK'
    at org.iq80.leveldb.impl.DbLock.<init>(DbLock.java:55)
    at org.iq80.leveldb.impl.DbImpl.<init>(DbImpl.java:167)
    at org.iq80.leveldb.impl.Iq80DBFactory.open(Iq80DBFactory.java:59)
    at akka.persistence.journal.leveldb.LeveldbStore$class.preStart(LeveldbStore.scala:178)
    at akka.persistence.journal.leveldb.LeveldbJournal.preStart(LeveldbJournal.scala:23)
    at akka.actor.Actor$class.aroundPreStart(Actor.scala:510)
    at akka.persistence.journal.leveldb.LeveldbJournal.aroundPreStart(LeveldbJournal.scala:23)
    at akka.actor.ActorCell.create(ActorCell.scala:590)
    ... 7 more

Когда PersistentActor перезапускается:

[ERROR] [02/04/2019 15:39:57.168] [operator-actor-system-akka.actor.default-dispatcher-16] [akka://operator-actor-system/user/controller/view-manager/records-service-api-supervisor/records-service-api] Persistence failure when replaying events for persistenceId [record-service-persistence-actor]. Last known sequence number [0] (akka.persistence.RecoveryTimedOut)

Спасибо,

Ido Sorozon

PS Версии:

Scala: 2.11.8
Akka:  2.4.19
...