[
https://issues.apache.org/jira/browse/WAVE-446?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15995352#comment-15995352
]
ASF GitHub Bot commented on WAVE-446:
-------------------------------------
Github user vega113 commented on a diff in the pull request:
https://github.com/apache/incubator-wave/pull/24#discussion_r114601665
--- Diff:
wave/src/main/java/org/waveprotocol/box/server/frontend/WaveViewSubscription.java
---
@@ -154,7 +155,15 @@ public synchronized void submitResponse(WaveletName
waveletName, HashedVersion v
// Forward any queued deltas.
List<TransformedWaveletDelta> filteredDeltas =
filterOwnDeltas(state.heldBackDeltas, state);
if (!filteredDeltas.isEmpty()) {
- sendUpdate(waveletName, filteredDeltas, null);
+ //
+ // Workaround for WAVE-446 ([email protected])
+ //
+ for (TransformedWaveletDelta delta: filteredDeltas) {
+ List<TransformedWaveletDelta> singleDeltaList = new
ArrayList<TransformedWaveletDelta>(1);
+ singleDeltaList.add(delta);
+ sendUpdate(waveletName, singleDeltaList, null);
+ }
--- End diff --
Looks like the bracket could use formatting.
> Client gets stuck during concurrent editing, no error is shown in console
> -------------------------------------------------------------------------
>
> Key: WAVE-446
> URL: https://issues.apache.org/jira/browse/WAVE-446
> Project: Wave
> Issue Type: Bug
> Components: Protocol, Server, Web Client
> Affects Versions: 0.4.0
> Reporter: Pablo Ojanguren
> Assignee: Pablo Ojanguren
> Priority: Blocker
>
> This issue has been detected in Wave's fork, SwellRT but it is expected to be
> found in Wave and Kune also because it impacts client/server protocol
> implementation.
> Steps to reproduce:
> It "appears" during concurrent editing of the same blip. Easier to reproduce
> having 3 or more users editing concurrently the same blip, it might take some
> time to happen.
> Summary:
> This bug is caused by a subtle implementation detail of the client/server
> protocol. In particular when the server sends more than one delta in a
> ProtocolWaveletUpdate message, in particular when these deltas' versions are
> not contiguous.
> Description:
> SERVER SIDE:
> A WaveViewSubscription for a particular user has a pending submit request
> (1). During the waiting period until the submit response (from the
> WaveletProvider) more than one delta update is queued (2). When the submit
> response is ready (3), queued update deltas are filtered to avoid sending the
> transformed delta generated by the client itself (4).
> 1) <WaveViewSubscription>.submitRequest() → state.hasOutstandingSubmit =
> true
> 2) <WaveViewSubscription>.onUpdate()
> 3) <WaveViewSubscription>.submitResponse()
> 4) <WaveViewSubscription>.filterOwnDeltas(state.heldBackDeltas, state);
> A real trace of this follows...
> submitRequest for ch4 last version sent @38060
> onUpdate HELD for ch4 @38060 -> @38061
> onUpdate HELD for ch4 @38061 -> @38062
> onUpdate HELD for ch4 @38062 -> @38063
> submitResponse for ch4 applied to @38060 -> resulting @38062
> filtering deltas
> TO SEND deltas: (@38060 -> @38061) (@38062 -> @38063)
> EXCLUDED deltas: (@38061 -> @38062)
> CLIENT SIDE:
> The ProtocolWaveletUpdate message is received (5) and deserialized (6) in
> order to deliver to the View Channel (7).
> During deserialization, deltas versions are mistaken in the following method,
> RemoteWaveViewService.deserialize(). A detailed trace of the buggy loop from
> this method follows:
> Having as input,
> end ← @38063
> deltas ← (@38060 -> @38061) (@38062 -> @38063)
> the result of deserialization is the following list of deltas with wrong
> versions:
> (@38061 -> @38062) (@38062 -> @38063)
> Then, deserialized deltas are delivered to the delta channel which gets stuck
> processing delta’s queue (8):
> lastServerVersion ← @38060
> queue ←
> ack(@38061 → @38062)
> delta(@38061 -> @38062) // this should be delta (@38060 -> @38061)
> delta(@38062 -> @38063)
> deltas are removed from the queue every time lastServerVersion is equal to
> start version of queue's head delta. In this situation, due to the missing
> delta (@38060 -> @38061), the delta channel will not send and receive more
> deltas from/to the wave’s operation channel.
> 5) <RemoteWaveViewService>.onUpdate(ProtocolWaveletUpdate update)
> 6) <RemoteWaveViewService>.deserialize(ProtocolWaveletUpdate)
> 7) <ViewChannelImpl>.onUpdate()
> 8) <WaveletDeltaChannelImpl>.flushServerMessages()
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)