From a24cf76375157c03b1bebb63d26ef664fd76e4c7 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 18 Apr 2013 17:38:16 -0700 Subject: [PATCH] #3182 - Fixing a StackOverflow error in the FileBasedMailbox --- .../filebased/filequeue/PersistentQueue.scala | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala index 33aa49061b..399ca74829 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala @@ -21,6 +21,7 @@ import java.io._ import scala.collection.mutable import akka.event.LoggingAdapter import java.util.concurrent.TimeUnit +import scala.annotation.tailrec import akka.actor.mailbox.filebased.FileBasedMailboxSettings // a config value that's backed by a global setting but may be locally overridden @@ -413,25 +414,28 @@ class PersistentQueue(persistencePath: String, val name: String, val settings: F } final def discardExpired(): Int = { - if (queue.isEmpty || journal.isReplaying) { - 0 - } else { - val realExpiry = adjustExpiry(queue.front.addTime, queue.front.expiry) - if ((realExpiry != 0) && (realExpiry < System.currentTimeMillis)) { - _totalExpired += 1 - val item = queue.dequeue - val len = item.data.length - queueSize -= len - _memoryBytes -= len - queueLength -= 1 - fillReadBehind - if (keepJournal()) journal.remove() - expiredQueue().map { _.add(item.data, 0) } - 1 + discardExpired() + @tailrec def internalDisard(discarded: Int): Int = { + if (queue.isEmpty || journal.isReplaying) { + discarded } else { - 0 + val realExpiry = adjustExpiry(queue.front.addTime, queue.front.expiry) + if ((realExpiry != 0) && (realExpiry < System.currentTimeMillis)) { + _totalExpired += 1 + val item = queue.dequeue + val len = item.data.length + queueSize -= len + _memoryBytes -= len + queueLength -= 1 + fillReadBehind + if (keepJournal()) journal.remove() + expiredQueue().map { _.add(item.data, 0) } + internalDisard(discarded + 1) + } else { + discarded + } } } + internalDisard(0) } private def _unremove(xid: Int) = {