48 lines
2.2 KiB
Diff
48 lines
2.2 KiB
Diff
# 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());
|