This is an automated email from the ASF dual-hosted git repository.

klund pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new afd082c  GEODE-6176: Make FunctionService testable with internal 
delegates
afd082c is described below

commit afd082c67895abf6e9467cc4fbf1bf7cc0c28995
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Mon Dec 10 13:44:24 2018 -0800

    GEODE-6176: Make FunctionService testable with internal delegates
    
    Introduce new internal FunctionExecutionService API interfaces:
    * FunctionExecutionService
    * InternalFunctionExecutionService
    
    Implement interfaces with:
    * InternalFunctionExecutionServiceImpl
    
    Collapse FunctionServiceManager into InternalFunctionExecutionServiceImpl
    
    Change the two static API classes to delegate to an instance of
    InternalFunctionExecutionServiceImpl:
    * FunctionService (User API) -- only has private internal changes
    * InternalFunctionService -- now extends FunctionService
    
    Geode classes that use the static API classes directly can now be
    changed to depend on one of the two interfaces using constructor
    injection to facilitate unit testing without PowerMock.
---
 .../geode/cache/execute/FunctionService.java       |  57 +--
 .../internal/InternalDistributedSystem.java        |   4 +-
 .../cache/execute/FunctionExecutionService.java}   |  91 +----
 .../execute/InternalFunctionExecutionService.java  | 154 ++++++++
 .../InternalFunctionExecutionServiceImpl.java}     | 403 +++++++++------------
 .../cache/execute/InternalFunctionService.java     |  72 ++--
 .../apache/geode/internal/cache/properties.html    |   2 +-
 .../tier/sockets/command/ExecuteFunction70.java    |   4 +-
 8 files changed, 412 insertions(+), 375 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java 
b/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java
index 630bfeb..3566c38 100755
--- 
a/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java
@@ -23,11 +23,10 @@ import org.apache.geode.cache.RegionService;
 import org.apache.geode.cache.client.ClientCache;
 import org.apache.geode.cache.client.ClientCacheFactory;
 import org.apache.geode.cache.client.Pool;
-import org.apache.geode.cache.execute.internal.FunctionServiceManager;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DistributedSystem;
-import org.apache.geode.distributed.DistributedSystemDisconnectedException;
-import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.internal.cache.execute.FunctionExecutionService;
+import 
org.apache.geode.internal.cache.execute.InternalFunctionExecutionServiceImpl;
 
 /**
  * Provides the entry point into execution of user defined {@linkplain 
Function}s.
@@ -39,9 +38,18 @@ import 
org.apache.geode.distributed.internal.InternalDistributedSystem;
  * @since GemFire 6.0
  */
 public class FunctionService {
-  private static final FunctionServiceManager functionSvcMgr = new 
FunctionServiceManager();
 
-  FunctionService() {}
+  private static final FunctionService INSTANCE =
+      new FunctionService(new InternalFunctionExecutionServiceImpl());
+
+  private final FunctionExecutionService functionExecutionService;
+
+  /**
+   * Protected visibility to allow InternalFunctionService to extend 
FunctionService.
+   */
+  protected FunctionService(FunctionExecutionService functionExecutionService) 
{
+    this.functionExecutionService = functionExecutionService;
+  }
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
dependent function on
@@ -63,7 +71,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static Execution onRegion(Region region) {
-    return functionSvcMgr.onRegion(region);
+    return getFunctionExecutionService().onRegion(region);
   }
 
   /**
@@ -78,7 +86,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static Execution onServer(Pool pool) {
-    return functionSvcMgr.onServer(pool);
+    return getFunctionExecutionService().onServer(pool);
   }
 
   /**
@@ -91,7 +99,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static Execution onServers(Pool pool) {
-    return functionSvcMgr.onServers(pool);
+    return getFunctionExecutionService().onServers(pool);
   }
 
   /**
@@ -108,7 +116,7 @@ public class FunctionService {
    * @since GemFire 6.5
    */
   public static Execution onServer(RegionService regionService) {
-    return functionSvcMgr.onServer(regionService);
+    return getFunctionExecutionService().onServer(regionService);
   }
 
   /**
@@ -123,7 +131,7 @@ public class FunctionService {
    * @since GemFire 6.5
    */
   public static Execution onServers(RegionService regionService) {
-    return functionSvcMgr.onServers(regionService);
+    return getFunctionExecutionService().onServers(regionService);
   }
 
   /**
@@ -135,10 +143,9 @@ public class FunctionService {
    * @param distributedMember defines a member in the distributed system
    * @throws FunctionException if distributedMember is null
    * @since GemFire 7.0
-   *
    */
   public static Execution onMember(DistributedMember distributedMember) {
-    return functionSvcMgr.onMember(getDistributedSystem(), distributedMember);
+    return getFunctionExecutionService().onMember(distributedMember);
   }
 
   /**
@@ -157,7 +164,7 @@ public class FunctionService {
    * @since GemFire 7.0
    */
   public static Execution onMembers(String... groups) {
-    return functionSvcMgr.onMembers(getDistributedSystem(), groups);
+    return getFunctionExecutionService().onMembers(groups);
   }
 
   /**
@@ -170,7 +177,7 @@ public class FunctionService {
    * @since GemFire 7.0
    */
   public static Execution onMembers(Set<DistributedMember> distributedMembers) 
{
-    return functionSvcMgr.onMembers(getDistributedSystem(), 
distributedMembers);
+    return getFunctionExecutionService().onMembers(distributedMembers);
   }
 
   /**
@@ -185,7 +192,7 @@ public class FunctionService {
    * @since GemFire 7.0
    */
   public static Execution onMember(String... groups) {
-    return functionSvcMgr.onMember(getDistributedSystem(), groups);
+    return getFunctionExecutionService().onMember(groups);
   }
 
   /**
@@ -196,7 +203,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static Function getFunction(String functionId) {
-    return functionSvcMgr.getFunction(functionId);
+    return getFunctionExecutionService().getFunction(functionId);
   }
 
   /**
@@ -212,7 +219,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static void registerFunction(Function function) {
-    functionSvcMgr.registerFunction(function);
+    getFunctionExecutionService().registerFunction(function);
   }
 
   /**
@@ -224,7 +231,7 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static void unregisterFunction(String functionId) {
-    functionSvcMgr.unregisterFunction(functionId);
+    getFunctionExecutionService().unregisterFunction(functionId);
   }
 
   /**
@@ -234,10 +241,9 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static boolean isRegistered(String functionId) {
-    return functionSvcMgr.isRegistered(functionId);
+    return getFunctionExecutionService().isRegistered(functionId);
   }
 
-
   /**
    * Returns all locally registered functions
    *
@@ -245,15 +251,10 @@ public class FunctionService {
    * @since GemFire 6.0
    */
   public static Map<String, Function> getRegisteredFunctions() {
-    return functionSvcMgr.getRegisteredFunctions();
+    return getFunctionExecutionService().getRegisteredFunctions();
   }
 
-  private static DistributedSystem getDistributedSystem() {
-    DistributedSystem system = 
InternalDistributedSystem.getConnectedInstance();
-    if (system == null) {
-      throw new DistributedSystemDisconnectedException(
-          "This connection to a distributed system has been disconnected.");
-    }
-    return system;
+  private static FunctionExecutionService getFunctionExecutionService() {
+    return INSTANCE.functionExecutionService;
   }
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
index 32f3d13..e2cc885 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
@@ -61,7 +61,6 @@ import org.apache.geode.SystemFailure;
 import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.CacheXmlException;
-import org.apache.geode.cache.execute.internal.FunctionServiceManager;
 import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DistributedSystem;
@@ -91,6 +90,7 @@ import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.execute.FunctionServiceStats;
 import org.apache.geode.internal.cache.execute.FunctionStats;
+import org.apache.geode.internal.cache.execute.InternalFunctionService;
 import org.apache.geode.internal.cache.tier.sockets.EncryptorImpl;
 import org.apache.geode.internal.cache.xmlcache.CacheServerCreation;
 import org.apache.geode.internal.logging.InternalLogWriter;
@@ -1432,7 +1432,7 @@ public class InternalDistributedSystem extends 
DistributedSystem
         functionstats.close();
       }
 
-      (new FunctionServiceManager()).unregisterAllFunctions();
+      InternalFunctionService.unregisterAllFunctions();
 
       if (this.sampler != null) {
         this.sampler.stop();
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/FunctionExecutionService.java
old mode 100755
new mode 100644
similarity index 73%
copy from 
geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java
copy to 
geode-core/src/main/java/org/apache/geode/internal/cache/execute/FunctionExecutionService.java
index 630bfeb..6916728
--- 
a/geode-core/src/main/java/org/apache/geode/cache/execute/FunctionService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/FunctionExecutionService.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions 
and limitations under
  * the License.
  */
-package org.apache.geode.cache.execute;
+package org.apache.geode.internal.cache.execute;
 
 import java.util.Map;
 import java.util.Properties;
@@ -23,25 +23,13 @@ import org.apache.geode.cache.RegionService;
 import org.apache.geode.cache.client.ClientCache;
 import org.apache.geode.cache.client.ClientCacheFactory;
 import org.apache.geode.cache.client.Pool;
-import org.apache.geode.cache.execute.internal.FunctionServiceManager;
+import org.apache.geode.cache.execute.Execution;
+import org.apache.geode.cache.execute.Function;
+import org.apache.geode.cache.execute.FunctionException;
+import org.apache.geode.cache.execute.FunctionService;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.DistributedSystem;
-import org.apache.geode.distributed.DistributedSystemDisconnectedException;
-import org.apache.geode.distributed.internal.InternalDistributedSystem;
 
-/**
- * Provides the entry point into execution of user defined {@linkplain 
Function}s.
- * <p>
- * Function execution provides a means to route application behaviour to 
{@linkplain Region data} or
- * more generically to peers in a {@link DistributedSystem} or servers in a 
{@link Pool}.
- * </p>
- *
- * @since GemFire 6.0
- */
-public class FunctionService {
-  private static final FunctionServiceManager functionSvcMgr = new 
FunctionServiceManager();
-
-  FunctionService() {}
+public interface FunctionExecutionService {
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
dependent function on
@@ -62,9 +50,7 @@ public class FunctionService {
    * @throws FunctionException if the region passed in is null
    * @since GemFire 6.0
    */
-  public static Execution onRegion(Region region) {
-    return functionSvcMgr.onRegion(region);
-  }
+  Execution onRegion(Region region);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -77,9 +63,7 @@ public class FunctionService {
    * @throws FunctionException if Pool instance passed in is null
    * @since GemFire 6.0
    */
-  public static Execution onServer(Pool pool) {
-    return functionSvcMgr.onServer(pool);
-  }
+  Execution onServer(Pool pool);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -90,9 +74,7 @@ public class FunctionService {
    * @throws FunctionException if Pool instance passed in is null
    * @since GemFire 6.0
    */
-  public static Execution onServers(Pool pool) {
-    return functionSvcMgr.onServers(pool);
-  }
+  Execution onServers(Pool pool);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -107,9 +89,7 @@ public class FunctionService {
    *         pool
    * @since GemFire 6.5
    */
-  public static Execution onServer(RegionService regionService) {
-    return functionSvcMgr.onServer(regionService);
-  }
+  Execution onServer(RegionService regionService);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -122,9 +102,7 @@ public class FunctionService {
    *         pool
    * @since GemFire 6.5
    */
-  public static Execution onServers(RegionService regionService) {
-    return functionSvcMgr.onServers(regionService);
-  }
+  Execution onServers(RegionService regionService);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -135,11 +113,8 @@ public class FunctionService {
    * @param distributedMember defines a member in the distributed system
    * @throws FunctionException if distributedMember is null
    * @since GemFire 7.0
-   *
    */
-  public static Execution onMember(DistributedMember distributedMember) {
-    return functionSvcMgr.onMember(getDistributedSystem(), distributedMember);
-  }
+  Execution onMember(DistributedMember distributedMember);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -156,9 +131,7 @@ public class FunctionService {
    * @throws FunctionException if no members are found belonging to the 
provided groups
    * @since GemFire 7.0
    */
-  public static Execution onMembers(String... groups) {
-    return functionSvcMgr.onMembers(getDistributedSystem(), groups);
-  }
+  Execution onMembers(String... groups);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -169,9 +142,7 @@ public class FunctionService {
    * @throws FunctionException if distributedMembers is null
    * @since GemFire 7.0
    */
-  public static Execution onMembers(Set<DistributedMember> distributedMembers) 
{
-    return functionSvcMgr.onMembers(getDistributedSystem(), 
distributedMembers);
-  }
+  Execution onMembers(Set<DistributedMember> distributedMembers);
 
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
@@ -184,9 +155,7 @@ public class FunctionService {
    * @throws FunctionException if no members are found belonging to the 
provided groups
    * @since GemFire 7.0
    */
-  public static Execution onMember(String... groups) {
-    return functionSvcMgr.onMember(getDistributedSystem(), groups);
-  }
+  Execution onMember(String... groups);
 
   /**
    * Returns the {@link Function} defined by the functionId, returns null if 
no function is found
@@ -195,9 +164,7 @@ public class FunctionService {
    * @throws FunctionException if functionID passed is null
    * @since GemFire 6.0
    */
-  public static Function getFunction(String functionId) {
-    return functionSvcMgr.getFunction(functionId);
-  }
+  Function getFunction(String functionId);
 
   /**
    * Registers the given {@link Function} with the {@link FunctionService} 
using
@@ -211,9 +178,7 @@ public class FunctionService {
    * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
    * @since GemFire 6.0
    */
-  public static void registerFunction(Function function) {
-    functionSvcMgr.registerFunction(function);
-  }
+  void registerFunction(Function function);
 
   /**
    * Unregisters the given {@link Function} with the {@link FunctionService} 
using
@@ -223,9 +188,7 @@ public class FunctionService {
    * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
    * @since GemFire 6.0
    */
-  public static void unregisterFunction(String functionId) {
-    functionSvcMgr.unregisterFunction(functionId);
-  }
+  void unregisterFunction(String functionId);
 
   /**
    * Returns true if the function is registered to FunctionService
@@ -233,10 +196,7 @@ public class FunctionService {
    * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
    * @since GemFire 6.0
    */
-  public static boolean isRegistered(String functionId) {
-    return functionSvcMgr.isRegistered(functionId);
-  }
-
+  boolean isRegistered(String functionId);
 
   /**
    * Returns all locally registered functions
@@ -244,16 +204,5 @@ public class FunctionService {
    * @return A view of registered functions as a Map of {@link 
Function#getId()} to {@link Function}
    * @since GemFire 6.0
    */
-  public static Map<String, Function> getRegisteredFunctions() {
-    return functionSvcMgr.getRegisteredFunctions();
-  }
-
-  private static DistributedSystem getDistributedSystem() {
-    DistributedSystem system = 
InternalDistributedSystem.getConnectedInstance();
-    if (system == null) {
-      throw new DistributedSystemDisconnectedException(
-          "This connection to a distributed system has been disconnected.");
-    }
-    return system;
-  }
+  Map<String, Function> getRegisteredFunctions();
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionService.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionService.java
new file mode 100644
index 0000000..6fb529a
--- /dev/null
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionService.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+package org.apache.geode.internal.cache.execute;
+
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionService;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ClientCacheFactory;
+import org.apache.geode.cache.client.Pool;
+import org.apache.geode.cache.execute.Execution;
+import org.apache.geode.cache.execute.Function;
+import org.apache.geode.cache.execute.FunctionException;
+import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.DistributedSystem;
+
+public interface InternalFunctionExecutionService extends 
FunctionExecutionService {
+
+  void unregisterAllFunctions();
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a 
function on the set of {@link
+   * Region}s. The function would be executed on the set of members that host 
data for any of the
+   * regions in the set of regions. <br>
+   * If the Set provided contains region with : <br>
+   * DataPolicy.NORMAL, execute the function on any random member which has 
DataPolicy.REPLICATE .
+   * <br>
+   * DataPolicy.EMPTY, execute the function on any random member which has 
DataPolicy.REPLICATE .
+   * <br>
+   * DataPolicy.REPLICATE, execute the function locally or any random member 
which has
+   * DataPolicy.REPLICATE .<br>
+   * DataPolicy.PARTITION, it executes on members where the primary copy of 
data is hosted. <br>
+   * This API is not supported for cache clients in client server mode
+   *
+   * <p>
+   * For an Execution object obtained from this method, calling the withFilter 
method throws
+   * {@link UnsupportedOperationException}
+   *
+   * @see MultiRegionFunctionContext
+   */
+  Execution onRegions(Set<Region> regions);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * all the servers that the given cache is connected to. If one of the 
servers goes down while
+   * dispatching or executing the function on the server, an Exception will be 
thrown.
+   *
+   * @param regionService obtained from {@link ClientCacheFactory#create} or
+   *        {@link ClientCache#createAuthenticatedView(Properties)} .
+   * @throws FunctionException if cache is null, is not on a client, or it 
does not have a default
+   *         pool
+   * @since GemFire 6.5
+   */
+  Execution onServers(RegionService regionService, String... groups);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * a server that the given cache is connected to.
+   * <p>
+   * If the server goes down while dispatching or executing the function, an 
Exception will be
+   * thrown.
+   *
+   * @param regionService obtained from {@link ClientCacheFactory#create} or
+   *        {@link ClientCache#createAuthenticatedView(Properties)} .
+   * @throws FunctionException if cache is null, is not on a client, or it 
does not have a default
+   *         pool
+   * @since GemFire 6.5
+   */
+  Execution onServer(RegionService regionService, String... groups);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * all the servers in the provided {@link Pool}. If one of the servers goes 
down while dispatching
+   * or executing the function on the server, an Exception will be thrown.
+   *
+   * @param pool the set of servers to execute the function
+   * @throws FunctionException if Pool instance passed in is null
+   * @since GemFire 6.0
+   */
+  Execution onServers(Pool pool, String... groups);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * a server in the provided {@link Pool}.
+   * <p>
+   * If the server goes down while dispatching or executing the function, an 
Exception will be
+   * thrown.
+   *
+   * @param pool from which to chose a server for execution
+   * @throws FunctionException if Pool instance passed in is null
+   * @since GemFire 6.0
+   */
+  Execution onServer(Pool pool, String... groups);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * a {@link DistributedMember} of the {@link DistributedSystem}. If the 
member is not found in the
+   * system, the function execution will throw an Exception. If the member 
goes down while
+   * dispatching or executing the function on the member, an Exception will be 
thrown.
+   *
+   * @param system defines the distributed system
+   * @param distributedMember defines a member in the distributed system
+   * @throws FunctionException if either input parameter is null
+   * @since GemFire 6.0
+   *
+   */
+  Execution onMember(DistributedSystem system, DistributedMember 
distributedMember);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * all members of the {@link DistributedSystem}. If one of the members goes 
down while dispatching
+   * or executing the function on the member, an Exception will be thrown.
+   *
+   * @param system defines the distributed system
+   *
+   * @throws FunctionException if DistributedSystem instance passed is null
+   * @since GemFire 6.0
+   */
+  Execution onMembers(DistributedSystem system, String... groups);
+
+  /**
+   * Uses {@code RANDOM_onMember} for tests.
+   *
+   * <p>
+   * TODO: maybe merge with {@link #onMembers(DistributedSystem, String...)}
+   */
+  Execution onMember(DistributedSystem system, String... groups);
+
+  /**
+   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
+   * the set of {@link DistributedMember}s of the {@link DistributedSystem}. 
If one of the members
+   * goes down while dispatching or executing the function, an Exception will 
be thrown.
+   *
+   * @param system defines the distributed system
+   * @param distributedMembers set of distributed members on which {@link 
Function} to be executed
+   * @throws FunctionException if DistributedSystem instance passed is null
+   * @since GemFire 6.0
+   */
+  Execution onMembers(DistributedSystem system, Set<DistributedMember> 
distributedMembers);
+}
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/execute/internal/FunctionServiceManager.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionServiceImpl.java
similarity index 58%
rename from 
geode-core/src/main/java/org/apache/geode/cache/execute/internal/FunctionServiceManager.java
rename to 
geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionServiceImpl.java
index 4ef63db..244c73c 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/execute/internal/FunctionServiceManager.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionExecutionServiceImpl.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions 
and limitations under
  * the License.
  */
-package org.apache.geode.cache.execute.internal;
+package org.apache.geode.internal.cache.execute;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -21,14 +21,11 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionService;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
 import org.apache.geode.cache.client.Pool;
 import org.apache.geode.cache.client.PoolManager;
 import org.apache.geode.cache.client.internal.InternalClientCache;
@@ -37,36 +34,18 @@ import org.apache.geode.cache.client.internal.ProxyRegion;
 import org.apache.geode.cache.execute.Execution;
 import org.apache.geode.cache.execute.Function;
 import org.apache.geode.cache.execute.FunctionException;
-import org.apache.geode.cache.execute.FunctionService;
 import org.apache.geode.cache.partition.PartitionRegionHelper;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.distributed.DistributedSystemDisconnectedException;
 import org.apache.geode.distributed.internal.DistributionConfig;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.InternalEntity;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalRegion;
-import 
org.apache.geode.internal.cache.execute.DistributedRegionFunctionExecutor;
-import org.apache.geode.internal.cache.execute.MemberFunctionExecutor;
-import 
org.apache.geode.internal.cache.execute.PartitionedRegionFunctionExecutor;
-import org.apache.geode.internal.cache.execute.ServerFunctionExecutor;
-import org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor;
-
-/**
- * Provides the entry point into execution of user defined {@linkplain 
Function}s.
- * <p>
- * Function execution provides a means to route application behaviour to 
{@linkplain Region data} or
- * more generically to peers in a {@link DistributedSystem} or servers in a 
{@link Pool}.
- * </p>
- *
- * While {@link FunctionService} is a customer facing interface to this 
functionality, all of the
- * work is done here. In addition, internal only functionality is exposed in 
this class.
- *
- * @since GemFire 7.0
- */
-public class FunctionServiceManager {
 
-  private static final ConcurrentHashMap<String, Function> idToFunctionMap =
-      new ConcurrentHashMap<>();
+public class InternalFunctionExecutionServiceImpl
+    implements FunctionExecutionService, InternalFunctionExecutionService {
 
   /**
    * use when the optimization to execute onMember locally is not desired.
@@ -74,29 +53,58 @@ public class FunctionServiceManager {
   public static final boolean RANDOM_onMember =
       Boolean.getBoolean(DistributionConfig.GEMFIRE_PREFIX + 
"randomizeOnMember");
 
-  public FunctionServiceManager() {
-    // do nothing
+  private static final String[] EMPTY_GROUPS = new String[0];
+
+  private static final ConcurrentHashMap<String, Function> idToFunctionMap =
+      new ConcurrentHashMap<>();
+
+  public InternalFunctionExecutionServiceImpl() {
+    // nothing
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
dependent function on
-   * the specified Region.<br>
-   * When invoked from a GemFire client, the method returns an Execution 
instance that sends a
-   * message to one of the connected servers as specified by the {@link Pool} 
for the region. <br>
-   * Depending on the filters setup on the {@link Execution}, the function is 
executed on all
-   * GemFire members that define the data region, or a subset of members.
-   * {@link Execution#withFilter(Set)}).
-   *
-   * For DistributedRegions with DataPolicy.NORMAL, it throws 
UnsupportedOperationException. For
-   * DistributedRegions with DataPolicy.EMPTY, execute the function on any 
random member which has
-   * DataPolicy.REPLICATE <br>
-   * . For DistributedRegions with DataPolicy.REPLICATE, execute the function 
locally. For Regions
-   * with DataPolicy.PARTITION, it executes on members where the data resides 
as specified by the
-   * filter.
-   *
-   * @throws FunctionException if the region passed in is null
-   * @since GemFire 6.0
-   */
+  // FunctionExecutionService API 
----------------------------------------------------------------
+
+  @Override
+  public Execution onServer(Pool pool) {
+    return onServer(pool, EMPTY_GROUPS);
+  }
+
+  @Override
+  public Execution onServers(Pool pool) {
+    return onServers(pool, EMPTY_GROUPS);
+  }
+
+  @Override
+  public Execution onServer(RegionService regionService) {
+    return onServer(regionService, EMPTY_GROUPS);
+  }
+
+  @Override
+  public Execution onServers(RegionService regionService) {
+    return onServers(regionService, EMPTY_GROUPS);
+  }
+
+  @Override
+  public Execution onMember(DistributedMember distributedMember) {
+    return onMember(getDistributedSystem(), distributedMember);
+  }
+
+  @Override
+  public Execution onMembers(String... groups) {
+    return onMembers(getDistributedSystem(), groups);
+  }
+
+  @Override
+  public Execution onMembers(Set<DistributedMember> distributedMembers) {
+    return onMembers(getDistributedSystem(), distributedMembers);
+  }
+
+  @Override
+  public Execution onMember(String... groups) {
+    return onMember(getDistributedSystem(), groups);
+  }
+
+  @Override
   public Execution onRegion(Region region) {
     if (region == null) {
       throw new FunctionException(
@@ -127,17 +135,66 @@ public class FunctionServiceManager {
     return new DistributedRegionFunctionExecutor(region);
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * a server in the provided {@link Pool}.
-   * <p>
-   * If the server goes down while dispatching or executing the function, an 
Exception will be
-   * thrown.
-   *
-   * @param pool from which to chose a server for execution
-   * @throws FunctionException if Pool instance passed in is null
-   * @since GemFire 6.0
-   */
+  @Override
+  public Function getFunction(String functionId) {
+    if (functionId == null) {
+      throw new FunctionException(String.format("%s passed is null",
+          "functionId instance "));
+    }
+    return idToFunctionMap.get(functionId);
+  }
+
+  @Override
+  public void registerFunction(Function function) {
+    if (function == null) {
+      throw new FunctionException(String.format("%s passed is null",
+          "function instance "));
+    }
+    if (function.getId() == null) {
+      throw new FunctionException(
+          "function.getId() returned null, implement the Function.getId() 
method properly");
+    }
+    if (function.isHA() && !function.hasResult()) {
+      throw new FunctionException(
+          "For Functions with isHA true, hasResult must also be true.");
+    }
+
+    idToFunctionMap.put(function.getId(), function);
+  }
+
+  @Override
+  public void unregisterFunction(String functionId) {
+    if (functionId == null) {
+      throw new FunctionException(String.format("%s passed is null",
+          "functionId instance "));
+    }
+    idToFunctionMap.remove(functionId);
+  }
+
+  @Override
+  public boolean isRegistered(String functionId) {
+    if (functionId == null) {
+      throw new FunctionException(String.format("%s passed is null",
+          "functionId instance "));
+    }
+    return idToFunctionMap.containsKey(functionId);
+  }
+
+  @Override
+  public Map<String, Function> getRegisteredFunctions() {
+    // We have to remove the internal functions before returning the map to 
the users
+    final Map<String, Function> tempIdToFunctionMap = new HashMap<>();
+    for (Map.Entry<String, Function> entry : idToFunctionMap.entrySet()) {
+      if (!(entry.getValue() instanceof InternalEntity)) {
+        tempIdToFunctionMap.put(entry.getKey(), entry.getValue());
+      }
+    }
+    return tempIdToFunctionMap;
+  }
+
+  // InternalFunctionExecutionService OnServerGroups API 
-----------------------------------------
+
+  @Override
   public Execution onServer(Pool pool, String... groups) {
     if (pool == null) {
       throw new FunctionException(
@@ -151,15 +208,7 @@ public class FunctionServiceManager {
     return new ServerFunctionExecutor(pool, false, groups);
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * all the servers in the provided {@link Pool}. If one of the servers goes 
down while dispatching
-   * or executing the function on the server, an Exception will be thrown.
-   *
-   * @param pool the set of servers to execute the function
-   * @throws FunctionException if Pool instance passed in is null
-   * @since GemFire 6.0
-   */
+  @Override
   public Execution onServers(Pool pool, String... groups) {
     if (pool == null) {
       throw new FunctionException(
@@ -173,19 +222,7 @@ public class FunctionServiceManager {
     return new ServerFunctionExecutor(pool, true, groups);
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * a server that the given cache is connected to.
-   * <p>
-   * If the server goes down while dispatching or executing the function, an 
Exception will be
-   * thrown.
-   *
-   * @param regionService obtained from {@link ClientCacheFactory#create} or
-   *        {@link ClientCache#createAuthenticatedView(Properties)} .
-   * @throws FunctionException if cache is null, is not on a client, or it 
does not have a default
-   *         pool
-   * @since GemFire 6.5
-   */
+  @Override
   public Execution onServer(RegionService regionService, String... groups) {
     if (regionService == null) {
       throw new FunctionException(String.format("%s passed is null",
@@ -207,17 +244,7 @@ public class FunctionServiceManager {
     }
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * all the servers that the given cache is connected to. If one of the 
servers goes down while
-   * dispatching or executing the function on the server, an Exception will be 
thrown.
-   *
-   * @param regionService obtained from {@link ClientCacheFactory#create} or
-   *        {@link ClientCache#createAuthenticatedView(Properties)} .
-   * @throws FunctionException if cache is null, is not on a client, or it 
does not have a default
-   *         pool
-   * @since GemFire 6.5
-   */
+  @Override
   public Execution onServers(RegionService regionService, String... groups) {
     if (regionService == null) {
       throw new FunctionException(String.format("%s passed is null",
@@ -239,18 +266,9 @@ public class FunctionServiceManager {
     }
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * a {@link DistributedMember} of the {@link DistributedSystem}. If the 
member is not found in the
-   * system, the function execution will throw an Exception. If the member 
goes down while
-   * dispatching or executing the function on the member, an Exception will be 
thrown.
-   *
-   * @param system defines the distributed system
-   * @param distributedMember defines a member in the distributed system
-   * @throws FunctionException if either input parameter is null
-   * @since GemFire 6.0
-   *
-   */
+  // InternalFunctionExecutionService InDistributedSystem API 
------------------------------------
+
+  @Override
   public Execution onMember(DistributedSystem system, DistributedMember 
distributedMember) {
     if (system == null) {
       throw new FunctionException(String.format("%s passed is null",
@@ -263,16 +281,7 @@ public class FunctionServiceManager {
     return new MemberFunctionExecutor(system, distributedMember);
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * all members of the {@link DistributedSystem}. If one of the members goes 
down while dispatching
-   * or executing the function on the member, an Exception will be thrown.
-   *
-   * @param system defines the distributed system
-   *
-   * @throws FunctionException if DistributedSystem instance passed is null
-   * @since GemFire 6.0
-   */
+  @Override
   public Execution onMembers(DistributedSystem system, String... groups) {
     if (system == null) {
       throw new FunctionException(String.format("%s passed is null",
@@ -281,7 +290,7 @@ public class FunctionServiceManager {
     if (groups.length == 0) {
       return new MemberFunctionExecutor(system);
     }
-    Set<DistributedMember> members = new HashSet<DistributedMember>();
+    Set<DistributedMember> members = new HashSet<>();
     for (String group : groups) {
       members.addAll(system.getGroupMembers(group));
     }
@@ -292,16 +301,32 @@ public class FunctionServiceManager {
     return new MemberFunctionExecutor(system, members);
   }
 
-  /**
-   * Returns an {@link Execution} object that can be used to execute a data 
independent function on
-   * the set of {@link DistributedMember}s of the {@link DistributedSystem}. 
If one of the members
-   * goes down while dispatching or executing the function, an Exception will 
be thrown.
-   *
-   * @param system defines the distributed system
-   * @param distributedMembers set of distributed members on which {@link 
Function} to be executed
-   * @throws FunctionException if DistributedSystem instance passed is null
-   * @since GemFire 6.0
-   */
+  @Override
+  public Execution onMember(DistributedSystem system, String... groups) {
+    if (system == null) {
+      throw new FunctionException(String.format("%s passed is null",
+          "DistributedSystem instance "));
+    }
+    Set<DistributedMember> members = new HashSet<>();
+    for (String group : groups) {
+      List<DistributedMember> grpMembers = new 
ArrayList<>(system.getGroupMembers(group));
+      if (!grpMembers.isEmpty()) {
+        if (!RANDOM_onMember && 
grpMembers.contains(system.getDistributedMember())) {
+          members.add(system.getDistributedMember());
+        } else {
+          Collections.shuffle(grpMembers);
+          members.add(grpMembers.get(0));
+        }
+      }
+    }
+    if (members.isEmpty()) {
+      throw new FunctionException(String.format("No members found in group(s) 
%s",
+          Arrays.toString(groups)));
+    }
+    return new MemberFunctionExecutor(system, members);
+  }
+
+  @Override
   public Execution onMembers(DistributedSystem system, Set<DistributedMember> 
distributedMembers) {
     if (system == null) {
       throw new FunctionException(String.format("%s passed is null",
@@ -314,100 +339,37 @@ public class FunctionServiceManager {
     return new MemberFunctionExecutor(system, distributedMembers);
   }
 
-  /**
-   * Returns the {@link Function} defined by the functionId, returns null if 
no function is found
-   * for the specified functionId
-   *
-   * @throws FunctionException if functionID passed is null
-   * @since GemFire 6.0
-   */
-  public Function getFunction(String functionId) {
-    if (functionId == null) {
-      throw new FunctionException(String.format("%s passed is null",
-          "functionId instance "));
-    }
-    return idToFunctionMap.get(functionId);
-  }
+  // InternalFunctionExecutionService OnRegions API 
----------------------------------------------
 
-  /**
-   * Registers the given {@link Function} with the {@link FunctionService} 
using
-   * {@link Function#getId()}.
-   * <p>
-   * Registering a function allows execution of the function using
-   * {@link Execution#execute(String)}. Every member that could execute a 
function using its
-   * {@link Function#getId()} should register the function.
-   * </p>
-   *
-   * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
-   * @since GemFire 6.0
-   */
-  public void registerFunction(Function function) {
-    if (function == null) {
-      throw new FunctionException(String.format("%s passed is null",
-          "function instance "));
-    }
-    if (function.getId() == null) {
-      throw new FunctionException(
-          "function.getId() returned null, implement the Function.getId() 
method properly");
-    }
-    if (function.isHA() && !function.hasResult()) {
-      throw new FunctionException(
-          "For Functions with isHA true, hasResult must also be true.");
+  @Override
+  public Execution onRegions(Set<Region> regions) {
+    if (regions == null) {
+      throw new IllegalArgumentException(
+          String.format("The input %s for the execute function request is 
null",
+              "regions set"));
     }
-
-    idToFunctionMap.put(function.getId(), function);
-  }
-
-  /**
-   * Unregisters the given {@link Function} with the {@link FunctionService} 
using
-   * {@link Function#getId()}.
-   * <p>
-   *
-   * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
-   * @since GemFire 6.0
-   */
-  public void unregisterFunction(String functionId) {
-    if (functionId == null) {
-      throw new FunctionException(String.format("%s passed is null",
-          "functionId instance "));
+    if (regions.contains(null)) {
+      throw new IllegalArgumentException(
+          "One or more region references added to the regions set is(are) 
null");
     }
-    idToFunctionMap.remove(functionId);
-  }
-
-  /**
-   * Returns true if the function is registered to FunctionService
-   *
-   * @throws FunctionException if function instance passed is null or 
Function.getId() returns null
-   * @since GemFire 6.0
-   */
-  public boolean isRegistered(String functionId) {
-    if (functionId == null) {
-      throw new FunctionException(String.format("%s passed is null",
-          "functionId instance "));
+    if (regions.isEmpty()) {
+      throw new IllegalArgumentException(
+          "Regions set is empty for onRegions function execution");
     }
-    return idToFunctionMap.containsKey(functionId);
-  }
-
-  /**
-   * Returns all locally registered functions
-   *
-   * @return A view of registered functions as a Map of {@link 
Function#getId()} to {@link Function}
-   * @since GemFire 6.0
-   */
-  public Map<String, Function> getRegisteredFunctions() {
-    // We have to remove the internal functions before returning the map to 
the users
-    final Map<String, Function> tempIdToFunctionMap = new HashMap<String, 
Function>();
-    for (Map.Entry<String, Function> entry : idToFunctionMap.entrySet()) {
-      if (!(entry.getValue() instanceof InternalEntity)) {
-        tempIdToFunctionMap.put(entry.getKey(), entry.getValue());
+    for (Region region : regions) {
+      if (isClientRegion(region)) {
+        throw new UnsupportedOperationException(
+            "FunctionService#onRegions() is not supported for cache clients in 
client server mode");
       }
     }
-    return tempIdToFunctionMap;
+    return new MultiRegionFunctionExecutor(regions);
   }
 
+  // InternalFunctionExecutionService unregisterAllFunctions API 
---------------------------------
+
+  @Override
   public void unregisterAllFunctions() {
     // Unregistering all the functions registered with the FunctionService.
-    Map<String, Function> functions = new HashMap<String, 
Function>(idToFunctionMap);
     for (String functionId : idToFunctionMap.keySet()) {
       unregisterFunction(functionId);
     }
@@ -421,27 +383,12 @@ public class FunctionServiceManager {
     return ((InternalRegion) region).hasServerProxy();
   }
 
-  public Execution onMember(DistributedSystem system, String... groups) {
+  private static DistributedSystem getDistributedSystem() {
+    DistributedSystem system = 
InternalDistributedSystem.getConnectedInstance();
     if (system == null) {
-      throw new FunctionException(String.format("%s passed is null",
-          "DistributedSystem instance "));
+      throw new DistributedSystemDisconnectedException(
+          "This connection to a distributed system has been disconnected.");
     }
-    Set<DistributedMember> members = new HashSet<>();
-    for (String group : groups) {
-      List<DistributedMember> grpMembers = new 
ArrayList<>(system.getGroupMembers(group));
-      if (!grpMembers.isEmpty()) {
-        if (!RANDOM_onMember && 
grpMembers.contains(system.getDistributedMember())) {
-          members.add(system.getDistributedMember());
-        } else {
-          Collections.shuffle(grpMembers);
-          members.add(grpMembers.get(0));
-        }
-      }
-    }
-    if (members.isEmpty()) {
-      throw new FunctionException(String.format("No members found in group(s) 
%s",
-          Arrays.toString(groups)));
-    }
-    return new MemberFunctionExecutor(system, members);
+    return system;
   }
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionService.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionService.java
index a781f63..f433b7c 100755
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/InternalFunctionService.java
@@ -22,18 +22,25 @@ import org.apache.geode.cache.client.ClientCache;
 import org.apache.geode.cache.client.ClientCacheFactory;
 import org.apache.geode.cache.client.Pool;
 import org.apache.geode.cache.execute.Execution;
-import org.apache.geode.cache.execute.internal.FunctionServiceManager;
-import org.apache.geode.internal.cache.LocalRegion;
+import org.apache.geode.cache.execute.FunctionService;
 
 /**
- *
  * Provides internal methods for tests
  *
- *
  * @since GemFire 6.1
- *
  */
-public class InternalFunctionService {
+public class InternalFunctionService extends FunctionService {
+
+  private static final InternalFunctionService INSTANCE =
+      new InternalFunctionService(new InternalFunctionExecutionServiceImpl());
+
+  private final InternalFunctionExecutionService 
internalFunctionExecutionService;
+
+  private InternalFunctionService(
+      InternalFunctionExecutionService internalFunctionExecutionService) {
+    super(internalFunctionExecutionService);
+    this.internalFunctionExecutionService = internalFunctionExecutionService;
+  }
 
   /**
    * Returns an {@link Execution} object that can be used to execute a 
function on the set of
@@ -55,43 +62,11 @@ public class InternalFunctionService {
    * {@link UnsupportedOperationException}
    *
    * @see MultiRegionFunctionContext
-   *
-   *
    */
   public static Execution onRegions(Set<Region> regions) {
-    if (regions == null) {
-      throw new IllegalArgumentException(
-          String.format("The input %s for the execute function request is 
null",
-              "regions set"));
-    }
-    if (regions.contains(null)) {
-      throw new IllegalArgumentException(
-          "One or more region references added to the regions set is(are) 
null");
-    }
-    if (regions.isEmpty()) {
-      throw new IllegalArgumentException(
-          "Regions set is empty for onRegions function execution");
-    }
-    for (Region region : regions) {
-      if (isClientRegion(region)) {
-        throw new UnsupportedOperationException(
-            "FunctionService#onRegions() is not supported for cache clients in 
client server mode");
-      }
-    }
-    return new MultiRegionFunctionExecutor(regions);
-  }
-
-  /**
-   * @return true if the method is called on a region has a {@link Pool}.
-   * @since GemFire 6.0
-   */
-  private static boolean isClientRegion(Region region) {
-    LocalRegion localRegion = (LocalRegion) region;
-    return localRegion.hasServerProxy();
+    return getInternalFunctionExecutionService().onRegions(regions);
   }
 
-  private static final FunctionServiceManager funcServiceManager = new 
FunctionServiceManager();
-
   /**
    * Returns an {@link Execution} object that can be used to execute a data 
independent function on
    * all the servers that the given cache is connected to. If the optional 
groups parameter is
@@ -108,7 +83,7 @@ public class InternalFunctionService {
    * @since GemFire 7.0
    */
   public static Execution onServers(RegionService regionService, String... 
groups) {
-    return funcServiceManager.onServers(regionService, groups);
+    return getInternalFunctionExecutionService().onServers(regionService, 
groups);
   }
 
   /**
@@ -127,7 +102,7 @@ public class InternalFunctionService {
    * @since GemFire 7.0
    */
   public static Execution onServer(RegionService regionService, String... 
groups) {
-    return funcServiceManager.onServer(regionService, groups);
+    return getInternalFunctionExecutionService().onServer(regionService, 
groups);
   }
 
   /**
@@ -145,7 +120,7 @@ public class InternalFunctionService {
    * @since GemFire 7.0
    */
   public static Execution onServers(Pool pool, String... groups) {
-    return funcServiceManager.onServers(pool, groups);
+    return getInternalFunctionExecutionService().onServers(pool, groups);
   }
 
   /**
@@ -163,6 +138,17 @@ public class InternalFunctionService {
    * @since GemFire 7.0
    */
   public static Execution onServer(Pool pool, String... groups) {
-    return funcServiceManager.onServer(pool, groups);
+    return getInternalFunctionExecutionService().onServer(pool, groups);
+  }
+
+  /**
+   * Unregisters all functions.
+   */
+  public static void unregisterAllFunctions() {
+    getInternalFunctionExecutionService().unregisterAllFunctions();
+  }
+
+  private static InternalFunctionExecutionService 
getInternalFunctionExecutionService() {
+    return INSTANCE.internalFunctionExecutionService;
   }
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/properties.html 
b/geode-core/src/main/java/org/apache/geode/internal/cache/properties.html
index 24b9782..18b3478 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/properties.html
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/properties.html
@@ -1691,7 +1691,7 @@ Allow query on region with heterogeneous objects
 <p>
 <em>Boolean</em> (defaults to false)
 <p>
-See 
<code>org.apache.geode.cache.execute.internal.FunctionServiceManager.#RANDOM_onMember</code>
+See 
<code>org.apache.geode.internal.cache.execute.InternalFunctionExecutionServiceImpl.#RANDOM_onMember</code>
 <p>
 When set, onMember execution will be executed on a random member.
 </dd>
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction70.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction70.java
index 525782a..eb2c80d 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction70.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction70.java
@@ -24,11 +24,11 @@ import java.util.Set;
 import org.apache.geode.cache.client.internal.ExecuteFunctionOp;
 import org.apache.geode.cache.execute.Execution;
 import org.apache.geode.cache.execute.Function;
-import org.apache.geode.cache.execute.internal.FunctionServiceManager;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.cache.execute.AbstractExecution;
+import 
org.apache.geode.internal.cache.execute.InternalFunctionExecutionServiceImpl;
 import org.apache.geode.internal.cache.execute.MemberFunctionExecutor;
 import 
org.apache.geode.internal.cache.execute.ServerToClientFunctionResultSender;
 import org.apache.geode.internal.cache.tier.Command;
@@ -106,7 +106,7 @@ public class ExecuteFunction70 extends ExecuteFunction66 {
         ArrayList<DistributedMember> memberList =
             new ArrayList<DistributedMember>(ds.getGroupMembers(group));
         if (!memberList.isEmpty()) {
-          if (!FunctionServiceManager.RANDOM_onMember
+          if (!InternalFunctionExecutionServiceImpl.RANDOM_onMember
               && memberList.contains(ds.getDistributedMember())) {
             members.add(ds.getDistributedMember());
           } else {

Reply via email to