From: Ian Jackson Date: Wed, 14 Jul 2021 16:31:53 +0000 (+0100) Subject: api: Loose ops: Make a loose conflicted op generate a Server update X-Git-Tag: otter-0.7.2~87 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=737d033b84cf466e3d35c4ec5cda19b4234c731e;p=otter.git api: Loose ops: Make a loose conflicted op generate a Server update As according to the PROTOCOL.md. This is no longer a client update, and the client can't really reconcile it. Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 34646e32..6c265d8e 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -140,11 +140,10 @@ fn api_piece_op(form: Json>) debug!("client={:?} pc.lastclient={:?} pc.gen_before={:?} pc.gen={:?} q_gen={:?} u_gen={:?}", &client, &gpc.lastclient, &gpc.gen_before_lastclient, &gpc.gen, &q_gen, &u_gen); - if u_gen > q_gen { + let loose_conflict = if u_gen <= q_gen { None } else { if ! form.loose { throw!(Inapplicable::Conflict); } - let ContinueDespiteConflict = form. - op.conflict_loose_check(&gpc, client)?; - } + Some(form.op.conflict_loose_check(&gpc, client)?) + }; trace_dbg!("form.op", player, piece, &form.op, &gpc); form.op.check_held(gpc,player)?; let update = @@ -154,7 +153,7 @@ fn api_piece_op(form: Json>) ig: &iad.gref, to_recalculate: &mut to_recalculate, })?; - Ok::<_,ApiPieceOpError>(update) + Ok::<_,ApiPieceOpError>((update, loose_conflict)) })() { Err(APOE::Inapplicable(poe)) => { PrepareUpdatesBuffer::piece_report_error( @@ -174,8 +173,13 @@ fn api_piece_op(form: Json>) warn!("api_piece_op ERROR {:?}: {:?}", &form, &err); Err(err)?; }, - Ok((PieceUpdate { wrc, log, ops }, unprepared)) => { - let by_client = Some((wrc, client, form.cseq)); + Ok(((PieceUpdate { wrc, log, ops }, unprepared), loose_conflict)) => { + let by_client = + if let Some(ContinueDespiteConflict) = loose_conflict { + None + } else { + Some((wrc, client, form.cseq)) + }; let mut buf = PrepareUpdatesBuffer::new(g, Some(1 + log.len()));