Author: amitj
Date: Thu May 18 03:36:19 2017
New Revision: 1795475
URL: http://svn.apache.org/viewvc?rev=1795475&view=rev
Log:
OAK-6229: NPE when running datastorecheck command with S3
- Initializing the S3DataStore with a temp directory
- Changed setup to also enable testing for S3 & Azure and test dependencies to
s3, azure modules
Modified:
jackrabbit/oak/trunk/oak-run/pom.xml
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/cli/BlobStoreFixtureProvider.java
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
Modified: jackrabbit/oak/trunk/oak-run/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/pom.xml?rev=1795475&r1=1795474&r2=1795475&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-run/pom.xml Thu May 18 03:36:19 2017
@@ -319,7 +319,27 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
-
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>oak-blob-plugins</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>oak-blob-cloud</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>oak-blob-cloud-azure</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<profiles>
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java?rev=1795475&r1=1795474&r2=1795475&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
Thu May 18 03:36:19 2017
@@ -305,4 +305,4 @@ public class DataStoreCheckCommand imple
System.out.println(count + " blob ids found");
System.out.println("Finished in " + watch.elapsed(TimeUnit.SECONDS) +
" seconds");
}
-}
\ No newline at end of file
+}
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java?rev=1795475&r1=1795474&r2=1795475&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
Thu May 18 03:36:19 2017
@@ -233,7 +233,9 @@ class Utils {
String cfgPath = s3dsConfig.value(options);
Properties props = loadAndTransformProps(cfgPath);
s3ds.setProperties(props);
- s3ds.init(null);
+ File homeDir = Files.createTempDir();
+ closer.register(asCloseable(homeDir));
+ s3ds.init(homeDir.getAbsolutePath());
delegate = s3ds;
} else if (options.has(azureBlobDSConfig)) {
AzureDataStore azureds = new AzureDataStore();
@@ -312,4 +314,4 @@ class Utils {
}
return props;
}
-}
\ No newline at end of file
+}
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/cli/BlobStoreFixtureProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/cli/BlobStoreFixtureProvider.java?rev=1795475&r1=1795474&r2=1795475&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/cli/BlobStoreFixtureProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/cli/BlobStoreFixtureProvider.java
Thu May 18 03:36:19 2017
@@ -68,7 +68,9 @@ public class BlobStoreFixtureProvider {
SharedS3DataStore s3ds = new SharedS3DataStore();
Properties props = loadAndTransformProps(bsopts.getS3ConfigPath());
s3ds.setProperties(props);
- s3ds.init(null);
+ File homeDir = Files.createTempDir();
+ closer.register(asCloseable(homeDir));
+ s3ds.init(homeDir.getAbsolutePath());
delegate = s3ds;
} else if(bsType == Type.AZURE){
AzureDataStore azureds = new AzureDataStore();
Modified:
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java?rev=1795475&r1=1795474&r2=1795475&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
Thu May 18 03:36:19 2017
@@ -21,7 +21,6 @@ package org.apache.jackrabbit.oak.run;
import static com.google.common.base.Charsets.UTF_8;
import static org.junit.Assert.assertEquals;
-import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -34,6 +33,7 @@ import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Properties;
import java.util.Random;
import java.util.Set;
@@ -41,9 +41,12 @@ import com.google.common.collect.Immutab
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
-import com.google.common.io.Files;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.felix.cm.file.ConfigurationHandler;
+import org.apache.jackrabbit.core.data.DataStore;
+import
org.apache.jackrabbit.oak.blob.cloud.azure.blobstorage.AzureDataStoreUtils;
+import org.apache.jackrabbit.oak.blob.cloud.s3.S3DataStoreUtils;
import org.apache.jackrabbit.oak.commons.FileIOUtils;
import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
import org.apache.jackrabbit.oak.plugins.blob.datastore.OakFileDataStore;
@@ -81,18 +84,48 @@ public class DataStoreCheckTest {
private String dsPath;
+ private DataStoreBlobStore setupDataStore;
+
+ private String dsOption;
+
@Before
public void setup() throws Exception {
- OakFileDataStore delegate = new OakFileDataStore();
- dsPath = temporaryFolder.newFolder().getAbsolutePath();
- delegate.setPath(dsPath);
- delegate.init(null);
- DataStoreBlobStore blobStore = new DataStoreBlobStore(delegate);
+ if (S3DataStoreUtils.isS3Configured()) {
+ Properties props = S3DataStoreUtils.getS3Config();
+ props.setProperty("cacheSize", "0");
+ DataStore ds =
S3DataStoreUtils.getS3DataStore(S3DataStoreUtils.getFixtures().get(0),
+ props,
+ temporaryFolder.newFolder().getAbsolutePath());
+ setupDataStore = new DataStoreBlobStore(ds);
+ cfgFilePath = createTempConfig(temporaryFolder.newFile(), props);
+ dsOption = "s3ds";
+ } else if (AzureDataStoreUtils.isAzureConfigured()) {
+ Properties props = AzureDataStoreUtils.getAzureConfig();
+ props.setProperty("cacheSize", "0");
+ DataStore ds = AzureDataStoreUtils.getAzureDataStore(props,
+ temporaryFolder.newFolder().getAbsolutePath());
+ setupDataStore = new DataStoreBlobStore(ds);
+ cfgFilePath = createTempConfig(temporaryFolder.newFile(), props);
+ dsOption = "azureblobds";
+ }
+ else {
+ OakFileDataStore delegate = new OakFileDataStore();
+ dsPath = temporaryFolder.newFolder().getAbsolutePath();
+ delegate.setPath(dsPath);
+ delegate.init(null);
+ setupDataStore = new DataStoreBlobStore(delegate);
+
+ File cfgFile = temporaryFolder.newFile();
+ Properties props = new Properties();
+ props.put("path", dsPath);
+ cfgFilePath = createTempConfig(cfgFile, props);
+ dsOption = "fds";
+ }
File storeFile = temporaryFolder.newFolder();
storePath = storeFile.getAbsolutePath();
FileStore fileStore = FileStoreBuilder.fileStoreBuilder(storeFile)
- .withBlobStore(blobStore)
+ .withBlobStore(setupDataStore)
.withMaxFileSize(256)
.withSegmentCacheSize(64)
.build();
@@ -104,7 +137,7 @@ public class DataStoreCheckTest {
blobsAdded = Sets.newHashSet();
for (int i = 0; i < numBlobs; i++) {
SegmentBlob b = (SegmentBlob) store.createBlob(randomStream(i,
18342));
- Iterator<String> idIter = blobStore.resolveChunks(b.getBlobId());
+ Iterator<String> idIter =
setupDataStore.resolveChunks(b.getBlobId());
while (idIter.hasNext()) {
String chunk = idIter.next();
blobsAdded.add(chunk);
@@ -115,14 +148,7 @@ public class DataStoreCheckTest {
store.merge(a, EmptyHook.INSTANCE, CommitInfo.EMPTY);
log.info("Created blobs : {}", blobsAdded);
- File cfgFile = temporaryFolder.newFile();
- BufferedWriter writer = Files.newWriter(cfgFile, UTF_8);
- FileIOUtils.writeAsLine(writer, "path=\"" +
StringEscapeUtils.escapeJava(dsPath) + "\"",false);
- writer.close();
- cfgFilePath = cfgFile.getAbsolutePath();
-
fileStore.close();
- blobStore.close();
}
@After
@@ -133,6 +159,7 @@ public class DataStoreCheckTest {
@Test
public void testCorrect() throws Exception {
File dump = temporaryFolder.newFolder();
+ setupDataStore.close();
testAllParams(dump);
}
@@ -140,17 +167,12 @@ public class DataStoreCheckTest {
public void testConsistency() throws Exception {
File dump = temporaryFolder.newFolder();
- // Delete a random blob from datastore
- OakFileDataStore delegate = new OakFileDataStore();
- delegate.setPath(dsPath);
- delegate.init(null);
- DataStoreBlobStore blobStore = new DataStoreBlobStore(delegate);
-
Random rand = new Random();
String deletedBlobId = Iterables.get(blobsAdded,
rand.nextInt(blobsAdded.size()));
blobsAdded.remove(deletedBlobId);
- long count =
blobStore.countDeleteChunks(ImmutableList.of(deletedBlobId), 0);
+ long count =
setupDataStore.countDeleteChunks(ImmutableList.of(deletedBlobId), 0);
assertEquals(1, count);
+ setupDataStore.close();
testAllParams(dump);
@@ -159,10 +181,10 @@ public class DataStoreCheckTest {
assertFileEquals(dump, "[consistency]",
Sets.newHashSet(deletedBlobId));
}
- public void testAllParams(File dump) throws Exception {
+ private void testAllParams(File dump) throws Exception {
DataStoreCheckCommand checkCommand = new DataStoreCheckCommand();
List<String> argsList = Lists
- .newArrayList("--id", "--ref", "--consistency", "--fds",
cfgFilePath, "--store", storePath,
+ .newArrayList("--id", "--ref", "--consistency", "--" + dsOption,
cfgFilePath, "--store", storePath,
"--dump", dump.getAbsolutePath());
checkCommand.execute(argsList.toArray(new String[0]));
@@ -170,9 +192,10 @@ public class DataStoreCheckTest {
@Test
public void testMissingOpParams() throws Exception {
+ setupDataStore.close();
File dump = temporaryFolder.newFolder();
List<String> argsList = Lists
- .newArrayList("--fds", cfgFilePath, "--store", storePath,
+ .newArrayList("--" + dsOption, cfgFilePath, "--store", storePath,
"--dump", dump.getAbsolutePath());
log.info("Running testMissinOpParams: {}", argsList);
testIncorrectParams(argsList, Lists.newArrayList("Missing required
option(s)", "'id'", "'ref'", "'consistency'"));
@@ -180,6 +203,7 @@ public class DataStoreCheckTest {
@Test
public void testTarNoDS() throws Exception {
+ setupDataStore.close();
File dump = temporaryFolder.newFolder();
List<String> argsList = Lists
.newArrayList("--id", "--ref", "--consistency", "--store",
storePath,
@@ -190,14 +214,15 @@ public class DataStoreCheckTest {
@Test
public void testOpNoStore() throws Exception {
+ setupDataStore.close();
File dump = temporaryFolder.newFolder();
List<String> argsList = Lists
- .newArrayList("--consistency", "--fds", cfgFilePath,
+ .newArrayList("--consistency", "--" + dsOption, cfgFilePath,
"--dump", dump.getAbsolutePath());
testIncorrectParams(argsList, Lists.newArrayList("Missing required
option(s) ['store']"));
argsList = Lists
- .newArrayList("--ref", "--fds", cfgFilePath,
+ .newArrayList("--ref", "--" + dsOption, cfgFilePath,
"--dump", dump.getAbsolutePath());
testIncorrectParams(argsList, Lists.newArrayList("Missing required
option(s) ['store']"));
}
@@ -236,4 +261,10 @@ public class DataStoreCheckTest {
r.nextBytes(data);
return new ByteArrayInputStream(data);
}
+
+ private static String createTempConfig(File cfgFile, Properties props)
throws IOException {
+ FileOutputStream fos = FileUtils.openOutputStream(cfgFile);
+ ConfigurationHandler.write(fos, props);
+ return cfgFile.getAbsolutePath();
+ }
}