/**
* 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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import junit.framework.TestCase;
import java.io.*;
import java.util.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.server.common.Storage.*;
import org.apache.hadoop.hdfs.server.common.StorageInfo;
import org.apache.hadoop.hdfs.server.namenode.SnapshotNode.*;
import org.apache.hadoop.hdfs.server.namenode.WaitingRoom.*;
import org.apache.hadoop.net.NetUtils;
/**
* Tests the Waiting Room Purger utility
*/
public class TestWaitingRoomPurger extends TestCase {
private static final Log LOG = LogFactory.getLog(TestWaitingRoomPurger.class);
public void testWaitingRoomPurger() throws IOException {
Configuration conf = new Configuration();
MiniDFSCluster cluster = new MiniDFSCluster(conf, 1, true, null);
cluster.waitClusterUp();
FileSystem fs = cluster.getFileSystem();
WaitingRoom wr = new WaitingRoom(conf);
WaitingRoomPurger purger = wr.getPurger();
SnapshotNode ssNode = new SnapshotNode(conf);
ssNode.shutdownWaitingRoomPurger();
String wrPath = conf.get("fs.snapshot.waitingroom", "/.WR");
String ssDir = conf.get("fs.snapshot.dir", "/.SNAPSHOT");
Path foo = new Path("/foo");
Path bar = new Path("/hadoop/bar");
Path mash = new Path("/hadoop/mash");
FSDataOutputStream stream;
// Create foo
stream = fs.create(foo);
stream.writeByte(0);
stream.close();
// Move foo to waiting room.
assertTrue(wr.moveToWaitingRoom(foo));
// Create snapshot
ssNode.createSnapshot("first", false); // contains nothing
// Create bar (V1)
stream = fs.create(bar);
stream.write(0);
stream.close();
// Create mash (empty)
stream = fs.create(mash);
stream.close();
// Create snapshot
ssNode.createSnapshot("second", false); // contains bar (V1), mash
// Move mash, bar to waiting room
assertTrue(wr.moveToWaitingRoom(mash));
assertTrue(wr.moveToWaitingRoom(bar));
// Create bar (V2)
stream = fs.create(bar);
stream.write(0);
stream.close();
ssNode.createSnapshot("third", false); // contains bar (V2)
// Verify fs state right now
assertTrue(fs.exists(bar));
assertFalse(fs.exists(foo));
assertFalse(fs.exists(mash));
assertTrue(fs.exists(new Path(wrPath + "/foo")));
assertTrue(fs.exists(new Path(wrPath + "/hadoop/bar")));
assertTrue(fs.exists(new Path(wrPath + "/hadoop/mash")));
// Run purger
purger.purge();
// Verify fs state right now
assertTrue(fs.exists(bar));
assertFalse(fs.exists(foo));
assertFalse(fs.exists(mash));
assertFalse(fs.exists(new Path(wrPath + "/foo"))); // deleted: unreferenced
assertTrue(fs.exists(new Path(wrPath + "/hadoop/bar")));
assertFalse(fs.exists(new Path(wrPath + "/hadoop/mash"))); // deleted: empty
// Delete snapshot 'second'
boolean success = fs.delete(new Path(ssDir + "/" + SnapshotNode.SSNAME + "second"));
assertTrue(success);
// Run purger again
purger.purge();
// Verify fs state right now
assertTrue(fs.exists(bar));
assertFalse(fs.exists(foo));
assertFalse(fs.exists(mash));
assertFalse(fs.exists(new Path(wrPath + "/foo"))); // deleted: last run
assertFalse(fs.exists(new Path(wrPath + "/hadoop/bar"))); // deleted: unreferenced
assertFalse(fs.exists(new Path(wrPath + "/hadoop/mash"))); // deleted: last run
}
}