@@ -634,6 +634,58 @@ pub mod db {
634634 . await
635635 }
636636
637+ #[ tracing:: instrument( skip( conn) ) ]
638+ pub async fn cancel_submission (
639+ id : SubmissionId ,
640+ mut conn : impl WriterConnection ,
641+ ) -> sqlx:: Result < ( ) > {
642+ conn. transaction ( move |mut tx| {
643+ Box :: pin (
644+ async move { cancel_submission_notx ( id, & mut tx) . await } ,
645+ )
646+ } )
647+ . await
648+ }
649+
650+ /// Do not call directly! Must be called inside a transaction.
651+ pub async fn cancel_submission_notx (
652+ id : SubmissionId ,
653+ mut conn : impl WriterConnection < Transaction = True > ,
654+ ) -> sqlx:: Result < ( ) > {
655+ cancel_submission_raw ( id, & mut conn) . await ?;
656+ super :: chunk:: db:: skip_remaining_chunks ( id, conn) . await ?;
657+ Ok ( ( ) )
658+ }
659+
660+ #[ tracing:: instrument( skip( conn) ) ]
661+ pub ( super ) async fn cancel_submission_raw (
662+ id : SubmissionId ,
663+ mut conn : impl WriterConnection ,
664+ ) -> sqlx:: Result < ( ) > {
665+ let now = chrono:: prelude:: Utc :: now ( ) ;
666+
667+ query ! (
668+ "
669+ INSERT INTO submissions_cancelled
670+ (id, chunks_total, prefix, metadata, cancelled_at, chunks_done)
671+ SELECT id, chunks_total, prefix, metadata, julianday($1), chunks_done FROM submissions WHERE id = $3;
672+
673+ DELETE FROM submissions WHERE id = $4 RETURNING *;
674+ " ,
675+ now,
676+ id,
677+ id,
678+ )
679+ . fetch_one ( conn. get_inner ( ) )
680+ . await ?;
681+ counter ! ( crate :: prometheus:: SUBMISSIONS_CANCELLED_COUNTER ) . increment ( 1 ) ;
682+ histogram ! ( crate :: prometheus:: SUBMISSIONS_DURATION_CANCEL_HISTOGRAM ) . record (
683+ crate :: prometheus:: time_delta_as_f64 ( Utc :: now ( ) - id. timestamp ( ) ) ,
684+ ) ;
685+
686+ Ok ( ( ) )
687+ }
688+
637689 #[ tracing:: instrument( skip( conn) ) ]
638690 /// Do not call directly! MUST be called inside a transaction.
639691 pub ( super ) async fn complete_submission_raw (
0 commit comments