org.opensearch.index.store.RemoteIndexInput Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of opensearch Show documentation
Show all versions of opensearch Show documentation
OpenSearch subproject :server
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/
package org.opensearch.index.store;
import org.apache.lucene.store.IndexInput;
import java.io.IOException;
import java.io.InputStream;
/**
* Class for input from a file in a {@link RemoteDirectory}. Used for all input operations from the remote store.
* Currently, only methods from {@link IndexInput} that are required for reading a file from remote store are
* implemented. Remaining methods will be implemented as we open up remote store for other use cases like replication,
* peer recovery etc.
* ToDo: Extend ChecksumIndexInput
* @see RemoteDirectory
*
* @opensearch.internal
*/
public class RemoteIndexInput extends IndexInput {
private final InputStream inputStream;
private final long size;
private long filePointer;
public RemoteIndexInput(String name, InputStream inputStream, long size) {
super(name);
this.inputStream = inputStream;
this.size = size;
this.filePointer = 0;
}
@Override
public byte readByte() throws IOException {
byte[] buffer = new byte[1];
int numberOfBytesRead = inputStream.read(buffer);
if (numberOfBytesRead != -1) {
filePointer += numberOfBytesRead;
}
return buffer[0];
}
@Override
public void readBytes(byte[] b, int offset, int len) throws IOException {
int bytesRead = inputStream.read(b, offset, len);
if (bytesRead == len) {
filePointer += bytesRead;
} else {
while (bytesRead > 0 && bytesRead < len) {
filePointer += bytesRead;
len -= bytesRead;
offset += bytesRead;
bytesRead = inputStream.read(b, offset, len);
}
}
}
@Override
public void close() throws IOException {
inputStream.close();
}
@Override
public long length() {
return size;
}
/**
* Guaranteed to throw an exception and leave the RemoteIndexInput unmodified.
* This method is not implemented as it is not used for the file transfer to/from the remote store.
*
* @throws UnsupportedOperationException always
*/
@Override
public void seek(long pos) throws IOException {
throw new UnsupportedOperationException();
}
/**
* Returns the current position in this file in terms of number of bytes read so far.
*/
@Override
public long getFilePointer() {
return filePointer;
}
/**
* Guaranteed to throw an exception and leave the RemoteIndexInput unmodified.
* This method is not implemented as it is not used for the file transfer to/from the remote store.
*
* @throws UnsupportedOperationException always
*/
@Override
public IndexInput slice(String sliceDescription, long offset, long length) throws IOException {
throw new UnsupportedOperationException();
}
}