|
@@ -21,11 +21,13 @@ package org.elasticsearch.repositories.hdfs;
|
|
|
import org.apache.hadoop.fs.CreateFlag;
|
|
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
|
|
import org.apache.hadoop.fs.FileStatus;
|
|
|
+import org.apache.hadoop.fs.Options;
|
|
|
import org.apache.hadoop.fs.Options.CreateOpts;
|
|
|
import org.apache.hadoop.fs.Path;
|
|
|
import org.elasticsearch.common.Nullable;
|
|
|
import org.elasticsearch.common.blobstore.BlobMetaData;
|
|
|
import org.elasticsearch.common.blobstore.BlobPath;
|
|
|
+import org.elasticsearch.common.blobstore.fs.FsBlobContainer;
|
|
|
import org.elasticsearch.common.blobstore.support.AbstractBlobContainer;
|
|
|
import org.elasticsearch.common.blobstore.support.PlainBlobMetaData;
|
|
|
import org.elasticsearch.repositories.hdfs.HdfsBlobStore.Operation;
|
|
@@ -116,6 +118,29 @@ final class HdfsBlobContainer extends AbstractBlobContainer {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void writeBlobAtomic(String blobName, InputStream inputStream, long blobSize, boolean failIfAlreadyExists) throws IOException {
|
|
|
+ final String tempBlob = FsBlobContainer.tempBlobName(blobName);
|
|
|
+ store.execute((Operation<Void>) fileContext -> {
|
|
|
+ final Path tempBlobPath = new Path(path, tempBlob);
|
|
|
+ try (FSDataOutputStream stream = fileContext.create(
|
|
|
+ tempBlobPath, EnumSet.of(CreateFlag.CREATE, CreateFlag.SYNC_BLOCK), CreateOpts.bufferSize(bufferSize))) {
|
|
|
+ int bytesRead;
|
|
|
+ byte[] buffer = new byte[bufferSize];
|
|
|
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
|
|
|
+ stream.write(buffer, 0, bytesRead);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ final Path blob = new Path(path, blobName);
|
|
|
+ try {
|
|
|
+ fileContext.rename(tempBlobPath, blob, failIfAlreadyExists ? Options.Rename.NONE : Options.Rename.OVERWRITE);
|
|
|
+ } catch (org.apache.hadoop.fs.FileAlreadyExistsException faee) {
|
|
|
+ throw new FileAlreadyExistsException(blob.toString(), null, faee.getMessage());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Map<String, BlobMetaData> listBlobsByPrefix(@Nullable final String prefix) throws IOException {
|
|
|
FileStatus[] files = store.execute(fileContext -> (fileContext.util().listStatus(path,
|