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


Reply via email to