/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.worker.block.allocator;
import alluxio.worker.block.BlockMetadataManager;
import alluxio.worker.block.BlockMetadataManagerView;
import alluxio.worker.block.BlockStoreLocation;
import alluxio.worker.block.TieredBlockStoreTestUtils;
import alluxio.worker.block.meta.BlockMeta;
import alluxio.worker.block.meta.StorageDir;
import alluxio.worker.block.meta.StorageDirView;
import alluxio.worker.block.meta.StorageTier;
import alluxio.worker.block.meta.TempBlockMeta;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
import java.io.IOException;
import java.util.HashSet;
/**
* Base class for allocator tests.
*/
public class AllocatorTestBase {
protected static final long SESSION_ID = 1;
protected int mTestBlockId = 0;
// Default tier/dir configurations we use for testing
public static final long DEFAULT_RAM_SIZE = 1000;
public static final long DEFAULT_SSD_SIZE = 2000;
public static final long DEFAULT_HDD_SIZE = 3000;
public static final int[] TIER_LEVEL = {0, 1, 2};
public static final String[] TIER_ALIAS = {"MEM", "SSD", "HDD"};
public static final String[][] TIER_PATH = {{"/ramdisk"}, {"/ssd1", "/ssd2"},
{"/disk1", "/disk2", "/disk3"}};
public static final long[][] TIER_CAPACITY_BYTES = {{DEFAULT_RAM_SIZE},
{DEFAULT_SSD_SIZE, DEFAULT_SSD_SIZE},
{DEFAULT_HDD_SIZE, DEFAULT_HDD_SIZE, DEFAULT_HDD_SIZE}};
public static final int DEFAULT_RAM_NUM = TIER_PATH[0].length;
public static final int DEFAULT_SSD_NUM = TIER_PATH[1].length;
public static final int DEFAULT_HDD_NUM = TIER_PATH[2].length;
protected BlockMetadataManager mManager = null;
protected Allocator mAllocator = null;
protected BlockStoreLocation mAnyTierLoc = BlockStoreLocation.anyTier();
protected BlockStoreLocation mAnyDirInTierLoc1 = BlockStoreLocation.anyDirInTier("MEM");
protected BlockStoreLocation mAnyDirInTierLoc2 = BlockStoreLocation.anyDirInTier("SSD");
protected BlockStoreLocation mAnyDirInTierLoc3 = BlockStoreLocation.anyDirInTier("HDD");
/** Rule to create a new temporary folder during each test. */
@Rule
public TemporaryFolder mTestFolder = new TemporaryFolder();
/**
* Sets up all dependencies before a test runs.
*/
@Before
public void before() throws Exception {
resetManagerView();
}
/**
* Resets the manager view configured by the parameters in this base class.
*/
protected void resetManagerView() throws Exception {
String alluxioHome = mTestFolder.newFolder().getAbsolutePath();
TieredBlockStoreTestUtils.setupConfWithMultiTier(alluxioHome, TIER_LEVEL, TIER_ALIAS,
TIER_PATH, TIER_CAPACITY_BYTES, null);
mManager = BlockMetadataManager.createBlockMetadataManager();
}
/**
* Given an allocator with the location and blockSize, we assert whether the block can be
* allocated.
*
* @param allocator the allocation manager of Alluxio managed data
* @param location the location in block store
* @param blockSize the size of block in bytes
* @param avail the block should be successfully allocated or not
*/
protected void assertTempBlockMeta(Allocator allocator, BlockStoreLocation location,
long blockSize, boolean avail) throws IOException {
mTestBlockId++;
StorageDirView dirView =
allocator.allocateBlockWithView(SESSION_ID, blockSize, location, getManagerView());
TempBlockMeta tempBlockMeta =
dirView == null ? null : dirView.createTempBlockMeta(SESSION_ID, mTestBlockId, blockSize);
if (!avail) {
Assert.assertTrue(tempBlockMeta == null);
} else {
Assert.assertTrue(tempBlockMeta != null);
}
}
/**
* Given an allocator with the location, blockSize, tierAlias and dirIndex,
* we assert whether the block can be allocated.
*
* @param allocator the allocation manager of Alluxio managed data
* @param location the location in block store
* @param blockSize the size of block in bytes
* @param avail the block should be successfully allocated or not
* @param tierAlias the block should be allocated at this tier
* @param dirIndex the block should be allocated at this dir
*/
protected void assertTempBlockMeta(Allocator allocator, BlockStoreLocation location,
int blockSize, boolean avail, String tierAlias, int dirIndex) throws Exception {
mTestBlockId++;
StorageDirView dirView =
allocator.allocateBlockWithView(SESSION_ID, blockSize, location, getManagerView());
TempBlockMeta tempBlockMeta =
dirView == null ? null : dirView.createTempBlockMeta(SESSION_ID, mTestBlockId, blockSize);
if (!avail) {
Assert.assertTrue(tempBlockMeta == null);
} else {
Assert.assertTrue(tempBlockMeta != null);
StorageDir pDir = tempBlockMeta.getParentDir();
StorageTier pTier = pDir.getParentTier();
Assert.assertTrue(pDir.getDirIndex() == dirIndex);
Assert.assertEquals(tierAlias, pTier.getTierAlias());
//update the dir meta info
pDir.addBlockMeta(new BlockMeta(mTestBlockId, blockSize, pDir));
}
}
protected BlockMetadataManagerView getManagerView() {
return new BlockMetadataManagerView(mManager, new HashSet<Long>(), new HashSet<Long>());
}
}