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) {