⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indexfiledeleter.java

📁 lucene2.2.0版本
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }        deleteFile(fileName);      }    }  }  /**   * For definition of "check point" see IndexWriter comments:   * "Clarification: Check Points (and commits)".   *    * Writer calls this when it has made a "consistent   * change" to the index, meaning new files are written to   * the index and the in-memory SegmentInfos have been   * modified to point to those files.   *   * This may or may not be a commit (segments_N may or may   * not have been written).   *   * We simply incref the files referenced by the new   * SegmentInfos and decref the files we had previously   * seen (if any).   *   * If this is a commit, we also call the policy to give it   * a chance to remove other commits.  If any commits are   * removed, we decref their files as well.   */  public void checkpoint(SegmentInfos segmentInfos, boolean isCommit) throws IOException {    if (infoStream != null) {      message("now checkpoint \"" + segmentInfos.getCurrentSegmentFileName() + "\" [isCommit = " + isCommit + "]");    }    // Try again now to delete any previously un-deletable    // files (because they were in use, on Windows):    if (deletable != null) {      List oldDeletable = deletable;      deletable = null;      int size = oldDeletable.size();      for(int i=0;i<size;i++) {        deleteFile((String) oldDeletable.get(i));      }    }    // Incref the files:    incRef(segmentInfos, isCommit);    if (isCommit) {      // Append to our commits list:      commits.add(new CommitPoint(segmentInfos));      // Tell policy so it can remove commits:      policy.onCommit(commits);      // Decref files for commits that were deleted by the policy:      deleteCommits();    }    // DecRef old files from the last checkpoint, if any:    int size = lastFiles.size();    if (size > 0) {      for(int i=0;i<size;i++) {        decRef((List) lastFiles.get(i));      }      lastFiles.clear();    }    if (!isCommit) {      // Save files so we can decr on next checkpoint/commit:      size = segmentInfos.size();      for(int i=0;i<size;i++) {        SegmentInfo segmentInfo = segmentInfos.info(i);        if (segmentInfo.dir == directory) {          lastFiles.add(segmentInfo.files());        }      }    }  }  void incRef(SegmentInfos segmentInfos, boolean isCommit) throws IOException {    int size = segmentInfos.size();    for(int i=0;i<size;i++) {      SegmentInfo segmentInfo = segmentInfos.info(i);      if (segmentInfo.dir == directory) {        incRef(segmentInfo.files());      }    }    if (isCommit) {      // Since this is a commit point, also incref its      // segments_N file:      getRefCount(segmentInfos.getCurrentSegmentFileName()).IncRef();    }  }  private void incRef(List files) throws IOException {    int size = files.size();    for(int i=0;i<size;i++) {      String fileName = (String) files.get(i);      RefCount rc = getRefCount(fileName);      if (infoStream != null) {        message("  IncRef \"" + fileName + "\": pre-incr count is " + rc.count);      }      rc.IncRef();    }  }  private void decRef(List files) throws IOException {    int size = files.size();    for(int i=0;i<size;i++) {      decRef((String) files.get(i));    }  }  private void decRef(String fileName) throws IOException {    RefCount rc = getRefCount(fileName);    if (infoStream != null) {      message("  DecRef \"" + fileName + "\": pre-decr count is " + rc.count);    }    if (0 == rc.DecRef()) {      // This file is no longer referenced by any past      // commit points nor by the in-memory SegmentInfos:      deleteFile(fileName);      refCounts.remove(fileName);    }  }  void decRef(SegmentInfos segmentInfos) throws IOException {    final int size = segmentInfos.size();    for(int i=0;i<size;i++) {      SegmentInfo segmentInfo = segmentInfos.info(i);      if (segmentInfo.dir == directory) {        decRef(segmentInfo.files());      }    }  }  private RefCount getRefCount(String fileName) {    RefCount rc;    if (!refCounts.containsKey(fileName)) {      rc = new RefCount();      refCounts.put(fileName, rc);    } else {      rc = (RefCount) refCounts.get(fileName);    }    return rc;  }  private void deleteFile(String fileName)       throws IOException {    try {      if (infoStream != null) {        message("delete \"" + fileName + "\"");      }      directory.deleteFile(fileName);    } catch (IOException e) {			  // if delete fails      if (directory.fileExists(fileName)) {        // Some operating systems (e.g. Windows) don't        // permit a file to be deleted while it is opened        // for read (e.g. by another process or thread). So        // we assume that when a delete fails it is because        // the file is open in another process, and queue        // the file for subsequent deletion.        if (infoStream != null) {          message("IndexFileDeleter: unable to remove file \"" + fileName + "\": " + e.toString() + "; Will re-try later.");        }        if (deletable == null) {          deletable = new ArrayList();        }        deletable.add(fileName);                  // add to deletable      }    }  }  /**   * Blindly delete the files used by the specific segments,   * with no reference counting and no retry.  This is only   * currently used by writer to delete its RAM segments   * from a RAMDirectory.   */  public void deleteDirect(Directory otherDir, List segments) throws IOException {    int size = segments.size();    for(int i=0;i<size;i++) {      List filestoDelete = ((SegmentInfo) segments.get(i)).files();      int size2 = filestoDelete.size();      for(int j=0;j<size2;j++) {        otherDir.deleteFile((String) filestoDelete.get(j));      }    }  }  /**   * Tracks the reference count for a single index file:   */  final private static class RefCount {    int count;    final private int IncRef() {      return ++count;    }    final private int DecRef() {      return --count;    }  }  /**   * Holds details for each commit point.  This class is   * also passed to the deletion policy.  Note: this class   * has a natural ordering that is inconsistent with   * equals.   */  final private class CommitPoint implements Comparable, IndexCommitPoint {    long gen;    List files;    String segmentsFileName;    boolean deleted;    public CommitPoint(SegmentInfos segmentInfos) throws IOException {      segmentsFileName = segmentInfos.getCurrentSegmentFileName();      int size = segmentInfos.size();      files = new ArrayList(size);      gen = segmentInfos.getGeneration();      for(int i=0;i<size;i++) {        SegmentInfo segmentInfo = segmentInfos.info(i);        if (segmentInfo.dir == directory) {          files.add(segmentInfo.files());        }      }    }    /**     * Get the segments_N file for this commit point.     */    public String getSegmentsFileName() {      return segmentsFileName;    }    /**     * Called only be the deletion policy, to remove this     * commit point from the index.     */    public void delete() {      if (!deleted) {        deleted = true;        commitsToDelete.add(this);      }    }    public int compareTo(Object obj) {      CommitPoint commit = (CommitPoint) obj;      if (gen < commit.gen) {        return -1;      } else if (gen > commit.gen) {        return 1;      } else {        return 0;      }    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -