diff --git a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp --- a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp +++ b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp @@ -3,15 +3,18 @@ #include "GlobalDBSingleton.h" #include "Logger.h" #include "WorkerThread.h" +#include "lib.rs.h" namespace comm { void BackupOperationsExecutor::createMainCompaction(std::string backupID) { taskType job = [backupID]() { try { DatabaseManager::getQueryExecutor().createMainCompaction(backupID); + ::onBackupCompactionCreationFinished( + rust::String(backupID), rust::String()); } catch (const std::exception &e) { - // TODO: Inform Rust networking about main - // compaction creation failure + ::onBackupCompactionCreationFinished( + rust::String(backupID), rust::String(e.what())); Logger::log( "Main compaction creation failed. Details: " + std::string(e.what())); } diff --git a/native/native_rust_library/src/backup.rs b/native/native_rust_library/src/backup.rs --- a/native/native_rust_library/src/backup.rs +++ b/native/native_rust_library/src/backup.rs @@ -1,7 +1,9 @@ +mod compaction_upload_promises; mod file_info; mod upload_handler; use crate::argon2_tools::{compute_backup_key, compute_backup_key_str}; +use crate::backup::compaction_upload_promises::CompactionUploadPromises; use crate::constants::{aes, secure_store}; use crate::ffi::secure_store_get; use crate::BACKUP_SOCKET_ADDR; @@ -12,10 +14,16 @@ LatestBackupIDResponse, LogUploadConfirmation, LogWSResponse, RequestedData, SinkExt, StreamExt, UploadLogRequest, UserIdentity, }; +use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use serde_json::json; use std::error::Error; +lazy_static! { + static ref COMPACTION_UPLOAD_PROMISES: CompactionUploadPromises = + Default::default(); +} + pub mod ffi { use super::*; diff --git a/native/native_rust_library/src/backup/compaction_upload_promises.rs b/native/native_rust_library/src/backup/compaction_upload_promises.rs new file mode 100644 --- /dev/null +++ b/native/native_rust_library/src/backup/compaction_upload_promises.rs @@ -0,0 +1,38 @@ +use crate::ffi::void_callback; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; + +#[derive(Debug, Default)] +pub struct CompactionUploadPromises { + backup_id_to_promise: Arc>>, +} + +impl CompactionUploadPromises { + pub fn insert(&self, backup_id: String, promise_id: u32) { + if let Ok(mut backups_to_promises) = self.backup_id_to_promise.lock() { + backups_to_promises.insert(backup_id, promise_id); + }; + } + + pub fn resolve(&self, backup_id: &str) { + let Ok(mut backups_to_promises) = self.backup_id_to_promise.lock() else { + return; + }; + let Some(promise_id) = backups_to_promises.remove(backup_id) else { + return; + }; + void_callback(String::new(), promise_id); + } + + pub fn reject(&self, backup_id: &str, err: String) { + let Ok(mut backups_to_promises) = self.backup_id_to_promise.lock() else { + return; + }; + let Some(promise_id) = backups_to_promises.remove(backup_id) else { + return; + }; + void_callback(err, promise_id); + } +} diff --git a/native/native_rust_library/src/backup/upload_handler.rs b/native/native_rust_library/src/backup/upload_handler.rs --- a/native/native_rust_library/src/backup/upload_handler.rs +++ b/native/native_rust_library/src/backup/upload_handler.rs @@ -1,5 +1,6 @@ use super::file_info::BackupFileInfo; use super::get_user_identity_from_secure_store; +use crate::backup::COMPACTION_UPLOAD_PROMISES; use crate::constants::BACKUP_SERVICE_CONNECTION_RETRY_DELAY; use crate::ffi::{ get_backup_directory_path, get_backup_file_path, get_backup_log_file_path, @@ -66,6 +67,19 @@ pub fn trigger_backup_file_upload() { TRIGGER_BACKUP_FILE_UPLOAD.notify_one(); } + + pub fn on_backup_compaction_creation_finished( + backup_id: String, + err: String, + ) { + if err.is_empty() { + trigger_backup_file_upload(); + return; + } + + COMPACTION_UPLOAD_PROMISES.reject(&backup_id, err); + RUNTIME.spawn(compaction::cleanup_files(backup_id)); + } } pub fn start() -> Result, Box> { @@ -217,6 +231,7 @@ .upload_backup(user_identity, backup_data) .await?; + COMPACTION_UPLOAD_PROMISES.resolve(&backup_id); tokio::spawn(cleanup_files(backup_id)); Ok(()) diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs --- a/native/native_rust_library/src/lib.rs +++ b/native/native_rust_library/src/lib.rs @@ -248,6 +248,9 @@ #[cxx_name = "triggerBackupFileUpload"] fn trigger_backup_file_upload(); + #[cxx_name = "onBackupCompactionCreationFinished"] + fn on_backup_compaction_creation_finished(backup_id: String, err: String); + #[cxx_name = "createBackup"] fn create_backup_sync( backup_id: String,