TestEditLog.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 junit.framework.TestCase;
  20. import java.io.*;
  21. import java.util.Collection;
  22. import java.util.Iterator;
  23. import java.util.Random;
  24. import org.apache.hadoop.conf.Configuration;
  25. import org.apache.hadoop.fs.FileSystem;
  26. import org.apache.hadoop.fs.permission.*;
  27. import org.apache.hadoop.hdfs.MiniDFSCluster;
  28. import org.apache.hadoop.io.ArrayWritable;
  29. import org.apache.hadoop.io.UTF8;
  30. import org.apache.hadoop.io.Writable;
  31. import org.apache.hadoop.hdfs.server.namenode.FSEditLog.EditLogFileInputStream;
  32. import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
  33. import org.apache.hadoop.hdfs.server.namenode.FSImage.NameNodeDirType;
  34. import org.apache.hadoop.hdfs.server.namenode.FSImage.NameNodeFile;
  35. /**
  36.  * This class tests the creation and validation of a checkpoint.
  37.  */
  38. public class TestEditLog extends TestCase {
  39.   static final int numDatanodes = 1;
  40.   // This test creates numThreads threads and each thread does
  41.   // 2 * numberTransactions Transactions concurrently.
  42.   int numberTransactions = 100;
  43.   int numThreads = 100;
  44.   //
  45.   // an object that does a bunch of transactions
  46.   //
  47.   static class Transactions implements Runnable {
  48.     FSEditLog editLog;
  49.     int numTransactions;
  50.     short replication = 3;
  51.     long blockSize = 64;
  52.     Transactions(FSEditLog editlog, int num) {
  53.       editLog = editlog;
  54.       numTransactions = num;
  55.     }
  56.     // add a bunch of transactions.
  57.     public void run() {
  58.       PermissionStatus p = FSNamesystem.getFSNamesystem(
  59.           ).createFsOwnerPermissions(new FsPermission((short)0777));
  60.       for (int i = 0; i < numTransactions; i++) {
  61.         try {
  62.           INodeFileUnderConstruction inode = new INodeFileUnderConstruction(
  63.                               p, replication, blockSize, 0, "", "", null);
  64.           editLog.logOpenFile("/filename" + i, inode);
  65.           editLog.logCloseFile("/filename" + i, inode);
  66.           editLog.logSync();
  67.         } catch (IOException e) {
  68.           System.out.println("Transaction " + i + " encountered exception " +
  69.                              e);
  70.         }
  71.       }
  72.     }
  73.   }
  74.   /**
  75.    * Tests transaction logging in dfs.
  76.    */
  77.   public void testEditLog() throws IOException {
  78.     // start a cluster 
  79.     Collection<File> namedirs = null;
  80.     Collection<File> editsdirs = null;
  81.     Configuration conf = new Configuration();
  82.     MiniDFSCluster cluster = new MiniDFSCluster(0, conf, numDatanodes, 
  83.                                                 true, true, null, null);
  84.     cluster.waitActive();
  85.     FileSystem fileSys = cluster.getFileSystem();
  86.     int numdirs = 0;
  87.     try {
  88.       namedirs = cluster.getNameDirs();
  89.       editsdirs = cluster.getNameEditsDirs();
  90.     } finally {
  91.       fileSys.close();
  92.       cluster.shutdown();
  93.     }
  94.     for (Iterator it = namedirs.iterator(); it.hasNext(); ) {
  95.       File dir = (File)it.next();
  96.       System.out.println(dir);
  97.       numdirs++;
  98.     }
  99.     FSImage fsimage = new FSImage(namedirs, editsdirs);
  100.     FSEditLog editLog = fsimage.getEditLog();
  101.     // set small size of flush buffer
  102.     editLog.setBufferCapacity(2048);
  103.     editLog.close();
  104.     editLog.open();
  105.   
  106.     // Create threads and make them run transactions concurrently.
  107.     Thread threadId[] = new Thread[numThreads];
  108.     for (int i = 0; i < numThreads; i++) {
  109.       Transactions trans = new Transactions(editLog, numberTransactions);
  110.       threadId[i] = new Thread(trans, "TransactionThread-" + i);
  111.       threadId[i].start();
  112.     }
  113.     // wait for all transactions to get over
  114.     for (int i = 0; i < numThreads; i++) {
  115.       try {
  116.         threadId[i].join();
  117.       } catch (InterruptedException e) {
  118.         i--;      // retry 
  119.       }
  120.     } 
  121.     
  122.     editLog.close();
  123.     // Verify that we can read in all the transactions that we have written.
  124.     // If there were any corruptions, it is likely that the reading in
  125.     // of these transactions will throw an exception.
  126.     //
  127.     for (Iterator<StorageDirectory> it = 
  128.             fsimage.dirIterator(NameNodeDirType.EDITS); it.hasNext();) {
  129.       File editFile = FSImage.getImageFile(it.next(), NameNodeFile.EDITS);
  130.       System.out.println("Verifying file: " + editFile);
  131.       int numEdits = FSEditLog.loadFSEdits(new EditLogFileInputStream(editFile));
  132.       int numLeases = FSNamesystem.getFSNamesystem().leaseManager.countLease();
  133.       System.out.println("Number of outstanding leases " + numLeases);
  134.       assertEquals(0, numLeases);
  135.       assertTrue("Verification for " + editFile + " failed. " +
  136.                  "Expected " + (numThreads * 2 * numberTransactions) + " transactions. "+
  137.                  "Found " + numEdits + " transactions.",
  138.                  numEdits == numThreads * 2 * numberTransactions);
  139.     }
  140.   }
  141. }