This is an automated email from the ASF dual-hosted git repository.

aduprat pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 862dd154133317eacffc8e5434083ac0d0452b1d
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Fri Dec 7 14:14:26 2018 +0700

    Avoid blob copy when saving byte arrays
    
    We can iterate the in memory byte array first to compute the blobId to use,
    saving a blob copy.
---
 .../blob/objectstorage/ObjectStorageBlobsDAO.java     | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
index 7bbd2da..fb22164 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
@@ -93,8 +93,15 @@ public class ObjectStorageBlobsDAO implements BlobStore {
     }
 
     @Override
-    public Mono<BlobId> save(BucketName bucketName, byte[] data) {
-        return save(bucketName, new ByteArrayInputStream(data));
+    public Mono<BlobId> save(byte[] data) {
+        BlobId blobId = blobIdFactory.forPayload(data);
+
+        Blob blob = blobStore.blobBuilder(blobId.asString())
+            .payload(payloadCodec.write(new ByteArrayInputStream(data)))
+            .build();
+
+        return save(bucketName, blob)
+            .thenApply(any -> blobId);
     }
 
     @Override
@@ -121,10 +128,15 @@ public class ObjectStorageBlobsDAO implements BlobStore {
                             .payload(payload.getPayload())
                             .build();
 
-        return Mono.fromRunnable(() -> putBlobFunction.putBlob(blob))
+        return save(blob)
             .then(Mono.fromCallable(() -> 
blobIdFactory.from(hashingInputStream.hash().toString())));
     }
 
+    private Mono<String> save(Blob blob) {
+        String containerName = this.containerName.value();
+        return Mono.fromCallable(() -> blobStore.putBlob(containerName, blob));
+    }
+
     @Override
     public Mono<byte[]> readBytes(BucketName bucketName, BlobId blobId) {
         return Mono.fromCallable(() -> IOUtils.toByteArray(read(bucketName, 
blobId)));
@@ -145,7 +157,6 @@ public class ObjectStorageBlobsDAO implements BlobStore {
                 "Failed to readBytes blob " + blobId.asString(),
                 cause);
         }
-
     }
 
     public void deleteContainer() {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to