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

网格计算

开发平台:

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.tools;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.DataOutputStream;
  21. import java.io.IOException;
  22. import java.io.PrintStream;
  23. import java.util.Arrays;
  24. import java.util.LinkedList;
  25. import java.util.List;
  26. import java.util.Random;
  27. import org.apache.commons.logging.LogFactory;
  28. import org.apache.commons.logging.impl.Log4JLogger;
  29. import org.apache.hadoop.conf.Configuration;
  30. import org.apache.hadoop.fs.FileStatus;
  31. import org.apache.hadoop.fs.FileSystem;
  32. import org.apache.hadoop.fs.FsShell;
  33. import org.apache.hadoop.fs.Path;
  34. import org.apache.hadoop.fs.permission.FsPermission;
  35. import org.apache.hadoop.fs.permission.PermissionStatus;
  36. import org.apache.hadoop.hdfs.MiniDFSCluster;
  37. import org.apache.hadoop.hdfs.server.datanode.DataNode;
  38. import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
  39. import org.apache.hadoop.io.IOUtils;
  40. import org.apache.hadoop.mapred.MiniMRCluster;
  41. import org.apache.hadoop.mapred.TaskTracker;
  42. import org.apache.log4j.Level;
  43. public class TestDistCh extends junit.framework.TestCase {
  44.   {
  45.     ((Log4JLogger)LogFactory.getLog("org.apache.hadoop.hdfs.StateChange")
  46.         ).getLogger().setLevel(Level.OFF);
  47.     ((Log4JLogger)DataNode.LOG).getLogger().setLevel(Level.OFF);
  48.     ((Log4JLogger)FSNamesystem.LOG).getLogger().setLevel(Level.OFF);
  49.     ((Log4JLogger)TaskTracker.LOG).getLogger().setLevel(Level.OFF);
  50.   }
  51.   static final Long RANDOM_NUMBER_GENERATOR_SEED = null;
  52.   private static final Random RANDOM = new Random();
  53.   static {
  54.     final long seed = RANDOM_NUMBER_GENERATOR_SEED == null?
  55.         RANDOM.nextLong(): RANDOM_NUMBER_GENERATOR_SEED;
  56.     System.out.println("seed=" + seed);
  57.     RANDOM.setSeed(seed);
  58.   }
  59.   static final String TEST_ROOT_DIR =
  60.     new Path(System.getProperty("test.build.data","/tmp")
  61.         ).toString().replace(' ', '+');
  62.   static final int NUN_SUBS = 5;
  63.   static class FileTree {
  64.     private final FileSystem fs;
  65.     private final String root;
  66.     private final Path rootdir;
  67.     private int fcount = 0;
  68.     Path createSmallFile(Path dir) throws IOException {
  69.       final Path f = new Path(dir, "f" + ++fcount);
  70.       assertTrue(!fs.exists(f));
  71.       final DataOutputStream out = fs.create(f);
  72.       try {
  73.         out.writeBytes("createSmallFile: f=" + f);
  74.       } finally {
  75.         out.close();
  76.       }
  77.       assertTrue(fs.exists(f));
  78.       return f;
  79.     }
  80.     Path mkdir(Path dir) throws IOException {
  81.       assertTrue(fs.mkdirs(dir));
  82.       assertTrue(fs.getFileStatus(dir).isDir());
  83.       return dir;
  84.     }
  85.     
  86.     FileTree(FileSystem fs, String name) throws IOException {
  87.       this.fs = fs;
  88.       this.root = "/test/" + name;
  89.       this.rootdir = mkdir(new Path(root));
  90.   
  91.       for(int i = 0; i < 3; i++) {
  92.         createSmallFile(rootdir);
  93.       }
  94.       
  95.       for(int i = 0; i < NUN_SUBS; i++) {
  96.         final Path sub = mkdir(new Path(root, "sub" + i));
  97.         int num_files = RANDOM.nextInt(3);
  98.         for(int j = 0; j < num_files; j++) {
  99.           createSmallFile(sub);
  100.         }
  101.       }
  102.       
  103.       System.out.println("rootdir = " + rootdir);
  104.     }
  105.   }
  106.   static class ChPermissionStatus extends PermissionStatus {
  107.     ChPermissionStatus(FileStatus filestatus) {
  108.       this(filestatus, "", "", "");
  109.     }
  110.     ChPermissionStatus(FileStatus filestatus, String owner, String group, String permission) {
  111.       super("".equals(owner)? filestatus.getOwner(): owner, 
  112.           "".equals(group)? filestatus.getGroup(): group,
  113.           "".equals(permission)? filestatus.getPermission(): new FsPermission(Short.parseShort(permission, 8)));
  114.     }
  115.   }
  116.   
  117.   public void testDistCh() throws Exception {
  118.     final Configuration conf = new Configuration();
  119.     final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  120.     final FileSystem fs = cluster.getFileSystem();
  121.     final MiniMRCluster mr = new MiniMRCluster(2, fs.getUri().toString(), 1);
  122.     final FsShell shell = new FsShell(conf);
  123.     
  124.     try {
  125.       final FileTree tree = new FileTree(fs, "testDistCh");
  126.       final FileStatus rootstatus = fs.getFileStatus(tree.rootdir);
  127.       runLsr(shell, tree.root, 0);
  128.       //generate random arguments
  129.       final String[] args = new String[RANDOM.nextInt(NUN_SUBS-1) + 1];
  130.       final PermissionStatus[] newstatus = new PermissionStatus[NUN_SUBS];
  131.       final List<Integer> indices = new LinkedList<Integer>();
  132.       for(int i = 0; i < NUN_SUBS; i++) {
  133.         indices.add(i);
  134.       }
  135.       for(int i = 0; i < args.length; i++) {
  136.         final int index = indices.remove(RANDOM.nextInt(indices.size()));
  137.         final String sub = "sub" + index;
  138.         final boolean changeOwner = RANDOM.nextBoolean();
  139.         final boolean changeGroup = RANDOM.nextBoolean();
  140.         final boolean changeMode = !changeOwner && !changeGroup? true: RANDOM.nextBoolean();
  141.         
  142.         final String owner = changeOwner? sub: "";
  143.         final String group = changeGroup? sub: "";
  144.         final String permission = changeMode? RANDOM.nextInt(8) + "" + RANDOM.nextInt(8) + "" + RANDOM.nextInt(8): "";
  145.         args[i] = tree.root + "/" + sub + ":" + owner + ":" + group + ":" + permission;
  146.         newstatus[index] = new ChPermissionStatus(rootstatus, owner, group, permission);
  147.       }
  148.       for(int i = 0; i < NUN_SUBS; i++) {
  149.         if (newstatus[i] == null) {
  150.           newstatus[i] = new ChPermissionStatus(rootstatus);
  151.         }
  152.       }
  153.       System.out.println("args=" + Arrays.asList(args).toString().replace(",", ",n  "));
  154.       System.out.println("newstatus=" + Arrays.asList(newstatus).toString().replace(",", ",n  "));
  155.       //run DistCh
  156.       new DistCh(mr.createJobConf()).run(args);
  157.       runLsr(shell, tree.root, 0);
  158.       //check results
  159.       for(int i = 0; i < NUN_SUBS; i++) {
  160.         Path sub = new Path(tree.root + "/sub" + i);
  161.         checkFileStatus(newstatus[i], fs.getFileStatus(sub));
  162.         for(FileStatus status : fs.listStatus(sub)) {
  163.           checkFileStatus(newstatus[i], status);
  164.         }
  165.       }
  166.     } finally {
  167.       cluster.shutdown();
  168.     }
  169.   }
  170.   static final FsPermission UMASK = FsPermission.createImmutable((short)0111);
  171.   static void checkFileStatus(PermissionStatus expected, FileStatus actual) {
  172.     assertEquals(expected.getUserName(), actual.getOwner());
  173.     assertEquals(expected.getGroupName(), actual.getGroup());
  174.     FsPermission perm = expected.getPermission(); 
  175.     if (!actual.isDir()) {
  176.       perm = perm.applyUMask(UMASK);
  177.     }
  178.     assertEquals(perm, actual.getPermission());
  179.   }
  180.   private static String runLsr(final FsShell shell, String root, int returnvalue
  181.       ) throws Exception {
  182.     System.out.println("root=" + root + ", returnvalue=" + returnvalue);
  183.     final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
  184.     final PrintStream out = new PrintStream(bytes);
  185.     final PrintStream oldOut = System.out;
  186.     final PrintStream oldErr = System.err;
  187.     System.setOut(out);
  188.     System.setErr(out);
  189.     final String results;
  190.     try {
  191.       assertEquals(returnvalue, shell.run(new String[]{"-lsr", root}));
  192.       results = bytes.toString();
  193.     } finally {
  194.       IOUtils.closeStream(out);
  195.       System.setOut(oldOut);
  196.       System.setErr(oldErr);
  197.     }
  198.     System.out.println("results:n" + results);
  199.     return results;
  200.   }
  201. }