HDFS-4802. Disallowing snapshot on / twice should throw SnapshotException but not IllegalStateException. Contributed by Jing Zhao

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1480015 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2013-05-07 18:45:03 +00:00
parent 393188c445
commit 41312abe84
4 changed files with 23 additions and 8 deletions

View File

@ -344,3 +344,6 @@ Branch-2802 Snapshot (Unreleased)
HDFS-4801. lsSnapshottableDir throws IllegalArgumentException when root is HDFS-4801. lsSnapshottableDir throws IllegalArgumentException when root is
snapshottable. (Jing Zhao via szetszwo) snapshottable. (Jing Zhao via szetszwo)
HDFS-4802. Disallowing snapshot on / twice should throw SnapshotException
but not IllegalStateException. (Jing Zhao via szetszwo)

View File

@ -84,13 +84,13 @@ private void checkNestedSnapshottable(INodeDirectory dir, String path)
if (s.isAncestorDirectory(dir)) { if (s.isAncestorDirectory(dir)) {
throw new SnapshotException( throw new SnapshotException(
"Nested snapshottable directories not allowed: path=" + path "Nested snapshottable directories not allowed: path=" + path
+ ", the ancestor " + s.getFullPathName() + ", the subdirectory " + s.getFullPathName()
+ " is already a snapshottable directory."); + " is already a snapshottable directory.");
} }
if (dir.isAncestorDirectory(s)) { if (dir.isAncestorDirectory(s)) {
throw new SnapshotException( throw new SnapshotException(
"Nested snapshottable directories not allowed: path=" + path "Nested snapshottable directories not allowed: path=" + path
+ ", the subdirectory " + s.getFullPathName() + ", the ancestor " + s.getFullPathName()
+ " is already a snapshottable directory."); + " is already a snapshottable directory.");
} }
} }
@ -156,6 +156,9 @@ public void resetSnapshottable(final String path) throws IOException {
} }
if (s == fsdir.getRoot()) { if (s == fsdir.getRoot()) {
if (s.getSnapshotQuota() == 0) {
throw new SnapshotException("Root is not a snapshottable directory");
}
s.setSnapshotQuota(0); s.setSnapshotQuota(0);
} else { } else {
s.replaceSelf(iip.getLatestSnapshot(), fsdir.getINodeMap()); s.replaceSelf(iip.getLatestSnapshot(), fsdir.getINodeMap());

View File

@ -357,7 +357,7 @@ private static <K, E extends Diff.Element<K>> List<E> apply2Previous(
// (A1) All lists are sorted. // (A1) All lists are sorted.
// (A2) All elements in dlist must be in previous. // (A2) All elements in dlist must be in previous.
// (A3) All elements in clist must be not in tmp = previous - dlist. // (A3) All elements in clist must be not in tmp = previous - dlist.
final List<E> tmp = new ArrayList<E>(); final List<E> tmp = new ArrayList<E>(previous.size() - dlist.size());
{ {
// tmp = previous - dlist // tmp = previous - dlist
final Iterator<E> i = previous.iterator(); final Iterator<E> i = previous.iterator();
@ -374,7 +374,7 @@ private static <K, E extends Diff.Element<K>> List<E> apply2Previous(
} }
} }
final List<E> current = new ArrayList<E>(); final List<E> current = new ArrayList<E>(tmp.size() + clist.size());
{ {
// current = tmp + clist // current = tmp + clist
final Iterator<E> tmpIterator = tmp.iterator(); final Iterator<E> tmpIterator = tmp.iterator();

View File

@ -19,6 +19,7 @@
import static org.apache.hadoop.hdfs.server.namenode.snapshot.INodeDirectorySnapshottable.SNAPSHOT_LIMIT; import static org.apache.hadoop.hdfs.server.namenode.snapshot.INodeDirectorySnapshottable.SNAPSHOT_LIMIT;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException; import java.io.IOException;
import java.util.Random; import java.util.Random;
@ -39,6 +40,7 @@
import org.apache.hadoop.hdfs.server.namenode.INode; import org.apache.hadoop.hdfs.server.namenode.INode;
import org.apache.hadoop.hdfs.server.namenode.INodeDirectory; import org.apache.hadoop.hdfs.server.namenode.INodeDirectory;
import org.apache.hadoop.ipc.RemoteException; import org.apache.hadoop.ipc.RemoteException;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
@ -123,6 +125,13 @@ public void testNestedSnapshots() throws Exception {
print("delete snapshot " + rootSnapshot); print("delete snapshot " + rootSnapshot);
hdfs.disallowSnapshot(rootPath); hdfs.disallowSnapshot(rootPath);
print("disallow snapshot " + rootStr); print("disallow snapshot " + rootStr);
try {
hdfs.disallowSnapshot(rootPath);
fail("Expect snapshot exception when disallowing snapshot on root again");
} catch (SnapshotException e) {
GenericTestUtils.assertExceptionContains(
"Root is not a snapshottable directory", e);
}
//change foo to non-snapshottable //change foo to non-snapshottable
hdfs.deleteSnapshot(foo, s1name); hdfs.deleteSnapshot(foo, s1name);
@ -134,13 +143,13 @@ public void testNestedSnapshots() throws Exception {
hdfs.allowSnapshot(rootPath); hdfs.allowSnapshot(rootPath);
Assert.fail(); Assert.fail();
} catch(SnapshotException se) { } catch(SnapshotException se) {
assertNestedSnapshotException(se, "ancestor"); assertNestedSnapshotException(se, "subdirectory");
} }
try { try {
hdfs.allowSnapshot(foo); hdfs.allowSnapshot(foo);
Assert.fail(); Assert.fail();
} catch(SnapshotException se) { } catch(SnapshotException se) {
assertNestedSnapshotException(se, "ancestor"); assertNestedSnapshotException(se, "subdirectory");
} }
final Path sub1Bar = new Path(bar, "sub1"); final Path sub1Bar = new Path(bar, "sub1");
@ -150,13 +159,13 @@ public void testNestedSnapshots() throws Exception {
hdfs.allowSnapshot(sub1Bar); hdfs.allowSnapshot(sub1Bar);
Assert.fail(); Assert.fail();
} catch(SnapshotException se) { } catch(SnapshotException se) {
assertNestedSnapshotException(se, "subdirectory"); assertNestedSnapshotException(se, "ancestor");
} }
try { try {
hdfs.allowSnapshot(sub2Bar); hdfs.allowSnapshot(sub2Bar);
Assert.fail(); Assert.fail();
} catch(SnapshotException se) { } catch(SnapshotException se) {
assertNestedSnapshotException(se, "subdirectory"); assertNestedSnapshotException(se, "ancestor");
} }
} }