Browse Source

HDFS-11209. SNN can't checkpoint when rolling upgrade is not finalized. Contributed by Xiaoyu Yao.

Xiaoyu Yao 8 years ago
parent
commit
b1fce2b8b1

+ 16 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/NamenodeProtocolServerSideTranslatorPB.java

@@ -37,6 +37,8 @@ import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecen
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdResponseProto;
+import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsRollingUpgradeRequestProto;
+import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsRollingUpgradeResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
@@ -240,4 +242,18 @@ public class NamenodeProtocolServerSideTranslatorPB implements
     return IsUpgradeFinalizedResponseProto.newBuilder()
     return IsUpgradeFinalizedResponseProto.newBuilder()
         .setIsUpgradeFinalized(isUpgradeFinalized).build();
         .setIsUpgradeFinalized(isUpgradeFinalized).build();
   }
   }
+
+  @Override
+  public IsRollingUpgradeResponseProto isRollingUpgrade(
+      RpcController controller, IsRollingUpgradeRequestProto request)
+      throws ServiceException {
+    boolean isRollingUpgrade;
+    try {
+      isRollingUpgrade = impl.isRollingUpgrade();
+    } catch (IOException e) {
+      throw new ServiceException(e);
+    }
+    return IsRollingUpgradeResponseProto.newBuilder()
+        .setIsRollingUpgrade(isRollingUpgrade).build();
+  }
 }
 }

+ 15 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocolPB/NamenodeProtocolTranslatorPB.java

@@ -34,6 +34,8 @@ import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlocksReq
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
+import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsRollingUpgradeRequestProto;
+import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsRollingUpgradeResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
@@ -247,4 +249,17 @@ public class NamenodeProtocolTranslatorPB implements NamenodeProtocol,
       throw ProtobufHelper.getRemoteException(e);
       throw ProtobufHelper.getRemoteException(e);
     }
     }
   }
   }
+
+  @Override
+  public boolean isRollingUpgrade() throws IOException {
+    IsRollingUpgradeRequestProto req = IsRollingUpgradeRequestProto
+        .newBuilder().build();
+    try {
+      IsRollingUpgradeResponseProto response = rpcProxy.isRollingUpgrade(
+          NULL_CONTROLLER, req);
+      return response.getIsRollingUpgrade();
+    } catch (ServiceException e) {
+      throw ProtobufHelper.getRemoteException(e);
+    }
+  }
 }
 }

+ 2 - 2
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/Checkpointer.java

@@ -260,8 +260,8 @@ class Checkpointer extends Daemon {
             completeBlocksTotal);
             completeBlocksTotal);
       }
       }
       bnImage.saveFSImageInAllDirs(backupNode.getNamesystem(), txid);
       bnImage.saveFSImageInAllDirs(backupNode.getNamesystem(), txid);
-      if (!backupNode.namesystem.isRollingUpgrade()) {
-        bnStorage.writeAll();
+      if (!backupNode.namenode.isRollingUpgrade()) {
+        bnImage.updateStorageVersion();
       }
       }
     } finally {
     } finally {
       backupNode.namesystem.writeUnlock("doCheckpoint");
       backupNode.namesystem.writeUnlock("doCheckpoint");

+ 2 - 2
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImage.java

@@ -539,7 +539,7 @@ public class FSImage implements Closeable {
 
 
     // and save it but keep the same checkpointTime
     // and save it but keep the same checkpointTime
     saveNamespace(target);
     saveNamespace(target);
-    getStorage().writeAll();
+    updateStorageVersion();
   }
   }
   
   
   void finalizeUpgrade(boolean finalizeEditLog) throws IOException {
   void finalizeUpgrade(boolean finalizeEditLog) throws IOException {
@@ -1052,7 +1052,7 @@ public class FSImage implements Closeable {
       try {
       try {
         saveFSImageInAllDirs(source, nnf, imageTxId, canceler);
         saveFSImageInAllDirs(source, nnf, imageTxId, canceler);
         if (!source.isRollingUpgrade()) {
         if (!source.isRollingUpgrade()) {
-          storage.writeAll();
+          updateStorageVersion();
         }
         }
       } finally {
       } finally {
         if (editLogWasOpen) {
         if (editLogWasOpen) {

+ 7 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java

@@ -1250,6 +1250,13 @@ public class NameNodeRpcServer implements NamenodeProtocols {
     namesystem.checkSuperuserPrivilege();
     namesystem.checkSuperuserPrivilege();
     return namesystem.isUpgradeFinalized();
     return namesystem.isUpgradeFinalized();
   }
   }
+
+  @Override // NamenodeProtocol
+  public boolean isRollingUpgrade() throws IOException {
+    checkNNStartup();
+    namesystem.checkSuperuserPrivilege();
+    return namesystem.isRollingUpgrade();
+  }
     
     
   @Override // ClientProtocol
   @Override // ClientProtocol
   public void finalizeUpgrade() throws IOException {
   public void finalizeUpgrade() throws IOException {

+ 3 - 3
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java

@@ -1064,7 +1064,7 @@ public class SecondaryNameNode implements Runnable,
 
 
   }
   }
     
     
-  static void doMerge(
+  void doMerge(
       CheckpointSignature sig, RemoteEditLogManifest manifest,
       CheckpointSignature sig, RemoteEditLogManifest manifest,
       boolean loadImage, FSImage dstImage, FSNamesystem dstNamesystem)
       boolean loadImage, FSImage dstImage, FSNamesystem dstNamesystem)
       throws IOException {   
       throws IOException {   
@@ -1093,8 +1093,8 @@ public class SecondaryNameNode implements Runnable,
     Checkpointer.rollForwardByApplyingLogs(manifest, dstImage, dstNamesystem);
     Checkpointer.rollForwardByApplyingLogs(manifest, dstImage, dstNamesystem);
     // The following has the side effect of purging old fsimages/edit logs.
     // The following has the side effect of purging old fsimages/edit logs.
     dstImage.saveFSImageInAllDirs(dstNamesystem, dstImage.getLastAppliedTxId());
     dstImage.saveFSImageInAllDirs(dstNamesystem, dstImage.getLastAppliedTxId());
-    if (!dstNamesystem.isRollingUpgrade()) {
-      dstStorage.writeAll();
+    if (!namenode.isRollingUpgrade()) {
+      dstImage.updateStorageVersion();
     }
     }
   }
   }
 }
 }

+ 8 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/protocol/NamenodeProtocol.java

@@ -193,5 +193,13 @@ public interface NamenodeProtocol {
   @Idempotent
   @Idempotent
   public boolean isUpgradeFinalized() throws IOException;
   public boolean isUpgradeFinalized() throws IOException;
 
 
+  /**
+   * return whether the Namenode is rolling upgrade in progress (true) or
+   * not (false).
+   * @return
+   * @throws IOException
+   */
+  @Idempotent
+  boolean isRollingUpgrade() throws IOException;
 }
 }
 
 

+ 16 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/proto/NamenodeProtocol.proto

@@ -192,6 +192,16 @@ message IsUpgradeFinalizedResponseProto {
   required bool isUpgradeFinalized = 1;
   required bool isUpgradeFinalized = 1;
 }
 }
 
 
+/**
+ * void request
+ */
+message IsRollingUpgradeRequestProto {
+}
+
+message IsRollingUpgradeResponseProto {
+  required bool isRollingUpgrade = 1;
+}
+
 /**
 /**
  * Protocol used by the sub-ordinate namenode to send requests
  * Protocol used by the sub-ordinate namenode to send requests
  * the active/primary namenode.
  * the active/primary namenode.
@@ -267,4 +277,10 @@ service NamenodeProtocolService {
    */
    */
   rpc isUpgradeFinalized(IsUpgradeFinalizedRequestProto)
   rpc isUpgradeFinalized(IsUpgradeFinalizedRequestProto)
       returns (IsUpgradeFinalizedResponseProto);
       returns (IsUpgradeFinalizedResponseProto);
+
+  /**
+   * Return whether the NameNode is in rolling upgrade (true) or not (false).
+   */
+  rpc isRollingUpgrade(IsRollingUpgradeRequestProto)
+      returns (IsRollingUpgradeResponseProto);
 }
 }