001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.hadoop.hdfs.protocol;
019    
020    import java.util.HashMap;
021    import java.util.Map;
022    
023    import org.apache.hadoop.classification.InterfaceAudience;
024    import org.apache.hadoop.fs.Path;
025    import org.apache.hadoop.hdfs.DFSConfigKeys;
026    import org.apache.hadoop.hdfs.DFSUtil;
027    import org.apache.hadoop.hdfs.HdfsConfiguration;
028    import org.apache.hadoop.hdfs.server.namenode.FSDirectory;
029    import org.apache.hadoop.hdfs.server.datanode.DataNode;
030    import org.apache.hadoop.hdfs.server.datanode.DataNodeLayoutVersion;
031    import org.apache.hadoop.hdfs.server.namenode.NameNode;
032    import org.apache.hadoop.hdfs.server.namenode.NameNodeLayoutVersion;
033    
034    /************************************
035     * Some handy constants
036     * 
037     ************************************/
038    @InterfaceAudience.Private
039    public class HdfsConstants {
040      /* Hidden constructor */
041      protected HdfsConstants() {
042      }
043      
044      /**
045       * HDFS Protocol Names:  
046       */
047      public static final String CLIENT_NAMENODE_PROTOCOL_NAME = 
048          "org.apache.hadoop.hdfs.protocol.ClientProtocol";
049      public static final String CLIENT_DATANODE_PROTOCOL_NAME = 
050          "org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol";
051      
052      
053      public static final int MIN_BLOCKS_FOR_WRITE = 1;
054    
055      // Long that indicates "leave current quota unchanged"
056      public static final long QUOTA_DONT_SET = Long.MAX_VALUE;
057      public static final long QUOTA_RESET = -1L;
058    
059      //
060      // Timeouts, constants
061      //
062      public static final long LEASE_SOFTLIMIT_PERIOD = 60 * 1000;
063      public static final long LEASE_HARDLIMIT_PERIOD = 60 * LEASE_SOFTLIMIT_PERIOD;
064      public static final long LEASE_RECOVER_PERIOD = 10 * 1000; // in ms
065    
066      // We need to limit the length and depth of a path in the filesystem.
067      // HADOOP-438
068      // Currently we set the maximum length to 8k characters and the maximum depth
069      // to 1k.
070      public static final int MAX_PATH_LENGTH = 8000;
071      public static final int MAX_PATH_DEPTH = 1000;
072    
073      // TODO should be conf injected?
074      public static final int DEFAULT_DATA_SOCKET_SIZE = 128 * 1024;
075      public static final int IO_FILE_BUFFER_SIZE = new HdfsConfiguration().getInt(
076          DFSConfigKeys.IO_FILE_BUFFER_SIZE_KEY,
077          DFSConfigKeys.IO_FILE_BUFFER_SIZE_DEFAULT);
078      // Used for writing header etc.
079      public static final int SMALL_BUFFER_SIZE = Math.min(IO_FILE_BUFFER_SIZE / 2,
080          512);
081    
082      public static final int BYTES_IN_INTEGER = Integer.SIZE / Byte.SIZE;
083    
084      // SafeMode actions
085      public static enum SafeModeAction {
086        SAFEMODE_LEAVE, SAFEMODE_ENTER, SAFEMODE_GET;
087      }
088    
089      public static enum RollingUpgradeAction {
090        QUERY, PREPARE, FINALIZE;
091        
092        private static final Map<String, RollingUpgradeAction> MAP
093            = new HashMap<String, RollingUpgradeAction>();
094        static {
095          MAP.put("", QUERY);
096          for(RollingUpgradeAction a : values()) {
097            MAP.put(a.name(), a);
098          }
099        }
100    
101        /** Covert the given String to a RollingUpgradeAction. */
102        public static RollingUpgradeAction fromString(String s) {
103          return MAP.get(s.toUpperCase());
104        }
105      }
106    
107      // type of the datanode report
108      public static enum DatanodeReportType {
109        ALL, LIVE, DEAD, DECOMMISSIONING
110      }
111    
112      // An invalid transaction ID that will never be seen in a real namesystem.
113      public static final long INVALID_TXID = -12345;
114    
115      // Number of generation stamps reserved for legacy blocks.
116      public static final long RESERVED_GENERATION_STAMPS_V1 =
117          1024L * 1024 * 1024 * 1024;
118    
119      /**
120       * URI Scheme for hdfs://namenode/ URIs.
121       */
122      public static final String HDFS_URI_SCHEME = "hdfs";
123    
124      /**
125       * A prefix put before the namenode URI inside the "service" field
126       * of a delgation token, indicating that the URI is a logical (HA)
127       * URI.
128       */
129      public static final String HA_DT_SERVICE_PREFIX = "ha-";
130    
131      /**
132       * Path components that are reserved in HDFS.
133       * <p>
134       * .reserved is only reserved under root ("/").
135       */
136      public static final String[] RESERVED_PATH_COMPONENTS = new String[] {
137        HdfsConstants.DOT_SNAPSHOT_DIR,
138        FSDirectory.DOT_RESERVED_STRING
139      };
140    
141      /**
142       * Current layout version for NameNode.
143       * Please see {@link NameNodeLayoutVersion.Feature} on adding new layout version.
144       */
145      public static final int NAMENODE_LAYOUT_VERSION
146          = NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION;
147    
148      /**
149       * Current layout version for DataNode.
150       * Please see {@link DataNodeLayoutVersion.Feature} on adding new layout version.
151       */
152      public static final int DATANODE_LAYOUT_VERSION
153          = DataNodeLayoutVersion.CURRENT_LAYOUT_VERSION;
154    
155      /**
156       * A special path component contained in the path for a snapshot file/dir
157       */
158      public static final String DOT_SNAPSHOT_DIR = ".snapshot";
159    
160      public static final byte[] DOT_SNAPSHOT_DIR_BYTES
161          = DFSUtil.string2Bytes(DOT_SNAPSHOT_DIR);
162      
163      public static final String SEPARATOR_DOT_SNAPSHOT_DIR
164          = Path.SEPARATOR + DOT_SNAPSHOT_DIR;
165    
166      public static final String SEPARATOR_DOT_SNAPSHOT_DIR_SEPARATOR
167          = Path.SEPARATOR + DOT_SNAPSHOT_DIR + Path.SEPARATOR;
168    
169      public static final String MEMORY_STORAGE_POLICY_NAME = "LAZY_PERSIST";
170      public static final String ALLSSD_STORAGE_POLICY_NAME = "ALL_SSD";
171      public static final String ONESSD_STORAGE_POLICY_NAME = "ONE_SSD";
172      public static final String HOT_STORAGE_POLICY_NAME = "HOT";
173      public static final String WARM_STORAGE_POLICY_NAME = "WARM";
174      public static final String COLD_STORAGE_POLICY_NAME = "COLD";
175    
176      public static final byte MEMORY_STORAGE_POLICY_ID = 15;
177      public static final byte ALLSSD_STORAGE_POLICY_ID = 12;
178      public static final byte ONESSD_STORAGE_POLICY_ID = 10;
179      public static final byte HOT_STORAGE_POLICY_ID = 7;
180      public static final byte WARM_STORAGE_POLICY_ID = 5;
181      public static final byte COLD_STORAGE_POLICY_ID = 2;
182    }