@@ -1736,7 +1736,7 @@ impl PrometheusRemoteWriteReceiver {
17361736 now_ms : u64 ,
17371737 ) -> Result < u64 , crate :: precompute_engine:: revisions:: RevisionError > {
17381738 use crate :: precompute_engine:: revisions:: { encode_state, InputSample , RevisionRecord } ;
1739- use crate :: precompute_engine:: { raw_dag :: RawDagProgram , window_manager:: WindowManager } ;
1739+ use crate :: precompute_engine:: window_manager:: WindowManager ;
17401740 use asap_types:: sds:: StoredOutputId ;
17411741 let ( plan, store) = runtime. installed ( ) ?;
17421742 let generation = plan
@@ -1825,15 +1825,21 @@ impl PrometheusRemoteWriteReceiver {
18251825 }
18261826 for config in plan. precompute_plan . materializations . iter ( ) . filter ( |c| c. derived_input . is_none ( ) ) {
18271827 let filter = compile_spatial_filter ( & config. spatial_filter_normalized ) ?;
1828- let program = RawDagProgram :: from_plan ( & plan . precompute_plan , config ) ?;
1828+ let program = plan . installed_precompute_plan . raw_programs . get ( & config . policy_fp_u64 ( ) ) . ok_or ( "revision raw program missing" ) ?;
18291829 let mut matching = samples. iter ( ) . filter_map ( |sample| {
18301830 let labels = sample. labels . iter ( ) . map ( |( k, v) |( k. clone ( ) , v. clone ( ) ) ) . collect ( ) ;
18311831 ( sample. metric == config. metric && filter. matches ( & labels) ) . then_some ( ( ) ) ?;
18321832 Some ( ( sample. series . as_str ( ) , sample. timestamp_ms , sample. value ?) )
18331833 } ) . collect :: < Vec < _ > > ( ) ;
18341834 matching. sort_by ( |a, b| ( a. 0 , a. 1 ) . cmp ( & ( b. 0 , b. 1 ) ) ) ;
1835- // Reject the whole request when the Planner graph cannot admit it.
1836- program. validate ( matching, runtime. policy . max_checkpoint_bytes ) . map_err ( |_| crate :: precompute_engine:: revisions:: AdmissionRejected ( "sample is outside the bound summary kernel's input domain" ) ) ?;
1835+ // Reject the whole request when the Planner graph cannot admit its
1836+ // values; resource and setup failures are not input errors.
1837+ if let Err ( error) = program. validate ( matching, runtime. policy . max_checkpoint_bytes ) {
1838+ return Err ( match error. downcast_ref :: < asap_physical_operators:: Error > ( ) {
1839+ Some ( asap_physical_operators:: Error :: MemoryLimit ) | None => error,
1840+ Some ( _) => crate :: precompute_engine:: revisions:: AdmissionRejected ( "sample is outside the bound summary kernel's input domain" ) . into ( ) ,
1841+ } ) ;
1842+ }
18371843 }
18381844 Ok ( ( ) )
18391845 } , |inputs, revision, captured_at_ms, admitted, publish| {
@@ -1855,19 +1861,18 @@ impl PrometheusRemoteWriteReceiver {
18551861 let WorkerMessage :: GroupSamples { sid, policy_fp, group_key, mut samples, .. } = message else { return Err ( "revision routing returned non-sample input" . into ( ) ) ; } ;
18561862 let config = plan. precompute_plan . materializations . iter ( ) . find ( |c| c. policy_fingerprint ( ) == policy_fp) . ok_or ( "revision raw configuration missing" ) ?;
18571863 if committed. contains_key ( & policy_fp. 0 ) { continue ; }
1858- let program = RawDagProgram :: from_plan ( & plan . precompute_plan , config ) ?;
1864+ let program = plan . installed_precompute_plan . raw_programs . get ( & config . policy_fp_u64 ( ) ) . ok_or ( "revision raw program missing" ) ?;
18591865 let manager = WindowManager :: with_layout ( config. window_size , config. slide_interval , config. pane_origin_ms , & config. window_layout ) ;
18601866 // Each stored window's admitted samples, built by the Planner graph below.
1861- let mut windows: BTreeMap < ( u64 , u64 ) , Vec < ( String , i64 , f64 ) > > = BTreeMap :: new ( ) ;
1862- let mut buffered = 0usize ;
1867+ // Overlapping windows share each sample's series key.
1868+ let mut windows : BTreeMap < ( u64 , u64 ) , Vec < ( Arc < str > , i64 , f64 ) > > = BTreeMap :: new ( ) ;
18631869 samples. sort_by ( |a, b| ( & a. 0 , a. 1 ) . cmp ( & ( & b. 0 , b. 1 ) ) ) ;
18641870 for ( series, time, value) in samples {
1871+ let series: Arc < str > = Arc :: from ( series) ;
18651872 for start in manager. stored_bucket_starts ( time) {
18661873 let ( start, end) = manager. stored_bucket_bounds ( start) ;
18671874 if start < 0 || end < 0 || end as u64 > captured_at_ms || ( start as u64 ) < captured_at_ms. saturating_sub ( retain. saturating_sub ( max_window) ) { continue ; }
1868- buffered = buffered. saturating_add ( series. len ( ) + std:: mem:: size_of :: < ( String , i64 , f64 ) > ( ) ) ;
1869- if buffered > runtime. policy . max_checkpoint_bytes { return Err ( Box :: new ( asap_physical_operators:: Error :: MemoryLimit ) ) ; }
1870- windows. entry ( ( start as u64 , end as u64 ) ) . or_default ( ) . push ( ( series. clone ( ) , time, value) ) ;
1875+ windows. entry ( ( start as u64 , end as u64 ) ) . or_default ( ) . push ( ( Arc :: clone ( & series) , time, value) ) ;
18711876 }
18721877 }
18731878 // This captured revision contains every accepted local input.
@@ -1896,14 +1901,13 @@ impl PrometheusRemoteWriteReceiver {
18961901 for ( window, samples) in windows {
18971902 let state = if samples. is_empty ( ) {
18981903 // A known-empty counter pane of this captured revision.
1899- Some ( program. empty_state ( ) ?)
1904+ program. empty_state ( ) ?
19001905 } else {
19011906 let bounds = ( i64:: try_from ( window. 0 ) ?, i64:: try_from ( window. 1 ) ?) ;
1902- program. build ( samples. iter ( ) . map ( |( s, t, v) |( s. as_str ( ) , * t, * v) ) , bounds, runtime. policy . max_checkpoint_bytes ) ?
1907+ program. build ( samples. iter ( ) . map ( |( s, t, v) |( s. as_ref ( ) , * t, * v) ) , bounds, runtime. policy . max_checkpoint_bytes ) ?
1908+ . ok_or ( "revision window admitted no population" ) ?
19031909 } ;
1904- if let Some ( state) = state {
1905- states. insert ( window, Arc :: from ( state) ) ;
1906- }
1910+ states. insert ( window, Arc :: from ( state) ) ;
19071911 }
19081912 for ( ( start, end) , state) in & states {
19091913 records. get_mut ( & policy_fp. into ( ) ) . unwrap ( ) . push ( RevisionRecord { reference : reference. clone ( ) , group : group. clone ( ) , start_ms : * start, end_ms : * end, payload : encode_state ( Arc :: clone ( state) , program. family . clone ( ) ) ? } ) ;
0 commit comments