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 am...@apache.org on 2017/05/31 05:21:46 UTC
svn commit: r1796975 - in /jackrabbit/oak/branches/1.6: ./
oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/
oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/
Author: amitj
Date: Wed May 31 05:21:46 2017
New Revision: 1796975
URL: http://svn.apache.org/viewvc?rev=1796975&view=rev
Log:
OAK-5935: AbstractSharedCachingDataStore#getRecordIfStored should use the underlying cache.get
Merged r1796274 from trunk
Modified:
jackrabbit/oak/branches/1.6/ (props changed)
jackrabbit/oak/branches/1.6/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractDataRecord.java
jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
Propchange: jackrabbit/oak/branches/1.6/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed May 31 05:21:46 2017
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784034,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787145,1787217,1787425,1788378,1788387-1788389,1788850,1789056,1790382,1792463,1792742,1792746,1793088,1793618,1793627,1793644,1795138,1795314,1795330,1795475,1795488,1795491,1795502,1795594,1795613,1795618,1796144
+/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784034,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787145,1787217,1787425,1788378,1788387-1788389,1788850,1789056,1790382,1792463,1792742,1792746,1793088,1793618,1793627,1793644,1795138,1795314,1795330,1795475,1795488,1795491,1795502,1795594,1795613,1795618,1796144,1796274
/jackrabbit/trunk:1345480
Modified: jackrabbit/oak/branches/1.6/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractDataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractDataRecord.java?rev=1796975&r1=1796974&r2=1796975&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractDataRecord.java (original)
+++ jackrabbit/oak/branches/1.6/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/AbstractDataRecord.java Wed May 31 05:21:46 2017
@@ -29,7 +29,7 @@ public abstract class AbstractDataRecord
/**
* The data store that contains this record.
*/
- private final AbstractSharedBackend backend;
+ protected final AbstractSharedBackend backend;
/**
* The binary identifier;
Modified: jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java?rev=1796975&r1=1796974&r2=1796975&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java Wed May 31 05:21:46 2017
@@ -202,13 +202,15 @@ public abstract class AbstractSharedCach
if (cached != null && cached.exists()) {
return new FileCacheDataRecord(this, backend, dataIdentifier, cached.length(),
cached.lastModified());
- }
-
- // File not in cache so, retrieve the meta data from the backend explicitly
- try {
- return backend.getRecord(dataIdentifier);
- } catch (Exception e) {
- LOG.error("Error retrieving record [{}] from backend", dataIdentifier, e);
+ } else {
+ // Return the metadata from backend and lazily load the stream
+ try {
+ DataRecord rec = backend.getRecord(dataIdentifier);
+ return new FileCacheDataRecord(this, backend, dataIdentifier, rec.getLength(),
+ rec.getLastModified());
+ } catch (Exception e) {
+ LOG.error("Error retrieving record [{}]", dataIdentifier, e);
+ }
}
return null;
}
@@ -311,8 +313,21 @@ public abstract class AbstractSharedCach
@Override
public InputStream getStream() throws DataStoreException {
+ File cached = null;
+ // Need a catch as there's a possibility of eviction of this from cache
try {
- return new FileInputStream(store.cache.get(getIdentifier().toString()));
+ cached = store.cache.get(getIdentifier().toString());
+ } catch (final Exception e) {
+ LOG.debug("Error retrieving from cache " + getIdentifier(), e);
+ }
+
+ try {
+ // If cache configured to 0 will return null
+ if (cached == null || !cached.exists()) {
+ return backend.getRecord(getIdentifier()).getStream();
+ } else {
+ return new FileInputStream(cached);
+ }
} catch (final Exception e) {
throw new DataStoreException(
"Error opening input stream for identifier " + getIdentifier(), e);
Modified: jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java?rev=1796975&r1=1796974&r2=1796975&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java Wed May 31 05:21:46 2017
@@ -252,13 +252,14 @@ public class AbstractDataStoreCacheTest
@Override public void write(DataIdentifier identifier, File file)
throws DataStoreException {
+ File backendFile = getFile(identifier.toString(), root);
if (file != null && file.exists()) {
try {
- FileUtils.copyFile(file, getFile(identifier.toString(), root));
+ FileUtils.copyFile(file, backendFile);
} catch (IOException e) {
throw new DataStoreException(e);
}
- _backend.put(identifier, file);
+ _backend.put(identifier, backendFile);
} else {
throw new DataStoreException(
String.format("file %s of id %s", new Object[] {file, identifier.toString()}));
Modified: jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java?rev=1796975&r1=1796974&r2=1796975&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java Wed May 31 05:21:46 2017
@@ -255,7 +255,7 @@ public class CachingDataStoreTest extend
}
/**
- * {@link CompositeDataStoreCache#getIfPresent(String)} when no cache.
+ * {@link CompositeDataStoreCache#getIfPresent(String)} when no record.
*/
@Test
public void getRecordNotAvailable() throws DataStoreException {
@@ -268,6 +268,53 @@ public class CachingDataStoreTest extend
}
/**
+ * Add in datastore, invalidate from cache and lazy load record stream.
+ */
+ @Test
+ public void lazyLoadStream() throws Exception {
+ LOG.info("Starting lazyLoadStream");
+
+ 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);
+ assertEquals(id, rec.getIdentifier().toString());
+
+ //start & finish
+ taskLatch.countDown();
+ callbackLatch.countDown();
+ waitFinish();
+
+ // Invalidate from the local cache
+ dataStore.getCache().invalidate(id);
+
+ // retrieve record from the datastore
+ rec = dataStore.getRecordIfStored(new DataIdentifier(id));
+ assertNotNull(rec);
+ assertEquals(id, rec.getIdentifier().toString());
+
+ // the file should not be in cache
+ File cached = dataStore.getCache().getIfPresent(id);
+ assertNull(cached);
+
+ // assert stream
+ assertFile(rec.getStream(), f, folder);
+
+ // Now should be available in the cache
+ cached = dataStore.getCache().getIfPresent(id);
+ assertNotNull(cached);
+ assertTrue(Files.equal(f, cached));
+
+ dataStore.deleteRecord(new DataIdentifier(id));
+ rec = dataStore.getRecordIfStored(new DataIdentifier(id));
+ assertNull(rec);
+
+ LOG.info("Finished lazyLoadStream");
+ }
+
+ /**
* {@link CompositeDataStoreCache#get(String)} when no cache.
* @throws IOException
*/