[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Ozone serialization bug
Hi,
There is a bug in ozone serialization that can cause infinite recursion.
I think you'll see it anywhere ozone has to read a Hashtable containing key
objects whose hashCode() methods require accessing another ozone object in
the same cluster.
I have an ozone class that contains a reference to a hashtable. The keys
in the hashtable are ozone objects AND their hashCode() method has been
overridden. The hashCode() method relies on a reference to an ozone object
stored in the key object.
This leads to the following problem:
(I've just shown the top of a long stack trace leading to a
StackOverflowError. Line numbers may be off because I put in some
debugging code.)
(you may want to widen your screen for this)
34 at
org.ozoneDB.core.wizardStore.ClusterStore.readCluster(ClusterStore.java:370
) <-- this is trying to read the same cluster as line 11 - loop
33 at
org.ozoneDB.core.wizardStore.ClusterStore.loadCluster(ClusterStore.java:172)
32 at
org.ozoneDB.core.wizardStore.WizardStore.containerForID(WizardStore.java:25
4)
31 at org.ozoneDB.core.Transaction.acquireObject(Transaction.java:107)
30 at org.ozoneDB.core.Transaction.invokeObject(Transaction.java:421)
29 at org.ozoneDB.Database.invoke(Database.java:192) <-- the insertion on
line 27 requires referencing an ozone object in the same cluster we're in.
28 at
will.sequiturDB.objTerminalImpl_Proxy.hashCode(objTerminalImpl_Proxy.java:1
57)
27 at java.util.Hashtable.put(Hashtable.java) <-- here the hashtable is
trying to insert an object it has just read.
26 at java.util.Hashtable.readObject(Hashtable.java)
25 at java.io.ObjectInputStream.inputObject(ObjectInputStream.java)
24 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
23 at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java)
22 at java.io.ObjectInputStream.inputObject(ObjectInputStream.java)
21 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
20 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
19 at
org.ozoneDB.core.wizardStore.WizardObjectContainer.readExternal(WizardObjec
tContainer.java:224)
18 at java.io.ObjectInputStream.inputObject(ObjectInputStream.java)
17 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
16 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
15 at org.ozoneDB.core.wizardStore.Cluster.readExternal(Cluster.java:253)
14 at java.io.ObjectInputStream.inputObject(ObjectInputStream.java)
13 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
12 at java.io.ObjectInputStream.readObject(ObjectInputStream.java)
11 at
org.ozoneDB.core.wizardStore.ClusterStore.readCluster(ClusterStore.java:370
) <-- this is where ozone starts reading a cluster
10 at
org.ozoneDB.core.wizardStore.ClusterStore.loadCluster(ClusterStore.java:172)
9 at
org.ozoneDB.core.wizardStore.WizardStore.containerForID(WizardStore.java:25
4)
8 at
org.ozoneDB.core.wizardStore.WizardStore.containerForName(WizardStore.java:
275)
7 at org.ozoneDB.core.DbRemote.DbObjForName.perform(DbObjForName.java:31)
6 at org.ozoneDB.core.Transaction.performCommand(Transaction.java:172)
5 at
org.ozoneDB.core.TransactionManager.completeTransaction(TransactionManager.
java:248)
4 at
org.ozoneDB.core.TransactionManager.handleCommand(TransactionManager.java:2
32)
3 at org.ozoneDB.core.InvokeServer.handleClientEvent(InvokeServer.java:58)
2 at
org.ozoneDB.DxLib.net.DxMultiServerClient.run(DxMultiServerClient.java:36)
1 at java.lang.Thread.run(Thread.java)
This is a very tricky bug to solve. sigh.
later,
\x/ill :-}