package org.infinispan.lucene.readlocks;
/**
* <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.impl.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 org.apache.lucene.store.Directory#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 of the file to acquire the lock at
* @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 org.apache.lucene.store.Directory#openInput
*/
boolean acquireReadLock(String filename);
}