Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: None
-
Fix Version/s: 6.1.16
-
Component/s: None
-
Labels:None
-
Number of attachments :
Description
JETTY-947 unfortunately makes this very hard to see but it is occurring once you get some load on the system
java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
at java.util.Hashtable$EntriesIterator.nextEntry(Hashtable.java:955)
at java.util.Hashtable$EntriesIterator.next(Hashtable.java:943)
at org.mortbay.terracotta.servlet.TerracottaSessionManager.scavenge(TerracottaSessionManager.java:484)
at org.mortbay.terracotta.servlet.TerracottaSessionManager.run(TerracottaSessionManager.java:166)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:292)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:58)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
This is an unfortunate behavior of clustered Hashtable instances. The local synchronization performed on the _sessionExpirations while collecting the candidate is not sufficient since updates from other nodes in the cluster can modify it. Without using some terracotta APIs, the only way to safely traverse the keys of the Hashtable is to use the keys() Enumeration.
Those line numbers are slightly off (I was testing some local changes). This should match the 6.1.15 tagged sources
java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
at java.util.Hashtable$EntriesIterator.nextEntry(Hashtable.java:955)
at java.util.Hashtable$EntriesIterator.next(Hashtable.java:943)
at org.mortbay.terracotta.servlet.TerracottaSessionManager.scavenge(TerracottaSessionManager.java:482)
at org.mortbay.terracotta.servlet.TerracottaSessionManager.run(TerracottaSessionManager.java:164)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:292)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:58)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)