From 90c02cadc0ddcc5f04b0c544b9d8b5e4f2df5dd9 Mon Sep 17 00:00:00 2001 From: hns Date: Tue, 20 Nov 2007 13:02:31 +0000 Subject: [PATCH] * Make sure deleted objects aren't fetched again from database. Fixes the other half of bug 551 * Renamed methods in Transactor to make their purpose clearer. --- src/helma/objectmodel/db/Node.java | 8 ++++---- src/helma/objectmodel/db/NodeManager.java | 14 +++++++++++--- src/helma/objectmodel/db/Transactor.java | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/helma/objectmodel/db/Node.java b/src/helma/objectmodel/db/Node.java index dcbe730f..ca3fd9c9 100644 --- a/src/helma/objectmodel/db/Node.java +++ b/src/helma/objectmodel/db/Node.java @@ -285,7 +285,7 @@ public final class Node implements INode, Serializable { " from two threads at the same time."); } - current.visitNode(this); + current.visitDirtyNode(this); lock = current; } @@ -311,9 +311,9 @@ public final class Node implements INode, Serializable { if (s == CLEAN) { clearWriteLock(); - tx.dropNode(this); + tx.dropDirtyNode(this); } else { - tx.visitNode(this); + tx.visitDirtyNode(this); if (s == NEW) { clearWriteLock(); @@ -2580,7 +2580,7 @@ public final class Node implements INode, Serializable { // register node with the transactor Transactor current = (Transactor) Thread.currentThread(); - current.visitNode(this); + current.visitDirtyNode(this); current.visitCleanNode(this); // recursively make children persistable diff --git a/src/helma/objectmodel/db/NodeManager.java b/src/helma/objectmodel/db/NodeManager.java index 038053d4..cf8f3ae2 100644 --- a/src/helma/objectmodel/db/NodeManager.java +++ b/src/helma/objectmodel/db/NodeManager.java @@ -165,7 +165,7 @@ public final class NodeManager { Transactor tx = (Transactor) Thread.currentThread(); // See if Transactor has already come across this node - Node node = tx.getVisitedNode(key); + Node node = tx.getCleanNode(key); if ((node != null) && (node.getState() != Node.INVALID)) { return node; @@ -232,7 +232,7 @@ public final class NodeManager { } // See if Transactor has already come across this node - Node node = tx.getVisitedNode(key); + Node node = tx.getCleanNode(key); if ((node != null) && (node.getState() != Node.INVALID)) { // we used to refresh the node in the main cache here to avoid the primary key @@ -277,7 +277,7 @@ public final class NodeManager { // from the database. node = getNodeByRelation(tx.txn, home, kstr, rel, otherDbm); - if (node != null) { + if (node != null && node.getState() != Node.DELETED) { Node newNode = node; if (key.equals(node.getKey())) { node = registerNewNode(node, null); @@ -1856,6 +1856,14 @@ public final class NodeManager { if (id == null) { return null; + } else if (Thread.currentThread() instanceof Transactor) { + // Check if the node is already registered with the transactor - + // it may be in the process of being DELETED. + DbKey key = new DbKey(dbmap, id); + Node dirtyNode = ((Transactor) Thread.currentThread()).getDirtyNode(key); + if (dirtyNode != null) { + return dirtyNode; + } } Hashtable propMap = new Hashtable(); diff --git a/src/helma/objectmodel/db/Transactor.java b/src/helma/objectmodel/db/Transactor.java index 03d0c641..8edc1eec 100644 --- a/src/helma/objectmodel/db/Transactor.java +++ b/src/helma/objectmodel/db/Transactor.java @@ -87,7 +87,7 @@ public class Transactor extends Thread { * * @param node ... */ - public void visitNode(Node node) { + public void visitDirtyNode(Node node) { if (node != null) { Key key = node.getKey(); @@ -102,7 +102,7 @@ public class Transactor extends Thread { * * @param node ... */ - public void dropNode(Node node) { + public void dropDirtyNode(Node node) { if (node != null) { Key key = node.getKey(); @@ -110,6 +110,15 @@ public class Transactor extends Thread { } } + /** + * Get a dirty Node from this transaction. + * @param key the key + * @return the dirty node associated with the key, or null + */ + public Node getDirtyNode(Key key) { + return (Node) dirtyNodes.get(key); + } + /** * Keep a reference to an unmodified Node local to this transaction * @@ -154,7 +163,7 @@ public class Transactor extends Thread { * * @return ... */ - public Node getVisitedNode(Object key) { + public Node getCleanNode(Object key) { return (key == null) ? null : (Node) cleanNodes.get(key); }