DatanodeBlockInfo.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.hdfs.server.datanode;
  19. import java.io.File;
  20. import java.io.FileInputStream;
  21. import java.io.FileOutputStream;
  22. import java.io.IOException;
  23. import org.apache.hadoop.hdfs.protocol.Block;
  24. import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
  25. import org.apache.hadoop.fs.FileUtil;
  26. import org.apache.hadoop.fs.FileUtil.HardLink;
  27. import org.apache.hadoop.io.IOUtils;
  28. /**
  29.  * This class is used by the datanode to maintain the map from a block 
  30.  * to its metadata.
  31.  */
  32. class DatanodeBlockInfo {
  33.   private FSVolume volume;       // volume where the block belongs
  34.   private File     file;         // block file
  35.   private boolean detached;      // copy-on-write done for block
  36.   DatanodeBlockInfo(FSVolume vol, File file) {
  37.     this.volume = vol;
  38.     this.file = file;
  39.     detached = false;
  40.   }
  41.   DatanodeBlockInfo(FSVolume vol) {
  42.     this.volume = vol;
  43.     this.file = null;
  44.     detached = false;
  45.   }
  46.   FSVolume getVolume() {
  47.     return volume;
  48.   }
  49.   File getFile() {
  50.     return file;
  51.   }
  52.   /**
  53.    * Is this block already detached?
  54.    */
  55.   boolean isDetached() {
  56.     return detached;
  57.   }
  58.   /**
  59.    *  Block has been successfully detached
  60.    */
  61.   void setDetached() {
  62.     detached = true;
  63.   }
  64.   /**
  65.    * Copy specified file into a temporary file. Then rename the
  66.    * temporary file to the original name. This will cause any
  67.    * hardlinks to the original file to be removed. The temporary
  68.    * files are created in the detachDir. The temporary files will
  69.    * be recovered (especially on Windows) on datanode restart.
  70.    */
  71.   private void detachFile(File file, Block b) throws IOException {
  72.     File tmpFile = volume.createDetachFile(b, file.getName());
  73.     try {
  74.       IOUtils.copyBytes(new FileInputStream(file),
  75.                         new FileOutputStream(tmpFile),
  76.                         16*1024, true);
  77.       if (file.length() != tmpFile.length()) {
  78.         throw new IOException("Copy of file " + file + " size " + file.length()+
  79.                               " into file " + tmpFile +
  80.                               " resulted in a size of " + tmpFile.length());
  81.       }
  82.       FileUtil.replaceFile(tmpFile, file);
  83.     } catch (IOException e) {
  84.       boolean done = tmpFile.delete();
  85.       if (!done) {
  86.         DataNode.LOG.info("detachFile failed to delete temporary file " +
  87.                           tmpFile);
  88.       }
  89.       throw e;
  90.     }
  91.   }
  92.   /**
  93.    * Returns true if this block was copied, otherwise returns false.
  94.    */
  95.   boolean detachBlock(Block block, int numLinks) throws IOException {
  96.     if (isDetached()) {
  97.       return false;
  98.     }
  99.     if (file == null || volume == null) {
  100.       throw new IOException("detachBlock:Block not found. " + block);
  101.     }
  102.     File meta = FSDataset.getMetaFile(file, block);
  103.     if (meta == null) {
  104.       throw new IOException("Meta file not found for block " + block);
  105.     }
  106.     if (HardLink.getLinkCount(file) > numLinks) {
  107.       DataNode.LOG.info("CopyOnWrite for block " + block);
  108.       detachFile(file, block);
  109.     }
  110.     if (HardLink.getLinkCount(meta) > numLinks) {
  111.       detachFile(meta, block);
  112.     }
  113.     setDetached();
  114.     return true;
  115.   }
  116.   
  117.   public String toString() {
  118.     return getClass().getSimpleName() + "(volume=" + volume
  119.         + ", file=" + file + ", detached=" + detached + ")";
  120.   }
  121. }