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;