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 dp...@apache.org on 2012/04/20 16:35:38 UTC
svn commit: r1328385 -
/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
Author: dpfister
Date: Fri Apr 20 14:35:37 2012
New Revision: 1328385
URL: http://svn.apache.org/viewvc?rev=1328385&view=rev
Log:
GC for revisions
- allow mark() to be customized
Modified:
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java?rev=1328385&r1=1328384&r2=1328385&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java Fri Apr 20 14:35:37 2012
@@ -60,8 +60,8 @@ public class DefaultRevisionStore extend
private final Persistence pm;
private final GCPersistence gcpm;
- private int initialCacheSize;
- private Map<Id, Object> cache;
+ /* avoid synthetic accessor */ int initialCacheSize;
+ /* avoid synthetic accessor */ Map<Id, Object> cache;
/**
* GC run state constants.
@@ -118,7 +118,9 @@ public class DefaultRevisionStore extend
gcExecutor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
- doGC();
+ if (cache.size() >= initialCacheSize) {
+ gc();
+ }
}
}, 60, 60, TimeUnit.SECONDS);
}
@@ -135,7 +137,7 @@ public class DefaultRevisionStore extend
cache.clear();
- IOUtils.closeQuietly((Closeable) pm);
+ IOUtils.closeQuietly(pm);
initialized = false;
}
@@ -382,12 +384,12 @@ public class DefaultRevisionStore extend
//----------------------------------------------------------------------- GC
- void doGC() {
- if (cache.size() < initialCacheSize) {
- // GC unneeded
- return;
- }
- if (!gcState.compareAndSet(NOT_ACTIVE, STARTING)) {
+ /**
+ * Perform a garbage collection. If a garbage collection cycle is already
+ * running, this method returns immediately.
+ */
+ public void gc() {
+ if (gcpm == null || !gcState.compareAndSet(NOT_ACTIVE, STARTING)) {
// already running
return;
}
@@ -397,20 +399,7 @@ public class DefaultRevisionStore extend
gcState.set(MARKING);
try {
- StoredCommit commit = getHeadCommit();
- long tsLimit = commit.getCommitTS() - (60 * 60 * 1000);
-
- for (;;) {
- markCommit(commit);
- Id id = commit.getParentId();
- if (id == null) {
- break;
- }
- commit = getCommit(id);
- if (commit.getCommitTS() < tsLimit) {
- break;
- }
- }
+ doMark();
} catch (Exception e) {
/* unable to perform GC */
gcState.set(NOT_ACTIVE);
@@ -428,8 +417,32 @@ public class DefaultRevisionStore extend
gcState.set(NOT_ACTIVE);
}
}
+
+ /**
+ * Mark all commits and nodes in a garbage collection cycle. Can be
+ * customized by subclasses. If this method throws an exception, the
+ * cycle will be stopped without sweeping.
+ *
+ * @throws Exception if an error occurs
+ */
+ protected void doMark() throws Exception {
+ StoredCommit commit = getHeadCommit();
+ long tsLimit = commit.getCommitTS() - (60 * 60 * 1000);
+
+ for (;;) {
+ markCommit(commit);
+ Id id = commit.getParentId();
+ if (id == null) {
+ break;
+ }
+ commit = getCommit(id);
+ if (commit.getCommitTS() < tsLimit) {
+ break;
+ }
+ }
+ }
- private void markCommit(StoredCommit commit)
+ protected void markCommit(StoredCommit commit)
throws Exception {
if (!gcpm.markCommit(commit.getId())) {