Description:
Evicts persisted deltas from memory
Please review this at http://codereview.waveprotocol.org/615001
Affected files:
M
src/org/waveprotocol/box/server/waveserver/DeltaStoreBasedWaveletState.java
Index:
src/org/waveprotocol/box/server/waveserver/DeltaStoreBasedWaveletState.java
===================================================================
---
a/src/org/waveprotocol/box/server/waveserver/DeltaStoreBasedWaveletState.java
+++
b/src/org/waveprotocol/box/server/waveserver/DeltaStoreBasedWaveletState.java
@@ -189,11 +189,13 @@
this.persistExecutor = persistExecutor;
this.versionZero =
HASH_FACTORY.createVersionZero(deltasAccess.getWaveletName());
this.deltasAccess = deltasAccess;
- for (WaveletDeltaRecord delta : deltas) {
- HashedVersion hashedVersion = delta.getAppliedAtVersion();
- appliedDeltas.put(hashedVersion, delta.getAppliedDelta());
- transformedDeltas.put(hashedVersion, delta.getTransformedDelta());
- }
+
+ WaveletDeltaRecord lastDelta = deltas.get(deltas.size() - 1);
+ HashedVersion hashedVersion = lastDelta.getAppliedAtVersion();
+ // Keep the last deltas so we can track the delta stream is contiguous.
+ appliedDeltas.put(hashedVersion, lastDelta.getAppliedDelta());
+ transformedDeltas.put(hashedVersion, lastDelta.getTransformedDelta());
+
this.snapshot = snapshot;
this.lastPersistedVersion = new
AtomicReference<HashedVersion>(deltasAccess.getEndVersion());
}
@@ -327,7 +329,7 @@
public Void call() throws PersistenceException {
HashedVersion last = lastPersistedVersion.get();
if (last != null && version.getVersion() <= last.getVersion())
{
- LOG.info("Attempt to persist version " + version
+ LOG.warning("Attempt to persist version " + version
+ " smaller than last persisted version " + last);
// done, version is already persisted
} else {
@@ -340,10 +342,21 @@
v = d.getResultingVersion();
} while (v.getVersion() < version.getVersion());
Preconditions.checkState(v.equals(version));
- deltasAccess.append(deltas.build());
+ ImmutableList<WaveletDeltaRecord> deltasTopersist =
deltas.build();
+ deltasAccess.append(deltasTopersist);
Preconditions.checkState(last == lastPersistedVersion.get(),
"lastPersistedVersion changed while we were writing to
storage");
lastPersistedVersion.set(version);
+ // Now, that we persisted the deltas, evict them from the
memory.
+ for (WaveletDeltaRecord persistedDelta : deltasTopersist) {
+ HashedVersion persitedAtVersion =
persistedDelta.getAppliedAtVersion();
+ if (persitedAtVersion.equals(version)) {
+ // Don't evict the boundary.
+ continue;
+ }
+ transformedDeltas.remove(persitedAtVersion);
+ appliedDeltas.remove(persitedAtVersion);
+ }
}
return null;
}
http://codereview.waveprotocol.org/615001/diff/1/2
File
src/org/waveprotocol/box/server/waveserver/DeltaStoreBasedWaveletState.java
(left):
http://codereview.waveprotocol.org/615001/diff/1/2#oldcode291
Line 291: : null;
This won't work as this patch evicts the deltas from the map. I was
thinking about reading the deltas from persistent store instead.
Something like
readDeltasFromStore(waveletName, startVersion, endVersion).