From 37c6b2a8cce17f13e325f6ee5abb81c68ad8adc8 Mon Sep 17 00:00:00 2001 From: Poorna Krishnamoorthy Date: Sun, 13 Dec 2020 23:54:05 -0800 Subject: [PATCH] Add SourceSelectionCriteria to replication config --- pkg/replication/replication.go | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/pkg/replication/replication.go b/pkg/replication/replication.go index 9083816901..6df8982144 100644 --- a/pkg/replication/replication.go +++ b/pkg/replication/replication.go @@ -195,6 +195,14 @@ func (c *Config) AddRule(opts Options) error { }, DeleteMarkerReplication: DeleteMarkerReplication{Status: dmStatus}, DeleteReplication: DeleteReplication{Status: vDeleteStatus}, + // MinIO enables replica metadata syncing by default in the case of bi-directional replication to allow + // automatic failover as the expectation in this case is that replica and source should be identical. + // However AWS leaves this configurable https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-for-metadata-changes.html + SourceSelectionCriteria: SourceSelectionCriteria{ + ReplicaModifications: ReplicaModifications{ + Status: Enabled, + }, + }, } // validate rule after overlaying priority for pre-existing rule being disabled. @@ -378,6 +386,7 @@ type Rule struct { DeleteReplication DeleteReplication `xml:"DeleteReplication"` Destination Destination `xml:"Destination"` Filter Filter `xml:"Filter" json:"Filter"` + SourceSelectionCriteria SourceSelectionCriteria `xml:"SourceSelectionCriteria" json:"SourceSelectionCriteria"` } // Validate validates the rule for correctness @@ -396,6 +405,10 @@ func (r Rule) Validate() error { return fmt.Errorf("Priority must be set for the rule") } + if err := r.validateStatus(); err != nil { + return err + } + return nil } @@ -569,3 +582,29 @@ type DeleteReplication struct { func (d DeleteReplication) IsEmpty() bool { return len(d.Status) == 0 } + +// ReplicaModifications specifies if replica modification sync is enabled +type ReplicaModifications struct { + Status Status `xml:"Status" json:"Status"` +} + +// SourceSelectionCriteria - specifies additional source selection criteria in ReplicationConfiguration. +type SourceSelectionCriteria struct { + ReplicaModifications ReplicaModifications `xml:"ReplicaModifications" json:"ReplicaModifications"` +} + +// IsValid - checks whether SourceSelectionCriteria is valid or not. +func (s SourceSelectionCriteria) IsValid() bool { + return s.ReplicaModifications.Status == Enabled || s.ReplicaModifications.Status == Disabled +} + +// Validate source selection criteria +func (s SourceSelectionCriteria) Validate() error { + if (s == SourceSelectionCriteria{}) { + return nil + } + if !s.IsValid() { + return fmt.Errorf("Invalid ReplicaModification status") + } + return nil +}