The AckCompactionRunner task needs to acquire the checkpiont lock to prevent other threads from running a checkpoint while the task is running. Normally this task runs on the same executor as the checkpoint task so the ack compaction task wouldn't run at the same time as the checkpoint task as they are processed one at a time.
However, there are two cases where this isn't always true. First, the checkpoint() method is public and can be called through the PersistenceAdapter interface by someone at the same time the ack compaction is running. Second, a checkpoint is called during shutdown without using the executor and could also run while the ack compaction is running.
The main reason for this fix is because when doing some testing I was seeing an occasional error from journal.getNextLocation() in the forwardAllAcks method because a journal file was missing which I believe was cleaned up by the cleanup task. I was testing scenarios such as shutdown and also manually triggering the task at the same time as an ack compaction.
Also, while we are at it, we should have a try/catch around the journal.getNextLocation calls to catch any IOException so we can abort gracefully.