You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by wh...@apache.org on 2016/01/05 20:52:16 UTC
[16/50] [abbrv] hadoop git commit: [partial-ns] Implement SetTime().
[partial-ns] Implement SetTime().
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/36cdcd77
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/36cdcd77
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/36cdcd77
Branch: refs/heads/feature-HDFS-8286
Commit: 36cdcd77e60f66135e72b27b4a32e6af6bdb8abe
Parents: 7f09c48
Author: Haohui Mai <wh...@apache.org>
Authored: Tue May 26 14:50:56 2015 -0700
Committer: Haohui Mai <wh...@apache.org>
Committed: Fri Jun 12 13:56:59 2015 -0700
----------------------------------------------------------------------
.../hdfs/server/namenode/FSDirAttrOp.java | 97 +++++++++-----------
.../hdfs/server/namenode/FSEditLogLoader.java | 9 +-
.../hdfs/server/namenode/FSNamesystem.java | 23 ++---
.../hdfs/server/namenode/RWTransaction.java | 4 +
4 files changed, 63 insertions(+), 70 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/36cdcd77/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
index f16183f..4221f80 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
@@ -108,31 +108,27 @@ public class FSDirAttrOp {
}
FSPermissionChecker pc = fsd.getPermissionChecker();
- byte[][] pathComponents = FSDirectory.getPathComponentsForReservedPath(src);
-
- INodesInPath iip;
- fsd.writeLock();
- try {
- src = fsd.resolvePath(pc, src, pathComponents);
- iip = fsd.getINodesInPath4Write(src);
- // Write access is required to set access and modification times
+ try (RWTransaction tx = fsd.newRWTransaction().begin()) {
+ Resolver.Result paths = Resolver.resolve(tx, src);
+ if (paths.invalidPath()) {
+ throw new InvalidPathException(src);
+ } else if (paths.notFound()) {
+ throw new FileNotFoundException(src);
+ }
+ FlatINodesInPath iip = paths.inodesInPath();
if (fsd.isPermissionEnabled()) {
fsd.checkPathAccess(pc, iip, FsAction.WRITE);
}
- final INode inode = iip.getLastINode();
- if (inode == null) {
- throw new FileNotFoundException("File/Directory " + src +
- " does not exist.");
- }
- boolean changed = unprotectedSetTimes(fsd, inode, mtime, atime, true,
- iip.getLatestSnapshotId());
+ FlatINode.Builder b = new FlatINode.Builder()
+ .mergeFrom(iip.getLastINode());
+ boolean changed = unprotectedSetTimes(fsd, b, mtime, atime, true);
if (changed) {
- fsd.getEditLog().logTimes(src, mtime, atime);
+ tx.putINode(b.id(), b.build());
+ tx.logTimes(src, mtime, atime);
+ tx.commit();
}
- } finally {
- fsd.writeUnlock();
+ return fsd.getAuditFileInfo(iip);
}
- return fsd.getAuditFileInfo(iip);
}
static boolean setReplication(
@@ -280,25 +276,23 @@ public class FSDirAttrOp {
}
}
- static boolean setTimes(
- FSDirectory fsd, INode inode, long mtime, long atime, boolean force,
- int latestSnapshotId) throws QuotaExceededException {
- fsd.writeLock();
- try {
- return unprotectedSetTimes(fsd, inode, mtime, atime, force,
- latestSnapshotId);
- } finally {
- fsd.writeUnlock();
- }
- }
-
- static boolean unprotectedSetTimes(
- FSDirectory fsd, String src, long mtime, long atime, boolean force)
- throws UnresolvedLinkException, QuotaExceededException {
+ static void unprotectedSetTimes(
+ FSDirectory fsd, RWTransaction tx, String src, long mtime, long atime)
+ throws IOException {
assert fsd.hasWriteLock();
- final INodesInPath i = fsd.getINodesInPath(src, true);
- return unprotectedSetTimes(fsd, i.getLastINode(), mtime, atime,
- force, i.getLatestSnapshotId());
+ Resolver.Result paths = Resolver.resolve(tx, src);
+ if (paths.invalidPath()) {
+ throw new InvalidPathException(src);
+ } else if (paths.notFound()) {
+ throw new FileNotFoundException(src);
+ }
+ FlatINodesInPath iip = paths.inodesInPath();
+ FlatINode.Builder b = new FlatINode.Builder()
+ .mergeFrom(iip.getLastINode());
+ boolean changed = unprotectedSetTimes(fsd, b, mtime, atime, true);
+ if (changed) {
+ tx.putINode(b.id(), b.build());
+ }
}
/**
@@ -450,26 +444,23 @@ public class FSDirAttrOp {
}
private static boolean unprotectedSetTimes(
- FSDirectory fsd, INode inode, long mtime, long atime, boolean force,
- int latest) throws QuotaExceededException {
- assert fsd.hasWriteLock();
- boolean status = false;
+ FSDirectory fsd, FlatINode.Builder builder, long mtime, long atime,
+ boolean force) {
+ boolean changed = false;
if (mtime != -1) {
- inode = inode.setModificationTime(mtime, latest);
- status = true;
+ builder.mtime(mtime);
+ changed = true;
}
+
if (atime != -1) {
- long inodeTime = inode.getAccessTime();
-
- // if the last access time update was within the last precision interval, then
- // no need to store access time
- if (atime <= inodeTime + fsd.getAccessTimePrecision() && !force) {
- status = false;
- } else {
- inode.setAccessTime(atime, latest);
- status = true;
+ long inodeTime = builder.atime();
+ // if the last access time update was within the last precision
+ // interval, then no need to store access time
+ if (force || atime > inodeTime + fsd.getAccessTimePrecision()) {
+ builder.atime(atime);
+ changed = true;
}
}
- return status;
+ return changed;
}
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/36cdcd77/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
index 4c399cb..6238771 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
@@ -630,9 +630,12 @@ public class FSEditLogLoader {
case OP_TIMES: {
TimesOp timesOp = (TimesOp)op;
- FSDirAttrOp.unprotectedSetTimes(
- fsDir, renameReservedPathsOnUpgrade(timesOp.path, logVersion),
- timesOp.mtime, timesOp.atime, true);
+ try (ReplayTransaction tx = fsDir.newReplayTransaction().begin()) {
+ FSDirAttrOp.unprotectedSetTimes(fsDir, tx, renameReservedPathsOnUpgrade(
+ timesOp.path, logVersion),
+ timesOp.mtime, timesOp.atime);
+ tx.commit();
+ }
break;
}
case OP_SYMLINK: {
http://git-wip-us.apache.org/repos/asf/hadoop/blob/36cdcd77/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
index 9432bc3..47fbe7a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
@@ -1722,9 +1722,8 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
byte[][] pathComponents = FSDirectory.getPathComponentsForReservedPath(
srcArg);
String src = srcArg;
- writeLock();
final long now = now();
- try {
+ try (RWTransaction tx = dir.newRWTransaction().begin()) {
checkOperation(OperationCategory.WRITE);
/**
* Resolve the path again and update the atime only when the file
@@ -1744,22 +1743,18 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
* HDFS-7463. A better fix is to change the edit log of SetTime to
* use inode id instead of a path.
*/
- src = dir.resolvePath(pc, srcArg, pathComponents);
- final INodesInPath iip = dir.getINodesInPath(src, true);
- INode inode = iip.getLastINode();
- boolean updateAccessTime = inode != null &&
- now > inode.getAccessTime() + dir.getAccessTimePrecision();
- if (!isInSafeMode() && updateAccessTime) {
- boolean changed = FSDirAttrOp.setTimes(dir,
- inode, -1, now, false, iip.getLatestSnapshotId());
- if (changed) {
- getEditLog().logTimes(src, -1, now);
+ Resolver.Result paths = Resolver.resolve(tx, srcArg);
+ if (paths.ok()) {
+ FlatINode inode = paths.inodesInPath().getLastINode();
+ boolean updateAccessTime = now > inode.atime()
+ + dir.getAccessTimePrecision();
+ if (!isInSafeMode() && updateAccessTime) {
+ FSDirAttrOp.unprotectedSetTimes(dir, tx, src, -1, now);
}
+ tx.commit();
}
} catch (Throwable e) {
LOG.warn("Failed to update the access time of " + src, e);
- } finally {
- writeUnlock();
}
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/36cdcd77/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
index 9b28625..14171c6 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
@@ -174,6 +174,10 @@ class RWTransaction extends Transaction {
fsd.getEditLog().logSetPermissions(src, permission);
}
+ public void logTimes(String src, long mtime, long atime) {
+ fsd.getEditLog().logTimes(src, mtime, atime);
+ }
+
public void logUpdateBlocks(String path, FlatINodeFileFeature file) {
Block[] blocks = new Block[file.numBlocks()];
int i = 0;