From 86b338584770df9a8cced2ff274a771d2bf39e27 Mon Sep 17 00:00:00 2001 From: Michael Christen Date: Wed, 7 Dec 2011 00:18:34 +0100 Subject: [PATCH] fixed a deadlock during secondary remote search --- .../data/word/WordReferenceFactory.java | 9 +++- source/net/yacy/search/query/SearchEvent.java | 53 +++++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/source/net/yacy/kelondro/data/word/WordReferenceFactory.java b/source/net/yacy/kelondro/data/word/WordReferenceFactory.java index fa99371ec..908355daa 100644 --- a/source/net/yacy/kelondro/data/word/WordReferenceFactory.java +++ b/source/net/yacy/kelondro/data/word/WordReferenceFactory.java @@ -26,8 +26,10 @@ package net.yacy.kelondro.data.word; +import java.util.Collections; import java.util.Iterator; import java.util.Map; +import java.util.SortedMap; import java.util.TreeMap; import net.yacy.cora.document.ASCII; @@ -39,15 +41,18 @@ import net.yacy.kelondro.util.ByteBuffer; public class WordReferenceFactory implements ReferenceFactory { + @Override public WordReference produceSlow(final Entry e) { return new WordReferenceRow(e); } + @Override public WordReference produceFast(final WordReference r) { if (r instanceof WordReferenceVars) return r; return new WordReferenceVars(r); } + @Override public Row getRow() { return WordReferenceRow.urlEntryRow; } @@ -110,8 +115,8 @@ public class WordReferenceFactory implements ReferenceFactory { * @param peerhash * @return */ - public static final TreeMap decompressIndex(ByteBuffer ci, final String peerhash) { - TreeMap target = new TreeMap(); + public static final SortedMap decompressIndex(ByteBuffer ci, final String peerhash) { + SortedMap target = Collections.synchronizedSortedMap(new TreeMap()); // target is a mapping from url-hashes to a string of peer-hashes if (ci.byteAt(0) != '{' || ci.byteAt(ci.length() - 1) != '}') return target; //System.out.println("DEBUG-DECOMPRESS: input is " + ci.toString()); diff --git a/source/net/yacy/search/query/SearchEvent.java b/source/net/yacy/search/query/SearchEvent.java index 441f87426..b94d5fe3d 100644 --- a/source/net/yacy/search/query/SearchEvent.java +++ b/source/net/yacy/search/query/SearchEvent.java @@ -26,6 +26,7 @@ package net.yacy.search.query; +import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.SortedMap; @@ -516,8 +517,8 @@ public final class SearchEvent private final Semaphore trigger; public SecondarySearchSuperviser() { - this.abstractsCache = new TreeMap>(); - this.checkedPeers = new TreeSet(); + this.abstractsCache = Collections.synchronizedSortedMap(new TreeMap>()); + this.checkedPeers = Collections.synchronizedSortedSet(new TreeSet()); this.trigger = new Semaphore(0); } @@ -527,16 +528,14 @@ public final class SearchEvent * @param wordhash * @param singleAbstract // a mapping from url-hashes to a string of peer-hashes */ - public void addAbstract(final String wordhash, final TreeMap singleAbstract) { + public void addAbstract(final String wordhash, final SortedMap singleAbstract) { final SortedMap oldAbstract; - synchronized ( this.abstractsCache ) { oldAbstract = this.abstractsCache.get(wordhash); if ( oldAbstract == null ) { // new abstracts in the cache this.abstractsCache.put(wordhash, singleAbstract); return; } - } // extend the abstracts in the cache: join the single abstracts new Thread() { @Override @@ -544,11 +543,9 @@ public final class SearchEvent for ( final Map.Entry oneref : singleAbstract.entrySet() ) { final String urlhash = oneref.getKey(); final StringBuilder peerlistNew = oneref.getValue(); - synchronized ( oldAbstract ) { - final StringBuilder peerlistOld = oldAbstract.put(urlhash, peerlistNew); - if ( peerlistOld != null ) { - peerlistOld.append(peerlistNew); - } + final StringBuilder peerlistOld = oldAbstract.put(urlhash, peerlistNew); + if ( peerlistOld != null ) { + peerlistOld.append(peerlistNew); } } } @@ -567,27 +564,25 @@ public final class SearchEvent SortedMap urlPeerlist; int p; boolean hasURL; - synchronized ( this ) { - final Iterator>> i = - this.abstractsCache.entrySet().iterator(); - while ( i.hasNext() ) { - entry = i.next(); - word = entry.getKey(); - urlPeerlist = entry.getValue(); - hasURL = true; - for ( int j = 0; j < urls.length(); j = j + 12 ) { - url = urls.substring(j, j + 12); - peerlist = urlPeerlist.get(url); - p = (peerlist == null) ? -1 : peerlist.indexOf(peerhash); - if ( (p < 0) || (p % 12 != 0) ) { - hasURL = false; - break; - } - } - if ( hasURL ) { - wordlist += word; + final Iterator>> i = + this.abstractsCache.entrySet().iterator(); + while ( i.hasNext() ) { + entry = i.next(); + word = entry.getKey(); + urlPeerlist = entry.getValue(); + hasURL = true; + for ( int j = 0; j < urls.length(); j = j + 12 ) { + url = urls.substring(j, j + 12); + peerlist = urlPeerlist.get(url); + p = (peerlist == null) ? -1 : peerlist.indexOf(peerhash); + if ( (p < 0) || (p % 12 != 0) ) { + hasURL = false; + break; } } + if ( hasURL ) { + wordlist += word; + } } return wordlist; }