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 al...@apache.org on 2016/08/11 14:14:52 UTC
svn commit: r1755992 - in /jackrabbit/oak/trunk/oak-segment-tar/src:
main/java/org/apache/jackrabbit/oak/segment/file/
test/java/org/apache/jackrabbit/oak/segment/file/
Author: alexparvulescu
Date: Thu Aug 11 14:14:51 2016
New Revision: 1755992
URL: http://svn.apache.org/viewvc?rev=1755992&view=rev
Log:
OAK-4657 Add metric for FileStore cleanup reclaimed size
Credits to Andrei Dulceanu for the patch
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMonitorMBean.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Thu Aug 11 14:14:51 2016
@@ -832,8 +832,7 @@ public class FileStore implements Segmen
long finalSize = size();
long reclaimedSize = initialSize - afterCleanupSize;
stats.reclaimed(reclaimedSize);
-
- gcJournal.persist(finalSize);
+ gcJournal.persist(reclaimedSize, finalSize);
gcListener.cleaned(reclaimedSize, finalSize);
gcListener.info("TarMK GC #{}: cleanup completed in {} ({} ms). Post cleanup size is {} ({} bytes)" +
" and space reclaimed {} ({} bytes).",
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java Thu Aug 11 14:14:51 2016
@@ -54,6 +54,8 @@ public class FileStoreGCMonitor extends
private long lastCompaction;
private long lastCleanup;
+ private long lastRepositorySize;
+ private long lastReclaimedSize;
private String lastError;
private String status = "NA";
@@ -104,6 +106,8 @@ public class FileStoreGCMonitor extends
@Override
public void cleaned(long reclaimed, long current) {
lastCleanup = clock.getTime();
+ lastReclaimedSize = reclaimed;
+ lastRepositorySize = current;
gcCount.getCounter().addAndGet(1);
repositorySize.getCounter().set(current);
reclaimedSize.getCounter().addAndGet(reclaimed);
@@ -121,6 +125,16 @@ public class FileStoreGCMonitor extends
return toString(lastCleanup);
}
+ @Override
+ public long getLastRepositorySize() {
+ return lastRepositorySize;
+ }
+
+ @Override
+ public long getLastReclaimedSize() {
+ return lastReclaimedSize;
+ }
+
private static String toString(long timestamp) {
if (timestamp != 0) {
return getDateTimeInstance().format(new Date(timestamp));
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java Thu Aug 11 14:14:51 2016
@@ -41,8 +41,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Persists the repository size following a cleanup operation in the
- * {@link #GC_JOURNAL gc journal} file with the format: 'size, timestamp'.
+ * Persists the repository size and the reclaimed size following a cleanup operation in the
+ * {@link #GC_JOURNAL gc journal} file with the format: 'repoSize, reclaimedSize, timestamp'.
*/
public class GCJournal {
@@ -59,8 +59,8 @@ public class GCJournal {
this.directory = checkNotNull(directory);
}
- public synchronized void persist(long size) {
- latest = new GCJournalEntry(size, System.currentTimeMillis());
+ public synchronized void persist(long reclaimedSize, long repoSize) {
+ latest = new GCJournalEntry(repoSize, reclaimedSize, System.currentTimeMillis());
Path path = new File(directory, GC_JOURNAL).toPath();
try {
try (BufferedWriter w = newBufferedWriter(path, UTF_8, WRITE,
@@ -108,27 +108,30 @@ public class GCJournal {
static class GCJournalEntry {
- static GCJournalEntry EMPTY = new GCJournalEntry(-1, -1);
+ static GCJournalEntry EMPTY = new GCJournalEntry(-1, -1, -1);
- private final long size;
+ private final long repoSize;
+ private final long reclaimedSize;
private final long ts;
- public GCJournalEntry(long size, long ts) {
+ public GCJournalEntry(long repoSize, long reclaimedSize, long ts) {
+ this.repoSize = repoSize;
+ this.reclaimedSize = reclaimedSize;
this.ts = ts;
- this.size = size;
}
@Override
public String toString() {
- return size + "," + ts;
+ return repoSize + "," + reclaimedSize + "," + ts;
}
static GCJournalEntry fromString(String in) {
String[] items = in.split(",");
- if (items.length == 2) {
- long size = safeParse(items[0]);
- long ts = safeParse(items[1]);
- return new GCJournalEntry(size, ts);
+ if (items.length == 3) {
+ long repoSize = safeParse(items[0]);
+ long reclaimedSize = safeParse(items[1]);
+ long ts = safeParse(items[2]);
+ return new GCJournalEntry(repoSize, reclaimedSize, ts);
}
return GCJournalEntry.EMPTY;
}
@@ -142,8 +145,12 @@ public class GCJournal {
return -1;
}
- public long getSize() {
- return size;
+ public long getRepoSize() {
+ return repoSize;
+ }
+
+ public long getReclaimedSize() {
+ return reclaimedSize;
}
public long getTs() {
@@ -154,7 +161,8 @@ public class GCJournal {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + (int) (size ^ (size >>> 32));
+ result = prime * result + (int) (reclaimedSize ^ (reclaimedSize >>> 32));
+ result = prime * result + (int) (repoSize ^ (repoSize >>> 32));
result = prime * result + (int) (ts ^ (ts >>> 32));
return result;
}
@@ -168,7 +176,9 @@ public class GCJournal {
if (getClass() != obj.getClass())
return false;
GCJournalEntry other = (GCJournalEntry) obj;
- if (size != other.size)
+ if (reclaimedSize != other.reclaimedSize)
+ return false;
+ if (repoSize != other.repoSize)
return false;
if (ts != other.ts)
return false;
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMonitorMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMonitorMBean.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMonitorMBean.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCMonitorMBean.java Thu Aug 11 14:14:51 2016
@@ -44,6 +44,16 @@ public interface GCMonitorMBean {
String getLastCleanup();
/**
+ * @return repository size after the last cleanup.
+ */
+ long getLastRepositorySize();
+
+ /**
+ * @return reclaimed size during the last cleanup.
+ */
+ long getLastReclaimedSize();
+
+ /**
* @return last error or {@code null} if none.
*/
@CheckForNull
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java Thu Aug 11 14:14:51 2016
@@ -97,6 +97,6 @@ public class SizeDeltaGcEstimation imple
}
private long getPreviousCleanupSize() {
- return gcJournal.read().getSize();
+ return gcJournal.read().getRepoSize();
}
}
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java?rev=1755992&r1=1755991&r2=1755992&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java Thu Aug 11 14:14:51 2016
@@ -44,20 +44,27 @@ public class GcJournalTest {
File directory = segmentFolder.newFolder();
GCJournal gc = new GCJournal(directory);
- gc.persist(100);
+ gc.persist(0, 100);
GCJournalEntry e0 = gc.read();
- assertEquals(100, e0.getSize());
+ assertEquals(100, e0.getRepoSize());
+ assertEquals(0, e0.getReclaimedSize());
- gc.persist(250);
+ gc.persist(0, 250);
GCJournalEntry e1 = gc.read();
- assertEquals(250, e1.getSize());
+ assertEquals(250, e1.getRepoSize());
+ assertEquals(0, e1.getReclaimedSize());
+
+ gc.persist(50, 200);
+ GCJournalEntry e2 = gc.read();
+ assertEquals(200, e2.getRepoSize());
+ assertEquals(50, e2.getReclaimedSize());
Collection<GCJournalEntry> all = gc.readAll();
- assertEquals(all.size(), 2);
+ assertEquals(all.size(), 3);
File file = new File(directory, GCJournal.GC_JOURNAL);
assertTrue(file.exists());
List<String> allLines = Files.readAllLines(file.toPath(), UTF_8);
- assertEquals(allLines.size(), 2);
+ assertEquals(allLines.size(), 3);
}
}