/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.lucene.readlocks;
import org.infinispan.lucene.InfinispanDirectory;
/**
* <p>SegmentReadLocker implementations have to make sure that segments are not deleted while they are
* being used by an IndexReader.</p>
* <p>When an {@link org.infinispan.lucene.InfinispanIndexInput} is opened on a file which is split in smaller chunks,
* {@link #acquireReadLock(String)} is invoked; then the {@link #deleteOrReleaseReadLock(String)} is
* invoked when the stream is closed.</p>
* <p>The same {@link #deleteOrReleaseReadLock(String)} is invoked when a file is deleted, so if this invocation is not balancing
* a lock acquire this implementation must delete all segment chunks and the associated metadata.</p>
* <p>Note that if you can use and tune the {@link org.apache.lucene.index.LogByteSizeMergePolicy} you could avoid the need
* for readlocks by setting a maximum segment size to equal the chunk size used by the InfinispanDirectory; readlocks
* will be skipped automatically when not needed, so it's advisable to still configure an appropriate SegmentReadLocker
* for the cases you might want to tune the chunk size.</p>
*
* @author Sanne Grinovero
* @since 4.1
*/
public interface SegmentReadLocker {
/**
* It will release a previously acquired readLock, or
* if no readLock was acquired it will mark the file to be deleted as soon
* as all pending locks are releases.
* If it's invoked on a file without pending locks the file is deleted.
*
* @param fileName of the file to release or delete
* @see InfinispanDirectory#deleteFile(String)
*/
void deleteOrReleaseReadLock(String fileName);
/**
* Acquires a readlock, in order to prevent other invocations to {@link #deleteOrReleaseReadLock(String)}
* from deleting the file.
*
* @param filename
* @return true if the lock was acquired, false if the implementation
* detects the file does not exist, or that it's being deleted by some other thread.
* @see InfinispanDirectory#openInput(String)
*/
boolean acquireReadLock(String filename);
}