Also diese Änderungen erzeugen bei mir jedes mal wenn bei leerem
RAM-Cache ein DHT-Chuck erzeugt werden soll folgenden Fehler:
> E 2006/03/15 13:18:37 SERVER Runtime Error in serverInstantThread,
> thread 'de.anomic.plasma.plasmaSwitchboard.deQueue': null; target
> exception: 0
> java.lang.ArrayIndexOutOfBoundsException: 0
>         at
> de.anomic.plasma.plasmaDHTChunk.selectTransferContainersResource(plasmaDHTChunk.java:186)
>         at
> de.anomic.plasma.plasmaDHTChunk.selectTransferContainers(plasmaDHTChunk.java:162)
>         at de.anomic.plasma.plasmaDHTChunk.<init>(plasmaDHTChunk.java:122)
>         at
> de.anomic.plasma.plasmaSwitchboard.deQueue(plasmaSwitchboard.java:930)
>         at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>         at java.lang.reflect.Method.invoke(Unknown Source)
>         at
> de.anomic.server.serverInstantThread.job(serverInstantThread.java:98)
>         at
> de.anomic.server.serverAbstractThread.run(serverAbstractThread.java:260)
> java.lang.ArrayIndexOutOfBoundsException: 0
>         at
> de.anomic.plasma.plasmaDHTChunk.selectTransferContainersResource(plasmaDHTChunk.java:186)
>         at
> de.anomic.plasma.plasmaDHTChunk.selectTransferContainers(plasmaDHTChunk.java:162)
>         at de.anomic.plasma.plasmaDHTChunk.<init>(plasmaDHTChunk.java:122)
>         at
> de.anomic.plasma.plasmaSwitchboard.deQueue(plasmaSwitchboard.java:930)
>         at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>         at java.lang.reflect.Method.invoke(Unknown Source)
>         at
> de.anomic.server.serverInstantThread.job(serverInstantThread.java:98)
>         at
> de.anomic.server.serverAbstractThread.run(serverAbstractThread.java:260)

orbiter at BerliOS wrote:
> Author: orbiter
> Date: 2006-03-15 00:22:49 +0100 (Wed, 15 Mar 2006)
> New Revision: 1888
>
> Modified:
>    trunk/source/de/anomic/plasma/plasmaDHTChunk.java
>    trunk/source/de/anomic/plasma/plasmaWordIndex.java
> Log:
> try to fix new 100% cpu bug, possibly caused by iterator method
> see http://www.yacy-forum.de/viewtopic.php?p=18900#18900
>
> Modified: trunk/source/de/anomic/plasma/plasmaDHTChunk.java
> ===================================================================
> --- trunk/source/de/anomic/plasma/plasmaDHTChunk.java 2006-03-14 22:56:41 UTC 
> (rev 1887)
> +++ trunk/source/de/anomic/plasma/plasmaDHTChunk.java 2006-03-14 23:22:49 UTC 
> (rev 1888)
> @@ -172,6 +172,82 @@
>      private int  selectTransferContainersResource(String hash, int 
> resourceLevel, int maxcount) {
>          // the hash is a start hash from where the indexes are picked
>          ArrayList tmpContainers = new ArrayList(maxcount);
> +        try {
> +            String[] wordHashes = wordIndex.wordHashes(hash, resourceLevel, 
> true, maxcount);
> +            plasmaWordIndexEntryContainer indexContainer;
> +            Iterator urlIter;
> +            plasmaWordIndexEntry indexEntry;
> +            plasmaCrawlLURL.Entry lurl;
> +            int refcount = 0;
> +
> +            urlCache = new HashMap();
> +            while ((maxcount > refcount) && ((tmpContainers.size() == 0) || 
> (yacyDHTAction.dhtDistance(wordHashes[refcount], 
> ((plasmaWordIndexEntryContainer) tmpContainers.get(0)).wordHash()) < 0.2))) {
> +                // make an on-the-fly entity and insert values
> +                indexContainer = 
> wordIndex.getContainer(wordHashes[refcount], true, 10000);
> +                int notBoundCounter = 0;
> +                try {
> +                    urlIter = indexContainer.entries();
> +                    // iterate over indexes to fetch url entries and store 
> them in the urlCache
> +                    while ((urlIter.hasNext()) && (maxcount > refcount)) {
> +                        indexEntry = (plasmaWordIndexEntry) urlIter.next();
> +                        try {
> +                            lurl = lurls.getEntry(indexEntry.getUrlHash(), 
> indexEntry);
> +                            if ((lurl == null) || (lurl.url() == null)) {
> +                                notBoundCounter++;
> +                                urlIter.remove();
> +                                
> wordIndex.removeEntries(wordHashes[refcount], new String[] { 
> indexEntry.getUrlHash() }, true);
> +                            } else {
> +                                urlCache.put(indexEntry.getUrlHash(), lurl);
> +                                refcount++;
> +                            }
> +                        } catch (IOException e) {
> +                            notBoundCounter++;
> +                            urlIter.remove();
> +                            wordIndex.removeEntries(wordHashes[refcount], 
> new String[] { indexEntry.getUrlHash() }, true);
> +                        }
> +                    }
> +
> +                    // remove all remaining; we have enough
> +                    while (urlIter.hasNext()) {
> +                        indexEntry = (plasmaWordIndexEntry) urlIter.next();
> +                        urlIter.remove();
> +                    }
> +
> +                    // use whats left
> +                    log.logFine("Selected partial index (" + 
> indexContainer.size() + " from " + 
> wordIndex.indexSize(wordHashes[refcount-1]) + " URLs, " + notBoundCounter + " 
> not bound) for word " + indexContainer.wordHash());
> +                    tmpContainers.add(indexContainer);
> +                } catch (kelondroException e) {
> +                    log.logSevere("plasmaWordIndexDistribution/2: deleted DB 
> for word " + wordHashes[refcount], e);
> +                    wordIndex.deleteIndex(wordHashes[refcount]);
> +                }
> +            }
> +            // create result
> +            indexContainers = (plasmaWordIndexEntryContainer[]) 
> tmpContainers.toArray(new 
> plasmaWordIndexEntryContainer[tmpContainers.size()]);
> +
> +            if ((indexContainers == null) || (indexContainers.length == 0)) {
> +                log.logFine("No index available for index transfer, hash 
> start-point " + startPointHash);
> +                this.status = chunkStatus_FAILED;
> +                return 0;
> +            }
> +
> +            this.status = chunkStatus_FILLED;
> +            
> +            return refcount;
> +        } catch (kelondroException e) {
> +            log.logSevere("selectTransferIndexes database corrupted: " + 
> e.getMessage(), e);
> +            indexContainers = new plasmaWordIndexEntryContainer[0];
> +            urlCache = new HashMap();
> +            
> +            this.status = chunkStatus_FAILED;
> +            
> +            return 0;
> +        }
> +    }
> +
> +    /*
> +    private int  selectTransferContainersResource(String hash, int 
> resourceLevel, int maxcount) {
> +        // the hash is a start hash from where the indexes are picked
> +        ArrayList tmpContainers = new ArrayList(maxcount);
>          String nexthash = "";
>          try {
>              Iterator wordHashIterator = wordIndex.wordHashes(hash, 
> resourceLevel, true);
> @@ -245,7 +321,8 @@
>              return 0;
>          }
>      }
> -
> +    */
> +    
>      public int deleteTransferIndexes() {
>          Iterator urlIter;
>          plasmaWordIndexEntry indexEntry;
>
> Modified: trunk/source/de/anomic/plasma/plasmaWordIndex.java
> ===================================================================
> --- trunk/source/de/anomic/plasma/plasmaWordIndex.java        2006-03-14 
> 22:56:41 UTC (rev 1887)
> +++ trunk/source/de/anomic/plasma/plasmaWordIndex.java        2006-03-14 
> 23:22:49 UTC (rev 1888)
> @@ -380,6 +380,22 @@
>      public static final int RL_ASSORTMENTS = 2;
>      public static final int RL_WORDFILES   = 3;
>      
> +    public synchronized String[] wordHashes(String startHash, int 
> resourceLevel, boolean rot, int count) {
> +        String[] hashes = new String[count];
> +        Iterator i = wordHashes(startHash, resourceLevel, rot);
> +        int j = 0;
> +        while ((count-- > 0) && (i.hasNext())) {
> +            hashes[j++] = (String) i.next();
> +        }
> +        if (count > 0) {
> +            String[] s = new String[j];
> +            System.arraycopy(hashes, 0, s, 0, j);
> +            return s;
> +        } else {
> +            return hashes;
> +        }
> +    }
> +    
>      public Iterator wordHashes(String startHash, int resourceLevel, boolean 
> rot) {
>          if (rot) return new rotatingWordIterator(startHash, resourceLevel);
>          else return new correctedWordIterator(startHash, resourceLevel, 
> rot); // use correction until bug is found
>
> _______________________________________________
> YaCy-svn mailing list
> [email protected]
> http://lists.berlios.de/mailman/listinfo/yacy-svn
>
>
>   


Attachment: signature.asc
Description: OpenPGP digital signature

Antwort per Email an