Author: amitj
Date: Thu May 18 10:00:08 2017
New Revision: 1795497

URL: http://svn.apache.org/viewvc?rev=1795497&view=rev
Log:
OAK-6229: NPE when running datastorecheck command with S3

- Merge r1795475 from trunk
- Added explicit dependency to httpcore-4.4.4 and httpclient-4.5.2 as stale 
versions not supported by the latest aws-java-sdk were being pulled in by solr
- Added explicit dependency to jackson core, annotations and databind as stale 
versions not supported by the latest aws-java-sdk, were being pulled in by 
oak-http

Modified:
    jackrabbit/oak/branches/1.6/   (props changed)
    jackrabbit/oak/branches/1.6/oak-run/pom.xml
    
jackrabbit/oak/branches/1.6/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
    
jackrabbit/oak/branches/1.6/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java

Propchange: jackrabbit/oak/branches/1.6/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu May 18 10:00:08 2017
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787217,1787425,1788378,1788387-1788389,1788850,1789056,1790382,1792463,1792742,1792746,1793088,1793618,1793627,1793644,1795314,1795330
+/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787217,1787425,1788378,1788387-1788389,1788850,1789056,1790382,1792463,1792742,1792746,1793088,1793618,1793627,1793644,1795314,1795330,1795475
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.6/oak-run/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-run/pom.xml?rev=1795497&r1=1795496&r2=1795497&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-run/pom.xml (original)
+++ jackrabbit/oak/branches/1.6/oak-run/pom.xml Thu May 18 10:00:08 2017
@@ -411,14 +411,62 @@
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
     </dependency>
-    
+
+    <!-- httpcore & httpclient -->
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.2</version>
+    </dependency>
+
+    <!-- jackson libs -->
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>2.6.6</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>2.6.6</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.6.6</version>
+    </dependency>
     <!-- Test dependencies -->
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-core</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/branches/1.6/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java?rev=1795497&r1=1795496&r2=1795497&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
 Thu May 18 10:00:08 2017
@@ -151,7 +151,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();

Modified: 
jackrabbit/oak/branches/1.6/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java?rev=1795497&r1=1795496&r2=1795497&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-run/src/test/java/org/apache/jackrabbit/oak/run/DataStoreCheckTest.java
 Thu May 18 10:00:08 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();
+    }
 }


Reply via email to