java-topology/defects/influxdb/patch/influxdb-0001-persisted-files-dedup-quadratic.patch

48 lines
2.2 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UNDF: UNDF-2026-000000756
# UNDF:
--- a/influxdb3_write/src/write_buffer/persisted_files.rs
+++ b/influxdb3_write/src/write_buffer/persisted_files.rs
@@ -505,10 +505,15 @@ fn update_persisted_files_with_snapshot(
if initial_load {
file_count += new_parquet_files.len() as u64;
table_files.extend(new_parquet_files.iter().cloned());
} else {
- let mut filtered_files: Vec<ParquetFile> = new_parquet_files
- .iter()
- .filter(|file| !table_files.contains(file))
- .cloned()
- .collect();
+ // Build a HashSet of existing paths for O(1) dedup
+ // instead of O(T) Vec::contains per file → O(F×T) total.
+ let existing_paths: std::collections::HashSet<&str> =
+ table_files.iter().map(|f| f.path.as_str()).collect();
+ let mut filtered_files: Vec<ParquetFile> = new_parquet_files
+ .iter()
+ .filter(|file| !existing_paths.contains(file.path.as_str()))
+ .cloned()
+ .collect();
file_count += filtered_files.len() as u64;
table_files.append(&mut filtered_files);
}
@@ -423,10 +423,14 @@ impl Inner {
pub(crate) fn add_persisted_file(
&mut self,
db_id: &DbId,
table_id: &TableId,
parquet_file: &ParquetFile,
) {
let existing_parquet_files = self
.files
.entry(*db_id)
.or_default()
.entry(*table_id)
.or_default();
- if !existing_parquet_files.contains(parquet_file) {
+ // Vec::contains is O(N); use path-based guard instead.
+ let already_present = existing_parquet_files
+ .iter()
+ .any(|f| f.path == parquet_file.path);
+ if !already_present {
self.parquet_files_row_count += parquet_file.row_count;
self.parquet_files_size_mb += as_mb(parquet_file.size_bytes);
existing_parquet_files.push(parquet_file.clone());