/*
* 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.junit.Assert.*;
import java.io.File;
import java.util.Arrays;
import java.util.Properties;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.AttributesFactory;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.cache.Scope;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.distributed.internal.ReplyException;
import org.apache.geode.test.dunit.Host;
import org.apache.geode.test.dunit.LogWriterUtils;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
import org.apache.geode.test.junit.categories.DistributedTest;
/**
* Confirms the bug 37241 is fixed. CleanupFailedInitialization on should also clean disk files
* created
*/
@Category(DistributedTest.class)
public class Bug37241DUnitTest extends JUnit4DistributedTestCase {
private static Cache cache = null;
static VM server1 = null;
static VM server2 = null;
private static final String REGION_NAME = "Bug37241DUnitTest_region";
static final String expectedReplyException = ReplyException.class.getName();
static final String expectedException = IllegalStateException.class.getName();
@Override
public final void postSetUp() throws Exception {
final Host host = Host.getHost(0);
server1 = host.getVM(0);
server2 = host.getVM(1);
}
/*
* 1.Create persistent region serevr1 with scope global. 2.Try to create persitent region with
* same name on server2 with scope d-ack. 3.Region creation should fail . Check for all files
* created in the directory for server 2 gets deleted.
*/
@Test
public void testBug37241ForNewDiskRegion() {
server1.invoke(() -> Bug37241DUnitTest.createRegionOnServer1());
try {
server2.invoke(() -> Bug37241DUnitTest.createRegionOnServer2(Scope.DISTRIBUTED_ACK));
} catch (Exception e) {
server2.invoke(() -> Bug37241DUnitTest.ignoreExceptionInLogs());
server2.invoke(() -> Bug37241DUnitTest.checkForCleanup());
}
}
@Test
public void testBug37241ForRecreatedDiskRegion() {
server1.invoke(() -> Bug37241DUnitTest.createRegionOnServer1());
server2.invoke(() -> Bug37241DUnitTest.createRegionOnServer2(Scope.GLOBAL));
server2.invoke(() -> Bug37241DUnitTest.closeRegion());
try {
server2.invoke(() -> Bug37241DUnitTest.createRegionOnServer2(Scope.DISTRIBUTED_ACK));
} catch (Exception e) {
server2.invoke(() -> Bug37241DUnitTest.ignoreExceptionInLogs());
server2.invoke(() -> Bug37241DUnitTest.checkForCleanupAfterRecreation());
}
}
private void createCache(Properties props) throws Exception {
DistributedSystem ds = getSystem(props);
ds.disconnect();
ds = getSystem(props);
assertNotNull(ds);
cache = CacheFactory.create(ds);
assertNotNull(cache);
}
public static void createRegionOnServer1() throws Exception {
new Bug37241DUnitTest().createCache(new Properties());
AttributesFactory factory = new AttributesFactory();
factory.setScope(Scope.GLOBAL);
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
File[] dirs = new File[2];
File file1 = new File("server1_disk1");
File file2 = new File("server1_disk2");
file1.mkdir();
file2.mkdir();
dirs[0] = file1;
dirs[1] = file2;
factory.setDiskSynchronous(false);
factory.setDiskStoreName(
cache.createDiskStoreFactory().setDiskDirs(dirs).create("Bug37241DUnitTest").getName());
RegionAttributes attrs = factory.create();
cache.createRegion(REGION_NAME, attrs);
}
public static void createRegionOnServer2(Scope scope) throws Exception {
new Bug37241DUnitTest().createCache(new Properties());
AttributesFactory factory = new AttributesFactory();
factory.setScope(scope);
factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
File[] dirs = new File[2];
File file1 = new File("server2_disk1");
File file2 = new File("server2_disk2");
file1.mkdir();
file2.mkdir();
dirs[0] = file1;
dirs[1] = file2;
factory.setDiskSynchronous(false);
factory.setDiskStoreName(
cache.createDiskStoreFactory().setDiskDirs(dirs).create("Bug37241DUnitTest").getName());
// added for not to log exepected IllegalStateExcepion.
LogWriterUtils.getLogWriter()
.info("<ExpectedException action=add>" + expectedReplyException + "</ExpectedException>");
LogWriterUtils.getLogWriter()
.info("<ExpectedException action=add>" + expectedException + "</ExpectedException>");
cache.getLogger()
.info("<ExpectedException action=add>" + expectedReplyException + "</ExpectedException>");
cache.getLogger()
.info("<ExpectedException action=add>" + expectedException + "</ExpectedException>");
RegionAttributes attrs = factory.create();
cache.createRegion(REGION_NAME, attrs);
}
public static void checkForCleanup() {
try {
Thread.sleep(200);
} catch (InterruptedException ignore) {
}
cache.getLogger()
.info("checkForCleanup=" + Arrays.asList(new File("server2_disk2").listFiles()));
assertEquals(0, new File("server2_disk2").listFiles().length);
}
public static void checkForCleanupAfterRecreation() {
checkForCleanup();
}
public static void ignoreExceptionInLogs() {
cache.getLogger()
.info("<ExpectedException action=remove>" + expectedException + "</ExpectedException>");
cache.getLogger().info(
"<ExpectedException action=remove>" + expectedReplyException + "</ExpectedException>");
LogWriterUtils.getLogWriter()
.info("<ExpectedException action=remove>" + expectedException + "</ExpectedException>");
LogWriterUtils.getLogWriter().info(
"<ExpectedException action=remove>" + expectedReplyException + "</ExpectedException>");
}
public static void closeRegion() {
Cache cache = CacheFactory.getAnyInstance();
Region region = cache.getRegion("/" + REGION_NAME);
region.close();
}
public static void closeCache() {
if (cache != null && !cache.isClosed()) {
cache.close();
cache.getDistributedSystem().disconnect();
}
}
@Override
public final void preTearDown() throws Exception {
server1.invoke(() -> Bug37241DUnitTest.closeCache());
server2.invoke(() -> Bug37241DUnitTest.closeCache());
}
}