You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2004/06/03 14:45:49 UTC

cvs commit: cocoon-2.1/src/java/org/apache/cocoon/components/flow ContinuationsManagerImpl.java

vgritsenko    2004/06/03 05:45:49

  Modified:    src/java/org/apache/cocoon/components/flow
                        ContinuationsManagerImpl.java
  Log:
  Instrument continuation manager. Instruments implemented:
  continuations count, size of continuations forrest, size of expiration set,
  continuations created/disposed counters.
  
  Revision  Changes    Path
  1.12      +118 -64   cocoon-2.1/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
  
  Index: ContinuationsManagerImpl.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ContinuationsManagerImpl.java	17 May 2004 18:50:53 -0000	1.11
  +++ ContinuationsManagerImpl.java	3 Jun 2004 12:45:49 -0000	1.12
  @@ -15,17 +15,6 @@
    */
   package org.apache.cocoon.components.flow;
   
  -import java.security.SecureRandom;
  -import java.util.Collections;
  -import java.util.HashMap;
  -import java.util.HashSet;
  -import java.util.Iterator;
  -import java.util.List;
  -import java.util.Map;
  -import java.util.Set;
  -import java.util.SortedSet;
  -import java.util.TreeSet;
  -
   import org.apache.avalon.framework.component.Component;
   import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
  @@ -37,6 +26,21 @@
   import org.apache.excalibur.event.Queue;
   import org.apache.excalibur.event.Sink;
   import org.apache.excalibur.event.command.RepeatedCommand;
  +import org.apache.excalibur.instrument.CounterInstrument;
  +import org.apache.excalibur.instrument.Instrument;
  +import org.apache.excalibur.instrument.Instrumentable;
  +import org.apache.excalibur.instrument.ValueInstrument;
  +
  +import java.security.SecureRandom;
  +import java.util.Collections;
  +import java.util.HashMap;
  +import java.util.HashSet;
  +import java.util.Iterator;
  +import java.util.List;
  +import java.util.Map;
  +import java.util.Set;
  +import java.util.SortedSet;
  +import java.util.TreeSet;
   
   /**
    * The default implementation of {@link ContinuationsManager}.
  @@ -50,12 +54,15 @@
   public class ContinuationsManagerImpl
           extends AbstractLogEnabled
           implements ContinuationsManager, Component, Configurable,
  -        ThreadSafe, Contextualizable {
  +                   ThreadSafe, Contextualizable, Instrumentable {
   
       static final int CONTINUATION_ID_LENGTH = 20;
       static final String EXPIRE_CONTINUATIONS = "expire-continuations";
   
  -    protected SecureRandom random = null;
  +    /**
  +     * Random number generator used to create continuation ID
  +     */
  +    protected SecureRandom random;
       protected byte[] bytes;
   
       protected Sink m_commandSink;
  @@ -68,12 +75,13 @@
   
       /**
        * Maintains the forrest of <code>WebContinuation</code> trees.
  +     * This Set used only for debugging puroses by {@link #displayAllContinuations()} method.
        */
       protected Set forrest = Collections.synchronizedSet(new HashSet());
   
       /**
  -     * Association between <code>WebContinuation</code> ids and the
  -     * corresponding <code>WebContinuation</code> object.
  +     * Association between <code>WebContinuation</code> IDs and the
  +     * corresponding <code>WebContinuation</code> objects.
        */
       protected Map idToWebCont = Collections.synchronizedMap(new HashMap());
   
  @@ -84,17 +92,29 @@
        */
       protected SortedSet expirations = Collections.synchronizedSortedSet(new TreeSet());
   
  +    private String instrumentableName;
  +    private ValueInstrument continuationsCount;
  +    private ValueInstrument forrestSize;
  +    private ValueInstrument expirationsSize;
  +    private CounterInstrument continuationsCreated;
  +    private CounterInstrument continuationsInvalidated;
  +
   
       public ContinuationsManagerImpl() throws Exception {
           try {
               random = SecureRandom.getInstance("SHA1PRNG");
  -        }
  -        catch(java.security.NoSuchAlgorithmException nsae) {
  +        } catch(java.security.NoSuchAlgorithmException nsae) {
               // maybe we are on IBM's SDK
               random = SecureRandom.getInstance("IBMSecureRandom");
           }
           random.setSeed(System.currentTimeMillis());
           bytes = new byte[CONTINUATION_ID_LENGTH];
  +
  +        continuationsCount = new ValueInstrument("count");
  +        forrestSize = new ValueInstrument("forrest-size");
  +        expirationsSize = new ValueInstrument("expirations-size");
  +        continuationsCreated = new CounterInstrument("creates");
  +        continuationsInvalidated = new CounterInstrument("invalidates");
       }
   
       /**
  @@ -118,6 +138,28 @@
           }
       }
   
  +    public void setInstrumentableName(String instrumentableName) {
  +        this.instrumentableName = instrumentableName;
  +    }
  +
  +    public String getInstrumentableName() {
  +        return instrumentableName;
  +    }
  +
  +    public Instrument[] getInstruments() {
  +        return new Instrument[]{
  +            continuationsCount,
  +            continuationsCreated,
  +            continuationsInvalidated,
  +            forrestSize
  +        };
  +    }
  +
  +    public Instrumentable[] getChildInstrumentables() {
  +        return Instrumentable.EMPTY_INSTRUMENTABLE_ARRAY;
  +    }
  +
  +
       public WebContinuation createWebContinuation(Object kont,
                                                    WebContinuation parent,
                                                    int timeToLive,
  @@ -129,6 +171,7 @@
   
           if (parent == null) {
               forrest.add(wk);
  +            forrestSize.setValue(forrest.size());
           } else {
               // REVISIT: This places only the "leaf" nodes in the expirations Sorted Set.
               // do we really want to do this?
  @@ -138,6 +181,7 @@
           }
   
           expirations.add(wk);
  +        expirationsSize.setValue(expirations.size());
   
           // No need to add the WebContinuation in idToWebCont as it was
           // already done during its construction.
  @@ -149,44 +193,6 @@
           return wk;
       }
   
  -    public void invalidateWebContinuation(WebContinuation wk) {
  -        WebContinuation parent = wk.getParentContinuation();
  -        if (parent == null) {
  -            forrest.remove(wk);
  -        } else {
  -            List parentKids = parent.getChildren();
  -            parentKids.remove(wk);
  -        }
  -
  -        _invalidate(wk);
  -    }
  -
  -    private void _invalidate(WebContinuation wk) {
  -        if (getLogger().isDebugEnabled()) {
  -            getLogger().debug("WK: Manual Expire of Continuation " + wk.getId());
  -        }
  -        disposeContinuation(wk);
  -        expirations.remove(wk);
  -
  -        // Invalidate all the children continuations as well
  -        List children = wk.getChildren();
  -        int size = children.size();
  -        for (int i = 0; i < size; i++) {
  -            _invalidate((WebContinuation) children.get(i));
  -        }
  -    }
  -
  -    /**
  -     * Makes the continuation inaccessible for lookup, and triggers possible needed
  -     * cleanup code through the ContinuationsDisposer interface.
  -     *
  -     * @param wk the continuation to dispose.
  -     */
  -    private void disposeContinuation(WebContinuation wk) {
  -        idToWebCont.remove(wk.getId());
  -        wk.dispose();
  -    }
  -
       public WebContinuation lookupWebContinuation(String id) {
           // REVISIT: Is the folliwing check needed to avoid threading issues:
           // return wk only if !(wk.hasExpired) ?
  @@ -230,14 +236,67 @@
                   if (!idToWebCont.containsKey(id)) {
                       wk = new WebContinuation(id, kont, parent, ttl, disposer);
                       idToWebCont.put(id, wk);
  +                    continuationsCount.setValue(idToWebCont.size());
                       break;
                   }
               }
           }
   
  +        continuationsCreated.increment();
           return wk;
       }
   
  +    public void invalidateWebContinuation(WebContinuation wk) {
  +        _detach(wk);
  +        _invalidate(wk);
  +    }
  +
  +    private void _invalidate(WebContinuation wk) {
  +        if (getLogger().isDebugEnabled()) {
  +            getLogger().debug("WK: Manual Expire of Continuation " + wk.getId());
  +        }
  +        disposeContinuation(wk);
  +        expirations.remove(wk);
  +        expirationsSize.setValue(expirations.size());
  +
  +        // Invalidate all the children continuations as well
  +        List children = wk.getChildren();
  +        int size = children.size();
  +        for (int i = 0; i < size; i++) {
  +            _invalidate((WebContinuation) children.get(i));
  +        }
  +    }
  +
  +    /**
  +     * Detach this continuation from parent. This method removes
  +     * continuation from {@link #forrest} set, or, if it has parent,
  +     * from parent's children collection.
  +     * @param wk Continuation to detach from parent.
  +     */
  +    private void _detach(WebContinuation wk) {
  +        WebContinuation parent = wk.getParentContinuation();
  +        if (parent == null) {
  +            forrest.remove(wk);
  +            forrestSize.setValue(forrest.size());
  +        } else {
  +            List parentKids = parent.getChildren();
  +            parentKids.remove(wk);
  +        }
  +    }
  +
  +    /**
  +     * Makes the continuation inaccessible for lookup, and triggers possible needed
  +     * cleanup code through the ContinuationsDisposer interface.
  +     *
  +     * @param wk the continuation to dispose.
  +     */
  +    private void disposeContinuation(WebContinuation wk) {
  +        idToWebCont.remove(wk.getId());
  +        continuationsCount.setValue(idToWebCont.size());
  +        wk.dispose();
  +        continuationsInvalidated.increment();
  +    }
  +
       /**
        * Removes an expired leaf <code>WebContinuation</code> node
        * from its continuation tree, and recursively removes its
  @@ -252,20 +311,14 @@
   
           // remove access to this contination
           disposeContinuation(wk);
  -
  -        WebContinuation parent = wk.getParentContinuation();
  -        if (parent == null) {
  -            forrest.remove(wk);
  -        } else {
  -            List parentKids = parent.getChildren();
  -            parentKids.remove(wk);
  -        }
  +        _detach(wk);
   
           if (getLogger().isDebugEnabled()) {
               getLogger().debug("WK: deleted this WK: " + wk.getId());
           }
   
           // now check if parent needs to be removed.
  +        WebContinuation parent = wk.getParentContinuation();
           if (null != parent && parent.hasExpired()) {
               removeContinuation(parent);
           }
  @@ -329,6 +382,7 @@
               iter.remove();
               removeContinuation(wk);
           }
  +        expirationsSize.setValue(expirations.size());
   
           // log state after continuations clean up
           if (getLogger().isDebugEnabled()) {