/*
* 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.cache30;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.AttributesFactory;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.cache.Scope;
import org.apache.geode.internal.cache.versions.VersionTag;
import org.apache.geode.test.dunit.SerializableCallable;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.junit.categories.DistributedTest;
@Category(DistributedTest.class)
public class DistributedAckPersistentRegionCCEDUnitTest extends DistributedAckRegionCCEDUnitTest {
@Override
protected RegionAttributes getRegionAttributes() {
AttributesFactory factory = new AttributesFactory();
factory.setScope(Scope.DISTRIBUTED_ACK);
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
factory.setConcurrencyChecksEnabled(true);
return factory.create();
}
@Ignore("Skip test for this configuration")
@Override
@Test
public void testClearOnNonReplicateWithConcurrentEvents() {}
@Ignore("Skip test for this configuration")
@Override
@Test
public void testConcurrentEventsOnNonReplicatedRegion() {}
@Ignore("Skip test for this configuration")
@Override
@Test
public void testGetAllWithVersions() {}
private VersionTag getVersionTag(VM vm, final String key) {
SerializableCallable getVersionTag = new SerializableCallable("verify recovered entry") {
@Override
public Object call() {
VersionTag tag = CCRegion.getVersionTag(key);
return tag;
}
};
return (VersionTag) vm.invoke(getVersionTag);
}
// TODO: resurrect dead test or delete the following dead code
// protected void do_version_recovery_if_necessary(final VM vm0, final VM vm1, final VM vm2, final
// Object[] params) {
// final String name = (String)params[0];
// final String hostName = (String)params[1];
// final String key = (String)params[2];
// final int ds1Port = (Integer)params[3];
// final int hub0Port = (Integer)params[4];
// final int hub2Port = (Integer)params[5];
//
// VersionTag tag0 = getVersionTag(vm0, key);
// VersionTag tag1 = getVersionTag(vm1, key);
// VersionTag tag2 = getVersionTag(vm2, key);
//
// // shutdown all the systems and restart to recover from disk
// disconnect(vm0);
// disconnect(vm1);
// disconnect(vm2);
//
// createRegionWithGatewayHub(vm1, name, hostName, ds1Port, hub0Port, hub2Port, true);
// createRegionWithGatewayHub(vm0, name, hostName, ds1Port, hub0Port, hub2Port, true);
// createRegionWithGatewayHubAtOtherSide(vm2, name, hostName, hub0Port, hub2Port, true);
//
// startHub(vm2);
// startHub(vm0);
//
// VersionTag tag00 = getVersionTag(vm0, key);
// VersionTag tag11 = getVersionTag(vm1, key);
// VersionTag tag22 = getVersionTag(vm2, key);
// assertTrue(tag00.equals(tag0));
// assertTrue(tag11.equals(tag1));
// assertTrue(tag22.equals(tag2));
// }
//
// /**
// * vm0 and vm1 are peers, each holds a DR.
// * vm0 do 3 puts to change the version to be 3, wait for distributions to vm1
// * Shutdown and restart both of them.
// * Make sure vm0 and vm1 are both at version 3.
// * Do local clear at vm0. Then do a put. It will use version 1.
// * This new operation should be rejected as conflicts at vm1.
// * That means, recovered version 3 can reject the new operation at version 1.
// */
// public void testNewOperationConflictWithRecoveredVersion() throws Throwable {
// Host host = Host.getHost(0);
// VM vm0 = host.getVM(0);
// VM vm1 = host.getVM(1);
// final String key = "Object2";
//
// SerializableRunnable disconnect = new SerializableRunnable("disconnect") {
// public void run() {
// GatewayBatchOp.VERSION_WITH_OLD_WAN = false;
// distributedSystemID = -1;
// CCRegion.getCache().getDistributedSystem().disconnect();
// }
// };
//
// final String name = this.getUniqueName() + "-CC";
// SerializableRunnable createRegion = new SerializableRunnable("Create Region") {
// public void run() {
// try {
// RegionFactory f = getCache().createRegionFactory(getRegionAttributes());
// CCRegion = (LocalRegion)f.create(name);
// } catch (CacheException ex) {
// fail("While creating region", ex);
// }
// }
// };
// vm0.invoke(createRegion);
// vm1.invoke(createRegion);
//
// vm0.invoke(new SerializableRunnable("put several times to bump version to 3") {
// public void run() {
// CCRegion.put(key, "dummy"); // v1
// CCRegion.put(key, "dummy"); // v2
// CCRegion.put(key, "dummy"); // v3
// }
// });
//
// VersionTag tag0 = getVersionTag(vm0, key);
// VersionTag tag1 = getVersionTag(vm1, key);
// assertIndexDetailsEquals(3, tag0.getRegionVersion());
// assertIndexDetailsEquals(3, tag0.getEntryVersion());
// assertIndexDetailsEquals(3, tag1.getRegionVersion());
// assertIndexDetailsEquals(3, tag1.getEntryVersion());
//
// // shutdown and recover
// vm0.invoke(disconnect);
// vm1.invoke(disconnect);
// vm1.invoke(createRegion);
// vm0.invoke(createRegion);
//
// tag0 = getVersionTag(vm0, key);
// tag1 = getVersionTag(vm1, key);
// assertIndexDetailsEquals(3, tag0.getRegionVersion());
// assertIndexDetailsEquals(3, tag0.getEntryVersion());
// assertIndexDetailsEquals(3, tag1.getRegionVersion());
// assertIndexDetailsEquals(3, tag1.getEntryVersion());
//
// vm0.invoke(new SerializableRunnable("put with version 1, value vm1") {
// public void run() {
// // clear the region using a test hook so that a new version will be
// // generated, starting at 1. This should be rejected by vm1 and not
// // queued to the WAN by vm0
// DistributedRegion.LOCALCLEAR_TESTHOOK = true;
// try {
// CCRegion.localClear();
// } finally {
// DistributedRegion.LOCALCLEAR_TESTHOOK = false;
// }
// CCRegion.put(key, "vm0");
// Assert.assertIndexDetailsEquals("vm0", CCRegion.get(key));
// }
// });
// vm1.invoke(new SerializableRunnable("verify that value has not been updated") {
// public void run() {
// Assert.assertIndexDetailsEquals("dummy", CCRegion.get(key));
// }
// });
//
// tag0 = getVersionTag(vm0, key);
// tag1 = getVersionTag(vm1, key);
// assertIndexDetailsEquals(4, tag0.getRegionVersion());
// assertIndexDetailsEquals(1, tag0.getEntryVersion());
// assertIndexDetailsEquals(3, tag1.getRegionVersion());
// assertIndexDetailsEquals(3, tag1.getEntryVersion());
// }
}