/*
* 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.shell.command;
import alluxio.AlluxioURI;
import alluxio.IntegrationTestUtils;
import alluxio.client.WriteType;
import alluxio.client.file.FileSystemTestUtils;
import alluxio.exception.AlluxioException;
import alluxio.heartbeat.HeartbeatContext;
import alluxio.heartbeat.ManuallyScheduleHeartbeat;
import alluxio.shell.AbstractAlluxioShellTest;
import alluxio.shell.AlluxioShellUtilsTest;
import alluxio.worker.block.BlockWorker;
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Test;
import java.io.IOException;
/**
* Tests for free command.
*/
public final class FreeCommandTest extends AbstractAlluxioShellTest {
@ClassRule
public static ManuallyScheduleHeartbeat sManuallySchedule =
new ManuallyScheduleHeartbeat(HeartbeatContext.WORKER_BLOCK_SYNC);
@Test
public void freeNonPersistedFile() throws IOException, AlluxioException {
String fileName = "/testFile";
FileSystemTestUtils.createByteFile(mFileSystem, fileName, WriteType.MUST_CACHE, 10);
// freeing non persisted files is expected to fail
Assert.assertEquals(-1, mFsShell.run("free", fileName));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class));
Assert.assertTrue(isInMemoryTest(fileName));
}
@Test
public void freePinnedFile() throws IOException, AlluxioException {
String fileName = "/testFile";
FileSystemTestUtils.createByteFile(mFileSystem, fileName, WriteType.CACHE_THROUGH, 10);
mFsShell.run("pin", fileName);
// freeing non persisted files is expected to fail
Assert.assertEquals(-1, mFsShell.run("free", fileName));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class));
Assert.assertTrue(isInMemoryTest(fileName));
}
@Test
public void freePinnedFileForced() throws IOException, AlluxioException {
String fileName = "/testFile";
FileSystemTestUtils.createByteFile(mFileSystem, fileName, WriteType.CACHE_THROUGH, 10);
long blockId = mFileSystem.getStatus(new AlluxioURI(fileName)).getBlockIds().get(0);
mFsShell.run("pin", fileName);
Assert.assertEquals(0, mFsShell.run("free", "-f", fileName));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class), blockId);
Assert.assertFalse(isInMemoryTest(fileName));
}
@Test
public void free() throws IOException, AlluxioException {
String fileName = "/testFile";
FileSystemTestUtils.createByteFile(mFileSystem, fileName, WriteType.CACHE_THROUGH, 10);
long blockId = mFileSystem.getStatus(new AlluxioURI(fileName)).getBlockIds().get(0);
Assert.assertEquals(0, mFsShell.run("free", fileName));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class), blockId);
Assert.assertFalse(isInMemoryTest(fileName));
}
@Test
public void freeWildCardNonPersistedFile() throws IOException, AlluxioException {
String testDir = AlluxioShellUtilsTest.resetFileHierarchy(mFileSystem, WriteType.MUST_CACHE);
Assert.assertEquals(-1, mFsShell.run("free", testDir + "/foo/*"));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class));
// freeing non persisted files is expected to fail
Assert.assertTrue(isInMemoryTest(testDir + "/foo/foobar1"));
Assert.assertTrue(isInMemoryTest(testDir + "/foo/foobar2"));
Assert.assertTrue(isInMemoryTest(testDir + "/bar/foobar3"));
Assert.assertTrue(isInMemoryTest(testDir + "/foobar4"));
}
@Test
public void freeWildCardPinnedFile() throws IOException, AlluxioException {
String testDir = AlluxioShellUtilsTest.resetFileHierarchy(mFileSystem, WriteType.CACHE_THROUGH);
mFsShell.run("pin", testDir + "/foo/foobar1");
Assert.assertEquals(-1, mFsShell.run("free", testDir + "/foo/*"));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class));
// freeing non pinned files is expected to fail without "-f"
Assert.assertTrue(isInMemoryTest(testDir + "/foo/foobar1"));
Assert.assertTrue(isInMemoryTest(testDir + "/foo/foobar2"));
Assert.assertTrue(isInMemoryTest(testDir + "/bar/foobar3"));
Assert.assertTrue(isInMemoryTest(testDir + "/foobar4"));
}
@Test
public void freeWildCardPinnedFileForced() throws IOException, AlluxioException {
String testDir = AlluxioShellUtilsTest.resetFileHierarchy(mFileSystem, WriteType.CACHE_THROUGH);
long blockId1 = mFileSystem.getStatus(new AlluxioURI(testDir + "/foo/foobar1")).getBlockIds()
.get(0);
long blockId2 =
mFileSystem.getStatus(new AlluxioURI(testDir + "/foo/foobar2")).getBlockIds().get(0);
mFsShell.run("pin", testDir + "/foo/foobar1");
Assert.assertEquals(0, mFsShell.run("free", "-f", testDir + "/foo/*"));
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class), blockId1, blockId2);
Assert.assertFalse(isInMemoryTest(testDir + "/foo/foobar1"));
Assert.assertFalse(isInMemoryTest(testDir + "/foo/foobar2"));
Assert.assertTrue(isInMemoryTest(testDir + "/bar/foobar3"));
Assert.assertTrue(isInMemoryTest(testDir + "/foobar4"));
}
@Test
public void freeWildCard() throws IOException, AlluxioException {
String testDir = AlluxioShellUtilsTest.resetFileHierarchy(mFileSystem, WriteType.CACHE_THROUGH);
long blockId1 =
mFileSystem.getStatus(new AlluxioURI(testDir + "/foo/foobar1")).getBlockIds().get(0);
long blockId2 =
mFileSystem.getStatus(new AlluxioURI(testDir + "/foo/foobar2")).getBlockIds().get(0);
int ret = mFsShell.run("free", testDir + "/foo/*");
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class), blockId1, blockId2);
Assert.assertEquals(0, ret);
Assert.assertFalse(isInMemoryTest(testDir + "/foo/foobar1"));
Assert.assertFalse(isInMemoryTest(testDir + "/foo/foobar2"));
Assert.assertTrue(isInMemoryTest(testDir + "/bar/foobar3"));
Assert.assertTrue(isInMemoryTest(testDir + "/foobar4"));
blockId1 = mFileSystem.getStatus(new AlluxioURI(testDir + "/bar/foobar3")).getBlockIds().get(0);
blockId2 = mFileSystem.getStatus(new AlluxioURI(testDir + "/foobar4")).getBlockIds().get(0);
ret = mFsShell.run("free", testDir + "/*/");
IntegrationTestUtils.waitForBlocksToBeFreed(
mLocalAlluxioCluster.getWorkerProcess().getWorker(BlockWorker.class), blockId1, blockId2);
Assert.assertEquals(0, ret);
Assert.assertFalse(isInMemoryTest(testDir + "/bar/foobar3"));
Assert.assertFalse(isInMemoryTest(testDir + "/foobar4"));
}
}