Author: mreutegg
Date: Wed Feb 28 17:08:35 2018
New Revision: 1825587
URL: http://svn.apache.org/viewvc?rev=1825587&view=rev
Log:
OAK-7216: Remove support for binaries and documents in persistent cache
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheType.java
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java
Wed Feb 28 17:08:35 2018
@@ -718,10 +718,6 @@ public class DocumentNodeStoreBuilder<T
protected void setGCBlobStore(GarbageCollectableBlobStore s) {
configureBlobStore(s);
- PersistentCache p = getPersistentCache();
- if (p != null) {
- s = p.wrapBlobStore(s);
- }
this.blobStore = s;
}
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
Wed Feb 28 17:08:35 2018
@@ -136,7 +136,7 @@ public class DocumentNodeStoreService {
static final int DEFAULT_BLOB_CACHE_SIZE = 16;
static final String DEFAULT_DB = "oak";
static final boolean DEFAULT_SO_KEEP_ALIVE = false;
- static final String DEFAULT_PERSISTENT_CACHE = "cache,binary=0";
+ static final String DEFAULT_PERSISTENT_CACHE = "cache";
static final String DEFAULT_JOURNAL_CACHE = "diff-cache";
static final boolean DEFAULT_CUSTOM_BLOB_STORE = false;
public static final String CONTINUOUS_RGC_EXPR = "*/5 * * * * ?";
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/BlobCache.java
Wed Feb 28 17:08:35 2018
@@ -1,236 +0,0 @@
-/*
- * 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.document.persistentCache;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Iterator;
-import java.util.List;
-
-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.BlobOptions;
-import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
-import org.h2.mvstore.MVMap;
-import org.h2.mvstore.StreamStore;
-import org.slf4j.Logger;
-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 GarbageCollectableBlobStore,
GenerationCache, Closeable {
-
- static final Logger LOG = LoggerFactory.getLogger(BlobCache.class);
-
- private final GarbageCollectableBlobStore base;
- private final PersistentCache cache;
- private final MultiGenerationMap<String, byte[]> meta;
- private MultiGenerationMap<Long, byte[]> data;
- private StreamStore streamStore;
- private long maxEntrySize;
-
- public BlobCache(
- PersistentCache cache,
- GarbageCollectableBlobStore base) {
- this.cache = cache;
- this.base = base;
- data = new MultiGenerationMap<Long, byte[]>();
- meta = new MultiGenerationMap<String, byte[]>();
- maxEntrySize = cache.getMaxBinaryEntrySize();
- }
-
- @Override
- public CacheType getType() {
- return CacheType.BLOB;
- }
-
- @Override
- public void addGeneration(int generation, boolean readOnly) {
- CacheMap<Long, byte[]> d = cache.openMap(generation, "data",
- new MVMap.Builder<Long, byte[]>());
- data.addReadMap(generation, d);
- CacheMap<String, byte[]> m = cache.openMap(generation, "meta",
- new MVMap.Builder<String, byte[]>());
- meta.addReadMap(generation, m);
- if (!readOnly) {
- // the order is important:
- // if we switch the data first,
- // we could end up with the data in store 1
- // but the metadata in store 2 - which could
- // result in a data block not found if store 1
- // is removed later on
- meta.setWriteMap(m);
- data.setWriteMap(d);
- }
- if (streamStore == null) {
- streamStore = new StreamStore(data);
- }
- }
-
- @Override
- public void removeGeneration(int generation) {
- data.removeReadMap(generation);
- meta.removeReadMap(generation);
- }
-
- @Override
- public InputStream getInputStream(String blobId) throws IOException {
- if (streamStore == null) {
- return base.getInputStream(blobId);
- }
- cache.switchGenerationIfNeeded();
- byte[] id = meta.get(blobId);
- if (id == null) {
- long length = base.getBlobLength(blobId);
- InputStream in = base.getInputStream(blobId);
- if (length < base.getBlockSizeMin()) {
- // in-place
- return in;
- }
- if (length > maxEntrySize) {
- // too large, don't cache
- return in;
- }
- id = streamStore.put(in);
- in.close();
- meta.put(blobId, id);
- }
- return streamStore.get(id);
- }
-
- @Override
- public String writeBlob(InputStream in) throws IOException {
- // TODO maybe copy the binary to the cache in a background thread
- 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 {
- InputStream in = getInputStream(blobId);
- long remainingSkip = pos;
- while (remainingSkip > 0) {
- remainingSkip -= in.skip(remainingSkip);
- }
- return in.read(buff, off, length);
- }
-
- @Override
- public long getBlobLength(String blobId) throws IOException {
- return base.getBlobLength(blobId);
- }
-
- @Override
- @CheckForNull
- public String getBlobId(@Nonnull String reference) {
- return base.getBlobId(reference);
- }
-
- @Override
- @CheckForNull
- public String getReference(@Nonnull String blobId) {
- return base.getReference(blobId);
- }
-
- @Override
- public void clearCache() {
- base.clearCache();
- }
-
- @Override
- public void clearInUse() {
- base.clearInUse();
- }
-
- @Override
- @Deprecated
- public boolean deleteChunks(List<String> chunkIds, long
maxLastModifiedTime) throws Exception {
- return base.deleteChunks(chunkIds, maxLastModifiedTime);
- }
-
- @Override
- public long countDeleteChunks(List<String> chunkIds, long
maxLastModifiedTime) throws Exception {
- return base.countDeleteChunks(chunkIds, maxLastModifiedTime);
- }
-
- @Override
- public Iterator<String> getAllChunkIds(long maxLastModifiedTime) throws
Exception {
- return base.getAllChunkIds(maxLastModifiedTime);
- }
-
- @Override
- public long getBlockSizeMin() {
- return base.getBlockSizeMin();
- }
-
- @Override
- public Iterator<String> resolveChunks(String blobId) throws IOException {
- return base.resolveChunks(blobId);
- }
-
- @Override
- public void setBlockSize(int x) {
- base.setBlockSize(x);
- }
-
- @Override
- public void startMark() throws IOException {
- base.startMark();
- }
-
- @Override
- public int sweep() throws IOException {
- return base.sweep();
- }
-
- @Override
- public String writeBlob(String tempFileName) throws IOException {
- return base.writeBlob(tempFileName);
- }
-
- @Override
- public void receive(ByteBuffer buff) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void close() throws IOException {
- if (base instanceof Closeable) {
- ((Closeable)base).close();
- }
- }
-
-}
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheType.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheType.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheType.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheType.java
Wed Feb 28 17:08:35 2018
@@ -126,63 +126,31 @@ public enum CacheType {
}
},
- DOC_CHILDREN {
- @Override
- public <K> String keyToString(K key) {
- return ((StringValue) key).asString();
- }
- @SuppressWarnings("unchecked")
- @Override
- public <K> K keyFromString(String key) {
- return (K) StringValue.fromString(key);
- }
- @Override
- public <K> int compareKeys(K a, K b) {
- return ((StringValue) a).asString().compareTo(((StringValue)
b).asString());
- }
- @Override
- public <V> String valueToString(V value) {
- return ((NodeDocument.Children) value).asString();
- }
- @SuppressWarnings("unchecked")
- @Override
- public <V> V valueFromString(
- DocumentNodeStore store, DocumentStore docStore, String value)
{
- return (V) NodeDocument.Children.fromString(value);
- }
- @Override
- public <K> boolean shouldCache(DocumentNodeStore store, K key) {
- return true;
- }
- },
-
DOCUMENT {
@Override
public <K> String keyToString(K key) {
- return ((StringValue) key).asString();
+ throw new UnsupportedOperationException();
}
- @SuppressWarnings("unchecked")
@Override
public <K> K keyFromString(String key) {
- return (K) StringValue.fromString(key);
+ throw new UnsupportedOperationException();
}
@Override
public <K> int compareKeys(K a, K b) {
- return ((StringValue) a).asString().compareTo(((StringValue)
b).asString());
+ throw new UnsupportedOperationException();
}
@Override
public <V> String valueToString(V value) {
- return ((NodeDocument) value).asString();
+ throw new UnsupportedOperationException();
}
- @SuppressWarnings("unchecked")
@Override
public <V> V valueFromString(
DocumentNodeStore store, DocumentStore docStore, String value)
{
- return (V) NodeDocument.fromString(docStore, value);
+ throw new UnsupportedOperationException();
}
@Override
public <K> boolean shouldCache(DocumentNodeStore store, K key) {
- return true;
+ return false;
}
},
@@ -244,40 +212,6 @@ public enum CacheType {
public <K> boolean shouldCache(DocumentNodeStore store, K key) {
return true;
}
- },
-
- BLOB {
-
- @Override
- public <K> String keyToString(K key) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public <K> K keyFromString(String key) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public <K> int compareKeys(K a, K b) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public <V> String valueToString(V value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public <V> V valueFromString(DocumentNodeStore store,
- DocumentStore docStore, String value) {
- throw new UnsupportedOperationException();
- }
- @Override
- public <K> boolean shouldCache(DocumentNodeStore store, K key) {
- return true;
- }
-
};
public static final CacheType[] VALUES = CacheType.values();
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java
Wed Feb 28 17:08:35 2018
@@ -33,7 +33,6 @@ import org.apache.jackrabbit.oak.plugins
import
org.apache.jackrabbit.oak.plugins.document.persistentCache.broadcast.InMemoryBroadcaster;
import
org.apache.jackrabbit.oak.plugins.document.persistentCache.broadcast.TCPBroadcaster;
import
org.apache.jackrabbit.oak.plugins.document.persistentCache.broadcast.UDPBroadcaster;
-import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.h2.mvstore.FileStore;
import org.h2.mvstore.MVMap;
@@ -63,8 +62,6 @@ public class PersistentCache implements
private boolean cacheDiff = true;
private boolean cacheLocalDiff = true;
private boolean cachePrevDocs = true;
- private boolean cacheDocs;
- private boolean cacheDocChildren;
private boolean compactOnClose;
private boolean compress = true;
private boolean asyncCache = true;
@@ -79,7 +76,6 @@ public class PersistentCache implements
private int memCache = -1;
private int readGeneration = -1;
private int writeGeneration;
- private long maxBinaryEntry = 1024 * 1024;
private int autoCompact = 0;
private boolean appendOnly;
private boolean manualCommit;
@@ -107,15 +103,11 @@ public class PersistentCache implements
String broadcast = "disabled";
for (String p : parts) {
if (p.equals("+docs")) {
- // enabling this can lead to consistency problems,
- // specially if multiple cluster nodes are used
- cacheDocs = true;
+ logUnsupportedWarning("docs");
} else if (p.equals("-prevDocs")) {
cachePrevDocs = false;
} else if (p.equals("+docChildren")) {
- // enabling this can lead to consistency problems,
- // specially if multiple cluster nodes are used
- cacheDocChildren = true;
+ logUnsupportedWarning("docChildren");
} else if (p.equals("-nodes")) {
cacheNodes = false;
} else if (p.equals("-children")) {
@@ -125,8 +117,7 @@ public class PersistentCache implements
} else if (p.equals("-localDiff")) {
cacheLocalDiff = false;
} else if (p.equals("+all")) {
- cacheDocs = true;
- cacheDocChildren = true;
+ logUnsupportedWarning("all");
} else if (p.equals("-compact")) {
compactOnClose = false;
} else if (p.equals("+compact")) {
@@ -140,7 +131,7 @@ public class PersistentCache implements
} else if (p.startsWith("memCache=")) {
memCache = Integer.parseInt(p.split("=")[1]);
} else if (p.startsWith("binary=")) {
- maxBinaryEntry = Long.parseLong(p.split("=")[1]);
+ logUnsupportedWarning("binary");
} else if (p.startsWith("autoCompact=")) {
autoCompact = Integer.parseInt(p.split("=")[1]);
} else if (p.equals("appendOnly")) {
@@ -215,6 +206,11 @@ public class PersistentCache implements
writeDispatcherThread.setDaemon(true);
writeDispatcherThread.start();
}
+
+ private void logUnsupportedWarning(String configKey) {
+ LOG.warn("Support for '{}' has been removed from persistent cache. " +
+ "Please update the configuration.", configKey);
+ }
private void initBroadcast(String broadcast) {
if (broadcast == null) {
@@ -384,16 +380,6 @@ public class PersistentCache implements
writeBuffer.remove();
}
- public synchronized GarbageCollectableBlobStore wrapBlobStore(
- GarbageCollectableBlobStore base) {
- if (maxBinaryEntry == 0) {
- return base;
- }
- BlobCache c = new BlobCache(this, base);
- initGenerationCache(c);
- return c;
- }
-
public synchronized <K, V> Cache<K, V> wrap(
DocumentNodeStore docNodeStore,
DocumentStore docStore,
@@ -423,12 +409,6 @@ public class PersistentCache implements
wrap = cacheLocalDiff;
async = asyncDiffCache;
break;
- case DOC_CHILDREN:
- wrap = cacheDocChildren;
- break;
- case DOCUMENT:
- wrap = cacheDocs;
- break;
case PREV_DOCUMENT:
wrap = cachePrevDocs;
break;
@@ -510,10 +490,6 @@ public class PersistentCache implements
return maxSizeMB;
}
- public long getMaxBinaryEntrySize() {
- return maxBinaryEntry;
- }
-
public int getOpenCount() {
return writeStore.getOpenCount();
}
Modified:
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java?rev=1825587&r1=1825586&r2=1825587&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
Wed Feb 28 17:08:35 2018
@@ -22,10 +22,8 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
-import java.util.Random;
import com.google.common.cache.Cache;
import org.apache.commons.io.FileUtils;
@@ -34,8 +32,6 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.Revision;
import org.apache.jackrabbit.oak.plugins.document.RevisionVector;
import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
-import org.apache.jackrabbit.oak.spi.blob.BlobStore;
-import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore;
import org.junit.Test;
public class CacheTest {
@@ -96,26 +92,6 @@ public class CacheTest {
}
@Test
- public void test() throws Exception {
- FileUtils.deleteDirectory(new File("target/cacheTest"));
- PersistentCache cache = new
PersistentCache("target/cacheTest,size=1,-compress");
- try {
- MemoryBlobStore mem = new MemoryBlobStore();
- mem.setBlockSizeMin(100);
- BlobStore b = cache.wrapBlobStore(mem);
- Random r = new Random();
- for (int i = 0; i < 10000; i++) {
- byte[] data = new byte[100];
- r.nextBytes(data);
- String id = b.writeBlob(new ByteArrayInputStream(data));
- b.readBlob(id, 0, new byte[1], 0, 1);
- }
- } finally {
- cache.close();
- }
- }
-
- @Test
public void interrupt() throws Exception {
FileUtils.deleteDirectory(new File("target/cacheTest"));
PersistentCache cache = new
PersistentCache("target/cacheTest,size=1,-compress");