| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.hadoop.raid; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import junit.framework.TestCase; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import org.apache.hadoop.fs.FileStatus; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.fs.FSDataOutputStream; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.hdfs.MiniDFSCluster; |
| import org.apache.hadoop.raid.protocol.PolicyInfo; |
| |
| public class TestRaidFilter extends TestCase { |
| final static String TEST_DIR = new File(System.getProperty("test.build.data", |
| "build/contrib/raid/test/data")).getAbsolutePath(); |
| final static Log LOG = |
| LogFactory.getLog("org.apache.hadoop.raid.TestRaidFilter"); |
| |
| Configuration conf; |
| MiniDFSCluster dfs = null; |
| FileSystem fs = null; |
| |
| private void mySetup() throws Exception { |
| new File(TEST_DIR).mkdirs(); // Make sure data directory exists |
| conf = new Configuration(); |
| dfs = new MiniDFSCluster(conf, 2, true, null); |
| dfs.waitActive(); |
| fs = dfs.getFileSystem(); |
| String namenode = fs.getUri().toString(); |
| FileSystem.setDefaultUri(conf, namenode); |
| } |
| |
| private void myTearDown() throws Exception { |
| if (dfs != null) { dfs.shutdown(); } |
| } |
| |
| public void testLayeredPolicies() throws Exception { |
| mySetup(); |
| Path src1 = new Path("/user/foo"); |
| Path src2 = new Path("/user/foo/bar"); |
| |
| PolicyInfo info1 = new PolicyInfo("p1", conf); |
| info1.setSrcPath(src1.toString()); |
| info1.setErasureCode("xor"); |
| info1.setDescription("test policy"); |
| info1.setProperty("targetReplication", "1"); |
| info1.setProperty("metaReplication", "1"); |
| info1.setProperty("modTimePeriod", "0"); |
| |
| PolicyInfo info2 = new PolicyInfo("p2", conf); |
| info2.setSrcPath(src2.toString()); |
| info2.setErasureCode("xor"); |
| info2.setDescription("test policy"); |
| info2.setProperty("targetReplication", "1"); |
| info2.setProperty("metaReplication", "1"); |
| info2.setProperty("modTimePeriod", "0"); |
| |
| ArrayList<PolicyInfo> all = new ArrayList<PolicyInfo>(); |
| all.add(info1); |
| all.add(info2); |
| |
| try { |
| long blockSize = 1024; |
| byte[] bytes = new byte[(int)blockSize]; |
| Path f1 = new Path(src1, "f1"); |
| Path f2 = new Path(src2, "f2"); |
| FSDataOutputStream stm1 = fs.create(f1, false, 4096, (short)1, blockSize); |
| FSDataOutputStream stm2 = fs.create(f2, false, 4096, (short)1, blockSize); |
| FSDataOutputStream[] stms = new FSDataOutputStream[]{stm1, stm2}; |
| for (FSDataOutputStream stm: stms) { |
| stm.write(bytes); |
| stm.write(bytes); |
| stm.write(bytes); |
| stm.close(); |
| } |
| |
| Thread.sleep(1000); |
| |
| FileStatus stat1 = fs.getFileStatus(f1); |
| FileStatus stat2 = fs.getFileStatus(f2); |
| |
| RaidFilter.Statistics stats = new RaidFilter.Statistics(); |
| RaidFilter.TimeBasedFilter filter = new RaidFilter.TimeBasedFilter( |
| conf, RaidNode.xorDestinationPath(conf), info1, all, |
| System.currentTimeMillis(), stats); |
| System.out.println("Stats " + stats); |
| |
| assertTrue(filter.check(stat1)); |
| assertFalse(filter.check(stat2)); |
| |
| } finally { |
| myTearDown(); |
| } |
| } |
| } |