/**
* 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.hdfs.server.namenode;
import java.io.IOException;
import java.util.Random;
import org.apache.commons.logging.impl.Log4JLogger;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.TestTrash;
import org.apache.hadoop.fs.TrashPolicy;
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.TestFileCreation;
import org.apache.log4j.Level;
public class TestFileDeleteWhitelist extends junit.framework.TestCase {
static final long seed = 0xDEADBEEFL;
static final int blockSize = 8192;
{
((Log4JLogger)NameNode.stateChangeLog).getLogger().setLevel(Level.ALL);
((Log4JLogger)FSNamesystem.LOG).getLogger().setLevel(Level.ALL);
}
//
// creates a zero file.
//
private void createFile(FileSystem fileSys, Path name)
throws IOException {
FSDataOutputStream stm = fileSys.create(name, true,
fileSys.getConf().getInt("io.file.buffer.size", 4096),
(short)1, (long)blockSize);
byte[] buffer = new byte[1024];
Random rand = new Random(seed);
rand.nextBytes(buffer);
stm.write(buffer);
stm.close();
}
public void testFileDeleteWhiteList() throws IOException {
Configuration conf = new Configuration();
conf.setInt("heartbeat.recheck.interval", 1000);
conf.setInt("dfs.heartbeat.interval", 1);
conf.set("dfs.namenode.whitelist.file", "whitelist.conf");
conf.setLong("dfs.namenode.config.reload.wait", 10000); // 10 milliseconds
conf.setLong("dfs.replication.interval", 2); // seconds
// create cluster
MiniDFSCluster cluster = new MiniDFSCluster(conf, 1, true, null);
FileSystem fs = null;
try {
cluster.waitActive();
fs = cluster.getFileSystem();
FSNamesystem namesys = cluster.getNameNode().getNamesystem();
// create file1.
Path dir = new Path("/foo");
Path file1 = new Path(dir, "file1");
createFile(fs, file1);
System.out.println("testFileCreationDeleteParent: "
+ "Created file " + file1);
// create file2.
Path file2 = new Path(dir, "file2");
createFile(fs, file2);
System.out.println("testFileCreationDeleteParent: "
+ "Created file " + file2);
// tell the namenode to never allow deletion of this path
namesys.neverDeletePaths.add("/foo/file2");
// this directory shoudl be deleted sucecssfully
assertTrue(fs.delete(file1, true));
System.out.println("testFileCreationDeleteParent: " +
"Successfulle deleted " + file1);
// deleting file2 should fail
boolean success = false;
try {
success = fs.delete(file2, true);
} catch (Exception e) {
}
assertFalse(success);
System.out.println("testFileCreationDeleteParent: " +
"Unable to deleted " + file2 + " as expected");
// renaming file2 should fail too
success = false;
try {
success = fs.rename(file2, file1);
} catch (Exception e) {
}
assertFalse(success);
System.out.println("testFileCreationDeleteParent: " +
"Unable to rename " + file2 + " as expected");
} finally {
fs.close();
cluster.shutdown();
}
}
public void testFileDeleteWithTrash() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.trash.interval", "10"); // 10 minute
// create cluster
MiniDFSCluster cluster = new MiniDFSCluster(conf, 1, true, null);
FileSystem fs = null;
try {
cluster.waitActive();
fs = cluster.getFileSystem();
// create file1.
Path dir = new Path("/foo");
Path file1 = new Path(dir, "file1");
createFile(fs, file1);
System.out.println("testFileCreationDeleteParent: "
+ "Created file " + file1);
fs.delete(file1, true);
// create file2.
Path file2 = new Path("/tmp", "file2");
createFile(fs, file2);
System.out.println("testFileCreationDeleteParent: "
+ "Created file " + file2);
fs.delete(file2, true);
TrashPolicy trashPolicy = TrashPolicy.getInstance(conf, fs, fs.getHomeDirectory());
Path trashRoot = trashPolicy.getCurrentTrashDir();
TestTrash.checkTrash(fs, trashRoot, file1);
TestTrash.checkNotInTrash(fs, trashRoot, file2.toString());
} finally {
fs.close();
cluster.shutdown();
}
}
}