HADOOP-8110. Fix trash checkpoint collisions (Jason Lowe via daryn)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1356897 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Daryn Sharp 2012-07-03 19:59:56 +00:00
parent f5186dabb8
commit 3c2101ae4a
2 changed files with 21 additions and 7 deletions

View File

@ -167,6 +167,8 @@ Trunk (unreleased changes)
HADOOP-8548. test-patch.sh shows an incorrect link in Jekins builds HADOOP-8548. test-patch.sh shows an incorrect link in Jekins builds
(Kihwal Lee via bobby) (Kihwal Lee via bobby)
HADOOP-8110. Fix trash checkpoint collisions (Jason Lowe via daryn)
OPTIMIZATIONS OPTIMIZATIONS
HADOOP-7761. Improve the performance of raw comparisons. (todd) HADOOP-7761. Improve the performance of raw comparisons. (todd)

View File

@ -35,6 +35,7 @@ import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured; import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Options.Rename;
import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.FsPermission;
@ -148,21 +149,32 @@ public class TrashPolicyDefault extends TrashPolicy {
new IOException("Failed to move to trash: "+path).initCause(cause); new IOException("Failed to move to trash: "+path).initCause(cause);
} }
@SuppressWarnings("deprecation")
@Override @Override
public void createCheckpoint() throws IOException { public void createCheckpoint() throws IOException {
if (!fs.exists(current)) // no trash, no checkpoint if (!fs.exists(current)) // no trash, no checkpoint
return; return;
Path checkpoint; Path checkpointBase;
synchronized (CHECKPOINT) { synchronized (CHECKPOINT) {
checkpoint = new Path(trash, CHECKPOINT.format(new Date())); checkpointBase = new Path(trash, CHECKPOINT.format(new Date()));
}
Path checkpoint = checkpointBase;
int attempt = 0;
while (true) {
try {
fs.rename(current, checkpoint, Rename.NONE);
break;
} catch (FileAlreadyExistsException e) {
if (++attempt > 1000) {
throw new IOException("Failed to checkpoint trash: "+checkpoint);
}
checkpoint = checkpointBase.suffix("-" + attempt);
}
} }
if (fs.rename(current, checkpoint)) { LOG.info("Created trash checkpoint: "+checkpoint.toUri().getPath());
LOG.info("Created trash checkpoint: "+checkpoint.toUri().getPath());
} else {
throw new IOException("Failed to checkpoint trash: "+checkpoint);
}
} }
@Override @Override