You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2016/08/02 09:50:13 UTC
svn commit: r1754858 - in /jackrabbit/oak/branches/1.4:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/
oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/
Author: tomekr
Date: Tue Aug 2 09:50:13 2016
New Revision: 1754858
URL: http://svn.apache.org/viewvc?rev=1754858&view=rev
Log:
OAK-4624: Optionally ignore missing blobs during sidegrade
Modified:
jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java
jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java
Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java Tue Aug 2 09:50:13 2016
@@ -74,9 +74,9 @@ public class DataStoreBlobStore implemen
GarbageCollectableBlobStore {
private final Logger log = LoggerFactory.getLogger(getClass());
- private final DataStore delegate;
+ protected final DataStore delegate;
- private BlobStatsCollector stats = BlobStatsCollector.NOOP;
+ protected BlobStatsCollector stats = BlobStatsCollector.NOOP;
/**
* If set to true then the blob length information would be encoded as part of blobId
@@ -523,7 +523,7 @@ public class DataStoreBlobStore implemen
//~---------------------------------------------< Internal >
- private InputStream getStream(String blobId) throws IOException {
+ protected InputStream getStream(String blobId) throws IOException {
try {
InputStream in = getDataRecord(blobId).getStream();
if (!(in instanceof BufferedInputStream)){
@@ -535,7 +535,7 @@ public class DataStoreBlobStore implemen
}
}
- private DataRecord getDataRecord(String blobId) throws DataStoreException {
+ protected DataRecord getDataRecord(String blobId) throws DataStoreException {
DataRecord id;
if (InMemoryDataRecord.isInstance(blobId)) {
id = InMemoryDataRecord.getInstance(blobId);
@@ -590,7 +590,7 @@ public class DataStoreBlobStore implemen
return dr.getIdentifier().toString();
}
- private String extractBlobId(String encodedBlobId) {
+ protected String extractBlobId(String encodedBlobId) {
if (encodeLengthInId) {
return BlobId.of(encodedBlobId).blobId;
}
Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/InMemoryDataRecord.java Tue Aug 2 09:50:13 2016
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
/**
* Represents binary data which is backed by a byte[] (in memory).
*/
-class InMemoryDataRecord implements DataRecord {
+public class InMemoryDataRecord implements DataRecord {
/**
* Logger instance for this class
@@ -89,7 +89,7 @@ class InMemoryDataRecord implements Data
* @param id DataRecord identifier
* @return true if it can be converted
*/
- static boolean isInstance(String id) {
+ public static boolean isInstance(String id) {
return id.startsWith(PREFIX);
}
@@ -98,7 +98,7 @@ class InMemoryDataRecord implements Data
* @param id DataRecord identifier
* @return the instance
*/
- static InMemoryDataRecord getInstance(String id) throws IllegalArgumentException {
+ public static InMemoryDataRecord getInstance(String id) throws IllegalArgumentException {
assert id.startsWith(PREFIX);
id = id.substring(PREFIX.length());
int len = id.length();
Modified: jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java?rev=1754858&r1=1754857&r2=1754858&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/SafeDataStoreBlobStore.java Tue Aug 2 09:50:13 2016
@@ -16,15 +16,29 @@
*/
package org.apache.jackrabbit.oak.upgrade.cli.blob;
+import org.apache.jackrabbit.core.data.DataIdentifier;
+import org.apache.jackrabbit.core.data.DataRecord;
import org.apache.jackrabbit.core.data.DataStore;
+import org.apache.jackrabbit.core.data.DataStoreException;
import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
+import org.apache.jackrabbit.oak.plugins.blob.datastore.InMemoryDataRecord;
+import org.apache.jackrabbit.oak.spi.blob.stats.StatsCollectingStreams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.annotation.Nonnull;
+import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * This implementation of the DataStoreBlobStore won't throw an exception if
+ * it can't find blob with given id. The WARN message will be emitted instead
+ * and the empty InputStream will be returned.
+ */
public class SafeDataStoreBlobStore extends DataStoreBlobStore {
private static final Logger log = LoggerFactory.getLogger(SafeDataStoreBlobStore.class);
@@ -34,12 +48,55 @@ public class SafeDataStoreBlobStore exte
}
@Override
- public InputStream getInputStream(final String encodedBlobId) {
+ public String getReference(@Nonnull String encodedBlobId) {
+ checkNotNull(encodedBlobId);
+ String blobId = extractBlobId(encodedBlobId);
+ //Reference are not created for in memory record
+ if (InMemoryDataRecord.isInstance(blobId)) {
+ return null;
+ }
+
+ DataRecord record;
+ try {
+ record = delegate.getRecordIfStored(new DataIdentifier(blobId));
+ if (record != null) {
+ return record.getReference();
+ } else {
+ log.debug("No blob found for id [{}]", blobId);
+ }
+ } catch (DataStoreException e) {
+ log.warn("Unable to access the blobId for [{}]", blobId, e);
+ }
+ return null;
+ }
+
+
+ @Override
+ protected InputStream getStream(String blobId) throws IOException {
try {
- return super.getInputStream(encodedBlobId);
- } catch(IOException e) {
- log.warn("Missing blob: {}", encodedBlobId);
- return new ByteArrayInputStream(new byte[0]);
+ DataRecord record = getDataRecord(blobId);
+ if (record == null) {
+ log.warn("No blob found for id [{}]", blobId);
+ return new ByteArrayInputStream(new byte[0]);
+ }
+ InputStream in = getDataRecord(blobId).getStream();
+ if (!(in instanceof BufferedInputStream)){
+ in = new BufferedInputStream(in);
+ }
+ return StatsCollectingStreams.wrap(stats, blobId, in);
+ } catch (DataStoreException e) {
+ throw new IOException(e);
+ }
+ }
+
+ @Override
+ protected DataRecord getDataRecord(String blobId) throws DataStoreException {
+ DataRecord id;
+ if (InMemoryDataRecord.isInstance(blobId)) {
+ id = InMemoryDataRecord.getInstance(blobId);
+ } else {
+ id = delegate.getRecordIfStored(new DataIdentifier(blobId));
}
+ return id;
}
}
\ No newline at end of file