You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2014/08/01 19:11:33 UTC
[2/3] git commit: HBASE-3270 When we create the .version file,
we should create it in a tmp location and then move it into place
HBASE-3270 When we create the .version file, we should create it in a tmp location and then move it into place
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/85e317b3
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/85e317b3
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/85e317b3
Branch: refs/heads/branch-1
Commit: 85e317b3aea94059695de8b8053be48f2520d3cb
Parents: d34c5d4
Author: Andrew Purtell <ap...@apache.org>
Authored: Fri Aug 1 10:03:12 2014 -0700
Committer: Andrew Purtell <ap...@apache.org>
Committed: Fri Aug 1 10:03:29 2014 -0700
----------------------------------------------------------------------
.../org/apache/hadoop/hbase/util/FSUtils.java | 26 +++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/85e317b3/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
index 6c53f2a..fb00cf5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java
@@ -630,11 +630,31 @@ public abstract class FSUtils {
public static void setVersion(FileSystem fs, Path rootdir, String version,
int wait, int retries) throws IOException {
Path versionFile = new Path(rootdir, HConstants.VERSION_FILE_NAME);
+ Path tempVersionFile = new Path(rootdir, HConstants.HBASE_TEMP_DIRECTORY + Path.SEPARATOR +
+ HConstants.VERSION_FILE_NAME);
while (true) {
try {
- FSDataOutputStream s = fs.create(versionFile);
- s.write(toVersionByteArray(version));
- s.close();
+ // Write the version to a temporary file
+ FSDataOutputStream s = fs.create(tempVersionFile);
+ try {
+ s.write(toVersionByteArray(version));
+ s.close();
+ s = null;
+ // Move the temp version file to its normal location. Returns false
+ // if the rename failed. Throw an IOE in that case.
+ if (!fs.rename(tempVersionFile, versionFile)) {
+ throw new IOException("Unable to move temp version file to " + versionFile);
+ }
+ } finally {
+ // Cleaning up the temporary if the rename failed would be trying
+ // too hard. We'll unconditionally create it again the next time
+ // through anyway, files are overwritten by default by create().
+
+ // Attempt to close the stream on the way out if it is still open.
+ try {
+ if (s != null) s.close();
+ } catch (IOException ignore) { }
+ }
LOG.debug("Created version file at " + rootdir.toString() + " with version=" + version);
return;
} catch (IOException e) {