LocalFileSystem.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.fs;
  19. import java.io.*;
  20. import java.net.URI;
  21. import java.util.*;
  22. /****************************************************************
  23.  * Implement the FileSystem API for the checksumed local filesystem.
  24.  *
  25.  *****************************************************************/
  26. public class LocalFileSystem extends ChecksumFileSystem {
  27.   static final URI NAME = URI.create("file:///");
  28.   static private Random rand = new Random();
  29.   FileSystem rfs;
  30.   
  31.   public LocalFileSystem() {
  32.     this(new RawLocalFileSystem());
  33.   }
  34.   
  35.   public FileSystem getRaw() {
  36.     return rfs;
  37.   }
  38.     
  39.   public LocalFileSystem(FileSystem rawLocalFileSystem) {
  40.     super(rawLocalFileSystem);
  41.     rfs = rawLocalFileSystem;
  42.   }
  43.     
  44.   /** Convert a path to a File. */
  45.   public File pathToFile(Path path) {
  46.     return ((RawLocalFileSystem)fs).pathToFile(path);
  47.   }
  48.   @Override
  49.   public void copyFromLocalFile(boolean delSrc, Path src, Path dst)
  50.     throws IOException {
  51.     FileUtil.copy(this, src, this, dst, delSrc, getConf());
  52.   }
  53.   @Override
  54.   public void copyToLocalFile(boolean delSrc, Path src, Path dst)
  55.     throws IOException {
  56.     FileUtil.copy(this, src, this, dst, delSrc, getConf());
  57.   }
  58.   /**
  59.    * Moves files to a bad file directory on the same device, so that their
  60.    * storage will not be reused.
  61.    */
  62.   public boolean reportChecksumFailure(Path p, FSDataInputStream in,
  63.                                        long inPos,
  64.                                        FSDataInputStream sums, long sumsPos) {
  65.     try {
  66.       // canonicalize f
  67.       File f = ((RawLocalFileSystem)fs).pathToFile(p).getCanonicalFile();
  68.       
  69.       // find highest writable parent dir of f on the same device
  70.       String device = new DF(f, getConf()).getMount();
  71.       File parent = f.getParentFile();
  72.       File dir = null;
  73.       while (parent!=null && parent.canWrite() && parent.toString().startsWith(device)) {
  74.         dir = parent;
  75.         parent = parent.getParentFile();
  76.       }
  77.       if (dir==null) {
  78.         throw new IOException(
  79.                               "not able to find the highest writable parent dir");
  80.       }
  81.         
  82.       // move the file there
  83.       File badDir = new File(dir, "bad_files");
  84.       if (!badDir.mkdirs()) {
  85.         if (!badDir.isDirectory()) {
  86.           throw new IOException("Mkdirs failed to create " + badDir.toString());
  87.         }
  88.       }
  89.       String suffix = "." + rand.nextInt();
  90.       File badFile = new File(badDir, f.getName()+suffix);
  91.       LOG.warn("Moving bad file " + f + " to " + badFile);
  92.       in.close();                               // close it first
  93.       f.renameTo(badFile);                      // rename it
  94.       // move checksum file too
  95.       File checkFile = ((RawLocalFileSystem)fs).pathToFile(getChecksumFile(p));
  96.       checkFile.renameTo(new File(badDir, checkFile.getName()+suffix));
  97.     } catch (IOException e) {
  98.       LOG.warn("Error moving bad file " + p + ": " + e);
  99.     }
  100.     return false;
  101.   }
  102. }