blob: 793e43938894978e31dc08300144e9ceb5d5c985 [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.
*/
/*
* Created on Feb 15, 2006
*
* TODO To change the template for this generated file go to Window - Preferences - Java - Code
* Style - Code Templates
*/
package org.apache.geode.internal.cache;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import org.apache.geode.StatisticsFactory;
import org.apache.geode.test.dunit.ThreadUtils;
/**
* Testing methods for SimpleDiskRegion.java api's
*
* @since GemFire 5.1
*/
public class SimpleDiskRegionJUnitTest extends DiskRegionTestingBase {
private Set keyIds = Collections.synchronizedSet(new HashSet());
private DiskRegionProperties diskProps = new DiskRegionProperties();
@Override
protected final void postSetUp() throws Exception {
diskProps.setDiskDirs(dirs);
}
/*
* Test method for 'org.apache.geode.internal.cache.SimpleDiskRegion.basicClose()'
*/
@Test
public void testBasicClose() {
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncOverFlowAndPersistRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowandPersist due to " + e);
}
region.close();
closeDiskStores();
checkIfContainsFileWithExt("lk");
}
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncOverFlowOnlyRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowOnly due to " + e);
}
region.close();
closeDiskStores();
checkIfContainsFileWithExt("lk");
}
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowandPersist due to " + e);
}
region.close();
closeDiskStores();
checkIfContainsFileWithExt("lk");
}
// Asif: Recreate the region so that it will be destroyed
try {
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowandPersist due to " + e);
}
}
void checkIfContainsFileWithSubstring(String substr) {
for (int i = 0; i < dirs.length; i++) {
File[] files = dirs[i].listFiles();
for (int j = 0; j < files.length; j++) {
if (files[j].getAbsolutePath().contains(substr)) {
fail("file \"" + files[j].getAbsolutePath() + "\" still exists");
}
}
}
}
void expectContainsFileWithSubstring(String substr) {
for (int i = 0; i < dirs.length; i++) {
File[] files = dirs[i].listFiles();
for (int j = 0; j < files.length; j++) {
if (files[j].getAbsolutePath().contains(substr)) {
return; // found one
}
}
}
fail("did not find a file with the substring " + substr);
}
void checkIfContainsFileWithExt(String fileExtension) {
for (int i = 0; i < dirs.length; i++) {
File[] files = dirs[i].listFiles();
for (int j = 0; j < files.length; j++) {
if (files[j].getAbsolutePath().endsWith(fileExtension)) {
fail("file \"" + files[j].getAbsolutePath() + "\" still exists");
}
}
}
}
/*
* Test method for 'org.apache.geode.internal.cache.SimpleDiskRegion.basicDestroy()'
*/
@Test
public void testBasicDestroy() {
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncOverFlowAndPersistRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowandPersist due to " + e);
}
region.destroyRegion();
closeDiskStores();
checkIfContainsFileWithExt("lk");
// note that this only passes because the test never forced us to create the following files
checkIfContainsFileWithExt("crf");
checkIfContainsFileWithExt("drf");
checkIfContainsFileWithSubstring("OVERFLOW");
}
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncOverFlowOnlyRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowOnly due to " + e);
}
region.destroyRegion();
closeDiskStores();
checkIfContainsFileWithExt("lk");
// note that this only passes because the test never forced us to create the following files
checkIfContainsFileWithExt("crf");
checkIfContainsFileWithExt("drf");
checkIfContainsFileWithSubstring("OVERFLOW");
}
{
deleteFiles();
try {
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
} catch (Exception e) {
logWriter.error("Exception occurred", e);
fail(" Exception in createOverflowandPersist due to " + e);
}
region.destroyRegion();
closeDiskStores();
checkIfContainsFileWithExt("lk");
// note that this only passes because the test never forced us to create the following files
checkIfContainsFileWithExt("crf");
checkIfContainsFileWithExt("drf");
checkIfContainsFileWithSubstring("OVERFLOW");
}
}
/*
* Test method for 'org.apache.geode.internal.cache.SimpleDiskRegion.getChild()'
*/
@Test
public void testGetChild() {
deleteFiles();
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
DiskRegion dr = ((LocalRegion) region).getDiskRegion();
Oplog oplog = dr.testHook_getChild();
long id = oplog.getOplogId();
StatisticsFactory factory = region.getCache().getDistributedSystem();
Oplog newOplog =
new Oplog(id, dr.getOplogSet(), new DirectoryHolder(factory, dirs[0], 1000000, 0));
dr.getDiskStore().getPersistentOplogs().setChild(newOplog);
assertEquals(newOplog, dr.testHook_getChild());
dr.setChild(oplog);
assertEquals(oplog, dr.testHook_getChild());
newOplog.close();
newOplog = null;
closeDown();
}
/*
* Test method for 'org.apache.geode.internal.cache.SimpleDiskRegion.getNextDir()'
*/
@Test
public void testGetNextDir() {
deleteFiles();
File file1 = new File("SimpleDiskRegionJUnitTestDir1");
file1.mkdir();
file1.deleteOnExit();
File file2 = new File("SimpleDiskRegionJUnitTestDir2");
file2.mkdir();
file2.deleteOnExit();
File file3 = new File("SimpleDiskRegionJUnitTestDir3");
file3.mkdir();
file3.deleteOnExit();
File file4 = new File("SimpleDiskRegionJUnitTestDir4");
file4.mkdir();
file4.deleteOnExit();
File[] oldDirs = new File[4];
oldDirs = dirs;
dirs[0] = file1;
dirs[1] = file2;
dirs[2] = file3;
dirs[3] = file4;
closeDiskStores();
deleteFiles();
DiskRegionProperties diskProps = new DiskRegionProperties();
diskProps.setDiskDirs(dirs);
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
DiskRegion dr = ((LocalRegion) region).getDiskRegion();
assertEquals(file2, dr.getNextDir().getDir());
assertEquals(file3, dr.getNextDir().getDir());
assertEquals(file4, dr.getNextDir().getDir());
assertEquals(file1, dr.getNextDir().getDir());
closeDown();
deleteFiles();
dirs = oldDirs;
}
/*
* Test method for 'org.apache.geode.internal.cache.SimpleDiskRegion.newDiskId()'
*/
@Test
public void testNewDiskId() {
deleteFiles();
region = DiskRegionHelperFactory.getAsyncPersistOnlyRegion(cache, diskProps);
TestNewDiskId newDiskId = new TestNewDiskId();
Thread thread1 = new Thread(newDiskId);
Thread thread2 = new Thread(newDiskId);
Thread thread3 = new Thread(newDiskId);
Thread thread4 = new Thread(newDiskId);
Thread thread5 = new Thread(newDiskId);
thread1.setDaemon(true);
thread2.setDaemon(true);
thread3.setDaemon(true);
thread4.setDaemon(true);
thread5.setDaemon(true);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
ThreadUtils.join(thread1, 30 * 1000);
ThreadUtils.join(thread2, 30 * 1000);
ThreadUtils.join(thread3, 30 * 1000);
ThreadUtils.join(thread4, 30 * 1000);
ThreadUtils.join(thread5, 30 * 1000);
if (keyIds.size() != 50000) {
fail("Size not equal to 5000 as expected but is " + keyIds.size());
}
closeDown();
}
class TestNewDiskId implements Runnable {
@Override
public void run() {
long keyId = 0;
for (int i = 0; i < 10000; i++) {
keyId = ((LocalRegion) region).getDiskRegion().newOplogEntryId();
keyIds.add(new Long(keyId));
}
}
}
}