{"record":{"id":"5e1f43aba291f2e8","repo":"vectordotdev/vector","slug":"allowed-lateness-ms-validated-to-fit-in-i64-in-aggregate-new","errorCode":null,"errorMessage":"allowed_lateness_ms validated to fit in i64 in Aggregate::new","messagePattern":"allowed_lateness_ms validated to fit in i64 in Aggregate::new","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/transforms/aggregate/event_time.rs","lineNumber":149,"sourceCode":"    /// closed unconditionally and late events for it are dropped.\n    const fn was_bucket_flushed(&self, bucket_key: BucketKey) -> bool {\n        if let Some(watermark) = self.watermark {\n            bucket_key < watermark\n        } else {\n            false\n        }\n    }\n\n    /// Returns `true` when `now_ms` is at or past the end of `bucket_key`'s\n    /// window plus `allowed_lateness_ms` — the same predicate used to decide\n    /// flush eligibility in `flush_event_time_buckets`. Recording must reject\n    /// events once this cutoff passes even if the periodic flush tick has not\n    /// run yet, so strict lateness is not weakened by a long flush interval.\n    pub(crate) fn is_past_bucket_cutoff(&self, bucket_key: BucketKey, now_ms: i64) -> bool {\n        let interval_ms = i64::try_from(self.config.interval_ms)\n            .expect(\"interval_ms validated to fit in i64 in Aggregate::new\");\n        let grace_ms = i64::try_from(self.event_time().allowed_lateness_ms)\n            .expect(\"allowed_lateness_ms validated to fit in i64 in Aggregate::new\");\n        now_ms\n            >= bucket_key\n                .saturating_add(interval_ms)\n                .saturating_add(grace_ms)\n    }\n    /// Records an event-time event into the appropriate bucket.\n    ///\n    /// Callers must reject incompatible events via `will_be_stored` before\n    /// calling this function so stray events never allocate buckets.\n    fn record_into_bucket(\n        &mut self,\n        bucket_key: BucketKey,\n        series: MetricSeries,\n        data: MetricData,\n        metadata: EventMetadata,\n    ) {\n        let mode = self.config.mode;\n","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/src/transforms/aggregate/event_time.rs#L131-L167","documentation":"`is_past_bucket_cutoff` also converts `allowed_lateness_ms` (u64) to i64, expecting it fits and citing validation in `Aggregate::new`. An over-large `allowed_lateness_ms` panics here while computing the lateness grace period.","triggerScenarios":"`record_event_time` → `is_past_bucket_cutoff` on an Aggregate whose configured `allowed_lateness_ms` exceeds `i64::MAX` without constructor validation.","commonSituations":"Extremely large lateness values in hand-written config; forks/tests constructing Aggregate without running the constructor's range checks.","solutions":["Use a realistic `allowed_lateness_ms` value","Ensure `Aggregate::new` validates `allowed_lateness_ms <= i64::MAX` and errors at config load","Run `vector validate` on the config","File a bug if valid configs trigger the panic"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if cfg.event_time.allowed_lateness_ms > i64::MAX as u64 {\n    return Err(\"allowed_lateness_ms too large\".into());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use practical lateness bounds (minutes/hours)","Validate allowed_lateness_ms fits i64 at config load","Test constructor validation with boundary values","Run `vector validate` pre-deploy"],"tags":["rust","panic","integer-overflow","transforms"],"backgroundTag":"value-out-of-range","analyzedSha":"bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013","analyzedAt":"2026-09-16T02:53:35.741Z","contentChangedAt":"2026-09-16T02:53:35.741Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}