use of alluxio.worker.block.meta.StorageTierView in project alluxio by Alluxio.
the class EvictorUtils method selectDirWithRequestedSpace.
/**
* Finds a directory in the given location range with capacity upwards of the given bound.
*
* @param bytesToBeAvailable the capacity bound
* @param location the location range
* @param mManagerView the storage manager view
* @return a {@link StorageDirView} in the range of location that already has availableBytes
* larger than bytesToBeAvailable, otherwise null
*/
public static StorageDirView selectDirWithRequestedSpace(long bytesToBeAvailable, BlockStoreLocation location, BlockMetadataManagerView mManagerView) {
if (location.equals(BlockStoreLocation.anyTier())) {
for (StorageTierView tierView : mManagerView.getTierViews()) {
for (StorageDirView dirView : tierView.getDirViews()) {
if (dirView.getAvailableBytes() >= bytesToBeAvailable) {
return dirView;
}
}
}
return null;
}
String tierAlias = location.tierAlias();
StorageTierView tierView = mManagerView.getTierView(tierAlias);
if (location.equals(BlockStoreLocation.anyDirInTier(tierAlias))) {
for (StorageDirView dirView : tierView.getDirViews()) {
if (dirView.getAvailableBytes() >= bytesToBeAvailable) {
return dirView;
}
}
return null;
}
StorageDirView dirView = tierView.getDirView(location.dir());
return (dirView.getAvailableBytes() >= bytesToBeAvailable) ? dirView : null;
}
use of alluxio.worker.block.meta.StorageTierView in project alluxio by Alluxio.
the class GreedyEvictor method freeSpaceWithView.
@Override
public EvictionPlan freeSpaceWithView(long availableBytes, BlockStoreLocation location, BlockMetadataManagerView view) {
Preconditions.checkNotNull(location);
Preconditions.checkNotNull(view);
// 1. Select a StorageDirView that has enough capacity for required bytes.
StorageDirView selectedDirView = null;
if (location.equals(BlockStoreLocation.anyTier())) {
selectedDirView = selectEvictableDirFromAnyTier(view, availableBytes);
} else {
String tierAlias = location.tierAlias();
StorageTierView tierView = view.getTierView(tierAlias);
if (location.equals(BlockStoreLocation.anyDirInTier(tierAlias))) {
selectedDirView = selectEvictableDirFromTier(tierView, availableBytes);
} else {
int dirIndex = location.dir();
StorageDirView dir = tierView.getDirView(dirIndex);
if (canEvictBlocksFromDir(dir, availableBytes)) {
selectedDirView = dir;
}
}
}
if (selectedDirView == null) {
LOG.error("Failed to freeSpace: No StorageDirView has enough capacity of {} bytes", availableBytes);
return null;
}
// 2. Check if the selected StorageDirView already has enough space.
List<BlockTransferInfo> toTransfer = new ArrayList<>();
List<Pair<Long, BlockStoreLocation>> toEvict = new ArrayList<>();
long bytesAvailableInDir = selectedDirView.getAvailableBytes();
if (bytesAvailableInDir >= availableBytes) {
// No need to evict anything, return an eviction plan with empty instructions.
return new EvictionPlan(toTransfer, toEvict);
}
// 3. Collect victim blocks from the selected StorageDirView. They could either be evicted or
// moved.
List<BlockMeta> victimBlocks = new ArrayList<>();
for (BlockMeta block : selectedDirView.getEvictableBlocks()) {
victimBlocks.add(block);
bytesAvailableInDir += block.getBlockSize();
if (bytesAvailableInDir >= availableBytes) {
break;
}
}
// 4. Make best effort to transfer victim blocks to lower tiers rather than evict them.
Map<StorageDirView, Long> pendingBytesInDir = new HashMap<>();
for (BlockMeta block : victimBlocks) {
// TODO(qifan): Should avoid calling getParentDir.
String fromTierAlias = block.getParentDir().getParentTier().getTierAlias();
List<StorageTierView> candidateTiers = view.getTierViewsBelow(fromTierAlias);
StorageDirView dstDir = selectAvailableDir(block, candidateTiers, pendingBytesInDir);
if (dstDir == null) {
// Not possible to transfer
toEvict.add(new Pair<>(block.getBlockId(), block.getBlockLocation()));
} else {
StorageTierView dstTier = dstDir.getParentTierView();
toTransfer.add(new BlockTransferInfo(block.getBlockId(), block.getBlockLocation(), new BlockStoreLocation(dstTier.getTierViewAlias(), dstDir.getDirViewIndex())));
if (pendingBytesInDir.containsKey(dstDir)) {
pendingBytesInDir.put(dstDir, pendingBytesInDir.get(dstDir) + block.getBlockSize());
} else {
pendingBytesInDir.put(dstDir, block.getBlockSize());
}
}
}
return new EvictionPlan(toTransfer, toEvict);
}
use of alluxio.worker.block.meta.StorageTierView in project alluxio by Alluxio.
the class RoundRobinAllocator method allocateBlock.
/**
* Allocates a block from the given block store location. The location can be a specific location,
* or {@link BlockStoreLocation#anyTier()} or {@link BlockStoreLocation#anyDirInTier(String)}.
*
* @param sessionId the id of session to apply for the block allocation
* @param blockSize the size of block in bytes
* @param location the location in block store
* @return a {@link StorageDirView} in which to create the temp block meta if success, null
* otherwise
* @throws IllegalArgumentException if block location is invalid
*/
private StorageDirView allocateBlock(long sessionId, long blockSize, BlockStoreLocation location) {
Preconditions.checkNotNull(location);
if (location.equals(BlockStoreLocation.anyTier())) {
// always starting from the first tier
int tierIndex = 0;
for (int i = 0; i < mManagerView.getTierViews().size(); i++) {
StorageTierView tierView = mManagerView.getTierViews().get(tierIndex);
int dirViewIndex = getNextAvailDirInTier(tierView, blockSize);
if (dirViewIndex >= 0) {
mTierAliasToLastDirMap.put(tierView.getTierViewAlias(), dirViewIndex);
return tierView.getDirView(dirViewIndex);
} else {
// we didn't find one in this tier, go to next tier
tierIndex++;
}
}
} else if (location.equals(BlockStoreLocation.anyDirInTier(location.tierAlias()))) {
StorageTierView tierView = mManagerView.getTierView(location.tierAlias());
int dirViewIndex = getNextAvailDirInTier(tierView, blockSize);
if (dirViewIndex >= 0) {
mTierAliasToLastDirMap.put(tierView.getTierViewAlias(), dirViewIndex);
return tierView.getDirView(dirViewIndex);
}
} else {
StorageTierView tierView = mManagerView.getTierView(location.tierAlias());
StorageDirView dirView = tierView.getDirView(location.dir());
if (dirView.getAvailableBytes() >= blockSize) {
return dirView;
}
}
return null;
}
use of alluxio.worker.block.meta.StorageTierView in project alluxio by Alluxio.
the class BlockMetadataManagerViewTest method sameTierViewsBelow.
/**
* Tests that {@link BlockMetadataManagerView#getTierViewsBelow(String)} returns the same
* TierViews as constructing by {@link BlockMetadataManager#getTiersBelow(String)}.
*/
@Test
public void sameTierViewsBelow() {
String tierAlias = mMetaManager.getTiers().get(TEST_TIER_ORDINAL).getTierAlias();
List<StorageTierView> tierViews1 = mMetaManagerView.getTierViewsBelow(tierAlias);
// Do some operations on metadata
StorageDir dir = mMetaManager.getTiers().get(TEST_TIER_ORDINAL + 1).getDir(TEST_DIR);
BlockMeta blockMeta = new BlockMeta(TEST_BLOCK_ID, TEST_BLOCK_SIZE, dir);
try {
dir.addBlockMeta(blockMeta);
} catch (Exception e) {
e.printStackTrace();
}
List<StorageTier> tiers2 = mMetaManager.getTiersBelow(tierAlias);
Assert.assertEquals(tierViews1.size(), tiers2.size());
for (int i = 0; i < tierViews1.size(); i++) {
assertSameTierView(tierViews1.get(i), new StorageTierView(tiers2.get(i), mMetaManagerView));
}
}
use of alluxio.worker.block.meta.StorageTierView in project alluxio by Alluxio.
the class BlockMetadataManagerViewTest method getTierView.
/**
* Tests the {@link BlockMetadataManagerView#getTierView(String)} method.
*/
@Test
public void getTierView() {
for (StorageTier tier : mMetaManager.getTiers()) {
String tierAlias = tier.getTierAlias();
StorageTierView tierView = mMetaManagerView.getTierView(tierAlias);
Assert.assertEquals(tier.getTierAlias(), tierView.getTierViewAlias());
Assert.assertEquals(tier.getTierOrdinal(), tierView.getTierViewOrdinal());
}
}
Aggregations