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

网格计算

开发平台:

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.contrib.index.lucene;
  19. import java.io.IOException;
  20. import org.apache.hadoop.conf.Configuration;
  21. import org.apache.hadoop.fs.FileSystem;
  22. import org.apache.hadoop.fs.Path;
  23. import org.apache.lucene.store.Directory;
  24. import org.apache.lucene.store.FSDirectory;
  25. import org.apache.lucene.store.IndexInput;
  26. import org.apache.lucene.store.IndexOutput;
  27. import org.apache.lucene.store.NoLockFactory;
  28. /**
  29.  * The initial version of an index is stored in a read-only FileSystem dir
  30.  * (FileSystemDirectory). Index files created by newer versions are written to
  31.  * a writable local FS dir (Lucene's FSDirectory). We should use the general
  32.  * FileSystemDirectory for the writable dir as well. But have to use Lucene's
  33.  * FSDirectory because currently Lucene does randome write and
  34.  * FileSystemDirectory only supports sequential write.
  35.  * 
  36.  * Note: We may delete files from the read-only FileSystem dir because there
  37.  * can be some segment files from an uncommitted checkpoint. For the same
  38.  * reason, we may create files in the writable dir which already exist in the
  39.  * read-only dir and logically they overwrite the ones in the read-only dir.
  40.  */
  41. class MixedDirectory extends Directory {
  42.   private final Directory readDir; // FileSystemDirectory
  43.   private final Directory writeDir; // Lucene's FSDirectory
  44.   // take advantage of the fact that Lucene's FSDirectory.fileExists is faster
  45.   public MixedDirectory(FileSystem readFs, Path readPath, FileSystem writeFs,
  46.       Path writePath, Configuration conf) throws IOException {
  47.     try {
  48.       readDir = new FileSystemDirectory(readFs, readPath, false, conf);
  49.       // check writeFS is a local FS?
  50.       writeDir = FSDirectory.getDirectory(writePath.toString());
  51.     } catch (IOException e) {
  52.       try {
  53.         close();
  54.       } catch (IOException e1) {
  55.         // ignore this one, throw the original one
  56.       }
  57.       throw e;
  58.     }
  59.     lockFactory = new NoLockFactory();
  60.   }
  61.   // for debugging
  62.   MixedDirectory(Directory readDir, Directory writeDir) throws IOException {
  63.     this.readDir = readDir;
  64.     this.writeDir = writeDir;
  65.     lockFactory = new NoLockFactory();
  66.   }
  67.   @Override
  68.   public String[] list() throws IOException {
  69.     String[] readFiles = readDir.list();
  70.     String[] writeFiles = writeDir.list();
  71.     if (readFiles == null || readFiles.length == 0) {
  72.       return writeFiles;
  73.     } else if (writeFiles == null || writeFiles.length == 0) {
  74.       return readFiles;
  75.     } else {
  76.       String[] result = new String[readFiles.length + writeFiles.length];
  77.       System.arraycopy(readFiles, 0, result, 0, readFiles.length);
  78.       System.arraycopy(writeFiles, 0, result, readFiles.length,
  79.           writeFiles.length);
  80.       return result;
  81.     }
  82.   }
  83.   @Override
  84.   public void deleteFile(String name) throws IOException {
  85.     if (writeDir.fileExists(name)) {
  86.       writeDir.deleteFile(name);
  87.     }
  88.     if (readDir.fileExists(name)) {
  89.       readDir.deleteFile(name);
  90.     }
  91.   }
  92.   @Override
  93.   public boolean fileExists(String name) throws IOException {
  94.     return writeDir.fileExists(name) || readDir.fileExists(name);
  95.   }
  96.   @Override
  97.   public long fileLength(String name) throws IOException {
  98.     if (writeDir.fileExists(name)) {
  99.       return writeDir.fileLength(name);
  100.     } else {
  101.       return readDir.fileLength(name);
  102.     }
  103.   }
  104.   @Override
  105.   public long fileModified(String name) throws IOException {
  106.     if (writeDir.fileExists(name)) {
  107.       return writeDir.fileModified(name);
  108.     } else {
  109.       return readDir.fileModified(name);
  110.     }
  111.   }
  112.   @Override
  113.   public void renameFile(String from, String to) throws IOException {
  114.     throw new UnsupportedOperationException();
  115.   }
  116.   @Override
  117.   public void touchFile(String name) throws IOException {
  118.     if (writeDir.fileExists(name)) {
  119.       writeDir.touchFile(name);
  120.     } else {
  121.       readDir.touchFile(name);
  122.     }
  123.   }
  124.   @Override
  125.   public IndexOutput createOutput(String name) throws IOException {
  126.     return writeDir.createOutput(name);
  127.   }
  128.   @Override
  129.   public IndexInput openInput(String name) throws IOException {
  130.     if (writeDir.fileExists(name)) {
  131.       return writeDir.openInput(name);
  132.     } else {
  133.       return readDir.openInput(name);
  134.     }
  135.   }
  136.   @Override
  137.   public IndexInput openInput(String name, int bufferSize) throws IOException {
  138.     if (writeDir.fileExists(name)) {
  139.       return writeDir.openInput(name, bufferSize);
  140.     } else {
  141.       return readDir.openInput(name, bufferSize);
  142.     }
  143.   }
  144.   @Override
  145.   public void close() throws IOException {
  146.     try {
  147.       if (readDir != null) {
  148.         readDir.close();
  149.       }
  150.     } finally {
  151.       if (writeDir != null) {
  152.         writeDir.close();
  153.       }
  154.     }
  155.   }
  156.   public String toString() {
  157.     return this.getClass().getName() + "@" + readDir + "&" + writeDir;
  158.   }
  159. }