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 */
018package org.apache.hadoop.hdfs.client;
019
020import org.apache.hadoop.classification.InterfaceAudience;
021import org.apache.hadoop.hdfs.protocol.HdfsConstants;
022
023import java.util.concurrent.TimeUnit;
024
025/** Client configuration properties */
026@InterfaceAudience.Private
027public interface HdfsClientConfigKeys {
028  long SECOND = 1000L;
029  long MINUTE = 60 * SECOND;
030
031  String  DFS_BLOCK_SIZE_KEY = "dfs.blocksize";
032  long    DFS_BLOCK_SIZE_DEFAULT = 128*1024*1024;
033  String  DFS_REPLICATION_KEY = "dfs.replication";
034  short   DFS_REPLICATION_DEFAULT = 3;
035  String  DFS_WEBHDFS_USER_PATTERN_KEY =
036      "dfs.webhdfs.user.provider.user.pattern";
037  String  DFS_WEBHDFS_USER_PATTERN_DEFAULT = "^[A-Za-z_][A-Za-z0-9._-]*[$]?$";
038  String DFS_WEBHDFS_ACL_PERMISSION_PATTERN_DEFAULT =
039      "^(default:)?(user|group|mask|other):[[A-Za-z_][A-Za-z0-9._-]]*:([rwx-]{3})?(,(default:)?(user|group|mask|other):[[A-Za-z_][A-Za-z0-9._-]]*:([rwx-]{3})?)*$";
040
041  String  DFS_WEBHDFS_SOCKET_CONNECT_TIMEOUT_KEY =
042      "dfs.webhdfs.socket.connect-timeout";
043  String  DFS_WEBHDFS_SOCKET_READ_TIMEOUT_KEY =
044      "dfs.webhdfs.socket.read-timeout";
045
046  String DFS_WEBHDFS_OAUTH_ENABLED_KEY = "dfs.webhdfs.oauth2.enabled";
047  boolean DFS_WEBHDFS_OAUTH_ENABLED_DEFAULT = false;
048
049  String DFS_WEBHDFS_REST_CSRF_ENABLED_KEY = "dfs.webhdfs.rest-csrf.enabled";
050  boolean DFS_WEBHDFS_REST_CSRF_ENABLED_DEFAULT = false;
051  String DFS_WEBHDFS_REST_CSRF_CUSTOM_HEADER_KEY =
052      "dfs.webhdfs.rest-csrf.custom-header";
053  String DFS_WEBHDFS_REST_CSRF_CUSTOM_HEADER_DEFAULT = "X-XSRF-HEADER";
054  String DFS_WEBHDFS_REST_CSRF_METHODS_TO_IGNORE_KEY =
055      "dfs.webhdfs.rest-csrf.methods-to-ignore";
056  String DFS_WEBHDFS_REST_CSRF_METHODS_TO_IGNORE_DEFAULT =
057      "GET,OPTIONS,HEAD,TRACE";
058  String DFS_WEBHDFS_REST_CSRF_BROWSER_USERAGENTS_REGEX_KEY =
059      "dfs.webhdfs.rest-csrf.browser-useragents-regex";
060
061  String OAUTH_CLIENT_ID_KEY = "dfs.webhdfs.oauth2.client.id";
062  String OAUTH_REFRESH_URL_KEY = "dfs.webhdfs.oauth2.refresh.url";
063
064  String ACCESS_TOKEN_PROVIDER_KEY = "dfs.webhdfs.oauth2.access.token.provider";
065
066  String PREFIX = "dfs.client.";
067  String  DFS_NAMESERVICES = "dfs.nameservices";
068  int     DFS_NAMENODE_HTTP_PORT_DEFAULT = 50070;
069  String  DFS_NAMENODE_HTTP_ADDRESS_KEY = "dfs.namenode.http-address";
070  int     DFS_NAMENODE_HTTPS_PORT_DEFAULT = 50470;
071  String  DFS_NAMENODE_HTTPS_ADDRESS_KEY = "dfs.namenode.https-address";
072  String DFS_HA_NAMENODES_KEY_PREFIX = "dfs.ha.namenodes";
073  String  DFS_WEBHDFS_ENABLED_KEY = "dfs.webhdfs.enabled";
074  boolean DFS_WEBHDFS_ENABLED_DEFAULT = true;
075  String  DFS_NAMENODE_HTTP_PORT_KEY = "dfs.http.port";
076  String  DFS_NAMENODE_HTTPS_PORT_KEY = "dfs.https.port";
077  int DFS_NAMENODE_RPC_PORT_DEFAULT = 8020;
078  String DFS_NAMENODE_KERBEROS_PRINCIPAL_KEY =
079      "dfs.namenode.kerberos.principal";
080  String  DFS_CLIENT_WRITE_PACKET_SIZE_KEY = "dfs.client-write-packet-size";
081  int     DFS_CLIENT_WRITE_PACKET_SIZE_DEFAULT = 64*1024;
082  String  DFS_CLIENT_SOCKET_TIMEOUT_KEY = "dfs.client.socket-timeout";
083  String  DFS_CLIENT_SOCKET_SEND_BUFFER_SIZE_KEY =
084      "dfs.client.socket.send.buffer.size";
085  int     DFS_CLIENT_SOCKET_SEND_BUFFER_SIZE_DEFAULT =
086      HdfsConstants.DEFAULT_DATA_SOCKET_SIZE;
087  String  DFS_CLIENT_SOCKET_CACHE_CAPACITY_KEY =
088      "dfs.client.socketcache.capacity";
089  int     DFS_CLIENT_SOCKET_CACHE_CAPACITY_DEFAULT = 16;
090  String  DFS_CLIENT_SOCKET_CACHE_EXPIRY_MSEC_KEY =
091      "dfs.client.socketcache.expiryMsec";
092  long    DFS_CLIENT_SOCKET_CACHE_EXPIRY_MSEC_DEFAULT = 3000;
093  String  DFS_CLIENT_USE_DN_HOSTNAME = "dfs.client.use.datanode.hostname";
094  boolean DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT = false;
095  String  DFS_CLIENT_CACHE_DROP_BEHIND_WRITES =
096      "dfs.client.cache.drop.behind.writes";
097  String  DFS_CLIENT_CACHE_DROP_BEHIND_READS =
098      "dfs.client.cache.drop.behind.reads";
099  String  DFS_CLIENT_CACHE_READAHEAD = "dfs.client.cache.readahead";
100  String  DFS_CLIENT_CACHED_CONN_RETRY_KEY = "dfs.client.cached.conn.retry";
101  int     DFS_CLIENT_CACHED_CONN_RETRY_DEFAULT = 3;
102  String  DFS_CLIENT_CONTEXT = "dfs.client.context";
103  String  DFS_CLIENT_CONTEXT_DEFAULT = "default";
104  String  DFS_CLIENT_FILE_BLOCK_STORAGE_LOCATIONS_NUM_THREADS =
105      "dfs.client.file-block-storage-locations.num-threads";
106  int     DFS_CLIENT_FILE_BLOCK_STORAGE_LOCATIONS_NUM_THREADS_DEFAULT = 10;
107  String  DFS_CLIENT_FILE_BLOCK_STORAGE_LOCATIONS_TIMEOUT_MS =
108      "dfs.client.file-block-storage-locations.timeout.millis";
109  int     DFS_CLIENT_FILE_BLOCK_STORAGE_LOCATIONS_TIMEOUT_MS_DEFAULT = 1000;
110  String  DFS_CLIENT_USE_LEGACY_BLOCKREADER =
111      "dfs.client.use.legacy.blockreader";
112  boolean DFS_CLIENT_USE_LEGACY_BLOCKREADER_DEFAULT = false;
113  String  DFS_CLIENT_USE_LEGACY_BLOCKREADERLOCAL =
114      "dfs.client.use.legacy.blockreader.local";
115  boolean DFS_CLIENT_USE_LEGACY_BLOCKREADERLOCAL_DEFAULT = false;
116  String  DFS_CLIENT_DATANODE_RESTART_TIMEOUT_KEY =
117      "dfs.client.datanode-restart.timeout";
118  long    DFS_CLIENT_DATANODE_RESTART_TIMEOUT_DEFAULT = 30;
119  // Much code in hdfs is not yet updated to use these keys.
120  // the initial delay (unit is ms) for locateFollowingBlock, the delay time
121  // will increase exponentially(double) for each retry.
122  String  DFS_CLIENT_MAX_BLOCK_ACQUIRE_FAILURES_KEY =
123      "dfs.client.max.block.acquire.failures";
124  int     DFS_CLIENT_MAX_BLOCK_ACQUIRE_FAILURES_DEFAULT = 3;
125  String  DFS_CHECKSUM_TYPE_KEY = "dfs.checksum.type";
126  String  DFS_CHECKSUM_TYPE_DEFAULT = "CRC32C";
127  String  DFS_BYTES_PER_CHECKSUM_KEY = "dfs.bytes-per-checksum";
128  int     DFS_BYTES_PER_CHECKSUM_DEFAULT = 512;
129  String  DFS_DATANODE_SOCKET_WRITE_TIMEOUT_KEY =
130      "dfs.datanode.socket.write.timeout";
131  String  DFS_CLIENT_DOMAIN_SOCKET_DATA_TRAFFIC =
132      "dfs.client.domain.socket.data.traffic";
133  boolean DFS_CLIENT_DOMAIN_SOCKET_DATA_TRAFFIC_DEFAULT = false;
134  String  DFS_DOMAIN_SOCKET_PATH_KEY = "dfs.domain.socket.path";
135  String  DFS_DOMAIN_SOCKET_PATH_DEFAULT = "";
136  String  DFS_SHORT_CIRCUIT_SHARED_MEMORY_WATCHER_INTERRUPT_CHECK_MS =
137      "dfs.short.circuit.shared.memory.watcher.interrupt.check.ms";
138  int     DFS_SHORT_CIRCUIT_SHARED_MEMORY_WATCHER_INTERRUPT_CHECK_MS_DEFAULT =
139      60000;
140  String  DFS_CLIENT_SLOW_IO_WARNING_THRESHOLD_KEY =
141      "dfs.client.slow.io.warning.threshold.ms";
142  long    DFS_CLIENT_SLOW_IO_WARNING_THRESHOLD_DEFAULT = 30000;
143  String  DFS_CLIENT_KEY_PROVIDER_CACHE_EXPIRY_MS =
144          "dfs.client.key.provider.cache.expiry";
145  long    DFS_CLIENT_KEY_PROVIDER_CACHE_EXPIRY_DEFAULT =
146              TimeUnit.DAYS.toMillis(10); // 10 days
147  String  DFS_HDFS_BLOCKS_METADATA_ENABLED =
148      "dfs.datanode.hdfs-blocks-metadata.enabled";
149  boolean DFS_HDFS_BLOCKS_METADATA_ENABLED_DEFAULT = false;
150
151  String  DFS_DATANODE_KERBEROS_PRINCIPAL_KEY =
152      "dfs.datanode.kerberos.principal";
153  String  DFS_DATANODE_READAHEAD_BYTES_KEY = "dfs.datanode.readahead.bytes";
154  long    DFS_DATANODE_READAHEAD_BYTES_DEFAULT = 4 * 1024 * 1024; // 4MB
155
156  String DFS_ENCRYPT_DATA_TRANSFER_CIPHER_SUITES_KEY =
157      "dfs.encrypt.data.transfer.cipher.suites";
158
159  String DFS_DATA_TRANSFER_PROTECTION_KEY = "dfs.data.transfer.protection";
160  String DFS_DATA_TRANSFER_PROTECTION_DEFAULT = "";
161  String DFS_DATA_TRANSFER_SASL_PROPS_RESOLVER_CLASS_KEY =
162      "dfs.data.transfer.saslproperties.resolver.class";
163
164  String DFS_ENCRYPT_DATA_TRANSFER_CIPHER_KEY_BITLENGTH_KEY =
165      "dfs.encrypt.data.transfer.cipher.key.bitlength";
166  int    DFS_ENCRYPT_DATA_TRANSFER_CIPHER_KEY_BITLENGTH_DEFAULT = 128;
167
168  String DFS_TRUSTEDCHANNEL_RESOLVER_CLASS =
169      "dfs.trustedchannel.resolver.class";
170
171  String REPLICA_ACCESSOR_BUILDER_CLASSES_KEY =
172      PREFIX + "replica.accessor.builder.classes";
173
174  // The number of NN response dropped by client proactively in each RPC call.
175  // For testing NN retry cache, we can set this property with positive value.
176  String  DFS_CLIENT_TEST_DROP_NAMENODE_RESPONSE_NUM_KEY =
177      "dfs.client.test.drop.namenode.response.number";
178  int     DFS_CLIENT_TEST_DROP_NAMENODE_RESPONSE_NUM_DEFAULT = 0;
179  String  DFS_CLIENT_LOCAL_INTERFACES = "dfs.client.local.interfaces";
180  String  DFS_USER_HOME_DIR_PREFIX_KEY = "dfs.user.home.dir.prefix";
181  String  DFS_USER_HOME_DIR_PREFIX_DEFAULT = "/user";
182
183  String DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_KEY =
184      "dfs.data.transfer.client.tcpnodelay";
185  boolean DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_DEFAULT = true;
186
187  /**
188   * These are deprecated config keys to client code.
189   */
190  interface DeprecatedKeys {
191    String DFS_NAMENODE_BACKUP_ADDRESS_KEY =
192        "dfs.namenode.backup.address";
193    String DFS_NAMENODE_BACKUP_HTTP_ADDRESS_KEY =
194        "dfs.namenode.backup.http-address";
195    String DFS_DATANODE_BALANCE_BANDWIDTHPERSEC_KEY =
196        "dfs.datanode.balance.bandwidthPerSec";
197    //Following keys have no defaults
198    String DFS_DATANODE_DATA_DIR_KEY = "dfs.datanode.data.dir";
199    String DFS_NAMENODE_MAX_OBJECTS_KEY = "dfs.namenode.max.objects";
200    String DFS_NAMENODE_NAME_DIR_KEY = "dfs.namenode.name.dir";
201    String DFS_NAMENODE_NAME_DIR_RESTORE_KEY = "dfs.namenode.name.dir.restore";
202    String DFS_NAMENODE_EDITS_DIR_KEY = "dfs.namenode.edits.dir";
203    String DFS_NAMENODE_SAFEMODE_EXTENSION_KEY =
204        "dfs.namenode.safemode.extension";
205    String DFS_NAMENODE_SAFEMODE_THRESHOLD_PCT_KEY =
206        "dfs.namenode.safemode.threshold-pct";
207    String DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY =
208        "dfs.namenode.secondary.http-address";
209    String DFS_NAMENODE_CHECKPOINT_DIR_KEY = "dfs.namenode.checkpoint.dir";
210    String DFS_NAMENODE_CHECKPOINT_EDITS_DIR_KEY =
211        "dfs.namenode.checkpoint.edits.dir";
212    String DFS_NAMENODE_CHECKPOINT_PERIOD_KEY =
213        "dfs.namenode.checkpoint.period";
214    String DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_KEY =
215        "dfs.namenode.heartbeat.recheck-interval";
216    String DFS_CLIENT_HTTPS_KEYSTORE_RESOURCE_KEY =
217        "dfs.client.https.keystore.resource";
218    String DFS_CLIENT_HTTPS_NEED_AUTH_KEY = "dfs.client.https.need-auth";
219    String DFS_DATANODE_HOST_NAME_KEY = "dfs.datanode.hostname";
220    String DFS_METRICS_SESSION_ID_KEY = "dfs.metrics.session-id";
221    String DFS_NAMENODE_ACCESSTIME_PRECISION_KEY =
222        "dfs.namenode.accesstime.precision";
223    String DFS_NAMENODE_REPLICATION_CONSIDERLOAD_KEY =
224        "dfs.namenode.replication.considerLoad";
225    String DFS_NAMENODE_REPLICATION_INTERVAL_KEY =
226        "dfs.namenode.replication.interval";
227    String DFS_NAMENODE_REPLICATION_MIN_KEY = "dfs.namenode.replication.min";
228    String DFS_NAMENODE_REPLICATION_PENDING_TIMEOUT_SEC_KEY =
229        "dfs.namenode.replication.pending.timeout-sec";
230    String DFS_NAMENODE_REPLICATION_MAX_STREAMS_KEY =
231        "dfs.namenode.replication.max-streams";
232    String DFS_PERMISSIONS_ENABLED_KEY = "dfs.permissions.enabled";
233    String DFS_PERMISSIONS_SUPERUSERGROUP_KEY =
234        "dfs.permissions.superusergroup";
235    String DFS_DATANODE_MAX_RECEIVER_THREADS_KEY =
236        "dfs.datanode.max.transfer.threads";
237    String DFS_NAMESERVICE_ID = "dfs.nameservice.id";
238  }
239
240  /** dfs.client.retry configuration properties */
241  interface Retry {
242    String PREFIX = HdfsClientConfigKeys.PREFIX + "retry.";
243
244    String  POLICY_ENABLED_KEY = PREFIX + "policy.enabled";
245    boolean POLICY_ENABLED_DEFAULT = false;
246    String  POLICY_SPEC_KEY = PREFIX + "policy.spec";
247    String  POLICY_SPEC_DEFAULT = "10000,6,60000,10"; //t1,n1,t2,n2,...
248
249    String  TIMES_GET_LAST_BLOCK_LENGTH_KEY =
250        PREFIX + "times.get-last-block-length";
251    int     TIMES_GET_LAST_BLOCK_LENGTH_DEFAULT = 3;
252    String  INTERVAL_GET_LAST_BLOCK_LENGTH_KEY =
253        PREFIX + "interval-ms.get-last-block-length";
254    int     INTERVAL_GET_LAST_BLOCK_LENGTH_DEFAULT = 4000;
255
256    String  MAX_ATTEMPTS_KEY = PREFIX + "max.attempts";
257    int     MAX_ATTEMPTS_DEFAULT = 10;
258
259    String  WINDOW_BASE_KEY = PREFIX + "window.base";
260    int     WINDOW_BASE_DEFAULT = 3000;
261  }
262
263  /** dfs.client.failover configuration properties */
264  interface Failover {
265    String PREFIX = HdfsClientConfigKeys.PREFIX + "failover.";
266
267    String  PROXY_PROVIDER_KEY_PREFIX = PREFIX + "proxy.provider";
268    String  MAX_ATTEMPTS_KEY = PREFIX + "max.attempts";
269    int     MAX_ATTEMPTS_DEFAULT = 15;
270    String  SLEEPTIME_BASE_KEY = PREFIX + "sleep.base.millis";
271    int     SLEEPTIME_BASE_DEFAULT = 500;
272    String  SLEEPTIME_MAX_KEY = PREFIX + "sleep.max.millis";
273    int     SLEEPTIME_MAX_DEFAULT = 15000;
274    String  CONNECTION_RETRIES_KEY = PREFIX + "connection.retries";
275    int     CONNECTION_RETRIES_DEFAULT = 0;
276    String  CONNECTION_RETRIES_ON_SOCKET_TIMEOUTS_KEY =
277        PREFIX + "connection.retries.on.timeouts";
278    int     CONNECTION_RETRIES_ON_SOCKET_TIMEOUTS_DEFAULT = 0;
279  }
280
281  /** dfs.client.write configuration properties */
282  interface Write {
283    String PREFIX = HdfsClientConfigKeys.PREFIX + "write.";
284
285    String  MAX_PACKETS_IN_FLIGHT_KEY = PREFIX + "max-packets-in-flight";
286    int     MAX_PACKETS_IN_FLIGHT_DEFAULT = 80;
287    String  EXCLUDE_NODES_CACHE_EXPIRY_INTERVAL_KEY =
288        PREFIX + "exclude.nodes.cache.expiry.interval.millis";
289    long    EXCLUDE_NODES_CACHE_EXPIRY_INTERVAL_DEFAULT = 10*MINUTE;
290
291    interface ByteArrayManager {
292      String PREFIX = Write.PREFIX + "byte-array-manager.";
293
294      String  ENABLED_KEY = PREFIX + "enabled";
295      boolean ENABLED_DEFAULT = false;
296      String  COUNT_THRESHOLD_KEY = PREFIX + "count-threshold";
297      int     COUNT_THRESHOLD_DEFAULT = 128;
298      String  COUNT_LIMIT_KEY = PREFIX + "count-limit";
299      int     COUNT_LIMIT_DEFAULT = 2048;
300      String  COUNT_RESET_TIME_PERIOD_MS_KEY =
301          PREFIX + "count-reset-time-period-ms";
302      long    COUNT_RESET_TIME_PERIOD_MS_DEFAULT = 10*SECOND;
303    }
304  }
305
306  /** dfs.client.block.write configuration properties */
307  interface BlockWrite {
308    String PREFIX = HdfsClientConfigKeys.PREFIX + "block.write.";
309
310    String  RETRIES_KEY = PREFIX + "retries";
311    int     RETRIES_DEFAULT = 3;
312    String  LOCATEFOLLOWINGBLOCK_RETRIES_KEY =
313        PREFIX + "locateFollowingBlock.retries";
314    int     LOCATEFOLLOWINGBLOCK_RETRIES_DEFAULT = 5;
315    String  LOCATEFOLLOWINGBLOCK_INITIAL_DELAY_MS_KEY =
316        PREFIX + "locateFollowingBlock.initial.delay.ms";
317    int     LOCATEFOLLOWINGBLOCK_INITIAL_DELAY_MS_DEFAULT = 400;
318
319    interface ReplaceDatanodeOnFailure {
320      String PREFIX = BlockWrite.PREFIX + "replace-datanode-on-failure.";
321
322      String  ENABLE_KEY = PREFIX + "enable";
323      boolean ENABLE_DEFAULT = true;
324      String  POLICY_KEY = PREFIX + "policy";
325      String  POLICY_DEFAULT = "DEFAULT";
326      String  BEST_EFFORT_KEY = PREFIX + "best-effort";
327      boolean BEST_EFFORT_DEFAULT = false;
328    }
329  }
330
331  /** dfs.client.read configuration properties */
332  interface Read {
333    String PREFIX = HdfsClientConfigKeys.PREFIX + "read.";
334
335    String  PREFETCH_SIZE_KEY = PREFIX + "prefetch.size";
336
337    interface ShortCircuit {
338      String PREFIX = Read.PREFIX + "shortcircuit.";
339
340      String  KEY = PREFIX.substring(0, PREFIX.length()-1);
341      boolean DEFAULT = false;
342      String  SKIP_CHECKSUM_KEY = PREFIX + "skip.checksum";
343      boolean SKIP_CHECKSUM_DEFAULT = false;
344      String  BUFFER_SIZE_KEY = PREFIX + "buffer.size";
345      int     BUFFER_SIZE_DEFAULT = 1024 * 1024;
346
347      String  STREAMS_CACHE_SIZE_KEY = PREFIX + "streams.cache.size";
348      int     STREAMS_CACHE_SIZE_DEFAULT = 256;
349      String  STREAMS_CACHE_EXPIRY_MS_KEY = PREFIX + "streams.cache.expiry.ms";
350      long    STREAMS_CACHE_EXPIRY_MS_DEFAULT = 5*MINUTE;
351    }
352  }
353
354  /** dfs.client.short.circuit configuration properties */
355  interface ShortCircuit {
356    String PREFIX = Read.PREFIX + "short.circuit.";
357
358    String  REPLICA_STALE_THRESHOLD_MS_KEY =
359        PREFIX + "replica.stale.threshold.ms";
360    long    REPLICA_STALE_THRESHOLD_MS_DEFAULT = 30*MINUTE;
361  }
362
363  /** dfs.client.mmap configuration properties */
364  interface Mmap {
365    String PREFIX = HdfsClientConfigKeys.PREFIX + "mmap.";
366
367    String  ENABLED_KEY = PREFIX + "enabled";
368    boolean ENABLED_DEFAULT = true;
369    String  CACHE_SIZE_KEY = PREFIX + "cache.size";
370    int     CACHE_SIZE_DEFAULT = 256;
371    String  CACHE_TIMEOUT_MS_KEY = PREFIX + "cache.timeout.ms";
372    long    CACHE_TIMEOUT_MS_DEFAULT  = 60*MINUTE;
373    String  RETRY_TIMEOUT_MS_KEY = PREFIX + "retry.timeout.ms";
374    long    RETRY_TIMEOUT_MS_DEFAULT = 5*MINUTE;
375  }
376
377  /** dfs.client.hedged.read configuration properties */
378  interface HedgedRead {
379    String PREFIX = HdfsClientConfigKeys.PREFIX + "hedged.read.";
380
381    String  THRESHOLD_MILLIS_KEY = PREFIX + "threshold.millis";
382    long    THRESHOLD_MILLIS_DEFAULT = 500;
383    String  THREADPOOL_SIZE_KEY = PREFIX + "threadpool.size";
384    int     THREADPOOL_SIZE_DEFAULT = 0;
385  }
386
387  /** dfs.http.client configuration properties */
388  interface HttpClient {
389    String  PREFIX = "dfs.http.client.";
390
391    // retry
392    String  RETRY_POLICY_ENABLED_KEY = PREFIX + "retry.policy.enabled";
393    boolean RETRY_POLICY_ENABLED_DEFAULT = false;
394    String  RETRY_POLICY_SPEC_KEY = PREFIX + "retry.policy.spec";
395    String  RETRY_POLICY_SPEC_DEFAULT = "10000,6,60000,10"; //t1,n1,t2,n2,...
396    String  RETRY_MAX_ATTEMPTS_KEY = PREFIX + "retry.max.attempts";
397    int     RETRY_MAX_ATTEMPTS_DEFAULT = 10;
398
399    // failover
400    String  FAILOVER_MAX_ATTEMPTS_KEY = PREFIX + "failover.max.attempts";
401    int     FAILOVER_MAX_ATTEMPTS_DEFAULT =  15;
402    String  FAILOVER_SLEEPTIME_BASE_KEY = PREFIX + "failover.sleep.base.millis";
403    int     FAILOVER_SLEEPTIME_BASE_DEFAULT = 500;
404    String  FAILOVER_SLEEPTIME_MAX_KEY = PREFIX + "failover.sleep.max.millis";
405    int     FAILOVER_SLEEPTIME_MAX_DEFAULT =  15000;
406  }
407}