Author: amitj
Date: Mon Oct 24 04:52:09 2016
New Revision: 1766341
URL: http://svn.apache.org/viewvc?rev=1766341&view=rev
Log:
OAK-4979: Caching sub-system implementation for DataStore
* Introduce noop implementations for FileCache & UploadStagingCache for 0 cache
size
* Fix issue in AbstractSharedCachingDataStore for cache size 0
* Tests for cache size 0
Modified:
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/CompositeDataStoreCache.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/FileCache.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCache.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.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/CompositeDataStoreCacheTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/FileCacheTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCacheTest.java
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=1766341&r1=1766340&r2=1766341&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
Mon Oct 24 04:52:09 2016
@@ -34,13 +34,11 @@ import javax.annotation.Nullable;
import com.google.common.base.Function;
import com.google.common.base.Stopwatch;
-import com.google.common.base.Strings;
import com.google.common.cache.CacheLoader;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.io.Closeables;
import com.google.common.util.concurrent.ListeningExecutorService;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.core.data.AbstractDataRecord;
import org.apache.jackrabbit.core.data.AbstractDataStore;
@@ -147,7 +145,7 @@ public abstract class AbstractSharedCach
this.rootDirectory = new File(path);
this.tmp = new File(rootDirectory, "tmp");
- tmp.mkdirs();
+ LOG.trace("Temporary file created [{}]", tmp.mkdirs());
this.backend = createBackend();
backend.init();
@@ -219,20 +217,13 @@ public abstract class AbstractSharedCach
LOG.debug("SHA1 of [{}], length =[{}] took [{}]ms ",
new Object[] {identifier, length,
watch.elapsed(TimeUnit.MILLISECONDS)});
- File cachedFile;
// asynchronously stage for upload if the size limit of staging
cache permits
+ // otherwise add to backend
if (!cache.stage(identifier.toString(), tmpFile)) {
backend.write(identifier, tmpFile);
- // Update the last modified for the file if present in the
download cache
- cachedFile = cache.getIfPresent(identifier.toString());
- if (cachedFile != null) {
- FileUtils.touch(cachedFile);
- }
- } else {
- cachedFile = cache.getIfPresent(identifier.toString());
}
- return new FileCacheDataRecord(this, identifier,
cachedFile.length(), cachedFile.lastModified());
+ return getRecordIfStored(identifier);
} catch (Exception e) {
LOG.error("Error in adding record");
throw new DataStoreException("Error in adding record ", e);
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCache.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCache.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCache.java
Mon Oct 24 04:52:09 2016
@@ -73,11 +73,10 @@ public class CompositeDataStoreCache ext
long uploadSize = (size * uploadSplitPercentage)/100;
- this.downloadCache =
- new FileCache((size - uploadSize), directory, loader, null);
+ this.downloadCache = FileCache.build((size - uploadSize), directory,
loader, null);
- this.stagingCache =
- new UploadStagingCache(directory, uploadThreads, uploadSize,
uploader, downloadCache,
+ this.stagingCache = UploadStagingCache
+ .build(directory, uploadThreads, uploadSize, uploader,
downloadCache,
statsProvider, executor, scheduledExecutor, purgeInterval);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/FileCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/FileCache.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/FileCache.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/FileCache.java
Mon Oct 24 04:52:09 2016
@@ -77,21 +77,20 @@ public class FileCache extends AbstractC
/**
* Convert the size calculation to KB to support max file size of 2 TB
*/
- private final Weigher<String, File> weigher = new Weigher<String, File>() {
+ private static final Weigher<String, File> weigher = new Weigher<String,
File>() {
@Override public int weigh(String key, File value) {
return Math.round(value.length() / (4 * 1024)); // convert to KB
}};
//Rough estimate of the in-memory key, value pair
- private final Weigher<String, File> memWeigher = new Weigher<String,
File>() {
+ private static final Weigher<String, File> memWeigher = new
Weigher<String, File>() {
@Override public int weigh(String key, File value) {
return (StringUtils.estimateMemoryUsage(key) +
StringUtils.estimateMemoryUsage(value.getAbsolutePath()) + 48);
}};
- public FileCache(long maxSize /** bytes **/, File root,
- final CacheLoader<String, InputStream> loader,
- @Nullable final ExecutorService executor) {
+ private FileCache(long maxSize /** bytes **/, File root,
+ final CacheLoader<String, InputStream> loader, @Nullable final
ExecutorService executor) {
this.cacheRoot = new File(root, "download");
@@ -150,6 +149,39 @@ public class FileCache extends AbstractC
this.executor.submit(new CacheBuildJob());
}
+ public static FileCache build(long maxSize /** bytes **/, File root,
+ final CacheLoader<String, InputStream> loader, @Nullable final
ExecutorService executor) {
+ if (maxSize > 0) {
+ return new FileCache(maxSize, root, loader, executor);
+ }
+ return new FileCache(maxSize, root, loader, executor) {
+ @Override public void put(String key, File file) {
+ }
+
+ @Override public boolean containsKey(String key) {
+ return false;
+ }
+
+ @Nullable @Override public File getIfPresent(String key) {
+ return null;
+ }
+
+ @Override public File get(String key) throws IOException {
+ return null;
+ }
+
+ @Override public void invalidate(Object key) {
+ }
+
+ @Override public DataStoreCacheStatsMBean getStats() {
+ return new FileCacheStats(this, "DataStore-DownloadCache",
weigher, memWeigher, 0);
+ }
+
+ @Override public void close() {
+ }
+ };
+ }
+
/**
* Puts the given key and file into the cache.
* The file is moved to the cache. So, the original file
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCache.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCache.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCache.java
Mon Oct 24 04:52:09 2016
@@ -34,6 +34,7 @@ import javax.annotation.Nullable;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.cache.Weigher;
+import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.google.common.util.concurrent.FutureCallback;
@@ -132,12 +133,10 @@ public class UploadStagingCache implemen
@Nullable
private final FileCache downloadCache;
- public UploadStagingCache(File dir, int uploadThreads, long size /** bytes
**/,
- StagingUploader uploader,
- @Nullable FileCache cache, StatisticsProvider statisticsProvider,
+ private UploadStagingCache(File dir, int uploadThreads, long size /**
bytes **/,
+ StagingUploader uploader, @Nullable FileCache cache,
StatisticsProvider statisticsProvider,
@Nullable ListeningExecutorService executor,
- @Nullable ScheduledExecutorService scheduledExecutor,
- long purgeInterval /** secs **/) {
+ @Nullable ScheduledExecutorService scheduledExecutor, long
purgeInterval /** secs **/) {
this.currentSize = new AtomicLong();
this.size = size;
@@ -165,6 +164,40 @@ public class UploadStagingCache implemen
TimeUnit.SECONDS);
}
+ public static UploadStagingCache build(File dir, int uploadThreads, long
size
+ /** bytes **/, StagingUploader uploader, @Nullable FileCache cache,
+ StatisticsProvider statisticsProvider, @Nullable
ListeningExecutorService executor,
+ @Nullable ScheduledExecutorService scheduledExecutor, long
purgeInterval /** secs **/) {
+ if (size > 0) {
+ return new UploadStagingCache(dir, uploadThreads, size, uploader,
cache,
+ statisticsProvider, executor, scheduledExecutor,
purgeInterval);
+ }
+ return new UploadStagingCache(dir, uploadThreads, size, uploader,
cache,
+ statisticsProvider, executor, scheduledExecutor, purgeInterval) {
+ @Override public Optional<SettableFuture<Integer>> put(String id,
File input) {
+ return Optional.absent();
+ }
+
+ @Override protected void invalidate(String key) {
+ }
+
+ @Override protected Iterator<String> getAllIdentifiers() {
+ return Iterators.emptyIterator();
+ }
+
+ @Nullable @Override public File getIfPresent(String key) {
+ return null;
+ }
+
+ @Override public DataStoreCacheStatsMBean getStats() {
+ return new StagingCacheStats(this, StatisticsProvider.NOOP, 0);
+ }
+
+ @Override public void close() {
+ }
+ };
+ }
+
/**
* Retrieves all the files staged in the staging area and schedules them
for uploads.
*/
@@ -278,7 +311,7 @@ public class UploadStagingCache implemen
// Add the uploaded file to the download cache if
available
if (downloadCache != null) {
// Touch the file to update timestamp and record
length
- FileUtils.touch(upload);
+ Files.touch(upload);
long length = upload.length();
downloadCache.put(id, upload);
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
Mon Oct 24 04:52:09 2016
@@ -47,6 +47,7 @@ import com.google.common.util.concurrent
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.core.data.AbstractDataRecord;
import org.apache.jackrabbit.core.data.DataIdentifier;
import org.apache.jackrabbit.core.data.DataRecord;
import org.apache.jackrabbit.core.data.DataStoreException;
@@ -227,7 +228,7 @@ public class AbstractDataStoreCacheTest
// A mock Backend implementation that uses a Map to keep track of what
// records have been added and removed, for test purposes only.
- class TestMemoryBackend implements SharedBackend {
+ static class TestMemoryBackend implements SharedBackend {
final Map<DataIdentifier, File> _backend = Maps.newHashMap();
@Override public InputStream read(DataIdentifier identifier) throws
DataStoreException {
@@ -249,6 +250,27 @@ public class AbstractDataStoreCacheTest
}
@Override public DataRecord getRecord(DataIdentifier id) throws
DataStoreException {
+ if (_backend.containsKey(id)) {
+ final File f = _backend.get(id);
+ return new AbstractDataRecord(null, id) {
+ @Override public long getLength() throws
DataStoreException {
+ return f.length();
+ }
+
+ @Override public InputStream getStream() throws
DataStoreException {
+ try {
+ return new FileInputStream(f);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override public long getLastModified() {
+ return f.lastModified();
+ }
+ };
+ }
return null;
}
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=1766341&r1=1766340&r2=1766341&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
Mon Oct 24 04:52:09 2016
@@ -82,10 +82,10 @@ public class CachingDataStoreTest extend
@Before
public void setup() throws Exception {
root = folder.newFolder();
- init(1);
+ init(1, 64 * 1024 * 1024, 10);
}
- private void init(int i) throws Exception {
+ private void init(int i, int cacheSize, int uploadSplit) throws Exception {
// create executor
taskLatch = new CountDownLatch(1);
callbackLatch = new CountDownLatch(1);
@@ -109,11 +109,61 @@ public class CachingDataStoreTest extend
}
};
dataStore.setStatisticsProvider(statsProvider);
+ dataStore.setCacheSize(cacheSize);
+ dataStore.setStagingSplitPercentage(uploadSplit);
dataStore.listeningExecutor = executor;
dataStore.schedulerExecutor = scheduledExecutor;
dataStore.init(root.getAbsolutePath());
}
+ @Test
+ public void zeroCacheAddGetDelete() throws Exception {
+ dataStore.close();
+ init(1, 0, 0);
+ 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());
+ 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);
+ }
+
+ @Test
+ public void zeroStagingCacheAddGetDelete() throws Exception {
+ dataStore.close();
+ init(1, 64 * 1024 * 1024, 0);
+ 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());
+ 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);
+ }
+
/**
* {@link CompositeDataStoreCache#getIfPresent(String)} when no cache.
*/
@@ -168,6 +218,7 @@ public class CachingDataStoreTest extend
DataRecord rec = dataStore.addRecord(fin);
assertEquals(id, rec.getIdentifier().toString());
+ assertFile(rec.getStream(), f, folder);
rec = dataStore.getRecordIfStored(new DataIdentifier(id));
assertNotNull(rec);
@@ -229,16 +280,18 @@ public class CachingDataStoreTest extend
private String getIdForInputStream(File f)
throws Exception {
- FileInputStream in = new FileInputStream(f);
- MessageDigest digest = MessageDigest.getInstance("SHA-1");
- OutputStream output = new DigestOutputStream(new NullOutputStream(),
digest);
+ FileInputStream in = null;
+ OutputStream output = null;
try {
+ in = new FileInputStream(f);
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
+ output = new DigestOutputStream(new NullOutputStream(), digest);
IOUtils.copyLarge(in, output);
+ return encodeHexString(digest.digest());
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(in);
}
- return encodeHexString(digest.digest());
}
private void waitFinish() {
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCacheTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCacheTest.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCacheTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CompositeDataStoreCacheTest.java
Mon Oct 24 04:52:09 2016
@@ -110,6 +110,27 @@ public class CompositeDataStoreCacheTest
closer.close();
}
+ @Test
+ public void zeroCache() throws IOException {
+ cache = new CompositeDataStoreCache(root.getAbsolutePath(),
+ 0 /* bytes */, 10, 1/*threads*/, loader,
+ uploader, statsProvider, executor, scheduledExecutor, 3000);
+ closer.register(cache);
+
+ File f = copyToFile(randomStream(0, 4 * 1024), folder.newFile());
+ boolean accepted = cache.stage(ID_PREFIX + 0, f);
+ assertFalse(accepted);
+ assertNull(cache.getIfPresent(ID_PREFIX + 0));
+ assertNull(cache.get(ID_PREFIX + 0));
+
+ assertEquals(0,
cache.getStagingCache().getStats().getMaxTotalWeight());
+ assertEquals(0, cache.getStagingCacheStats().getMaxTotalWeight());
+
assertEquals(0,cache.getDownloadCache().getStats().getMaxTotalWeight());
+ assertEquals(0,cache.getCacheStats().getMaxTotalWeight());
+ cache.invalidate(ID_PREFIX + 0);
+ cache.close();
+ }
+
/**
* {@link CompositeDataStoreCache#getIfPresent(String)} when no cache.
*/
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/FileCacheTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/FileCacheTest.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/FileCacheTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/FileCacheTest.java
Mon Oct 24 04:52:09 2016
@@ -79,7 +79,7 @@ public class FileCacheTest extends Abstr
TestExecutor executor = new TestExecutor(1, beforeLatch,
afterLatch, afterExecuteLatch);
beforeLatch.countDown();
afterLatch.countDown();
- cache = new FileCache(0/** MB */, root, loader, executor);
+ cache = FileCache.build(4 * 1024/** KB */, root, loader, executor);
Futures.successfulAsList((Iterable<? extends ListenableFuture<?>>)
executor.futures).get();
closer.register(cache);
@@ -91,6 +91,20 @@ public class FileCacheTest extends Abstr
closeQuietly(closer);
}
+ @Test
+ public void zeroCache() throws Exception {
+ cache = FileCache.build(0/** KB */, root, loader, null);
+ closer.register(cache);
+ File f = createFile(0, loader, cache, folder);
+ cache.put(ID_PREFIX + 0, f);
+ assertNull(cache.getIfPresent(ID_PREFIX + 0));
+ assertNull(cache.get(ID_PREFIX + 0));
+ assertEquals(0, cache.getStats().getMaxTotalWeight());
+ cache.invalidate(ID_PREFIX + 0);
+ assertFalse(cache.containsKey(ID_PREFIX + 0));
+ cache.close();
+ }
+
/**
* Load and get from cache.
* @throws Exception
@@ -349,7 +363,7 @@ public class FileCacheTest extends Abstr
TestExecutor executor = new TestExecutor(1, beforeLatch, afterLatch,
afterExecuteLatch);
beforeLatch.countDown();
afterLatch.countDown();
- cache = new FileCache(4 * 1024/* bytes */, root, loader, executor);
+ cache = FileCache.build(4 * 1024/* bytes */, root, loader, executor);
afterExecuteLatch.await();
Futures.successfulAsList((Iterable<? extends ListenableFuture<?>>)
executor.futures).get();
@@ -366,7 +380,7 @@ public class FileCacheTest extends Abstr
executor = new TestExecutor(1, beforeLatch, afterLatch,
afterExecuteLatch);
beforeLatch.countDown();
afterLatch.countDown();
- cache = new FileCache(4 * 1024/* bytes */, root, loader, executor);
+ cache = FileCache.build(4 * 1024/* bytes */, root, loader, executor);
closer.register(cache);
afterExecuteLatch.await();
Futures.successfulAsList((Iterable<? extends ListenableFuture<?>>)
executor.futures).get();
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCacheTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCacheTest.java?rev=1766341&r1=1766340&r2=1766341&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCacheTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/UploadStagingCacheTest.java
Mon Oct 24 04:52:09 2016
@@ -108,7 +108,7 @@ public class UploadStagingCacheTest exte
//cache instance
stagingCache =
- new UploadStagingCache(root, 1/*threads*/, 8 * 1024 /* bytes */,
+ UploadStagingCache.build(root, 1/*threads*/, 8 * 1024 /* bytes */,
uploader, null/*cache*/, statsProvider, executor, null, 3000);
closer.register(stagingCache);
}
@@ -118,6 +118,22 @@ public class UploadStagingCacheTest exte
closer.close();
}
+ @Test
+ public void testZeroCache() throws IOException {
+ stagingCache =
+ UploadStagingCache.build(root, 1/*threads*/, 0 /* bytes */,
+ uploader, null/*cache*/, statsProvider, executor, null, 3000);
+ closer.register(stagingCache);
+
+ File f = copyToFile(randomStream(0, 4 * 1024), folder.newFile());
+ Optional<SettableFuture<Integer>> future = stagingCache.put(ID_PREFIX
+ 0, f);
+ assertFalse(future.isPresent());
+
+ assertNull(stagingCache.getIfPresent(ID_PREFIX + 0));
+ assertEquals(0, Iterators.size(stagingCache.getAllIdentifiers()));
+ assertEquals(0, stagingCache.getStats().getMaxTotalWeight());
+ }
+
/**
* Stage file successful upload.
* @throws Exception
@@ -148,7 +164,7 @@ public class UploadStagingCacheTest exte
// initialize staging cache using the mocked uploader
stagingCache =
- new UploadStagingCache(root, 1/*threads*/, 4 * 1024 /* bytes */,
+ UploadStagingCache.build(root, 1/*threads*/, 4 * 1024 /* bytes */,
mockedDS, null/*cache*/, statsProvider, executor, null, 3000);
closer.register(stagingCache);
@@ -255,7 +271,7 @@ public class UploadStagingCacheTest exte
public void testCacheFullAdd() throws Exception {
// initialize cache to have restricted size
stagingCache =
- new UploadStagingCache(root, 1/*threads*/, 4 * 1024 /* bytes */,
+ UploadStagingCache.build(root, 1/*threads*/, 4 * 1024 /* bytes */,
uploader, null/*cache*/, statsProvider, executor, null, 3000);
closer.register(stagingCache);