From 6dc42a2392e9f92c9289c3d5294303ae2eb3bde0 Mon Sep 17 00:00:00 2001 From: orbiter Date: Sun, 6 Nov 2005 21:06:55 +0000 Subject: [PATCH] detecting of loops in kelondroTree during last/first-Node search git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@1038 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- source/de/anomic/kelondro/kelondroTree.java | 30 ++++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/source/de/anomic/kelondro/kelondroTree.java b/source/de/anomic/kelondro/kelondroTree.java index cbcf789de..23245d940 100644 --- a/source/de/anomic/kelondro/kelondroTree.java +++ b/source/de/anomic/kelondro/kelondroTree.java @@ -136,7 +136,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } // Returns the value to which this map maps the specified key. - public byte[][] get(byte[] key) throws IOException { + public synchronized byte[][] get(byte[] key) throws IOException { //System.out.println("kelondroTree.get " + new String(key) + " in " + filename); Search search = new Search(); search.process(key); @@ -148,7 +148,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - public long[] getLong(byte[] key) throws IOException { + public synchronized long[] getLong(byte[] key) throws IOException { byte[][] row = get(key); long[] longs = new long[columns() - 1]; if (row == null) { @@ -295,14 +295,14 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - public boolean isChild(Node childn, Node parentn, int child) throws IOException { + public synchronized boolean isChild(Node childn, Node parentn, int child) throws IOException { if (childn == null) throw new IllegalArgumentException("isLeftChild: Node parameter is NULL"); Handle lc = parentn.getOHHandle(child); if (lc == null) return false; return (lc.equals(childn.handle())); } - public long[] putLong(byte[] key, long[] newlongs) throws IOException { + public synchronized long[] putLong(byte[] key, long[] newlongs) throws IOException { byte[][] newrow = new byte[newlongs.length + 1][]; newrow[0] = key; for (int i = 0; i < newlongs.length; i++) { @@ -579,7 +579,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } // Associates the specified value with the specified key in this map - public byte[] put(byte[] key, byte[] value) throws IOException { + public synchronized byte[] put(byte[] key, byte[] value) throws IOException { byte[][] row = new byte[2][]; row[0] = key; row[1] = value; @@ -602,7 +602,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - public void removeAll() throws IOException { + public synchronized void removeAll() throws IOException { while (size() > 0) remove(lastNode(), null); } @@ -716,9 +716,14 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr private Node firstNode(Node node) throws IOException { if (node == null) throw new IllegalArgumentException("firstNode: node=null"); Handle h = node.getOHHandle(leftchild); - while (h != null) { + HashSet visitedNodeKeys = new HashSet(); // to detect loops + String nodeKey; + while (h != null) { try { node = getNode(h, node, leftchild); + nodeKey = new String(node.getKey()); + if (visitedNodeKeys.contains(nodeKey)) throw new kelondroException(this.filename, "firstNode: database contains loops: '" + nodeKey + "' appears twice."); + visitedNodeKeys.add(nodeKey); } catch (IllegalArgumentException e) { // return what we have return node; @@ -737,9 +742,14 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr private Node lastNode(Node node) throws IOException { if (node == null) throw new IllegalArgumentException("lastNode: node=null"); Handle h = node.getOHHandle(rightchild); + HashSet visitedNodeKeys = new HashSet(); // to detect loops + String nodeKey; while (h != null) { try { node = getNode(h, node, rightchild); + nodeKey = new String(node.getKey()); + if (visitedNodeKeys.contains(nodeKey)) throw new kelondroException(this.filename, "lastNode: database contains loops: '" + nodeKey + "' appears twice."); + visitedNodeKeys.add(nodeKey); } catch (IllegalArgumentException e) { // return what we have return node; @@ -758,7 +768,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - public Iterator nodeIterator(boolean up, boolean rotating, byte[] firstKey) { + public synchronized Iterator nodeIterator(boolean up, boolean rotating, byte[] firstKey) { // iterates the elements in a sorted way. returns Node - type Objects try { Search search = new Search(); @@ -939,14 +949,14 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - public rowIterator rows(boolean up, boolean rotating) throws IOException { + public synchronized rowIterator rows(boolean up, boolean rotating) throws IOException { // iterates the rows of the Nodes // enumerated objects are of type byte[][] // iterates the elements in a sorted way. return new rowIterator(new nodeIterator(up, rotating)); } - public Iterator rows(boolean up, boolean rotating, byte[] firstKey) throws IOException { + public synchronized Iterator rows(boolean up, boolean rotating, byte[] firstKey) throws IOException { Search search = new Search(); search.process(firstKey); if (search.found()) {