/*
* 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.PropertyKey;
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.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
/**
* Integration tests for statistics in TFS.
*/
public class FileSystemStatisticsTest extends BaseIntegrationTest {
private static final int BLOCK_SIZE = 128;
private static final int FILE_LEN = BLOCK_SIZE * 2 + 1;
@ClassRule
public static LocalAlluxioClusterResource sLocalAlluxioClusterResource =
new LocalAlluxioClusterResource.Builder()
.setProperty(PropertyKey.USER_BLOCK_SIZE_BYTES_DEFAULT, BLOCK_SIZE)
.build();
private static org.apache.hadoop.fs.FileSystem.Statistics sStatistics;
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, "/testFile-read", WriteType.CACHE_THROUGH,
FILE_LEN);
URI uri = URI.create(sLocalAlluxioClusterResource.get().getMasterURI());
sTFS = org.apache.hadoop.fs.FileSystem.get(uri, conf);
sStatistics = org.apache.hadoop.fs.FileSystem.getStatistics(uri.getScheme(), sTFS.getClass());
}
/**
* Test the number of bytes read.
*/
@Test
public void bytesReadStatistics() throws Exception {
long originStat = sStatistics.getBytesRead();
InputStream is = sTFS.open(new Path("/testFile-read"));
while (is.read() != -1) {
}
is.close();
Assert.assertEquals(originStat + FILE_LEN, sStatistics.getBytesRead());
}
/**
* Test the number of bytes written.
*/
@Test
public void bytesWrittenStatistics() throws Exception {
long originStat = sStatistics.getBytesWritten();
OutputStream os = sTFS.create(new Path("/testFile-write"));
for (int i = 0; i < FILE_LEN; i++) {
os.write(1);
}
os.close();
Assert.assertEquals(originStat + FILE_LEN, sStatistics.getBytesWritten());
}
/**
* Test the number of read/write operations.
*/
@Test
public void readWriteOperationsStatistics() throws Exception {
int exceptedReadOps = sStatistics.getReadOps();
int exceptedWriteOps = sStatistics.getWriteOps();
// Call all the overridden methods and check the statistics.
sTFS.create(new Path("/testFile-create")).close();
exceptedWriteOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.delete(new Path("/testFile-create"), true);
exceptedWriteOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
// Due to Hadoop 1 support we stick with the deprecated version. If we drop support for it
// FileSystem.getDefaultBlockSize(new Path("/testFile-create")) will be the new one.
sTFS.getDefaultBlockSize();
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
// Due to Hadoop 1 support we stick with the deprecated version. If we drop support for it
// FileSystem.geDefaultReplication(new Path("/testFile-create")) will be the new one.
sTFS.getDefaultReplication();
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
FileStatus fStatus = sTFS.getFileStatus(new Path("/testFile-read"));
exceptedReadOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.getFileBlockLocations(fStatus, 0, FILE_LEN);
exceptedReadOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.getUri();
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.getWorkingDirectory();
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.listStatus(new Path("/"));
exceptedReadOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.mkdirs(new Path("/testDir"));
exceptedWriteOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.open(new Path("/testFile-read")).close();
exceptedReadOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.rename(new Path("/testDir"), new Path("/testDir-rename"));
exceptedWriteOps++;
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
sTFS.setWorkingDirectory(new Path("/testDir-rename"));
Assert.assertEquals(exceptedReadOps, sStatistics.getReadOps());
Assert.assertEquals(exceptedWriteOps, sStatistics.getWriteOps());
}
}