/*
* 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.hadoop;
import alluxio.LocalAlluxioClusterResource;
import alluxio.BaseIntegrationTest;
import alluxio.client.WriteType;
import alluxio.client.file.FileSystemTestUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import java.net.URI;
/**
* Integration tests for {@link FileSystem#getFileBlockLocations(FileStatus, long, long)}.
*/
public class FileSystemBlockLocationIntegrationTest extends BaseIntegrationTest {
private static final int BLOCK_SIZE = 1024;
private static final int FILE_LEN = BLOCK_SIZE * 3;
@ClassRule
public static LocalAlluxioClusterResource sLocalAlluxioClusterResource =
new LocalAlluxioClusterResource.Builder().build();
private static org.apache.hadoop.fs.FileSystem sTFS;
@BeforeClass
public static void beforeClass() throws Exception {
Configuration conf = new Configuration();
conf.set("fs.alluxio.impl", FileSystem.class.getName());
alluxio.client.file.FileSystem alluxioFS = sLocalAlluxioClusterResource.get().getClient();
FileSystemTestUtils.createByteFile(alluxioFS, "/testFile1", WriteType.CACHE_THROUGH, FILE_LEN);
URI uri = URI.create(sLocalAlluxioClusterResource.get().getMasterURI());
sTFS = org.apache.hadoop.fs.FileSystem.get(uri, conf);
}
/**
* Test {@code BlockLocation[] getFileBlockLocations(FileStatus file, long start, long len)}.
* Test the different situations of different start and len.
*/
@Test
public void basicBlockLocation() throws Exception {
FileStatus fStatus = sTFS.getFileStatus(new Path("/testFile1"));
// block0.offset = start < start+len < block1.offset
long start = 0;
long len = BLOCK_SIZE - 1;
Assert.assertEquals(1, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset < start < start+len < block1.offset
start = 1;
len = BLOCK_SIZE - 2;
Assert.assertEquals(1, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset < start = start+len < block1.offset
start = 1;
len = 0;
Assert.assertEquals(1, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset = start < start+len = block1.offset
start = 0;
len = BLOCK_SIZE;
Assert.assertEquals(2, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset = start < block1.offset < start+len < block2.offset
start = 0;
len = BLOCK_SIZE + 1;
Assert.assertEquals(2, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset < start < block1.offset < start+len < block2.offset
start = 1;
len = BLOCK_SIZE;
Assert.assertEquals(2, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset = start < start+len = block2.offset
start = 0;
len = BLOCK_SIZE * 2;
Assert.assertEquals(3, sTFS.getFileBlockLocations(fStatus, start, len).length);
// block0.offset = start < start+len = file.len
start = 0;
len = FILE_LEN;
Assert.assertEquals(3, sTFS.getFileBlockLocations(fStatus, start, len).length);
// file.len < start < start+len
start = FILE_LEN + 1;
len = 1;
Assert.assertEquals(0, sTFS.getFileBlockLocations(fStatus, start, len).length);
}
}