hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From apurt...@apache.org
Subject [3/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
Date Fri, 01 Aug 2014 17:11:34 GMT
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/5b00dbc6
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5b00dbc6
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5b00dbc6

Branch: refs/heads/0.98
Commit: 5b00dbc63ff2abc52fb65d46e5e00441fb227177
Parents: 40077a1
Author: Andrew Purtell <apurtell@apache.org>
Authored: Fri Aug 1 10:03:12 2014 -0700
Committer: Andrew Purtell <apurtell@apache.org>
Committed: Fri Aug 1 10:03:38 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/5b00dbc6/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 02aa7b5..b870b37 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
@@ -643,11 +643,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) {


Mime
View raw message