Author: amitj
Date: Wed Dec  7 09:23:45 2016
New Revision: 1773032

URL: http://svn.apache.org/viewvc?rev=1773032&view=rev
Log:
OAK-5232: Add option to datastorecheck command to add blob ids to tracker 
offline

* Added --track option
* Test in BlobIdTrackerStoreTest

Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/BlobIdTrackerTest.java
    jackrabbit/oak/trunk/oak-run/README.md
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/BlobIdTrackerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/BlobIdTrackerTest.java?rev=1773032&r1=1773031&r2=1773032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/BlobIdTrackerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/BlobIdTrackerTest.java
 Wed Dec  7 09:23:45 2016
@@ -29,9 +29,12 @@ import java.util.concurrent.ScheduledExe
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
+import com.google.common.collect.Iterators;
 import com.google.common.io.Closer;
+import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.core.data.DataRecord;
 import org.apache.jackrabbit.core.data.DataStoreException;
+import org.apache.jackrabbit.oak.commons.FileIOUtils;
 import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.apache.jackrabbit.oak.plugins.blob.SharedDataStore;
 
@@ -155,6 +158,35 @@ public class BlobIdTrackerTest {
         }
     }
 
+    @Test
+    public void externalAddOffline() throws Exception {
+        // Close and open a new object to use the system property
+        closer.close();
+
+        //Add file offline
+        File offline = new File(new File(root, "blobids"), 
"blob-offline123456.gen");
+        List<String> offlineLoad = range(0, 1000);
+        FileIOUtils.writeStrings(offlineLoad.iterator(), offline, false);
+
+        this.tracker = new BlobIdTracker(root.getAbsolutePath(), repoId, 100 * 
60, dataStore);
+        this.scheduler = newSingleThreadScheduledExecutor();
+        closer.register(tracker);
+        closer.register(new ExecutorCloser(scheduler));
+
+        Set<String> initAdd = add(tracker, range(1001, 1005));
+        ScheduledFuture<?> scheduledFuture =
+            scheduler.schedule(tracker.new SnapshotJob(), 0, 
TimeUnit.MILLISECONDS);
+        scheduledFuture.get();
+        initAdd.addAll(offlineLoad);
+
+        assertEquals(initAdd.size(),
+            
Iterators.size(FileUtils.lineIterator(tracker.store.getBlobRecordsFile())));
+
+        Set<String> retrieved = retrieve(tracker);
+        assertEquals("Extra elements after add", initAdd, retrieved);
+        
assertTrue(read(dataStore.getAllMetadataRecords(BLOBREFERENCES.getType())).isEmpty());
+    }
+
     private static Set<String> read(List<DataRecord> recs)
         throws IOException, DataStoreException {
         Set<String> ids = newHashSet();

Modified: jackrabbit/oak/trunk/oak-run/README.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/README.md?rev=1773032&r1=1773031&r2=1773032&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/README.md (original)
+++ jackrabbit/oak/trunk/oak-run/README.md Wed Dec  7 09:23:45 2016
@@ -962,19 +962,21 @@ Use the following command:
     $ java -jar oak-run-*.jar datastorecheck [--id] [--ref] [--consistency] \
             [--store <path>|<mongo_uri>] \
             [--s3ds <s3ds_config>|--fds <fds_config>] \
-            [--dump <path>]
+            [--dump <path>] \
+            [--track <DataStore local tracking path>]
 
 The following options are available:
 
     --id             - List all the ids in the data store
     --ref            - List all the blob references in the node store
-    --consistency    - Lists all the missing blobs by doind a consistency check
+    --consistency    - List all the missing blobs by doing a consistency check
     Atleast one of the above should be specified
     
     --store          - Path to the segment store of mongo uri (Required for 
--ref & --consistency option above)
     --dump           - Path where to dump the files (Optional). Otherwise, 
files will be dumped in the user tmp directory.
     --s3ds           - Path to the S3DataStore configuration file
     --fds            - Path to the FileDataStore configuration file ('path' 
property is mandatory)
+    --track          - Path of the local reposity home folder (Optional). This 
will place a copy of the downloaded blob ids to be tracked.
 
 Note:
 For using S3DataStore the following additional jars have to be downloaded

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=1773032&r1=1773031&r2=1773032&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
 Wed Dec  7 09:23:45 2016
@@ -43,6 +43,8 @@ import joptsimple.OptionParser;
 import joptsimple.OptionSet;
 import joptsimple.OptionSpec;
 import joptsimple.OptionSpecBuilder;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import 
org.apache.jackrabbit.oak.commons.FileIOUtils.FileLineDifferenceIterator;
 import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
@@ -93,6 +95,10 @@ public class DataStoreCheckCommand imple
                 .withRequiredArg().ofType(String.class);
             OptionSpec segment = parser.accepts("segment", "Use oak-segment 
instead of oak-segment-tar");
 
+            // Optional argument to specify tracking
+            ArgumentAcceptingOptionSpec<String> track = 
parser.accepts("track", "Local repository home folder")
+                .withRequiredArg().ofType(String.class);
+
             OptionSpec<?> help = parser.acceptsAll(asList("h", "?", "help"),
                 "show help").forHelp();
 
@@ -158,8 +164,17 @@ public class DataStoreCheckCommand imple
             closer.register(register);
 
             if (options.has(idOp) || options.has(consistencyOp)) {
-                retrieveBlobIds(blobStore,
-                    register.createFile(idOp, dumpPath));
+                File dumpFile = register.createFile(idOp, dumpPath);
+                retrieveBlobIds(blobStore, dumpFile);
+
+                // If track path specified copy the file to the location
+                if (options.has(track)) {
+                    String trackPath = options.valueOf(track);
+                    File trackingFileParent = new 
File(FilenameUtils.concat(trackPath, "blobids"));
+                    File trackingFile = new File(trackingFileParent,
+                        "blob-" + String.valueOf(System.currentTimeMillis()) + 
".gen");
+                    FileUtils.copyFile(dumpFile, trackingFile);
+                }
             }
 
             if (options.has(refOp) || options.has(consistencyOp)) {


Reply via email to