Skip to content

Commit b69fb1c

Browse files
authored
rust(bug): Create file-backup mode directories, ignore exists error (#435)
1 parent 35a903c commit b69fb1c

4 files changed

Lines changed: 34 additions & 16 deletions

File tree

Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ members = [
1313

1414
[workspace.package]
1515
authors = ["Sift Software Engineers <engineering@siftstack.com>"]
16-
version = "0.7.0-rc.9"
16+
version = "0.7.0-rc.10"
1717
edition = "2024"
1818
categories = ["aerospace", "science::robotics"]
1919
homepage = "https://github.com/sift-stack/sift"
@@ -27,11 +27,11 @@ chrono = { version = "0.4.39", default-features = false, features = ["clock"] }
2727
pbjson-types = "^0.7"
2828
tonic = { version = "^0.12", features = ["gzip"] }
2929

30-
sift_connect = { version = "0.7.0-rc.9", path = "rust/crates/sift_connect" }
31-
sift_rs = { version = "0.7.0-rc.9", path = "rust/crates/sift_rs" }
32-
sift_error = { version = "0.7.0-rc.9", path = "rust/crates/sift_error" }
33-
sift_stream = { version = "0.7.0-rc.9", path = "rust/crates/sift_stream" }
34-
sift_pbfs = { version = "0.7.0-rc.9", path = "rust/crates/sift_pbfs" }
30+
sift_connect = { version = "0.7.0-rc.10", path = "rust/crates/sift_connect" }
31+
sift_rs = { version = "0.7.0-rc.10", path = "rust/crates/sift_rs" }
32+
sift_error = { version = "0.7.0-rc.10", path = "rust/crates/sift_error" }
33+
sift_stream = { version = "0.7.0-rc.10", path = "rust/crates/sift_stream" }
34+
sift_pbfs = { version = "0.7.0-rc.10", path = "rust/crates/sift_pbfs" }
3535

3636
sift_stream_bindings = { version = "0.1.0", path = "rust/crates/sift_stream_bindings" }
3737

rust/CHANGELOG.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@ All notable changes to this project will be documented in this file.
33

44
This project adheres to [Semantic Versioning](http://semver.org/).
55

6+
## [v0.7.0-rc.10] - December 16, 2025
7+
### What's New
8+
#### SiftStream File-Backup Only Mode Create Parent Directories
9+
A minor fix to create all parent directories for file-backup only mode, as well as ignoring
10+
any "already exists" errors.
11+
12+
### Full Changelog
13+
- [Create file-backup mode directories, ignore exists error]()
14+
615
## [v0.7.0-rc.9] - December 16, 2025
716
### What's New
817
#### SiftStream File-Backup Only Mode Directory Bug Fix
918
A minor fix to save the backup files in the specified directory.
1019

1120
### Full Changelog
12-
- []()
21+
- [Fix SiftStream file-backup mode directory](https://github.com/sift-stack/sift/commit/fe041085243ca27601b327b5fd2235b6f8399d5a)
1322

1423
## [v0.7.0-rc.8] - December 5, 2025
1524
### What's New

rust/crates/sift_stream/src/stream/builder.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -578,12 +578,6 @@ impl SiftStreamBuilder {
578578
output_directory.push_str(&format!("/{}", sanitize_name(&run.name)));
579579
}
580580

581-
// Ensure the output directory exists
582-
tokio::fs::create_dir_all(&output_directory)
583-
.await
584-
.map_err(|e| Error::new(ErrorKind::IoError, e))
585-
.context("failed to create output directory")?;
586-
587581
SiftStream::new_file_backup(
588582
setup_channel,
589583
ingestion_config,
@@ -599,6 +593,7 @@ impl SiftStreamBuilder {
599593
sift_stream_id,
600594
metrics,
601595
)
596+
.await
602597
}
603598
}
604599

rust/crates/sift_stream/src/stream/mode/file_backup.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use sift_rs::{
1919
runs::v2::Run,
2020
};
2121
use std::collections::HashSet;
22+
use std::io::ErrorKind as IoErrorKind;
2223
use std::{collections::HashMap, path::PathBuf, sync::Arc, time::Duration};
24+
use tokio::fs;
2325
use tokio::{sync::broadcast, task::JoinHandle};
2426
use uuid::Uuid;
2527

@@ -276,7 +278,7 @@ impl SiftStream<IngestionConfigEncoder, FileBackup> {
276278
///
277279
/// [`SiftStreamBuilder`]: crate::stream::builder::SiftStreamBuilder
278280
#[allow(clippy::too_many_arguments)]
279-
pub(crate) fn new_file_backup(
281+
pub(crate) async fn new_file_backup(
280282
grpc_channel: SiftChannel,
281283
ingestion_config: IngestionConfig,
282284
flows_by_name: HashMap<String, FlowDescriptor<String>>,
@@ -292,6 +294,16 @@ impl SiftStream<IngestionConfigEncoder, FileBackup> {
292294
metrics: Arc<SiftStreamMetrics>,
293295
) -> Result<Self> {
294296
let full_backup_path = backups_directory.join(output_directory);
297+
298+
// Ensure the output directory exists
299+
if let Err(err) = fs::create_dir_all(&full_backup_path).await
300+
&& err.kind() != IoErrorKind::AlreadyExists
301+
{
302+
return Err(Error::new(ErrorKind::BackupsError, err))
303+
.with_context(|| format!("failed to create directory for backups at {}", full_backup_path.display()))
304+
.help("if using a custom path for backups directory ensure that it's valid with proper permissions, otherwise contact Sift");
305+
}
306+
295307
let file_writer_config = FileWriterConfig {
296308
directory: full_backup_path,
297309
prefix: ingestion_config.client_key.clone(),
@@ -856,7 +868,8 @@ mod tests {
856868
sift_stream_id,
857869
metrics,
858870
)
859-
.unwrap();
871+
.await
872+
.expect("failed to create file backup stream");
860873

861874
// Finish should succeed
862875
stream.finish().await.unwrap();
@@ -886,7 +899,8 @@ mod tests {
886899
sift_stream_id,
887900
metrics,
888901
)
889-
.unwrap();
902+
.await
903+
.expect("failed to create file backup stream");
890904

891905
// Write some data first
892906
let request = create_test_request("test_flow", &ingestion_config.ingestion_config_id);

0 commit comments

Comments
 (0)