Forráskód Böngészése

HADOOP-3270. Constant DatanodeCommands are stored in static final
immutable variables for better code clarity.
(Tsz Wo (Nicholas), SZE via dhruba)



git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@651165 13f79535-47bb-0310-9956-ffa450edef68

Dhruba Borthakur 17 éve
szülő
commit
a83c29dd7f

+ 4 - 0
CHANGES.txt

@@ -77,6 +77,10 @@ Trunk (unreleased changes)
     HADOOP-3300. Fix locking of explicit locks in NetworkTopology.
     (tomwhite via omalley)
 
+    HADOOP-3270. Constant DatanodeCommands are stored in static final
+    immutable variables for better code clarity.  
+    (Tsz Wo (Nicholas), SZE via dhruba)
+
 Release 0.17.0 - Unreleased
 
   INCOMPATIBLE CHANGES

+ 47 - 16
src/java/org/apache/hadoop/dfs/BlockCommand.java

@@ -20,14 +20,51 @@ package org.apache.hadoop.dfs;
 import java.io.*;
 import org.apache.hadoop.io.*;
 
-class DatanodeCommand implements Writable {
-  protected int action;
+abstract class DatanodeCommand implements Writable {
+  static class Register extends DatanodeCommand {
+    private Register() {super(DatanodeProtocol.DNA_REGISTER);}
+    public void readFields(DataInput in) {}
+    public void write(DataOutput out) {}
+  }
+
+  static class BlockReport extends DatanodeCommand {
+    private BlockReport() {super(DatanodeProtocol.DNA_BLOCKREPORT);}
+    public void readFields(DataInput in) {}
+    public void write(DataOutput out) {}
+  }
+
+  static class Finalize extends DatanodeCommand {
+    private Finalize() {super(DatanodeProtocol.DNA_FINALIZE);}
+    public void readFields(DataInput in) {}
+    public void write(DataOutput out) {}
+  }
+
+  static {                                      // register a ctor
+    WritableFactories.setFactory(Register.class,
+        new WritableFactory() {
+          public Writable newInstance() {return new Register();}
+        });
+    WritableFactories.setFactory(BlockReport.class,
+        new WritableFactory() {
+          public Writable newInstance() {return new BlockReport();}
+        });
+    WritableFactories.setFactory(Finalize.class,
+        new WritableFactory() {
+          public Writable newInstance() {return new Finalize();}
+        });
+  }
+
+  static final DatanodeCommand REGISTER = new Register();
+  static final DatanodeCommand BLOCKREPORT = new BlockReport();
+  static final DatanodeCommand FINALIZE = new Finalize();
+
+  private int action;
   
   public DatanodeCommand() {
     this(DatanodeProtocol.DNA_UNKNOWN);
   }
   
-  public DatanodeCommand(int action) {
+  DatanodeCommand(int action) {
     this.action = action;
   }
 
@@ -38,14 +75,6 @@ class DatanodeCommand implements Writable {
   ///////////////////////////////////////////
   // Writable
   ///////////////////////////////////////////
-  static {                                      // register a ctor
-    WritableFactories.setFactory
-      (BlockCommand.class,
-       new WritableFactory() {
-         public Writable newInstance() { return new DatanodeCommand(); }
-       });
-  }
-
   public void write(DataOutput out) throws IOException {
     out.writeInt(this.action);
   }
@@ -74,27 +103,29 @@ class BlockCommand extends DatanodeCommand {
    * @param blocks    blocks to be transferred 
    * @param targets   nodes to transfer
    */
-  public BlockCommand(Block blocks[], DatanodeInfo targets[][]) {
+  BlockCommand(Block blocks[], DatanodeInfo targets[][]) {
     super( DatanodeProtocol.DNA_TRANSFER);
     this.blocks = blocks;
     this.targets = targets;
   }
 
+  private static final DatanodeInfo[][] EMPTY_TARGET = {};
+
   /**
    * Create BlockCommand for the given action
    * @param blocks blocks related to the action
    */
-  public BlockCommand(int action, Block blocks[]) {
+  BlockCommand(int action, Block blocks[]) {
     super(action);
     this.blocks = blocks;
-    this.targets = new DatanodeInfo[0][];
+    this.targets = EMPTY_TARGET;
   }
 
-  public Block[] getBlocks() {
+  Block[] getBlocks() {
     return blocks;
   }
 
-  public DatanodeInfo[][] getTargets() {
+  DatanodeInfo[][] getTargets() {
     return targets;
   }
 

+ 3 - 3
src/java/org/apache/hadoop/dfs/FSNamesystem.java

@@ -2184,7 +2184,7 @@ class FSNamesystem implements FSConstants, FSNamesystemMBean {
         try {
           nodeinfo = getDatanode(nodeReg);
         } catch(UnregisteredDatanodeException e) {
-          return new DatanodeCommand(DatanodeProtocol.DNA_REGISTER);
+          return DatanodeCommand.REGISTER;
         }
           
         // Check if this datanode should actually be shutdown instead. 
@@ -2194,7 +2194,7 @@ class FSNamesystem implements FSConstants, FSNamesystemMBean {
         }
 
         if (nodeinfo == null || !nodeinfo.isAlive) {
-          return new DatanodeCommand(DatanodeProtocol.DNA_REGISTER);
+          return DatanodeCommand.REGISTER;
         }
 
         updateStats(nodeinfo, false);
@@ -2220,7 +2220,7 @@ class FSNamesystem implements FSConstants, FSNamesystemMBean {
       // have any work for that as well
       assert(cmd == null);
       if (isResolved(nodeReg)) {
-        return new DatanodeCommand(DatanodeProtocol.DNA_BLOCKREPORT);
+        return DatanodeCommand.BLOCKREPORT;
       }
     }
     //check distributed upgrade

+ 1 - 1
src/java/org/apache/hadoop/dfs/NameNode.java

@@ -559,7 +559,7 @@ public class NameNode implements ClientProtocol, DatanodeProtocol,
     if (blocksToDelete != null && blocksToDelete.length > 0)
       return new BlockCommand(DatanodeProtocol.DNA_INVALIDATE, blocksToDelete);
     if (getFSImage().isUpgradeFinalized())
-      return new DatanodeCommand(DatanodeProtocol.DNA_FINALIZE);
+      return DatanodeCommand.FINALIZE;
     return null;
   }
 

+ 1 - 1
src/test/org/apache/hadoop/dfs/TestDistributedUpgrade.java

@@ -174,7 +174,7 @@ class UO_Namenode extends UpgradeObjectNamenode {
 
   synchronized public UpgradeCommand processUpgradeCommand(
                                   UpgradeCommand command) throws IOException {
-    switch(command.action) {
+    switch(command.getAction()) {
       case UpgradeCommand.UC_ACTION_REPORT_STATUS:
         this.status += command.getCurrentStatus()/8;  // 4 reports needed
         break;