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();