Evists persisted deltas from memory (Incomplete).

2 views
Skip to first unread message

veg...@gmail.com

unread,
Sep 2, 2011, 6:05:02 AM9/2/11
to soren...@gmail.com, wave-protocol...@googlegroups.com
Reviewers: Soren Lassen,

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;
}


veg...@gmail.com

unread,
Sep 2, 2011, 6:11:44 AM9/2/11
to soren...@gmail.com, wave-protocol...@googlegroups.com
Hi Soren.
The patch is incomplete yet, as it's doesn't handle history requests.
But can you please take a look and let me know what you think about the
approach?

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).

http://codereview.waveprotocol.org/615001

Reply all
Reply to author
Forward
0 new messages