You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2013/12/14 14:48:43 UTC

svn commit: r1550934 - in /manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core: interfaces/ system/ throttler/

Author: kwright
Date: Sat Dec 14 13:48:43 2013
New Revision: 1550934

URL: http://svn.apache.org/r1550934
Log:
Reorganize the throttler api so that we only need to find the throttlegroup once.

Added:
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThrottleGroups.java
      - copied, changed from r1550906, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThrottleGroupsFactory.java
      - copied, changed from r1550329, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectionThrottlerFactory.java
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ThrottleGroups.java
      - copied, changed from r1550906, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ConnectionThrottler.java
Removed:
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectionThrottlerFactory.java
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ConnectionThrottler.java
Modified:
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
    manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/Throttler.java

Modified: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java?rev=1550934&r1=1550933&r2=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java Sat Dec 14 13:48:43 2013
@@ -20,88 +20,34 @@ package org.apache.manifoldcf.core.inter
 
 import java.util.*;
 
-/** An IConnectionThrottler object is thread-local and creates a virtual pool
-* of connections to resources whose access needs to be throttled in number, 
-* rate of use, and byte rate.
+/** An IConnectionThrottler object is not thread-local.  It gates connection
+* creation.
 */
 public interface IConnectionThrottler
 {
   public static final String _rcsid = "@(#)$Id$";
 
-  /** Get all existing throttle groups for a throttle group type.
-  * The throttle group type typically describes a connector class, while the throttle group represents
-  * a namespace of bin names specific to that connector class.
-  *@param throttleGroupType is the throttle group type.
-  *@return the set of throttle groups for that group type.
-  */
-  public Set<String> getThrottleGroups(String throttleGroupType)
-    throws ManifoldCFException;
-  
-  /** Remove a throttle group.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  */
-  public void removeThrottleGroup(String throttleGroupType, String throttleGroup)
-    throws ManifoldCFException;
-  
-  /** Set or update throttle specification for a throttle group.  This creates the
-  * throttle group if it does not yet exist.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param throttleSpec is the desired throttle specification object.
-  */
-  public void updateThrottleSpecification(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
-    throws ManifoldCFException;
-
   /** Get permission to use a connection, which is described by the passed array of bin names.
   * This method may block until a connection slot is available.
   * The connection can be used multiple times until the releaseConnectionPermission() method is called.
   * This persistence feature is meant to allow connections to be pooled locally by the caller.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
   *@return the fetch throttler to use when performing fetches from the corresponding connection, or null if the system is being shut down.
   */
-  public IFetchThrottler obtainConnectionPermission(String throttleGroupType , String throttleGroup,
-    String[] binNames)
-    throws ManifoldCFException;
+  public IFetchThrottler obtainConnectionPermission()
+    throws InterruptedException;
   
   /** Determine whether to release a pooled connection.  This method returns the number of bins
   * where the outstanding connection exceeds current quotas, indicating whether at least one with the specified
   * characteristics should be released.
   * NOTE WELL: This method cannot judge which is the best connection to be released to meet
   * quotas.  The caller needs to do that based on the highest number of bins matched.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
   *@return the number of bins that are over quota, or zero if none of them are.
   */
-  public int overConnectionQuotaCount(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException;
+  public int overConnectionQuotaCount();
   
   /** Release permission to use one connection. This presumes that obtainConnectionPermission()
   * was called earlier by someone and was successful.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
   */
-  public void releaseConnectionPermission(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException;
+  public void releaseConnectionPermission();
   
-  /** Poll periodically, to update cluster-wide statistics and allocation.
-  *@param throttleGroupType is the throttle group type to update.
-  */
-  public void poll(String throttleGroupType)
-    throws ManifoldCFException;
-  
-  /** Free unused resources.
-  */
-  public void freeUnusedResources()
-    throws ManifoldCFException;
-  
-  /** Shut down throttler permanently.
-  */
-  public void destroy()
-    throws ManifoldCFException;
-
 }

Copied: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThrottleGroups.java (from r1550906, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java)
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThrottleGroups.java?p2=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThrottleGroups.java&p1=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java&r1=1550906&r2=1550934&rev=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IConnectionThrottler.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/IThrottleGroups.java Sat Dec 14 13:48:43 2013
@@ -20,11 +20,11 @@ package org.apache.manifoldcf.core.inter
 
 import java.util.*;
 
-/** An IConnectionThrottler object is thread-local and creates a virtual pool
+/** An IThrottleGroups object is thread-local and creates a virtual pool
 * of connections to resources whose access needs to be throttled in number, 
 * rate of use, and byte rate.
 */
-public interface IConnectionThrottler
+public interface IThrottleGroups
 {
   public static final String _rcsid = "@(#)$Id$";
 
@@ -44,49 +44,22 @@ public interface IConnectionThrottler
   public void removeThrottleGroup(String throttleGroupType, String throttleGroup)
     throws ManifoldCFException;
   
-  /** Set or update throttle specification for a throttle group.  This creates the
-  * throttle group if it does not yet exist.
+  /** Create or update a throttle group.
   *@param throttleGroupType is the throttle group type.
   *@param throttleGroup is the throttle group.
   *@param throttleSpec is the desired throttle specification object.
   */
-  public void updateThrottleSpecification(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
+  public void createOrUpdateThrottleGroup(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
     throws ManifoldCFException;
 
-  /** Get permission to use a connection, which is described by the passed array of bin names.
-  * This method may block until a connection slot is available.
-  * The connection can be used multiple times until the releaseConnectionPermission() method is called.
-  * This persistence feature is meant to allow connections to be pooled locally by the caller.
+  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
+  * pool of similar objects, and used to gate the creation of new connections in that pool.
   *@param throttleGroupType is the throttle group type.
   *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the fetch throttler to use when performing fetches from the corresponding connection, or null if the system is being shut down.
+  *@param binNames are the connection type bin names.
+  *@return the connection throttling object, or null if the pool is being shut down.
   */
-  public IFetchThrottler obtainConnectionPermission(String throttleGroupType , String throttleGroup,
-    String[] binNames)
-    throws ManifoldCFException;
-  
-  /** Determine whether to release a pooled connection.  This method returns the number of bins
-  * where the outstanding connection exceeds current quotas, indicating whether at least one with the specified
-  * characteristics should be released.
-  * NOTE WELL: This method cannot judge which is the best connection to be released to meet
-  * quotas.  The caller needs to do that based on the highest number of bins matched.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the number of bins that are over quota, or zero if none of them are.
-  */
-  public int overConnectionQuotaCount(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException;
-  
-  /** Release permission to use one connection. This presumes that obtainConnectionPermission()
-  * was called earlier by someone and was successful.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  */
-  public void releaseConnectionPermission(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException;
+  public IConnectionThrottler obtainConnectionThrottler(String throttleGroupType, String throttleGroup, String[] binNames);
   
   /** Poll periodically, to update cluster-wide statistics and allocation.
   *@param throttleGroupType is the throttle group type to update.
@@ -94,7 +67,7 @@ public interface IConnectionThrottler
   public void poll(String throttleGroupType)
     throws ManifoldCFException;
   
-  /** Free unused resources.
+  /** Free all unused resources.
   */
   public void freeUnusedResources()
     throws ManifoldCFException;

Copied: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThrottleGroupsFactory.java (from r1550329, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectionThrottlerFactory.java)
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThrottleGroupsFactory.java?p2=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThrottleGroupsFactory.java&p1=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectionThrottlerFactory.java&r1=1550329&r2=1550934&rev=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ConnectionThrottlerFactory.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/interfaces/ThrottleGroupsFactory.java Sat Dec 14 13:48:43 2013
@@ -18,16 +18,16 @@
 */
 package org.apache.manifoldcf.core.interfaces;
 
-/** Thread-local IConnectionThrottle factory.
+/** Thread-local IThrottleGroups factory.
 */
-public class ConnectionThrottlerFactory
+public class ThrottleGroupsFactory
 {
   public static final String _rcsid = "@(#)$Id$";
 
   // name to use in thread context pool of objects
-  private final static String objectName = "_ConnectionThrottler_";
+  private final static String objectName = "_ThrottleGroups_";
 
-  private ConnectionThrottlerFactory()
+  private ThrottleGroupsFactory()
   {
   }
 
@@ -35,16 +35,16 @@ public class ConnectionThrottlerFactory
   *@param tc is the thread context.
   *@return the handle.
   */
-  public static IConnectionThrottler make(IThreadContext tc)
+  public static IThrottleGroups make(IThreadContext tc)
     throws ManifoldCFException
   {
     Object o = tc.get(objectName);
-    if (o == null || !(o instanceof IConnectionThrottler))
+    if (o == null || !(o instanceof IThrottleGroups))
     {
-      o = new org.apache.manifoldcf.core.throttler.ConnectionThrottler(tc);
+      o = new org.apache.manifoldcf.core.throttler.ThrottleGroups(tc);
       tc.save(objectName,o);
     }
-    return (IConnectionThrottler)o;
+    return (IThrottleGroups)o;
   }
 
 }

Modified: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java?rev=1550934&r1=1550933&r2=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java Sat Dec 14 13:48:43 2013
@@ -1396,7 +1396,7 @@ public class ManifoldCF
     public void doCleanup(IThreadContext threadContext)
       throws ManifoldCFException
     {
-      IConnectionThrottler connectionThrottler = ConnectionThrottlerFactory.make(threadContext);
+      IThrottleGroups connectionThrottler = ThrottleGroupsFactory.make(threadContext);
       connectionThrottler.destroy();
     }
     

Copied: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ThrottleGroups.java (from r1550906, manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ConnectionThrottler.java)
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ThrottleGroups.java?p2=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ThrottleGroups.java&p1=manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ConnectionThrottler.java&r1=1550906&r2=1550934&rev=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ConnectionThrottler.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/ThrottleGroups.java Sat Dec 14 13:48:43 2013
@@ -21,11 +21,11 @@ package org.apache.manifoldcf.core.throt
 import org.apache.manifoldcf.core.interfaces.*;
 import java.util.*;
 
-/** An implementation of IConnectionThrottler, which establishes a JVM-wide
+/** An implementation of IThrottleGroups, which establishes a JVM-wide
 * pool of throttlers that can be used as a resource by any connector that needs
 * it.
 */
-public class ConnectionThrottler implements IConnectionThrottler
+public class ThrottleGroups implements IThrottleGroups
 {
   public static final String _rcsid = "@(#)$Id$";
 
@@ -36,7 +36,7 @@ public class ConnectionThrottler impleme
   protected final static Throttler throttler = new Throttler();
   
   /** Constructor */
-  public ConnectionThrottler(IThreadContext threadContext)
+  public ThrottleGroups(IThreadContext threadContext)
     throws ManifoldCFException
   {
     this.threadContext = threadContext;
@@ -73,66 +73,25 @@ public class ConnectionThrottler impleme
   *@param throttleSpec is the desired throttle specification object.
   */
   @Override
-  public void updateThrottleSpecification(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
+  public void createOrUpdateThrottleGroup(String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
     throws ManifoldCFException
   {
-    throttler.updateThrottleSpecification(threadContext, throttleGroupType, throttleGroup, throttleSpec);
+    throttler.createOrUpdateThrottleGroup(threadContext, throttleGroupType, throttleGroup, throttleSpec);
   }
 
-  /** Get permission to use a connection, which is described by the passed array of bin names.
-  * This method may block until a connection slot is available.
-  * The connection can be used multiple times until the releaseConnectionPermission() method is called.
-  * This persistence feature is meant to allow connections to be pooled locally by the caller.
+  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
+  * pool of similar objects, and used to gate the creation of new connections in that pool.
   *@param throttleGroupType is the throttle group type.
   *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the fetch throttler to use when performing fetches from the corresponding connection, or null if the system is being shut down.
+  *@param binNames are the connection type bin names.
+  *@return the connection throttling object, or null if the pool is being shut down.
   */
   @Override
-  public IFetchThrottler obtainConnectionPermission(String throttleGroupType , String throttleGroup,
-    String[] binNames)
-    throws ManifoldCFException
-  {
-    try
-    {
-      return throttler.obtainConnectionPermission(throttleGroupType, throttleGroup, binNames);
-    }
-    catch (InterruptedException e)
-    {
-      throw new ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
-    }
-  }
-  
-  /** Determine whether to release a pooled connection.  This method returns the number of bins
-  * where the outstanding connection exceeds current quotas, indicating whether at least one with the specified
-  * characteristics should be released.
-  * NOTE WELL: This method cannot judge which is the best connection to be released to meet
-  * quotas.  The caller needs to do that based on the highest number of bins matched.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the number of bins that are over quota, or zero if none of them are.
-  */
-  @Override
-  public int overConnectionQuotaCount(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException
+  public IConnectionThrottler obtainConnectionThrottler(String throttleGroupType, String throttleGroup, String[] binNames)
   {
-    return throttler.overConnectionQuotaCount(throttleGroupType, throttleGroup, binNames);
+    return throttler.obtainConnectionThrottler(throttleGroupType, throttleGroup, binNames);
   }
-  
-  /** Release permission to use one connection. This presumes that obtainConnectionPermission()
-  * was called earlier by someone and was successful.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  */
-  @Override
-  public void releaseConnectionPermission(String throttleGroupType, String throttleGroup, String[] binNames)
-    throws ManifoldCFException
-  {
-    throttler.releaseConnectionPermission(throttleGroupType, throttleGroup, binNames);
-  }
-  
+
   /** Poll periodically, to update cluster-wide statistics and allocation.
   *@param throttleGroupType is the throttle group type to update.
   */

Modified: manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/Throttler.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/Throttler.java?rev=1550934&r1=1550933&r2=1550934&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/Throttler.java (original)
+++ manifoldcf/branches/CONNECTORS-829/framework/core/src/main/java/org/apache/manifoldcf/core/throttler/Throttler.java Sat Dec 14 13:48:43 2013
@@ -102,7 +102,7 @@ public class Throttler
   *@param throttleGroup is the throttle group.
   *@param throttleSpec is the desired throttle specification object.
   */
-  public void updateThrottleSpecification(IThreadContext threadContext, String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
+  public void createOrUpdateThrottleGroup(IThreadContext threadContext, String throttleGroupType, String throttleGroup, IThrottleSpec throttleSpec)
     throws ManifoldCFException
   {
     // Potential addition.  Lock the whole hierarchy.
@@ -114,72 +114,21 @@ public class Throttler
         tg = new ThrottlingGroups(throttleGroupType);
         throttleGroupsHash.put(throttleGroupType, tg);
       }
-      tg.updateThrottleSpecification(threadContext, throttleGroup, throttleSpec);
+      tg.createOrUpdateThrottleGroup(threadContext, throttleGroup, throttleSpec);
     }
   }
 
-  /** Get permission to use a connection, which is described by the passed array of bin names.
-  * This method may block until a connection slot is available.
-  * The connection can be used multiple times until the releaseConnectionPermission() method is called.
-  * This persistence feature is meant to allow connections to be pooled locally by the caller.
+  /** Construct connection throttler for connections with specific bin names.  This object is meant to be embedded with a connection
+  * pool of similar objects, and used to gate the creation of new connections in that pool.
   *@param throttleGroupType is the throttle group type.
   *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the fetch throttler to use when performing fetches from the corresponding connection, or null if the system is being shut down.
+  *@param binNames are the connection type bin names.
+  *@return the connection throttling object, or null if the pool is being shut down.
   */
-  public IFetchThrottler obtainConnectionPermission(String throttleGroupType , String throttleGroup,
-    String[] binNames)
-    throws InterruptedException
+  public IConnectionThrottler obtainConnectionThrottler(String throttleGroupType, String throttleGroup, String[] binNames)
   {
-    // This method may wait at the innermost level.  We therefore do not lock the hierarchy, BUT
-    // we must code for the possibility that the hierarchy is fluid, and may dissolve.  Under such
-    // conditions we could simply retry.  But in this case, the hierarchy has state: there is an
-    // explicit creation step (updateThrottleSpecification) that must be called to establish the
-    // innermost object and set it up correctly.  It is therefore meaningful if we do not find
-    // the expected structure: we return null in that case.
-    ThrottlingGroups tg;
-    synchronized (throttleGroupsHash)
-    {
-      tg = throttleGroupsHash.get(throttleGroupType);
-    }
-    if (tg == null)
-      return null;
-    return tg.obtainConnectionPermission(throttleGroup, binNames);
-  }
-  
-  /** Determine whether to release a pooled connection.  This method returns the number of bins
-  * where the outstanding connection exceeds current quotas, indicating whether at least one with the specified
-  * characteristics should be released.
-  * NOTE WELL: This method cannot judge which is the best connection to be released to meet
-  * quotas.  The caller needs to do that based on the highest number of bins matched.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  *@return the number of bins that are over quota, or zero if none of them are.
-  */
-  public int overConnectionQuotaCount(String throttleGroupType, String throttleGroup, String[] binNames)
-  {
-    // No waiting, so it is OK to lock everything.
-    synchronized (throttleGroupsHash)
-    {
-      // MHL
-      return 0;
-    }
-  }
-  
-  /** Release permission to use one connection. This presumes that obtainConnectionPermission()
-  * was called earlier by someone and was successful.
-  *@param throttleGroupType is the throttle group type.
-  *@param throttleGroup is the throttle group.
-  *@param binNames is the set of bin names to throttle for, within the throttle group.
-  */
-  public void releaseConnectionPermission(String throttleGroupType, String throttleGroup, String[] binNames)
-  {
-    // No waiting, so it is ok to lock the entire tree.
-    synchronized (throttleGroupsHash)
-    {
-      // MHL
-    }
+    // MHL
+    return null;
   }
   
   /** Poll periodically.
@@ -258,7 +207,7 @@ public class Throttler
     // MHL
     
     /** Update throttle specification */
-    public void updateThrottleSpecification(IThreadContext threadContext, String throttleGroup, IThrottleSpec throttleSpec)
+    public void createOrUpdateThrottleGroup(IThreadContext threadContext, String throttleGroup, IThrottleSpec throttleSpec)
       throws ManifoldCFException
     {
       synchronized (groups)