Author: amitj
Date: Tue Nov 29 08:36:03 2016
New Revision: 1771855

URL: http://svn.apache.org/viewvc?rev=1771855&view=rev
Log:
OAK-5174: Introduce API to pass options while writing blobs in 
BlobStore/DataStore

* New method added to BlobStore to pass options while writing
* BlobOptions to pass options
* Enable AbstractSharedCachingDataStore to interpret options to add blobs 
synchronously

Added:
    
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java
   (with props)
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
    
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobStore.java
    
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/DefaultSplitBlobStore.java
    
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/WrappingSplitBlobStore.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreUtils.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/BasicReadOnlyBlobStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
    
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/tooling/BasicReadOnlyBlobStore.java
    
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java

Modified: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -208,6 +208,20 @@ public abstract class AbstractBlobStore
         }
     }
 
+    /**
+     * Default implementation ignores options and delegates to the {@link 
#writeBlob(InputStream)}
+     * method.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+       return writeBlob(in);
+    }
+
     @Override
     public InputStream getInputStream(String blobId) throws IOException {
         //Marking would handled by next call to store.readBlob

Added: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java?rev=1771855&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java
 Tue Nov 29 08:36:03 2016
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.spi.blob;
+
+/**
+ * Options while writing blobs to the blob store / data store.
+ */
+public class BlobOptions {
+    private UploadType uploadType = UploadType.DEFAULT;
+
+    public UploadType getUpload() {
+        return uploadType;
+    }
+
+    public BlobOptions setUpload(UploadType uploadType) {
+        this.uploadType = uploadType;
+        return this;
+    }
+
+    /**
+     * Specifies the upload type for the blob.
+     */
+    public enum UploadType {
+        SYNCHRONOUS,
+        DEFAULT
+    }
+}

Propchange: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobOptions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/BlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -37,6 +37,17 @@ public interface BlobStore {
     String writeBlob(InputStream in) throws IOException;
 
     /**
+     * Write a blob from an input stream with specified options.
+     * This method closes the input stream.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    String writeBlob(InputStream in, BlobOptions options) throws IOException;
+
+    /**
      * Read a number of bytes from a blob.
      * 
      * @param blobId the blob id

Modified: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/DefaultSplitBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/DefaultSplitBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/DefaultSplitBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/DefaultSplitBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.spi.bl
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,6 +58,19 @@ public class DefaultSplitBlobStore imple
         return blobId;
     }
 
+    /**
+     * Ignores the options provided and delegates to {@link 
#writeBlob(InputStream)}.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
     @Override
     public int readBlob(String blobId, long pos, byte[] buff, int off, int 
length) throws IOException {
         return chooseBlobStoreByBlobId(blobId).readBlob(blobId, pos, buff, 
off, length);

Modified: 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/WrappingSplitBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/WrappingSplitBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/WrappingSplitBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/split/WrappingSplitBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.spi.bl
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.BlobStoreWrapper;
 import org.slf4j.Logger;
@@ -60,6 +61,19 @@ public class WrappingSplitBlobStore impl
         return getSplitBlobStore().writeBlob(in);
     }
 
+    /**
+     * Ignores the options provided and delegates to {@link 
#writeBlob(InputStream)}.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
     @Override
     public int readBlob(String blobId, long pos, byte[] buff, int off, int 
length) throws IOException {
         return getSplitBlobStore().readBlob(blobId, pos, buff, off, length);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
 Tue Nov 29 08:36:03 2016
@@ -46,14 +46,17 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.DataRecord;
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.core.data.MultiDataStoreAware;
+import org.apache.jackrabbit.oak.plugins.blob.datastore.TypedDataStore;
 import org.apache.jackrabbit.oak.spi.blob.AbstractDataRecord;
 import org.apache.jackrabbit.oak.spi.blob.AbstractSharedBackend;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.apache.jackrabbit.util.TransientFileFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static 
org.apache.jackrabbit.oak.spi.blob.BlobOptions.UploadType.SYNCHRONOUS;
 
 /**
  * Cache files locally and stage files locally for async uploads.
@@ -71,7 +74,7 @@ import static com.google.common.base.Pre
  * </DataStore>
  */
 public abstract class AbstractSharedCachingDataStore extends AbstractDataStore
-    implements MultiDataStoreAware, SharedDataStore {
+    implements MultiDataStoreAware, SharedDataStore, TypedDataStore {
     /**
      * Logger instance.
      */
@@ -215,6 +218,12 @@ public abstract class AbstractSharedCach
 
     @Override
     public DataRecord addRecord(InputStream inputStream) throws 
DataStoreException {
+        return addRecord(inputStream, new BlobOptions());
+    }
+
+    @Override
+    public DataRecord addRecord(InputStream inputStream, BlobOptions 
blobOptions)
+        throws DataStoreException {
         Stopwatch watch = Stopwatch.createStarted();
         try {
             TransientFileFactory fileFactory = 
TransientFileFactory.getInstance();
@@ -237,8 +246,10 @@ public abstract class AbstractSharedCach
 
             // asynchronously stage for upload if the size limit of staging 
cache permits
             // otherwise add to backend
-            if (!cache.stage(identifier.toString(), tmpFile)) {
+            if (blobOptions.getUpload() == SYNCHRONOUS
+                || !cache.stage(identifier.toString(), tmpFile)) {
                 backend.write(identifier, tmpFile);
+                LOG.info("Added blob [{}] to backend", identifier);
                 // offer to download cache
                 cache.getDownloadCache().put(identifier.toString(), tmpFile);
             }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -61,6 +61,7 @@ import org.apache.jackrabbit.oak.cache.C
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.apache.jackrabbit.oak.plugins.blob.BlobTrackingStore;
 import org.apache.jackrabbit.oak.plugins.blob.SharedDataStore;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.stats.StatsCollectingStreams;
 import org.apache.jackrabbit.oak.spi.blob.stats.BlobStatsCollector;
@@ -73,8 +74,8 @@ import org.slf4j.LoggerFactory;
  * It also handles inlining binaries if there size is smaller than
  * {@link org.apache.jackrabbit.core.data.DataStore#getMinRecordLength()}
  */
-public class DataStoreBlobStore implements DataStore, BlobStore,
-        GarbageCollectableBlobStore, BlobTrackingStore {
+public class DataStoreBlobStore
+    implements DataStore, BlobStore, GarbageCollectableBlobStore, 
BlobTrackingStore, TypedDataStore {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     protected final DataStore delegate;
@@ -164,7 +165,7 @@ public class DataStoreBlobStore implemen
     @Override
     public DataRecord addRecord(InputStream stream) throws DataStoreException {
         try {
-            return writeStream(stream);
+            return writeStream(stream, new BlobOptions());
         } catch (IOException e) {
             throw new DataStoreException(e);
         }
@@ -206,11 +207,16 @@ public class DataStoreBlobStore implemen
 
     @Override
     public String writeBlob(InputStream stream) throws IOException {
+        return writeBlob(stream, new BlobOptions());
+    }
+
+    @Override
+    public String writeBlob(InputStream stream, BlobOptions options) throws 
IOException {
         boolean threw = true;
         try {
             long start = System.nanoTime();
             checkNotNull(stream);
-            DataRecord dr = writeStream(stream);
+            DataRecord dr = writeStream(stream, options);
             String id = getBlobId(dr);
             if (tracker != null && !InMemoryDataRecord.isInstance(id)) {
                 try {
@@ -518,6 +524,15 @@ public class DataStoreBlobStore implemen
         return Type.DEFAULT;
     }
 
+
+    @Override
+    public DataRecord addRecord(InputStream input, BlobOptions options) throws 
DataStoreException {
+        if (delegate instanceof TypedDataStore) {
+            return ((TypedDataStore) delegate).addRecord(input, options);
+        }
+        return delegate.addRecord(input);
+    }
+
     //~---------------------------------------------< Object >
 
     @Override
@@ -590,9 +605,10 @@ public class DataStoreBlobStore implemen
      * while large objects are stored in the data store
      *
      * @param in the input stream
+     * @param options
      * @return the value
      */
-    private DataRecord writeStream(InputStream in) throws IOException, 
DataStoreException {
+    private DataRecord writeStream(InputStream in, BlobOptions options) throws 
IOException, DataStoreException {
         int maxMemorySize = Math.max(0, delegate.getMinRecordLength() + 1);
         byte[] buffer = new byte[maxMemorySize];
         int pos = 0, len = maxMemorySize;
@@ -613,7 +629,7 @@ public class DataStoreBlobStore implemen
         } else {
             // a few bytes are already read, need to re-build the input stream
             in = new SequenceInputStream(new ByteArrayInputStream(buffer, 0, 
pos), in);
-            record = delegate.addRecord(in);
+            record = addRecord(in, options);
         }
         return record;
     }

Added: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java?rev=1771855&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java
 Tue Nov 29 08:36:03 2016
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.blob.datastore;
+
+import java.io.InputStream;
+
+import org.apache.jackrabbit.core.data.DataRecord;
+import org.apache.jackrabbit.core.data.DataStoreException;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
+
+/**
+ * Interface to provide ability to the {@link 
org.apache.jackrabbit.core.data.DataStore}
+ * to add records with {@link BlobOptions}.
+ */
+public interface TypedDataStore {
+    /**
+     * Add a record with specified options.
+     *
+     * @param input
+     * @param options
+     * @return
+     * @throws DataStoreException
+     */
+    DataRecord addRecord(InputStream input, BlobOptions options) throws 
DataStoreException;
+}
+

Propchange: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/TypedDataStore.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
 Tue Nov 29 08:36:03 2016
@@ -26,7 +26,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import 
org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache.GenerationCache;
-import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
 import org.h2.mvstore.MVMap;
 import org.h2.mvstore.StreamStore;
@@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
  * A persistent blob cache. Only blobs that are smaller than 10% of the maximum
  * cache size are stored.
  */
-public class BlobCache implements BlobStore, GarbageCollectableBlobStore, 
GenerationCache {
+public class BlobCache implements GarbageCollectableBlobStore, GenerationCache 
{
 
     static final Logger LOG = LoggerFactory.getLogger(BlobCache.class);
 
@@ -123,6 +123,19 @@ public class BlobCache implements BlobSt
         return base.writeBlob(in);
     }
 
+    /**
+     * Ignores the options provided and delegates to {@link 
#writeBlob(InputStream)}.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
     @Override
     public int readBlob(String blobId, long pos, byte[] buff, int off,
             int length) throws IOException {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
 Tue Nov 29 08:36:03 2016
@@ -40,6 +40,7 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.apache.jackrabbit.oak.spi.blob.AbstractSharedBackend;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.stats.DefaultStatisticsProvider;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.junit.After;
@@ -52,6 +53,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.commons.codec.binary.Hex.encodeHexString;
+import static 
org.apache.jackrabbit.oak.spi.blob.BlobOptions.UploadType.SYNCHRONOUS;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -166,6 +168,32 @@ public class CachingDataStoreTest extend
         assertEquals(id, rec.getIdentifier().toString());
         assertFile(rec.getStream(), f, folder);
 
+        rec = dataStore.getRecordIfStored(new DataIdentifier(id));
+        assertEquals(id, rec.getIdentifier().toString());
+        assertFile(rec.getStream(), f, folder);
+
+        assertEquals(1, Iterators.size(dataStore.getAllIdentifiers()));
+
+        dataStore.deleteRecord(new DataIdentifier(id));
+        rec = dataStore.getRecordIfStored(new DataIdentifier(id));
+        assertNull(rec);
+    }
+
+    /**
+     * Add, get, delete with synchronous option.
+     * @throws Exception
+     */
+    @Test
+    public void syncAddGetDelete() throws Exception {
+        File f = copyToFile(randomStream(0, 4 * 1024), folder.newFile());
+        String id = getIdForInputStream(f);
+        FileInputStream fin = new FileInputStream(f);
+        closer.register(fin);
+
+        DataRecord rec = dataStore.addRecord(fin, new 
BlobOptions().setUpload(SYNCHRONOUS));
+        assertEquals(id, rec.getIdentifier().toString());
+        assertFile(rec.getStream(), f, folder);
+
         rec = dataStore.getRecordIfStored(new DataIdentifier(id));
         assertEquals(id, rec.getIdentifier().toString());
         assertFile(rec.getStream(), f, folder);

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreUtils.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreUtils.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreUtils.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreUtils.java
 Tue Nov 29 08:36:03 2016
@@ -18,9 +18,11 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.File;
 import java.util.Map;
+import java.util.Properties;
 
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.core.data.DataStore;
+import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.core.data.FileDataStore;
 
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
@@ -94,6 +96,20 @@ public class DataStoreUtils {
         return fds;
     }
 
+    public static CachingFileDataStore createCachingFDS(String path, String 
cachePath)
+        throws DataStoreException {
+        Properties props = new Properties();
+        props.setProperty("fsBackendPath", path);
+        CachingFileDataStore ds = new CachingFileDataStore();
+        ds.setMinRecordLength(10);
+        Map<String, ?> config = DataStoreUtils.getConfig();
+        props.putAll(config);
+        PropertiesUtil.populate(ds, Maps.fromProperties(props), false);
+        ds.setProperties(props);
+        ds.init(cachePath);
+        return ds;
+    }
+
     @Test
     public void testPropertySetup() throws Exception {
         System.setProperty(DS_CLASS_NAME, FileDataStore.class.getName());

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/BasicReadOnlyBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/BasicReadOnlyBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/BasicReadOnlyBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/BasicReadOnlyBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 
 /**
@@ -36,6 +37,19 @@ public class BasicReadOnlyBlobStore impl
         throw new UnsupportedOperationException();
     }
 
+    /**
+     * Ignores the options provided and delegates to {@link 
#writeBlob(InputStream)}.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
     @Override
     public int readBlob(String blobId, long pos, byte[] buff, int off,
             int length) throws IOException {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
 Tue Nov 29 08:36:03 2016
@@ -33,6 +33,7 @@ import com.google.common.base.Strings;
 import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob;
 import org.apache.jackrabbit.oak.segment.Segment.RecordConsumer;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore;
 import org.junit.Rule;
@@ -56,6 +57,11 @@ public class BlobIdRecordTest {
         }
 
         @Override
+        public String writeBlob(InputStream inputStream, BlobOptions options) 
throws IOException {
+            return writeBlob(inputStream);
+        }
+
+        @Override
         public int readBlob(String s, long l, byte[] bytes, int i, int i1) 
throws IOException {
             return bs.readBlob(mapId(s), l, bytes, i, i1);
         }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobIT.java
 Tue Nov 29 08:36:03 2016
@@ -49,6 +49,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.FileBlob;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
@@ -210,6 +211,11 @@ public class ExternalBlobIT {
         }
 
         @Override
+        public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+            return writeBlob(in);
+        }
+
+        @Override
         public int readBlob(String blobId, long pos, byte[] buff, int off, int 
length) throws IOException {
             throw new UnsupportedOperationException();
         }

Modified: 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/tooling/BasicReadOnlyBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/tooling/BasicReadOnlyBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/tooling/BasicReadOnlyBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/tooling/BasicReadOnlyBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 
 /**
@@ -37,6 +38,20 @@ public class BasicReadOnlyBlobStore impl
         throw new UnsupportedOperationException();
     }
 
+    /**
+     * Ignores the options provided and delegates to {@link 
#writeBlob(InputStream)}.
+     *
+     * @param in the input stream to write
+     * @param options the options to use
+     * @return
+     * @throws IOException
+     */
+    @Override
+    @Deprecated
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
     @Override
     @Deprecated
     public int readBlob(String blobId, long pos, byte[] buff, int off,

Modified: 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
 Tue Nov 29 08:36:03 2016
@@ -45,6 +45,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
 import org.apache.jackrabbit.oak.plugins.segment.file.FileBlob;
 import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
@@ -204,6 +205,11 @@ public class ExternalBlobIT {
         }
 
         @Override
+        public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+            return writeBlob(in);
+        }
+
+        @Override
         public int readBlob(String blobId, long pos, byte[] buff, int off, int 
length) throws IOException {
             throw new UnsupportedOperationException();
         }

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java?rev=1771855&r1=1771854&r2=1771855&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java
 Tue Nov 29 08:36:03 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.upgrad
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.jackrabbit.oak.spi.blob.BlobOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 
 /**
@@ -36,6 +37,11 @@ public class MissingBlobStore implements
     }
 
     @Override
+    public String writeBlob(InputStream in, BlobOptions options) throws 
IOException {
+        return writeBlob(in);
+    }
+
+    @Override
     public int readBlob(String blobId, long pos, byte[] buff, int off,
             int length) throws IOException {
         throw new UnsupportedOperationException();


Reply via email to