You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2017/05/10 07:33:44 UTC
svn commit: r1794679 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document:
Commit.java DocumentNodeStore.java LastRevRecoveryAgent.java
UnsavedModifications.java
Author: mreutegg
Date: Wed May 10 07:33:44 2017
New Revision: 1794679
URL: http://svn.apache.org/viewvc?rev=1794679&view=rev
Log:
OAK-6197: Remove DocumentNodeStore dependency in UnsavedModifications
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java?rev=1794679&r1=1794678&r2=1794679&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java Wed May 10 07:33:44 2017
@@ -100,16 +100,23 @@ public class Commit {
UpdateOp getUpdateOperationForNode(String path) {
UpdateOp op = operations.get(path);
if (op == null) {
- String id = Utils.getIdFromPath(path);
- op = new UpdateOp(id, false);
- NodeDocument.setModified(op, revision);
- if (getBranch() != null) {
- NodeDocument.setBranchCommit(op, revision);
- }
+ op = createUpdateOp(path, revision, getBranch() != null);
operations.put(path, op);
}
return op;
}
+
+ static UpdateOp createUpdateOp(String path,
+ Revision revision,
+ boolean isBranch) {
+ String id = Utils.getIdFromPath(path);
+ UpdateOp op = new UpdateOp(id, false);
+ NodeDocument.setModified(op, revision);
+ if (isBranch) {
+ NodeDocument.setBranchCommit(op, revision);
+ }
+ return op;
+ }
/**
* The revision for this new commit. That is, the changes within this commit
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1794679&r1=1794678&r2=1794679&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Wed May 10 07:33:44 2017
@@ -2308,7 +2308,13 @@ public final class DocumentNodeStore
//-----------------------------< internal >---------------------------------
private BackgroundWriteStats backgroundWrite() {
- return unsavedLastRevisions.persist(this, new UnsavedModifications.Snapshot() {
+ return unsavedLastRevisions.persist(getDocumentStore(),
+ new Supplier<Revision>() {
+ @Override
+ public Revision get() {
+ return getSweepRevisions().getRevision(getClusterId());
+ }
+ }, new UnsavedModifications.Snapshot() {
@Override
public void acquiring(Revision mostRecent) {
pushJournalEntry(mostRecent);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java?rev=1794679&r1=1794678&r2=1794679&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgent.java Wed May 10 07:33:44 2017
@@ -39,6 +39,7 @@ import javax.annotation.Nonnull;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
@@ -329,7 +330,12 @@ public class LastRevRecoveryAgent {
// thus it doesn't matter, where exactly the check is done
// as to whether the recovered lastRev has already been
// written to the journal.
- unsaved.persist(nodeStore, new UnsavedModifications.Snapshot() {
+ unsaved.persist(docStore, new Supplier<Revision>() {
+ @Override
+ public Revision get() {
+ return sweepRev.get();
+ }
+ }, new UnsavedModifications.Snapshot() {
@Override
public void acquiring(Revision mostRecent) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java?rev=1794679&r1=1794678&r2=1794679&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnsavedModifications.java Wed May 10 07:33:44 2017
@@ -21,6 +21,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import javax.annotation.CheckForNull;
@@ -29,12 +30,13 @@ import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.document.util.MapFactory;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
-import org.apache.jackrabbit.oak.stats.Clock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.base.Stopwatch;
+import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -43,6 +45,7 @@ import static com.google.common.base.Pre
import static org.apache.jackrabbit.oak.commons.PathUtils.ROOT_PATH;
import static org.apache.jackrabbit.oak.plugins.document.Collection.CLUSTER_NODES;
import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
+import static org.apache.jackrabbit.oak.plugins.document.Commit.createUpdateOp;
/**
* Keeps track of when nodes where last modified. To be persisted later by
@@ -134,14 +137,16 @@ class UnsavedModifications {
* will persist a snapshot of the pending revisions and current sweep
* revision by acquiring the passed lock for a short period of time.
*
- * @param store the document node store.
+ * @param store the document store.
+ * @param sweepRevision supplier for the current sweep revision.
* @param snapshot callback when the snapshot of the pending changes is
* acquired.
* @param lock the lock to acquire to get a consistent snapshot of the
* revisions to write back.
* @return stats about the write operation.
*/
- public BackgroundWriteStats persist(@Nonnull DocumentNodeStore store,
+ public BackgroundWriteStats persist(@Nonnull DocumentStore store,
+ @Nonnull Supplier<Revision> sweepRevision,
@Nonnull Snapshot snapshot,
@Nonnull Lock lock) {
BackgroundWriteStats stats = new BackgroundWriteStats();
@@ -149,22 +154,22 @@ class UnsavedModifications {
return stats;
}
checkNotNull(store);
+ checkNotNull(sweepRevision);
+ checkNotNull(snapshot);
checkNotNull(lock);
- Clock clock = store.getClock();
-
- long time = clock.getTime();
+ Stopwatch sw = Stopwatch.createStarted();
// get a copy of the map while holding the lock
lock.lock();
- stats.lock = clock.getTime() - time;
- time = clock.getTime();
- RevisionVector sweepRevisions;
+ stats.lock = sw.elapsed(TimeUnit.MILLISECONDS);
+ sw.reset().start();
+ Revision sweepRev;
Map<String, Revision> pending;
try {
snapshot.acquiring(getMostRecentRevision());
pending = Maps.newTreeMap(PathComparator.INSTANCE);
pending.putAll(map);
- sweepRevisions = store.getSweepRevisions();
+ sweepRev = sweepRevision.get();
} finally {
lock.unlock();
}
@@ -180,11 +185,11 @@ class UnsavedModifications {
// update root individually at the end
continue;
}
- updates.add(newUpdateOp(store, p, r));
+ updates.add(newUpdateOp(p, r));
pathToRevision.put(p, r);
}
if (!updates.isEmpty()) {
- store.getDocumentStore().createOrUpdate(NODES, updates);
+ store.createOrUpdate(NODES, updates);
stats.calls++;
for (Map.Entry<String, Revision> entry : pathToRevision.entrySet()) {
map.remove(entry.getKey(), entry.getValue());
@@ -198,28 +203,27 @@ class UnsavedModifications {
// finally update remaining root document
Revision rootRev = pending.get(ROOT_PATH);
if (rootRev != null) {
- UpdateOp rootUpdate = newUpdateOp(store, ROOT_PATH, rootRev);
+ UpdateOp rootUpdate = newUpdateOp(ROOT_PATH, rootRev);
// also update to most recent sweep revision
- Revision sweep = sweepRevisions.getRevision(store.getClusterId());
- if (sweep != null) {
- NodeDocument.setSweepRevision(rootUpdate, sweep);
- LOG.debug("Updating _sweepRev to {}", sweep);
+ if (sweepRev != null) {
+ NodeDocument.setSweepRevision(rootUpdate, sweepRev);
+ LOG.debug("Updating _sweepRev to {}", sweepRev);
}
- store.getDocumentStore().findAndUpdate(NODES, rootUpdate);
+ store.findAndUpdate(NODES, rootUpdate);
stats.calls++;
map.remove(ROOT_PATH, rootRev);
LOG.debug("Updated _lastRev to {} on {}", rootRev, ROOT_PATH);
int cid = rootRev.getClusterId();
- if (store.getDocumentStore().find(CLUSTER_NODES, String.valueOf(cid)) != null) {
+ if (store.find(CLUSTER_NODES, String.valueOf(cid)) != null) {
UpdateOp update = new UpdateOp(String.valueOf(cid), false);
update.equals(Document.ID, null, String.valueOf(cid));
update.set(ClusterNodeInfo.LAST_WRITTEN_ROOT_REV_KEY, rootRev.toString());
- store.getDocumentStore().findAndUpdate(CLUSTER_NODES, update);
+ store.findAndUpdate(CLUSTER_NODES, update);
}
}
- stats.write = clock.getTime() - time;
+ stats.write = sw.elapsed(TimeUnit.MILLISECONDS);
return stats;
}
@@ -228,10 +232,8 @@ class UnsavedModifications {
return map.toString();
}
- private static UpdateOp newUpdateOp(DocumentNodeStore store,
- String path, Revision r) {
- Commit commit = new Commit(store, r, null);
- UpdateOp updateOp = commit.getUpdateOperationForNode(path);
+ private static UpdateOp newUpdateOp(String path, Revision r) {
+ UpdateOp updateOp = createUpdateOp(path, r, false);
NodeDocument.setLastRev(updateOp, r);
return updateOp;
}