refactor(replication): route app storage through ecstore (#4251)

This commit is contained in:
Zhengchao An
2026-07-04 02:00:28 +08:00
committed by GitHub
parent 2214f67fba
commit 8a0617865b
13 changed files with 151 additions and 48 deletions
+13 -5
View File
@@ -43,18 +43,26 @@ mod replication_versioning_boundary;
mod runtime_boundary;
pub use datatypes::ResyncStatusType;
pub use replication_config_boundary::{ObjectOpts, ReplicationConfigurationExt};
pub use replication_config_boundary::{
ObjectOpts, ReplicationConfigurationExt, ReplicationTargetValidationError, replication_target_arns,
should_remove_replication_target, validate_replication_config_target_arns,
};
#[cfg(test)]
pub(crate) use replication_filemeta_boundary::ReplicateTargetDecision;
pub(crate) use replication_filemeta_boundary::{
ReplicateDecision, ReplicationState, replication_statuses_map, version_purge_statuses_map,
pub(crate) use replication_filemeta_boundary::version_purge_statuses_map;
pub use replication_filemeta_boundary::{
REPLICATE_INCOMING_DELETE, ReplicateDecision, ReplicateObjectInfo, ReplicationState, ReplicationStatusType, ReplicationType,
VersionPurgeStatusType, replication_statuses_map,
};
pub use replication_filemeta_boundary::{ReplicateObjectInfo, ReplicationStatusType, ReplicationType, VersionPurgeStatusType};
pub(crate) use replication_lifecycle_bridge::{ReplicationLifecycleBridge, ReplicationLifecycleConfig};
pub(crate) use replication_migration_bridge::ReplicationMigrationBridge;
pub use replication_object_bridge::ReplicationObjectBridge;
pub use replication_object_config::ReplicationConfig;
pub use replication_object_decision_boundary::MustReplicateOptions;
pub use replication_object_decision_boundary::{
MustReplicateOptions, ReplicationDeleteScheduleInput, ReplicationDeleteStateSource, delete_replication_state_from_config,
delete_replication_version_id, should_schedule_delete_replication, should_use_existing_delete_replication_info,
should_use_existing_delete_replication_source,
};
pub use replication_pool::{
DynReplicationPool, ReplicationPoolTrait, get_global_replication_pool, get_global_replication_stats,
init_background_replication,
@@ -12,4 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
pub use rustfs_replication::{ObjectOpts, ReplicationConfigurationExt};
pub use rustfs_replication::{
ObjectOpts, ReplicationConfigurationExt, ReplicationTargetValidationError, replication_target_arns,
should_remove_replication_target, validate_replication_config_target_arns,
};
@@ -14,9 +14,11 @@
pub(crate) use rustfs_replication::{MrfOpKind, MrfReplicateEntry};
pub(crate) use rustfs_replication::{
REPLICATE_EXISTING, REPLICATE_EXISTING_DELETE, REPLICATE_HEAL_DELETE, REPLICATE_INCOMING_DELETE, ReplicateDecision,
ReplicateTargetDecision, ReplicatedInfos, ReplicatedTargetInfo, ReplicationAction, ReplicationState,
ReplicationWorkerOperation, ResyncDecision, get_replication_state, parse_replicate_decision, replication_statuses_map,
target_reset_header, version_purge_statuses_map,
REPLICATE_EXISTING, REPLICATE_EXISTING_DELETE, REPLICATE_HEAL_DELETE, ReplicateTargetDecision, ReplicatedInfos,
ReplicatedTargetInfo, ReplicationAction, ReplicationWorkerOperation, ResyncDecision, get_replication_state,
parse_replicate_decision, target_reset_header, version_purge_statuses_map,
};
pub use rustfs_replication::{
REPLICATE_INCOMING_DELETE, ReplicateDecision, ReplicateObjectInfo, ReplicationState, ReplicationStatusType, ReplicationType,
VersionPurgeStatusType, replication_statuses_map,
};
pub use rustfs_replication::{ReplicateObjectInfo, ReplicationStatusType, ReplicationType, VersionPurgeStatusType};
@@ -12,7 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
pub use rustfs_replication::MustReplicateOptions;
pub use rustfs_replication::{
MustReplicateOptions, ReplicationDeleteScheduleInput, ReplicationDeleteStateSource, delete_replication_state_from_config,
delete_replication_version_id, should_schedule_delete_replication, should_use_existing_delete_replication_info,
should_use_existing_delete_replication_source,
};
pub(crate) use rustfs_replication::{
ReplicationDeleteSource, ReplicationMultipartPartInput, ReplicationResyncTargetObject,
delete_replication_missing_source_decision, delete_replication_object_opts, heal_uses_delete_replication_path,
@@ -16,8 +16,12 @@ mod storage_api;
use s3s::dto::ReplicationConfiguration;
use storage_api::replication_compat::{
BucketStats, DeletedObjectReplicationInfo, DynReplicationPool, ObjectOpts, ReplicationConfigurationExt,
ReplicationObjectBridge, ReplicationStats, ResyncStatusType,
BucketStats, DeletedObjectReplicationInfo, DynReplicationPool, ObjectOpts, REPLICATE_INCOMING_DELETE, ReplicateDecision,
ReplicationConfigurationExt, ReplicationDeleteScheduleInput, ReplicationDeleteStateSource, ReplicationObjectBridge,
ReplicationState, ReplicationStats, ReplicationTargetValidationError, ResyncStatusType, delete_replication_state_from_config,
delete_replication_version_id, replication_statuses_map, replication_target_arns, should_remove_replication_target,
should_schedule_delete_replication, should_use_existing_delete_replication_info,
should_use_existing_delete_replication_source, validate_replication_config_target_arns,
};
fn type_name<T>() -> &'static str {
@@ -55,3 +59,43 @@ fn replication_facade_exports_runtime_and_dto_types() {
assert!(type_name::<ReplicationObjectBridge>().contains("ReplicationObjectBridge"));
assert!(type_name_unsized::<DynReplicationPool>().contains("ReplicationPoolTrait"));
}
#[test]
fn replication_facade_exports_app_storage_helper_contracts() {
let config = ReplicationConfiguration::default();
let target_arns = replication_target_arns(&config);
assert!(target_arns.is_empty());
let source = ReplicationDeleteStateSource {
name: String::new(),
user_tags: String::new(),
version_id: None,
delete_marker: false,
replica: false,
};
assert!(delete_replication_state_from_config(&config, &source).is_none());
assert!(replication_statuses_map("").is_empty());
let source_replication_status = Default::default();
let source_version_purge_status = Default::default();
let input = ReplicationDeleteScheduleInput {
replication_request: false,
version_id_requested: false,
source_delete_marker: false,
source_replication_status: &source_replication_status,
source_version_purge_status: &source_version_purge_status,
deleted_delete_marker_version: false,
};
assert!(!should_schedule_delete_replication(input));
assert!(delete_replication_version_id(false, None, false).is_none());
assert!(!should_remove_replication_target("arn", false, &target_arns));
assert!(!should_use_existing_delete_replication_info(false, false));
assert!(!should_use_existing_delete_replication_source(false, false, false));
assert!(validate_replication_config_target_arns(std::iter::empty(), &config).is_ok());
assert_eq!(REPLICATE_INCOMING_DELETE, "replicate:incoming:delete");
assert!(type_name::<ReplicateDecision>().contains("ReplicateDecision"));
assert!(type_name::<ReplicationState>().contains("ReplicationState"));
assert!(type_name::<ReplicationTargetValidationError>().contains("ReplicationTargetValidationError"));
}
+6 -2
View File
@@ -22,8 +22,12 @@ pub(crate) mod contract_compat {
pub(crate) mod replication_compat {
pub(crate) use rustfs_ecstore::api::bucket::replication::{
BucketStats, DeletedObjectReplicationInfo, DynReplicationPool, ObjectOpts, ReplicationConfigurationExt,
ReplicationObjectBridge, ReplicationStats, ResyncStatusType,
BucketStats, DeletedObjectReplicationInfo, DynReplicationPool, ObjectOpts, REPLICATE_INCOMING_DELETE, ReplicateDecision,
ReplicationConfigurationExt, ReplicationDeleteScheduleInput, ReplicationDeleteStateSource, ReplicationObjectBridge,
ReplicationState, ReplicationStats, ReplicationTargetValidationError, ResyncStatusType,
delete_replication_state_from_config, delete_replication_version_id, replication_statuses_map, replication_target_arns,
should_remove_replication_target, should_schedule_delete_replication, should_use_existing_delete_replication_info,
should_use_existing_delete_replication_source, validate_replication_config_target_arns,
};
}
-1
View File
@@ -44,7 +44,6 @@ time = { workspace = true }
chrono = { workspace = true }
rmp-serde = { workspace = true }
rustfs-filemeta = { workspace = true }
rustfs-replication = { workspace = true }
tokio-util = { workspace = true }
rustfs-ecstore = { workspace = true }
rustfs-storage-api = { workspace = true }