diff --git a/changelog.d/1065-empty-file-fingerprint-warning.fix.md b/changelog.d/1065-empty-file-fingerprint-warning.fix.md new file mode 100644 index 0000000000000..4f3f7326447a2 --- /dev/null +++ b/changelog.d/1065-empty-file-fingerprint-warning.fix.md @@ -0,0 +1 @@ +Avoid emitting a warning for empty files that are too small to fingerprint. diff --git a/lib/file-source-common/src/fingerprinter.rs b/lib/file-source-common/src/fingerprinter.rs index 3216d8c2178d4..5390422160cdf 100644 --- a/lib/file-source-common/src/fingerprinter.rs +++ b/lib/file-source-common/src/fingerprinter.rs @@ -202,9 +202,12 @@ impl Fingerprinter { known_small_files: &mut HashMap, emitter: &impl FileSourceInternalEvents, ) -> Option { + let mut file_size = None; + let metadata = match fs::metadata(path).await { Ok(metadata) => { if !metadata.is_dir() { + file_size = Some(metadata.len()); self.fingerprint(path).await.map(Some) } else { Ok(None) @@ -221,7 +224,7 @@ impl Fingerprinter { .map_err(|error| { match error.kind() { ErrorKind::UnexpectedEof => { - if !known_small_files.contains_key(path) { + if file_size != Some(0) && !known_small_files.contains_key(path) { emitter.emit_file_checksum_failed(path); known_small_files.insert(path.to_path_buf(), time::Instant::now()); } @@ -638,6 +641,31 @@ mod test { ); } + #[tokio::test] + async fn no_error_on_empty_file() { + let target_dir = tempdir().unwrap(); + let empty_path = target_dir.path().join("empty.log"); + fs::write(&empty_path, []).unwrap(); + + let mut fingerprinter = Fingerprinter::new( + FingerprintStrategy::FirstLinesChecksum { + ignored_header_bytes: 0, + lines: 1, + }, + 1024, + false, + ); + + let mut small_files = HashMap::new(); + assert!( + fingerprinter + .fingerprint_or_emit(&empty_path, &mut small_files, &NoErrors) + .await + .is_none() + ); + assert!(!small_files.contains_key(&empty_path)); + } + #[test] fn test_monotonic_compression_algorithms() { // This test is necessary to handle an edge case where when assessing the magic header