[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            :-}