froehlich    02/01/28 11:57:52

  Modified:    src/java/org/apache/cocoon/components/store
                        StoreJanitorImpl.java MRUMemoryStore.java
  Log:
  ok I hope I fixed the problem now:
  The number of objects which are freed out of the Store
  is calculated now. It take a configurable percentage
  of stored objects. For i.e: 10% and 1000 objects, then
  the StoreJanitor free out 100 objects!
  
  Revision  Changes    Path
  1.6       +72 -12    
xml-cocoon2/src/java/org/apache/cocoon/components/store/StoreJanitorImpl.java
  
  Index: StoreJanitorImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/store/StoreJanitorImpl.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- StoreJanitorImpl.java     27 Jan 2002 17:54:18 -0000      1.5
  +++ StoreJanitorImpl.java     28 Jan 2002 19:57:52 -0000      1.6
  @@ -16,6 +16,7 @@
   import org.apache.avalon.framework.thread.ThreadSafe;
   
   import java.util.ArrayList;
  +import java.util.Enumeration;
   import java.util.Iterator;
   
   /**
  @@ -43,6 +44,7 @@
       private ArrayList storelist;
       private int index = -1;
       private static boolean doRun = false;
  +    private int m_percent;
   
       /**
        * Initialize the StoreJanitorImpl.
  @@ -69,6 +71,7 @@
           
this.setCleanupthreadinterval(params.getParameterAsInteger("cleanupthreadinterval",10));
           this.setPriority(params.getParameterAsInteger( "threadpriority",
                                           Thread.currentThread().getPriority()));
  +        this.m_percent = params.getParameterAsInteger( "percent_to_free",10);
   
           if ((this.getFreememory() < 1)) {
               throw new ConfigurationException("StoreJanitorImpl freememory parameter 
has to be greater then 1");
  @@ -82,6 +85,9 @@
           if ((this.getPriority() < 1)) {
               throw new ConfigurationException("StoreJanitorImpl threadpriority has 
to be greater then 1");
           }
  +        if ((this.m_percent > 100 && this.m_percent < 1)) {
  +            throw new ConfigurationException("StoreJanitorImpl percent_to_free, has 
to be between 1 and 100");
  +        }
   
           this.setStoreList(new ArrayList());
       }
  @@ -109,27 +115,26 @@
           while (doRun) {
               // amount of memory used is greater then heapsize
               if (this.memoryLow()) {
  -                int cnt = 0;
  -              
                   if (this.getLogger().isDebugEnabled()) {
                       this.getLogger().debug("Invoking garbage collection, total 
memory = "
                               + this.getJVM().totalMemory() + ", free memory = "
                               + this.getJVM().freeMemory());
                   }
  +                
                   this.freePhysicalMemory();
  +                
                   if (this.getLogger().isDebugEnabled()) {
                       this.getLogger().debug("Garbage collection complete, total 
memory = "
                           + this.getJVM().totalMemory() + ", free memory = "
                           + this.getJVM().freeMemory());
                   }
  +                
                   synchronized (this) {
  -                    while (this.memoryLow() 
  -                           && this.getStoreList().size() > 0
  -                           && cnt < 1) {
  +                    if (this.memoryLow() && this.getStoreList().size() > 0) {
                           this.freeMemory();
  -                        cnt++;
  +                        this.setIndex(this.getIndex() + 1);
                       }
  -                }
  +               }
               }
               try {
                   Thread.currentThread().sleep(this.cleanupthreadinterval * 1000);
  @@ -210,7 +215,10 @@
        * Round Robin alghorithm for freeing the registerd caches.
        */
       private void freeMemory() {
  +        Store store;
  +      
           try {
  +            //Determine elements in Store:
               if (this.getLogger().isDebugEnabled()) {
                   this.getLogger().debug("StoreList size=" + 
this.getStoreList().size());
                   this.getLogger().debug("Actual Index position: " + this.getIndex());
  @@ -218,31 +226,83 @@
               if (this.getIndex() < this.getStoreList().size()) {
                   if(this.getIndex() == -1) {
                       this.setIndex(0);
  +                    store = (Store)this.getStoreList().get(this.getIndex());
  +                    
                       if (this.getLogger().isDebugEnabled()) {
                           this.getLogger().debug("Freeing Store: " + this.getIndex());
                       }
  -                    ((Store)this.getStoreList().get(this.getIndex())).free();
  +                
  +                    //delete proportionate elements out of the cache as
  +                    //configured.
  +                    int limit = this.calcToFree(store);
  +                    for (int i=0; i < limit; i++) {
  +                        store.free();
  +                    }
                   } else {
  -                    this.setIndex(this.getIndex() + 1);
  +                    store = (Store)this.getStoreList().get(this.getIndex());
  +                    
                       if (this.getLogger().isDebugEnabled()) {
                           this.getLogger().debug("Freeing Store: " + this.getIndex());
                       }
  -                    ((Store)this.getStoreList().get(this.getIndex())).free();
  +                    
  +                    //delete proportionate elements out of the cache as
  +                    //configured.
  +                    int limit = this.calcToFree(store);
  +                    for (int i=0; i < limit; i++) {
  +                        store.free();
  +                    }
                   }
               } else {
                   if (this.getLogger().isDebugEnabled()) {
                       this.getLogger().debug("Starting from the beginning");
                   }
  +                
                   this.resetIndex();
  -                ((Store)this.getStoreList().get(0)).free();
                   this.setIndex(0);
  +                store = (Store)this.getStoreList().get(this.getIndex());
  +                 
  +                //delete proportionate elements out of the cache as
  +                //configured.
  +                int limit = this.calcToFree(store);
  +                for (int i=0; i < limit; i++) {
  +                    store.free();
  +                }
               }
  -            //this.freePhysicalMemory();
           } catch(Exception e) {
               this.getLogger().error("Error in freeMemory()",e);
           }
       }
   
  +    /**
  +     * This method claculates the number of Elements to be freememory
  +     * out of the Cache.
  +     *
  +     * @param store the Store which was selected as victim
  +     * @return number of elements to be removed!
  +     */
  +    private int calcToFree(Store store) {
  +        int cnt = 0;
  +        try {
  +            this.getLogger().debug("Calculating percentage!");
  +            Enumeration enum = store.keys();
  +            
  +            while(enum.hasMoreElements()) {
  +                cnt++; 
  +                enum.nextElement(); 
  +            }
  +            
  +            this.getLogger().debug("Counted: " + cnt);
  +            double fac = new Integer(this.m_percent).doubleValue() / 100;
  +            double dcnt = new Integer(cnt).doubleValue();
  +            this.getLogger().debug("Calculated: " + new Double(dcnt * 
fac).intValue());
  +            
  +            return new Double(dcnt * fac).intValue();
  +        } catch (Exception e) {
  +            this.getLogger().error("",e);
  +            return 0;
  +        }
  +    }
  +    
       /**
        * This method forces the garbage collector
        */
  
  
  
  1.4       +1 -54     
xml-cocoon2/src/java/org/apache/cocoon/components/store/MRUMemoryStore.java
  
  Index: MRUMemoryStore.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/store/MRUMemoryStore.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MRUMemoryStore.java       27 Jan 2002 13:14:40 -0000      1.3
  +++ MRUMemoryStore.java       28 Jan 2002 19:57:52 -0000      1.4
  @@ -264,7 +264,7 @@
        * @return the enumeration of the cache
        */
       public Enumeration keys() {
  -        return new StoreEnumeration(this.cache.keys(), 
this.fsstore.keys(),this.cachedirstr);
  +        return this.cache.keys();
       }
   
       /**
  @@ -340,58 +340,5 @@
             .append(URLEncoder.encode(key.toString()))
             .toString();
       }
  -
  -    final class StoreEnumeration implements Enumeration {
  -
  -        private String[] array;
  -        private int      index;
  -        private int      length;
  -
  -        StoreEnumeration(Enumeration cache, Enumeration fs, String cachedir) {
  -            this.array = new String[16];
  -            this.length = 0;
  -            this.index = 0;
  -
  -            while (cache.hasMoreElements()) {
  -                this.add(cache.nextElement().toString());
  -            }
  -            RE re = null;
  -
  -            try {
  -                re = new RE("^" + cachedir);
  -            } catch(RESyntaxException ree) {
  -                ree.printStackTrace();
  -            }
  -
  -            while (fs.hasMoreElements()) {
  -                final String key = fs.nextElement().toString();
  -                if (re.match(cachedir)) {
  -                    this.add(key);
  -                }
  -            }
  -        }
  -
  -        public void add(String key) {
  -            if (this.length == array.length) {
  -                String[] newarray = new String[this.length + 16];
  -                System.arraycopy(this.array, 0, newarray, 0, this.array.length);
  -                this.array = newarray;
  -            }
  -            this.array[this.length] = key;
  -            this.length++;
  -        }
  -
  -        public boolean hasMoreElements() {
  -            return (this.index < this.length);
  -        }
  -
  -        public Object nextElement() {
  -            if (this.hasMoreElements()) {
  -                this.index++;
  -                return this.array[index-1];
  -            }
  -            return null;
  -        }
  -   }
   }
   
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to