/* * 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; import alluxio.collections.Pair; import alluxio.worker.block.meta.StorageDir; import alluxio.worker.block.meta.StorageTier; import com.google.common.collect.ImmutableMap; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Unit tests for {@link BlockStoreMeta}. */ public final class BlockStoreMetaTest { private static final long TEST_SESSION_ID = 33L; /** block size in Bytes for test. */ private static final long TEST_BLOCK_SIZE = 200L; /** num of total committed blocks. */ private static final long COMMITTED_BLOCKS_NUM = 10L; private BlockMetadataManager mMetadataManager; private BlockStoreMeta mBlockStoreMeta; private BlockStoreMeta mBlockStoreMetaFull; /** 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 { String alluxioHome = mTestFolder.newFolder().getAbsolutePath(); mMetadataManager = TieredBlockStoreTestUtils.defaultMetadataManager(alluxioHome); // Add and commit COMMITTED_BLOCKS_NUM temp blocks repeatedly StorageDir dir = mMetadataManager.getTier("MEM").getDir(0); for (long blockId = 0L; blockId < COMMITTED_BLOCKS_NUM; blockId++) { TieredBlockStoreTestUtils.cache(TEST_SESSION_ID, blockId, TEST_BLOCK_SIZE, dir, mMetadataManager, null); } mBlockStoreMeta = BlockStoreMeta.getBlockStoreMeta(mMetadataManager); mBlockStoreMetaFull = BlockStoreMeta.getBlockStoreMetaFull(mMetadataManager); } /** * Tests the {@link BlockStoreMeta#getBlockList()} method. */ @Test public void getBlockList() { Map<String, List<Long>> tierAliasToBlockIds = new HashMap<>(); for (StorageTier tier : mMetadataManager.getTiers()) { List<Long> blockIdsOnTier = new ArrayList<>(); for (StorageDir dir : tier.getStorageDirs()) { blockIdsOnTier.addAll(dir.getBlockIds()); } tierAliasToBlockIds.put(tier.getTierAlias(), blockIdsOnTier); } Map<String, List<Long>> actual = mBlockStoreMetaFull.getBlockList(); Assert.assertEquals(TieredBlockStoreTestUtils.TIER_ALIAS.length, actual.keySet().size()); Assert.assertEquals(tierAliasToBlockIds, actual); } /** * Tests the {@link BlockStoreMeta#getCapacityBytes()} method. */ @Test public void getCapacityBytes() { Assert.assertEquals(TieredBlockStoreTestUtils.getDefaultTotalCapacityBytes(), mBlockStoreMeta.getCapacityBytes()); } /** * Tests the {@link BlockStoreMeta#getCapacityBytes()} method. */ @Test public void getCapacityBytesOnDirs() { Map<Pair<String, String>, Long> dirsToCapacityBytes = new HashMap<>(); for (StorageTier tier : mMetadataManager.getTiers()) { for (StorageDir dir : tier.getStorageDirs()) { dirsToCapacityBytes.put(new Pair<>(tier.getTierAlias(), dir.getDirPath()), dir.getCapacityBytes()); } } Assert.assertEquals(dirsToCapacityBytes, mBlockStoreMeta.getCapacityBytesOnDirs()); Assert.assertEquals(TieredBlockStoreTestUtils.getDefaultDirNum(), mBlockStoreMeta .getCapacityBytesOnDirs().values().size()); } /** * Tests the {@link BlockStoreMeta#getCapacityBytesOnTiers()} method. */ @Test public void getCapacityBytesOnTiers() { Map<String, Long> expectedCapacityBytesOnTiers = ImmutableMap.of("MEM", 5000L, "SSD", 60000L); Assert.assertEquals(expectedCapacityBytesOnTiers, mBlockStoreMeta.getCapacityBytesOnTiers()); } /** * Tests the {@link BlockStoreMeta#getNumberOfBlocks()} method. */ @Test public void getNumberOfBlocks() { Assert.assertEquals(COMMITTED_BLOCKS_NUM, mBlockStoreMetaFull.getNumberOfBlocks()); } /** * Tests the {@link BlockStoreMeta#getUsedBytes()} method. */ @Test public void getUsedBytes() { long usedBytes = TEST_BLOCK_SIZE * COMMITTED_BLOCKS_NUM; Assert.assertEquals(usedBytes, mBlockStoreMeta.getUsedBytes()); } /** * Tests the {@link BlockStoreMeta#getUsedBytesOnDirs()} method. */ @Test public void getUsedBytesOnDirs() { Map<Pair<String, String>, Long> dirsToUsedBytes = new HashMap<>(); for (StorageTier tier : mMetadataManager.getTiers()) { for (StorageDir dir : tier.getStorageDirs()) { dirsToUsedBytes.put(new Pair<>(tier.getTierAlias(), dir.getDirPath()), dir.getCapacityBytes() - dir.getAvailableBytes()); } } Assert.assertEquals(dirsToUsedBytes, mBlockStoreMeta.getUsedBytesOnDirs()); } /** * Tests the {@link BlockStoreMeta#getUsedBytesOnTiers()} method. */ @Test public void getUsedBytesOnTiers() { long usedBytes = TEST_BLOCK_SIZE * COMMITTED_BLOCKS_NUM; Map<String, Long> usedBytesOnTiers = ImmutableMap.of("MEM", usedBytes, "SSD", 0L); Assert.assertEquals(usedBytesOnTiers, mBlockStoreMeta.getUsedBytesOnTiers()); } }