blob: e596f9a0facd79a899599cd2f1e3b00b92dc7d11 [file] [log] [blame]
/*
* 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;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import org.junit.Test;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.ClientCache;
import org.apache.geode.cache.client.ClientCacheFactory;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.geode.cache.client.Pool;
import org.apache.geode.cache.client.PoolManager;
import org.apache.geode.cache.client.internal.LocatorTestBase;
import org.apache.geode.cache.client.internal.PoolImpl;
import org.apache.geode.cache.execute.Execution;
import org.apache.geode.cache.execute.Function;
import org.apache.geode.cache.execute.FunctionService;
import org.apache.geode.internal.cache.functions.FireAndForgetFunctionOnAllServers;
import org.apache.geode.test.dunit.Assert;
import org.apache.geode.test.dunit.Host;
import org.apache.geode.test.dunit.NetworkUtils;
import org.apache.geode.test.dunit.VM;
public class FireAndForgetFunctionOnAllServersDUnitTest extends LocatorTestBase {
public FireAndForgetFunctionOnAllServersDUnitTest() {
super();
}
@Override
public final void postSetUp() throws Exception {
disconnectAllFromDS();
}
@Override
protected final void postTearDownLocatorTestBase() throws Exception {
disconnectAllFromDS();
}
@Test
public void testFireAndForgetFunctionOnAllServers() {
// Test case for Executing a fire-and-forget function on all servers as opposed to only
// executing on the ones the
// client is currently connected to.
Host host = Host.getHost(0);
VM locator = host.getVM(0);
VM server1 = host.getVM(1);
VM server2 = host.getVM(2);
VM client = host.getVM(3);
final String locatorHost = NetworkUtils.getServerHostName();
// Step 1. Start a locator and one cache server.
final int locatorPort = locator.invoke("Start Locator", () -> startLocator(locatorHost, ""));
String locString = getLocatorString(locatorHost, locatorPort);
// Step 2. Start a server and create a replicated region "R1".
server1.invoke("Start BridgeServer",
() -> startBridgeServer(new String[] {"R1"}, locString, new String[] {"R1"}));
// Step 3. Create a client cache with pool mentioning locator.
client.invoke("create client cache and pool mentioning locator", () -> {
ClientCacheFactory ccf = new ClientCacheFactory();
ccf.addPoolLocator(locatorHost, locatorPort);
ClientCache cache = ccf.create();
Pool pool1 = PoolManager.createFactory().addLocator(locatorHost, locatorPort)
.setServerGroup("R1").create("R1");
Region region1 = cache.createClientRegionFactory(ClientRegionShortcut.PROXY).setPoolName("R1")
.create("R1");
// Step 4. Execute the function to put DistributedMemberID into above created replicated
// region.
Function function = new FireAndForgetFunctionOnAllServers();
FunctionService.registerFunction(function);
PoolImpl pool = (PoolImpl) pool1;
await()
.untilAsserted(() -> Assert.assertEquals(1, pool.getCurrentServers().size()));
String regionName = "R1";
Execution dataSet = FunctionService.onServers(pool1);
dataSet.setArguments(regionName).execute(function);
// Using Awatility, if the condition is not met during the timeout, a
// ConditionTimeoutException will be thrown. This makes analyzing the failure much simpler
// Step 5. Assert for the region keyset size with 1.
await()
.untilAsserted(() -> Assert.assertEquals(1, region1.keySetOnServer().size()));
region1.clear();
// Step 6. Start another server mentioning locator and create a replicated region "R1".
server2.invoke("Start BridgeServer",
() -> startBridgeServer(new String[] {"R1"}, locString, new String[] {"R1"}));
// Step 7. Execute the same function to put DistributedMemberID into above created replicated
// region.
await()
.untilAsserted(() -> Assert.assertEquals(1, pool.getCurrentServers().size()));
dataSet = FunctionService.onServers(pool1);
dataSet.setArguments(regionName).execute(function);
await()
.untilAsserted(() -> Assert.assertEquals(2, pool.getCurrentServers().size()));
// Using Awatility, if the condition is not met during the timeout, a
// ConditionTimeoutException will be thrown. This makes analyzing the failure much simpler
// Step 8. Assert for the region keyset size with 2, since above function was executed on 2
// servers.
await().untilAsserted(() -> {
Assert.assertEquals(2, region1.keySetOnServer().size());
});
region1.clear();
// Step 8.Stop one of the servers.
server1.invoke("Stop BridgeServer", () -> stopBridgeMemberVM(server1));
// Step 9. Execute the same function to put DistributedMemberID into above created replicated
// region.
dataSet = FunctionService.onServers(pool1);
dataSet.setArguments(regionName).execute(function);
await()
.untilAsserted(() -> Assert.assertEquals(1, pool.getCurrentServers().size()));
// Using Awatility, if the condition is not met during the timeout, a
// ConditionTimeoutException will be thrown. This makes analyzing the failure much simpler
// Step 10. Assert for the region keyset size with 1, since only one server was running.
await().untilAsserted(() -> {
Assert.assertEquals(1, region1.keySetOnServer().size());
});
region1.clear();
return null;
});
}
}