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

网格计算

开发平台:

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.namenode;
  19. import java.io.*;
  20. import java.net.*;
  21. import java.util.Iterator;
  22. import java.util.Map;
  23. import javax.servlet.http.HttpServletResponse;
  24. import javax.servlet.http.HttpServletRequest;
  25. import org.apache.hadoop.hdfs.protocol.FSConstants;
  26. import org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.ErrorSimulator;
  27. /**
  28.  * This class provides fetching a specified file from the NameNode.
  29.  */
  30. class TransferFsImage implements FSConstants {
  31.   
  32.   private boolean isGetImage;
  33.   private boolean isGetEdit;
  34.   private boolean isPutImage;
  35.   private int remoteport;
  36.   private String machineName;
  37.   private CheckpointSignature token;
  38.   
  39.   /**
  40.    * File downloader.
  41.    * @param pmap key=value[] map that is passed to the http servlet as 
  42.    *        url parameters
  43.    * @param request the object from which this servelet reads the url contents
  44.    * @param response the object into which this servelet writes the url contents
  45.    * @throws IOException
  46.    */
  47.   public TransferFsImage(Map<String,String[]> pmap,
  48.                          HttpServletRequest request,
  49.                          HttpServletResponse response
  50.                          ) throws IOException {
  51.     isGetImage = isGetEdit = isPutImage = false;
  52.     remoteport = 0;
  53.     machineName = null;
  54.     token = null;
  55.     for (Iterator<String> it = pmap.keySet().iterator(); it.hasNext();) {
  56.       String key = it.next();
  57.       if (key.equals("getimage")) { 
  58.         isGetImage = true;
  59.       } else if (key.equals("getedit")) { 
  60.         isGetEdit = true;
  61.       } else if (key.equals("putimage")) { 
  62.         isPutImage = true;
  63.       } else if (key.equals("port")) { 
  64.         remoteport = new Integer(pmap.get("port")[0]).intValue();
  65.       } else if (key.equals("machine")) { 
  66.         machineName = pmap.get("machine")[0];
  67.       } else if (key.equals("token")) { 
  68.         token = new CheckpointSignature(pmap.get("token")[0]);
  69.       }
  70.     }
  71.     int numGets = (isGetImage?1:0) + (isGetEdit?1:0);
  72.     if ((numGets > 1) || (numGets == 0) && !isPutImage) {
  73.       throw new IOException("Illegal parameters to TransferFsImage");
  74.     }
  75.   }
  76.   boolean getEdit() {
  77.     return isGetEdit;
  78.   }
  79.   boolean getImage() {
  80.     return isGetImage;
  81.   }
  82.   boolean putImage() {
  83.     return isPutImage;
  84.   }
  85.   CheckpointSignature getToken() {
  86.     return token;
  87.   }
  88.   String getInfoServer() throws IOException{
  89.     if (machineName == null || remoteport == 0) {
  90.       throw new IOException ("MachineName and port undefined");
  91.     }
  92.     return machineName + ":" + remoteport;
  93.   }
  94.   /**
  95.    * A server-side method to respond to a getfile http request
  96.    * Copies the contents of the local file into the output stream.
  97.    */
  98.   static void getFileServer(OutputStream outstream, File localfile) 
  99.     throws IOException {
  100.     byte buf[] = new byte[BUFFER_SIZE];
  101.     FileInputStream infile = null;
  102.     try {
  103.       infile = new FileInputStream(localfile);
  104.       if (ErrorSimulator.getErrorSimulation(2)
  105.           && localfile.getAbsolutePath().contains("secondary")) {
  106.         // throw exception only when the secondary sends its image
  107.         throw new IOException("If this exception is not caught by the " +
  108.             "name-node fs image will be truncated.");
  109.       }
  110.       int num = 1;
  111.       while (num > 0) {
  112.         num = infile.read(buf);
  113.         if (num <= 0) {
  114.           break;
  115.         }
  116.         outstream.write(buf, 0, num);
  117.       }
  118.     } finally {
  119.       if (infile != null) {
  120.         infile.close();
  121.       }
  122.     }
  123.   }
  124.   /**
  125.    * Client-side Method to fetch file from a server
  126.    * Copies the response from the URL to a list of local files.
  127.    */
  128.   static void getFileClient(String fsName, String id, File[] localPath)
  129.     throws IOException {
  130.     byte[] buf = new byte[BUFFER_SIZE];
  131.     StringBuffer str = new StringBuffer("http://"+fsName+"/getimage?");
  132.     str.append(id);
  133.     //
  134.     // open connection to remote server
  135.     //
  136.     URL url = new URL(str.toString());
  137.     URLConnection connection = url.openConnection();
  138.     InputStream stream = connection.getInputStream();
  139.     FileOutputStream[] output = null;
  140.     try {
  141.       if (localPath != null) {
  142.         output = new FileOutputStream[localPath.length];
  143.         for (int i = 0; i < output.length; i++) {
  144.           output[i] = new FileOutputStream(localPath[i]);
  145.         }
  146.       }
  147.       int num = 1;
  148.       while (num > 0) {
  149.         num = stream.read(buf);
  150.         if (num > 0 && localPath != null) {
  151.           for (int i = 0; i < output.length; i++) {
  152.             output[i].write(buf, 0, num);
  153.           }
  154.         }
  155.       }
  156.     } finally {
  157.       stream.close();
  158.       if (output != null) {
  159.         for (int i = 0; i < output.length; i++) {
  160.           if (output[i] != null) {
  161.             output[i].close();
  162.           }
  163.         }
  164.       }
  165.     }
  166.   }
  167. }