Author: amitj
Date: Thu May 16 06:52:07 2019
New Revision: 1859351
URL: http://svn.apache.org/viewvc?rev=1859351&view=rev
Log:
OAK-8314: BlobIds created with direct uploads lack length suffix
Enable DocumentNodeStore-Mongo fixture for BinaryAccessDSGCIT
Added:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/DocumentMongoNodeStoreFixture.java
- copied, changed from r1859350,
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/BinaryAccessDSGCIT.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/BinaryAccessDSGCIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/BinaryAccessDSGCIT.java?rev=1859351&r1=1859350&r2=1859351&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/BinaryAccessDSGCIT.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/BinaryAccessDSGCIT.java
Thu May 16 06:52:07 2019
@@ -56,25 +56,33 @@ import org.apache.jackrabbit.core.data.D
import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
import
org.apache.jackrabbit.oak.jcr.binary.fixtures.datastore.AzureDataStoreFixture;
import
org.apache.jackrabbit.oak.jcr.binary.fixtures.datastore.S3DataStoreFixture;
+import
org.apache.jackrabbit.oak.jcr.binary.fixtures.nodestore.DocumentMongoNodeStoreFixture;
import
org.apache.jackrabbit.oak.jcr.binary.fixtures.nodestore.SegmentMemoryNodeStoreFixture;
+import org.apache.jackrabbit.oak.jcr.binary.util.BinaryAccessDSGCFixture;
import org.apache.jackrabbit.oak.jcr.binary.util.Content;
+import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever;
import org.apache.jackrabbit.oak.plugins.blob.MarkSweepGarbageCollector;
import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
-import org.apache.jackrabbit.oak.segment.SegmentBlobReferenceRetriever;
import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
import org.apache.jackrabbit.oak.spi.cluster.ClusterRepositoryInfo;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import org.junit.runners.Parameterized;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class BinaryAccessDSGCIT extends AbstractBinaryAccessIT {
+ private static Logger LOG =
LoggerFactory.getLogger(BinaryAccessDSGCIT.class);
+
private static final String TEST_ROOT = "testroot";
private static final long BINARY_SIZE = 1024*1024;
@@ -83,17 +91,24 @@ public class BinaryAccessDSGCIT extends
private static final String DIRECT_UPLOAD_1 = "du1";
private static final String DIRECT_UPLOAD_2 = "du2";
+ @Rule
+ public TemporaryFolder folder = new TemporaryFolder(new File("target"));
+
@Parameterized.Parameters(name = "{0}")
public static Iterable<?> dataStoreFixtures() {
Collection<NodeStoreFixture> fixtures = new ArrayList<>();
fixtures.add(new SegmentMemoryNodeStoreFixture(new
S3DataStoreFixture()));
+ fixtures.add(new DocumentMongoNodeStoreFixture(new
S3DataStoreFixture()));
+
fixtures.add(new SegmentMemoryNodeStoreFixture(new
AzureDataStoreFixture()));
+ fixtures.add(new DocumentMongoNodeStoreFixture(new
AzureDataStoreFixture()));
+
return fixtures;
}
public BinaryAccessDSGCIT(NodeStoreFixture fixture) {
// reuse NodeStore (and DataStore) across all tests in this class
- super(fixture, true);
+ super(fixture, false);
}
private Session session;
@@ -190,8 +205,6 @@ public class BinaryAccessDSGCIT extends
private MarkSweepGarbageCollector getGarbageCollector()
throws DataStoreException, IOException {
DataStoreBlobStore blobStore = (DataStoreBlobStore)
getNodeStoreComponent(BlobStore.class);
- FileStore fileStore = getNodeStoreComponent(FileStore.class);
- File fileStoreRoot = getNodeStoreComponent(FileStore.class.getName() +
":root");
if (null == garbageCollector) {
String repoId =
ClusterRepositoryInfo.getOrCreateId(getNodeStore());
@@ -200,11 +213,12 @@ public class BinaryAccessDSGCIT extends
if (null == executor) {
executor = (ThreadPoolExecutor)
Executors.newFixedThreadPool(10);
}
+ BlobReferenceRetriever referenceRetriever =
((BinaryAccessDSGCFixture) fixture).getBlobReferenceRetriever(getNodeStore());
garbageCollector = new MarkSweepGarbageCollector(
- new SegmentBlobReferenceRetriever(fileStore),
+ referenceRetriever,
blobStore,
executor,
- fileStoreRoot.getAbsolutePath(),
+ folder.newFolder().getAbsolutePath(),
2048,
0,
repoId
@@ -225,6 +239,8 @@ public class BinaryAccessDSGCIT extends
@Test
public void testGC() throws Exception {
+ LOG.info("Starting testGC [{}]", fixture);
+
Map<String, Content> binaryContent = Maps.newHashMap();
Map<String, Binary> binaries = Maps.newHashMap();
@@ -256,7 +272,6 @@ public class BinaryAccessDSGCIT extends
}
session.save();
-
// Verify that they are deleted from repo
for (String path : deletedBinaryPaths) {
assertFalse(session.nodeExists(toAbsolutePath(path)));
@@ -267,7 +282,7 @@ public class BinaryAccessDSGCIT extends
// Run DSGC
- compactFileStore();
+ ((BinaryAccessDSGCFixture) fixture).compactStore(getNodeStore());
MarkSweepGarbageCollector garbageCollector = getGarbageCollector();
garbageCollector.collectGarbage(false);
Copied:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/DocumentMongoNodeStoreFixture.java
(from r1859350,
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/DocumentMongoNodeStoreFixture.java?p2=jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/DocumentMongoNodeStoreFixture.java&p1=jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java&r1=1859350&r2=1859351&rev=1859351&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/DocumentMongoNodeStoreFixture.java
Thu May 16 06:52:07 2019
@@ -20,60 +20,74 @@ package org.apache.jackrabbit.oak.jcr.bi
import java.io.File;
import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
import javax.jcr.RepositoryException;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.data.DataStore;
import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
import
org.apache.jackrabbit.oak.jcr.binary.fixtures.datastore.DataStoreFixture;
+import org.apache.jackrabbit.oak.jcr.binary.util.BinaryAccessDSGCFixture;
import org.apache.jackrabbit.oak.jcr.util.ComponentHolder;
+import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever;
import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
-import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
-import org.apache.jackrabbit.oak.segment.file.FileStore;
-import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
-import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
+import
org.apache.jackrabbit.oak.plugins.document.DocumentBlobReferenceRetriever;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.MongoConnectionFactory;
+import org.apache.jackrabbit.oak.plugins.document.Revision;
+import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector;
+import
org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentNodeStoreBuilder;
+import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.stats.Clock;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
-
/**
* Creates a repository with
- * - SegmentNodeStore, storing data in-memory
+ * - DocumentNodeStore, storing data in mongo (available locally or deloying
in docker if available)
* - an optional DataStore provided by DataStoreFixture
*/
-public class SegmentMemoryNodeStoreFixture extends NodeStoreFixture implements
ComponentHolder {
+public class DocumentMongoNodeStoreFixture extends NodeStoreFixture implements
ComponentHolder,
+ BinaryAccessDSGCFixture {
private final Logger log = LoggerFactory.getLogger(getClass());
private final DataStoreFixture dataStoreFixture;
-
private final Table<NodeStore, String, Object> components =
HashBasedTable.create();
+ private MongoConnection connection;
+ private final Clock clock;
+ public final MongoConnectionFactory connFactory = new
MongoConnectionFactory();
- public SegmentMemoryNodeStoreFixture(@Nullable DataStoreFixture
dataStoreFixture) {
+ public DocumentMongoNodeStoreFixture(@Nullable DataStoreFixture
dataStoreFixture) {
this.dataStoreFixture = dataStoreFixture;
+ this.clock = new Clock.Virtual();
}
@Override
public boolean isAvailable() {
+ this.connection = connFactory.getConnection();
+
// if a DataStore is configured, it must be available for our
NodeStore to be available
- return dataStoreFixture == null || dataStoreFixture.isAvailable();
+ return (dataStoreFixture == null || dataStoreFixture.isAvailable()) &&
(connection != null);
}
@Override
public NodeStore createNodeStore() {
+
try {
log.info("Creating NodeStore using " + toString());
+ clock.waitUntil(Revision.getCurrentTimestamp());
- File fileStoreRoot = FixtureUtils.createTempFolder();
- FileStoreBuilder fileStoreBuilder =
FileStoreBuilder.fileStoreBuilder(fileStoreRoot)
- .withNodeDeduplicationCacheSize(16384)
- .withMaxFileSize(256)
- .withMemoryMapping(false);
+ MongoDocumentNodeStoreBuilder documentNodeStoreBuilder =
+
MongoDocumentNodeStoreBuilder.newMongoDocumentNodeStoreBuilder()
+ .setMongoDB(connection.getMongoClient(),
connection.getDBName());
+ documentNodeStoreBuilder.clock(clock);
File dataStoreFolder = null;
BlobStore blobStore = null;
@@ -86,11 +100,10 @@ public class SegmentMemoryNodeStoreFixtu
dataStore.init(dataStoreFolder.getAbsolutePath());
blobStore = new DataStoreBlobStore(dataStore);
- fileStoreBuilder.withBlobStore(blobStore);
+ documentNodeStoreBuilder.setBlobStore(blobStore);
}
- FileStore fileStore = fileStoreBuilder.build();
- NodeStore nodeStore =
SegmentNodeStoreBuilders.builder(fileStore).build();
+ NodeStore nodeStore = documentNodeStoreBuilder.build();
// track all main components
if (dataStore != null) {
@@ -100,12 +113,9 @@ public class SegmentMemoryNodeStoreFixtu
if (blobStore != null) {
components.put(nodeStore, BlobStore.class.getName(),
blobStore);
}
- components.put(nodeStore, FileStore.class.getName(), fileStore);
- components.put(nodeStore, FileStore.class.getName() + ":root",
fileStoreRoot);
return nodeStore;
-
- } catch (IOException | InvalidFileStoreVersionException |
RepositoryException e) {
+ } catch (IOException | RepositoryException | InterruptedException e) {
throw new AssertionError("Cannot create test repo fixture " +
toString(), e);
}
}
@@ -113,8 +123,9 @@ public class SegmentMemoryNodeStoreFixtu
@Override
public void dispose(NodeStore nodeStore) {
try {
- File fileStoreRoot = (File) components.get(nodeStore,
FileStore.class.getName() + ":root");
- FileUtils.deleteQuietly(fileStoreRoot);
+ if (nodeStore instanceof DocumentNodeStore) {
+ ((DocumentNodeStore)nodeStore).dispose();
+ }
DataStore dataStore = (DataStore) components.get(nodeStore,
DataStore.class.getName());
if (dataStore != null && dataStoreFixture != null) {
@@ -123,12 +134,25 @@ public class SegmentMemoryNodeStoreFixtu
File dataStoreFolder = (File) components.get(nodeStore,
DataStore.class.getName() + ":folder");
FileUtils.deleteQuietly(dataStoreFolder);
}
+ connection.close();
} finally {
components.row(nodeStore).clear();
}
}
@Override
+ public void compactStore(NodeStore nodeStore) throws IOException,
InterruptedException {
+ clock.waitUntil(clock.getTime() + TimeUnit.HOURS.toMillis(10));
+ VersionGarbageCollector vGC = ((DocumentNodeStore)
nodeStore).getVersionGarbageCollector();
+ VersionGarbageCollector.VersionGCStats stats = vGC.gc(0,
TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public BlobReferenceRetriever getBlobReferenceRetriever(NodeStore
nodeStore) {
+ return new DocumentBlobReferenceRetriever((DocumentNodeStore)
nodeStore);
+ }
+
+ @Override
public String toString() {
// for nice Junit parameterized test labels
return FixtureUtils.getFixtureLabel(this, dataStoreFixture);
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java?rev=1859351&r1=1859350&r2=1859351&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/fixtures/nodestore/SegmentMemoryNodeStoreFixture.java
Thu May 16 06:52:07 2019
@@ -26,9 +26,13 @@ import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.data.DataStore;
import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
import
org.apache.jackrabbit.oak.jcr.binary.fixtures.datastore.DataStoreFixture;
+import org.apache.jackrabbit.oak.jcr.binary.util.BinaryAccessDSGCFixture;
import org.apache.jackrabbit.oak.jcr.util.ComponentHolder;
+import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever;
import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
+import org.apache.jackrabbit.oak.segment.SegmentBlobReferenceRetriever;
import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
+import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
@@ -46,7 +50,8 @@ import com.google.common.collect.Table;
* - SegmentNodeStore, storing data in-memory
* - an optional DataStore provided by DataStoreFixture
*/
-public class SegmentMemoryNodeStoreFixture extends NodeStoreFixture implements
ComponentHolder {
+public class SegmentMemoryNodeStoreFixture extends NodeStoreFixture implements
ComponentHolder,
+ BinaryAccessDSGCFixture {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -129,6 +134,19 @@ public class SegmentMemoryNodeStoreFixtu
}
@Override
+ public void compactStore(NodeStore nodeStore) {
+ FileStore fileStore = get(nodeStore, FileStore.class.getName());
+ for (int i = 0; i<
SegmentGCOptions.defaultGCOptions().getRetainedGenerations(); i++) {
+ fileStore.compactFull();
+ }
+ }
+
+ @Override
+ public BlobReferenceRetriever getBlobReferenceRetriever(NodeStore
nodeStore) {
+ return new SegmentBlobReferenceRetriever(get(nodeStore,
FileStore.class.getName()));
+ }
+
+ @Override
public String toString() {
// for nice Junit parameterized test labels
return FixtureUtils.getFixtureLabel(this, dataStoreFixture);
Added:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java?rev=1859351&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java
(added)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java
Thu May 16 06:52:07 2019
@@ -0,0 +1,32 @@
+/*
+ * 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.jcr.binary.util;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+
+/** Marker Interface for DSGC Fixture */
+public interface BinaryAccessDSGCFixture {
+
+ void compactStore(NodeStore nodeStore) throws IOException,
InterruptedException;
+
+ BlobReferenceRetriever getBlobReferenceRetriever(NodeStore nodeStore);
+}
Propchange:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/binary/util/BinaryAccessDSGCFixture.java
------------------------------------------------------------------------------
svn:eol-style = native