From 7008a218b3dc4b9f4788c84d32909000498db46e Mon Sep 17 00:00:00 2001 From: danielr Date: Mon, 17 Mar 2008 13:51:56 +0000 Subject: [PATCH] avoid ConcurrentModificationException in plasmaCrawlerQueues git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@4579 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- .../plasma/crawler/plasmaCrawlQueues.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/source/de/anomic/plasma/crawler/plasmaCrawlQueues.java b/source/de/anomic/plasma/crawler/plasmaCrawlQueues.java index 1b7a9607d..18121209d 100644 --- a/source/de/anomic/plasma/crawler/plasmaCrawlQueues.java +++ b/source/de/anomic/plasma/crawler/plasmaCrawlQueues.java @@ -31,11 +31,10 @@ import java.io.IOException; import java.net.MalformedURLException; import java.text.ParseException; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import de.anomic.data.robotsParser; import de.anomic.kelondro.kelondroFlexWidthArray; @@ -68,7 +67,7 @@ public class plasmaCrawlQueues { public plasmaCrawlQueues(plasmaSwitchboard sb, File plasmaPath) { this.sb = sb; this.log = new serverLog("CRAWLER"); - this.workers = Collections.synchronizedMap(new HashMap()); + this.workers = new ConcurrentHashMap(); this.loader = new plasmaProtocolLoader(sb, log); this.remoteCrawlProviderHashes = new ArrayList(); @@ -93,8 +92,9 @@ public class plasmaCrawlQueues { if (noticeURL.existsInStack(hash)) return "crawler"; if (delegatedURL.exists(hash)) return "delegated"; if (errorURL.exists(hash)) return "errors"; - Iterator i = workers.values().iterator(); - while (i.hasNext()) if (i.next().entry.url().hash().equals(hash)) return "worker"; + for (crawlWorker worker: workers.values()) { + if (worker.entry.url().hash().equals(hash)) return "worker"; + } return null; } @@ -112,10 +112,7 @@ public class plasmaCrawlQueues { if (ee != null) return ee.url(); ee = errorURL.getEntry(urlhash); if (ee != null) return ee.url(); - Iterator i = workers.values().iterator(); - crawlWorker w; - while (i.hasNext()) { - w = i.next(); + for (crawlWorker w: workers.values()) { if (w.entry.url().hash().equals(urlhash)) return w.entry.url(); } return null; @@ -123,8 +120,9 @@ public class plasmaCrawlQueues { public void close() { // wait for all workers to finish - Iterator i = workers.values().iterator(); - while (i.hasNext()) i.next().interrupt(); + for (crawlWorker w: workers.values()) { + w.interrupt(); + } // TODO: wait some more time until all threads are finished noticeURL.close(); errorURL.close(); @@ -133,13 +131,7 @@ public class plasmaCrawlQueues { public plasmaCrawlEntry[] activeWorker() { synchronized (workers) { - plasmaCrawlEntry[] w = new plasmaCrawlEntry[workers.size()]; - int i = 0; - Iterator j = workers.values().iterator(); - while (j.hasNext()) { - w[i++] = j.next().entry; - } - return w; + return workers.values().toArray(new plasmaCrawlEntry[0]); } }