mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-20 03:22:18 +00:00
refactor(ecstore): add replication work bridges (#4137)
This commit is contained in:
@@ -12,26 +12,22 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use rustfs_filemeta::{REPLICATE_INCOMING_DELETE, ReplicateDecision};
|
||||
use rustfs_filemeta::ReplicateDecision;
|
||||
use s3s::dto::ReplicationConfiguration;
|
||||
|
||||
use crate::bucket::lifecycle::lifecycle::ObjectOpts;
|
||||
use crate::bucket::replication::{self, DeletedObjectReplicationInfo, ReplicationConfig, ReplicationConfigurationExt as _};
|
||||
use crate::bucket::replication::{ReplicationLifecycleBridge, ReplicationLifecycleConfig};
|
||||
use crate::object_api::{ObjectInfo, ObjectOptions};
|
||||
use crate::storage_api_contracts::object::{DeletedObject, ObjectToDelete};
|
||||
|
||||
pub(crate) type LifecycleReplicationConfig = ReplicationConfig;
|
||||
pub(crate) type LifecycleReplicationConfig = ReplicationLifecycleConfig;
|
||||
|
||||
pub(crate) fn new_replication_config(config: ReplicationConfiguration) -> LifecycleReplicationConfig {
|
||||
ReplicationConfig::new(Some(config), None)
|
||||
ReplicationLifecycleBridge::new_config(config)
|
||||
}
|
||||
|
||||
pub(crate) fn has_pending_version_purge(config: &LifecycleReplicationConfig, obj: &ObjectOpts) -> bool {
|
||||
config
|
||||
.config
|
||||
.as_ref()
|
||||
.is_some_and(|config| config.has_active_rules(obj.name.as_str(), true))
|
||||
&& !obj.version_purge_status.is_empty()
|
||||
ReplicationLifecycleBridge::has_pending_version_purge(config, obj.name.as_str(), !obj.version_purge_status.is_empty())
|
||||
}
|
||||
|
||||
pub(crate) async fn check_delete_replication(
|
||||
@@ -40,76 +36,9 @@ pub(crate) async fn check_delete_replication(
|
||||
source: &ObjectInfo,
|
||||
opts: &ObjectOptions,
|
||||
) -> ReplicateDecision {
|
||||
replication::check_replicate_delete(bucket, &object, source, opts, None).await
|
||||
ReplicationLifecycleBridge::check_delete_replication(bucket, &object, source, opts).await
|
||||
}
|
||||
|
||||
pub(crate) async fn schedule_delete(bucket: String, delete_object: DeletedObject) {
|
||||
replication::schedule_replication_delete(DeletedObjectReplicationInfo {
|
||||
delete_object,
|
||||
bucket,
|
||||
event_type: REPLICATE_INCOMING_DELETE.to_string(),
|
||||
..Default::default()
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::collections::HashMap;
|
||||
|
||||
use rustfs_filemeta::{ReplicationStatusType, VersionPurgeStatusType};
|
||||
use s3s::dto::{Destination, ReplicationRule, ReplicationRuleStatus};
|
||||
|
||||
use super::*;
|
||||
|
||||
fn replication_rule() -> ReplicationRule {
|
||||
ReplicationRule {
|
||||
delete_marker_replication: None,
|
||||
delete_replication: None,
|
||||
destination: Destination {
|
||||
bucket: "arn:aws:s3:::target-bucket".to_string(),
|
||||
..Default::default()
|
||||
},
|
||||
existing_object_replication: None,
|
||||
filter: None,
|
||||
id: Some("rule".to_string()),
|
||||
prefix: Some(String::new()),
|
||||
priority: Some(1),
|
||||
source_selection_criteria: None,
|
||||
status: ReplicationRuleStatus::from_static(ReplicationRuleStatus::ENABLED),
|
||||
}
|
||||
}
|
||||
|
||||
fn object_opts(version_purge_status: VersionPurgeStatusType) -> ObjectOpts {
|
||||
ObjectOpts {
|
||||
name: "logs/object".to_string(),
|
||||
user_tags: String::new(),
|
||||
mod_time: None,
|
||||
size: 0,
|
||||
version_id: None,
|
||||
is_latest: true,
|
||||
delete_marker: false,
|
||||
num_versions: 1,
|
||||
successor_mod_time: None,
|
||||
transition_status: String::new(),
|
||||
restore_ongoing: false,
|
||||
restore_expires: None,
|
||||
versioned: true,
|
||||
version_suspended: false,
|
||||
user_defined: HashMap::new(),
|
||||
version_purge_status,
|
||||
replication_status: ReplicationStatusType::default(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn has_pending_version_purge_preserves_replication_active_rule_behavior() {
|
||||
let config = new_replication_config(ReplicationConfiguration {
|
||||
role: String::new(),
|
||||
rules: vec![replication_rule()],
|
||||
});
|
||||
|
||||
assert!(has_pending_version_purge(&config, &object_opts(VersionPurgeStatusType::Pending)));
|
||||
assert!(!has_pending_version_purge(&config, &object_opts(VersionPurgeStatusType::default())));
|
||||
}
|
||||
ReplicationLifecycleBridge::schedule_delete(bucket, delete_object).await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user