chore: detect and re-request missing updates on the server side

This commit is contained in:
Bartosz Sypytkowski 2024-10-25 13:11:19 +02:00
parent 923fe7ffde
commit 395424bfd2
1 changed files with 26 additions and 12 deletions

View File

@ -673,10 +673,23 @@ impl CollabGroup {
.await .await
.map_err(|err| RTProtocolError::Internal(err.into()))?? .map_err(|err| RTProtocolError::Internal(err.into()))??
}; };
let state_vector = decoded_update.state_vector(); let missing_updates = {
let state_vector = state.state_vector.read().await;
match state_vector.partial_cmp(&decoded_update.state_vector_lower()) {
None | Some(std::cmp::Ordering::Less) => Some(state_vector.clone()),
_ => None,
}
};
if let Some(missing_updates) = missing_updates {
let msg = Message::Sync(SyncMessage::SyncStep1(missing_updates));
tracing::debug!("subscriber {} send update with missing data", origin);
Ok(Some(msg.encode_v1()))
} else {
let upper_state_vector = decoded_update.state_vector();
state state
.persister .persister
.send_update(origin.clone(), update, state_vector) .send_update(origin.clone(), update, upper_state_vector)
.await .await
.map_err(|err| RTProtocolError::Internal(err.into()))?; .map_err(|err| RTProtocolError::Internal(err.into()))?;
let elapsed = start.elapsed(); let elapsed = start.elapsed();
@ -688,6 +701,7 @@ impl CollabGroup {
Ok(None) Ok(None)
} }
}
async fn handle_update( async fn handle_update(
state: &CollabGroupState, state: &CollabGroupState,