Author: mreutegg
Date: Mon Oct  5 09:52:58 2015
New Revision: 1706778

URL: http://svn.apache.org/viewvc?rev=1706778&view=rev
Log:
OAK-3472: Run mode to identify blob garbage

Added:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java
      - copied unchanged from r1706770, 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java
Modified:
    jackrabbit/oak/trunk/oak-run/README.md
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreHelper.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java

Modified: jackrabbit/oak/trunk/oak-run/README.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/README.md?rev=1706778&r1=1706777&r2=1706778&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/README.md (original)
+++ jackrabbit/oak/trunk/oak-run/README.md Mon Oct  5 09:52:58 2015
@@ -21,6 +21,7 @@ The following runmodes are currently ava
     * recovery    : Run a _lastRev recovery on a MongoMK repository
     * checkpoints : Manage checkpoints
     * tika        : Performs text extraction
+    * garbage     : Identifies blob garbage on a DocumentMK repository
     * help        : Print a list of available runmodes
     
 
@@ -778,6 +779,22 @@ The recovery tool will only perform the
 It is therefore recommended to explicitly specify a clusterId. The tool will
 fix the documents it identified, unless the `dryRun` keyword is specified.
 
+Garbage
+=======
+
+The garbage mode can the used to identify blob garbage still referenced by
+documents in a MongoMK repository. It can be invoked like this:
+
+    $ java -jar oak-run-*.jar garbage [options] mongodb://host:port/database
+
+The following recovery options (with default values) are currently supported:
+
+    --clusterId         - MongoMK clusterId (default: 0 -> automatic)
+
+The tool will scan the store for documents with blob references and print a
+report with the top 100 documents with blob references considered garbage. The
+rank is based on the size of the referenced blobs.
+
 <a name="jr2"></a>
 Oak Runnable Jar - JR 2
 ===============================

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreHelper.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreHelper.java?rev=1706778&r1=1706777&r2=1706778&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreHelper.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreHelper.java
 Mon Oct  5 09:52:58 2015
@@ -27,6 +27,7 @@ import com.mongodb.DBObject;
 import com.mongodb.QueryBuilder;
 import com.mongodb.WriteResult;
 
+import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.Revision;
@@ -92,4 +93,14 @@ public class MongoDocumentStoreHelper {
         
     }
 
+    public static <T extends Document> DBCollection getDBCollection(
+            MongoDocumentStore store, Collection<T> c) {
+        return store.getDBCollection(c);
+    }
+
+    public static <T extends Document> T convertFromDBObject(
+            MongoDocumentStore store, Collection<T> col, DBObject obj) {
+        return store.convertFromDBObject(col, obj);
+    }
+
 }

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1706778&r1=1706777&r2=1706778&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
 Mon Oct  5 09:52:58 2015
@@ -81,6 +81,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.backup.FileStoreRestore;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreHelper;
 import org.apache.jackrabbit.oak.plugins.document.LastRevRecoveryAgent;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
@@ -194,6 +195,9 @@ public final class Main {
             case TIKA:
                 TextExtractorMain.main(args);
                 break;
+            case GARBAGE:
+                garbage(args);
+                break;
             case HELP:
             default:
                 System.err.print("Available run modes: ");
@@ -422,6 +426,7 @@ public final class Main {
             closer.register(asCloseable(mongo));
             DocumentNodeStore store = new DocumentMK.Builder()
                     .setMongoDB(mongo.getDB())
+                    .setLeaseCheck(false)
                     .setClusterId(clusterId.value(options)).getNodeStore();
             closer.register(asCloseable(store));
             return store;
@@ -698,6 +703,25 @@ public final class Main {
         }
     }
 
+    private static void garbage(String[] args) throws IOException {
+        Closer closer = Closer.create();
+        String h = "garbage mongodb://host:port/database";
+        try {
+            NodeStore store = bootstrapNodeStore(args, closer, h);
+            if (!(store instanceof DocumentNodeStore)) {
+                System.err.println("Garbage mode only available for 
DocumentNodeStore");
+                System.exit(1);
+            }
+            DocumentNodeStore dns = (DocumentNodeStore) store;
+
+            DocumentNodeStoreHelper.garbageReport(dns);
+        } catch (Throwable e) {
+            throw closer.rethrow(e);
+        } finally {
+            closer.close();
+        }
+    }
+
     private static void debug(String[] args) throws IOException {
         if (args.length == 0) {
             System.err.println("usage: debug <path> [id...]");
@@ -1150,7 +1174,8 @@ public final class Main {
         CHECKPOINTS("checkpoints"),
         RECOVERY("recovery"),
         REPAIR("repair"),
-        TIKA("tika");
+        TIKA("tika"),
+        GARBAGE("garbage");
 
         private final String name;
 


Reply via email to