mirror of
				https://github.com/minio/minio.git
				synced 2025-10-29 15:55:00 -04:00 
			
		
		
		
	Remove site replication config if it succeeded locally (#16279)
This commit is contained in:
		
							parent
							
								
									1dd8f0e8f3
								
							
						
					
					
						commit
						6423e4c767
					
				| @ -1384,7 +1384,7 @@ var errorCodes = errorCodeMap{ | |||||||
| 	ErrSiteReplicationPeerResp: { | 	ErrSiteReplicationPeerResp: { | ||||||
| 		Code:           "XMinioSiteReplicationPeerResp", | 		Code:           "XMinioSiteReplicationPeerResp", | ||||||
| 		Description:    "Error received when contacting a peer site", | 		Description:    "Error received when contacting a peer site", | ||||||
| 		HTTPStatusCode: http.StatusServiceUnavailable, | 		HTTPStatusCode: http.StatusBadRequest, | ||||||
| 	}, | 	}, | ||||||
| 	ErrSiteReplicationBackendIssue: { | 	ErrSiteReplicationBackendIssue: { | ||||||
| 		Code:           "XMinioSiteReplicationBackendIssue", | 		Code:           "XMinioSiteReplicationBackendIssue", | ||||||
|  | |||||||
| @ -131,8 +131,8 @@ func validateReplicationDestination(ctx context.Context, bucket string, rCfg *re | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		// validate replication ARN against target endpoint | 		// validate replication ARN against target endpoint | ||||||
| 		c, ok := globalBucketTargetSys.arnRemotesMap[arnStr] | 		c := globalBucketTargetSys.GetRemoteTargetClient(ctx, arnStr) | ||||||
| 		if ok { | 		if c != nil { | ||||||
| 			if c.EndpointURL().String() == clnt.EndpointURL().String() { | 			if c.EndpointURL().String() == clnt.EndpointURL().String() { | ||||||
| 				selfTarget, _ := isLocalHost(clnt.EndpointURL().Hostname(), clnt.EndpointURL().Port(), globalMinioPort) | 				selfTarget, _ := isLocalHost(clnt.EndpointURL().Hostname(), clnt.EndpointURL().Port(), globalMinioPort) | ||||||
| 				if !sameTarget { | 				if !sameTarget { | ||||||
|  | |||||||
| @ -72,6 +72,10 @@ var ( | |||||||
| 		Cause: errors.New("peer not found"), | 		Cause: errors.New("peer not found"), | ||||||
| 		Code:  ErrSiteReplicationInvalidRequest, | 		Code:  ErrSiteReplicationInvalidRequest, | ||||||
| 	} | 	} | ||||||
|  | 	errSRRequestorNotFound = SRError{ | ||||||
|  | 		Cause: errors.New("requesting site not found in site replication config"), | ||||||
|  | 		Code:  ErrSiteReplicationInvalidRequest, | ||||||
|  | 	} | ||||||
| 	errSRNotEnabled = SRError{ | 	errSRNotEnabled = SRError{ | ||||||
| 		Cause: errors.New("site replication is not enabled"), | 		Cause: errors.New("site replication is not enabled"), | ||||||
| 		Code:  ErrSiteReplicationInvalidRequest, | 		Code:  ErrSiteReplicationInvalidRequest, | ||||||
| @ -2060,12 +2064,12 @@ func (c *SiteReplicationSys) RemovePeerCluster(ctx context.Context, objectAPI Ob | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	for _, s := range siteNames { | 	for _, s := range siteNames { | ||||||
| 		info, ok := peerMap[s] | 		pinfo, ok := peerMap[s] | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			return st, errSRConfigMissingError(errMissingSRConfig) | 			return st, errSRConfigMissingError(errMissingSRConfig) | ||||||
| 		} | 		} | ||||||
| 		rmvEndpoints = append(rmvEndpoints, info.Endpoint) | 		rmvEndpoints = append(rmvEndpoints, pinfo.Endpoint) | ||||||
| 		delete(updatedPeers, info.DeploymentID) | 		delete(updatedPeers, pinfo.DeploymentID) | ||||||
| 	} | 	} | ||||||
| 	var wg sync.WaitGroup | 	var wg sync.WaitGroup | ||||||
| 	errs := make(map[string]error, len(c.state.Peers)) | 	errs := make(map[string]error, len(c.state.Peers)) | ||||||
| @ -2087,6 +2091,8 @@ func (c *SiteReplicationSys) RemovePeerCluster(ctx context.Context, objectAPI Ob | |||||||
| 				errs[pi.DeploymentID] = errSRPeerResp(fmt.Errorf("unable to create admin client for %s: %w", pi.Name, err)) | 				errs[pi.DeploymentID] = errSRPeerResp(fmt.Errorf("unable to create admin client for %s: %w", pi.Name, err)) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
|  | 			// set the requesting site's deploymentID for verification of peer request | ||||||
|  | 			rreq.RequestingDepID = globalDeploymentID | ||||||
| 			if _, err = admClient.SRPeerRemove(ctx, rreq); err != nil { | 			if _, err = admClient.SRPeerRemove(ctx, rreq); err != nil { | ||||||
| 				if errors.Is(err, errMissingSRConfig) { | 				if errors.Is(err, errMissingSRConfig) { | ||||||
| 					// ignore if peer is already removed. | 					// ignore if peer is already removed. | ||||||
| @ -2100,9 +2106,11 @@ func (c *SiteReplicationSys) RemovePeerCluster(ctx context.Context, objectAPI Ob | |||||||
| 	wg.Wait() | 	wg.Wait() | ||||||
| 
 | 
 | ||||||
| 	errdID := "" | 	errdID := "" | ||||||
|  | 	selfTgtsDeleted := errs[globalDeploymentID] == nil // true if all remote targets and replication config cleared successfully on local cluster | ||||||
|  | 
 | ||||||
| 	for dID, err := range errs { | 	for dID, err := range errs { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			if !rreq.RemoveAll { | 			if !rreq.RemoveAll && !selfTgtsDeleted { | ||||||
| 				return madmin.ReplicateRemoveStatus{ | 				return madmin.ReplicateRemoveStatus{ | ||||||
| 					ErrDetail: err.Error(), | 					ErrDetail: err.Error(), | ||||||
| 					Status:    madmin.ReplicateRemoveStatusPartial, | 					Status:    madmin.ReplicateRemoveStatusPartial, | ||||||
| @ -2146,12 +2154,17 @@ func (c *SiteReplicationSys) RemovePeerCluster(ctx context.Context, objectAPI Ob | |||||||
| 		return madmin.ReplicateRemoveStatus{ | 		return madmin.ReplicateRemoveStatus{ | ||||||
| 			Status:    madmin.ReplicateRemoveStatusPartial, | 			Status:    madmin.ReplicateRemoveStatusPartial, | ||||||
| 			ErrDetail: fmt.Sprintf("unable to save cluster-replication state on local: %v", err), | 			ErrDetail: fmt.Sprintf("unable to save cluster-replication state on local: %v", err), | ||||||
| 		}, nil | 		}, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return madmin.ReplicateRemoveStatus{ | 	st = madmin.ReplicateRemoveStatus{ | ||||||
| 		Status: madmin.ReplicateRemoveStatusSuccess, | 		Status: madmin.ReplicateRemoveStatusSuccess, | ||||||
| 	}, nil | 	} | ||||||
|  | 	if errs[errdID] != nil { | ||||||
|  | 		st.Status = madmin.ReplicateRemoveStatusPartial | ||||||
|  | 		st.ErrDetail = errs[errdID].Error() | ||||||
|  | 	} | ||||||
|  | 	return st, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // InternalRemoveReq - sends an unlink request to peer cluster to remove one or more sites | // InternalRemoveReq - sends an unlink request to peer cluster to remove one or more sites | ||||||
| @ -2160,6 +2173,19 @@ func (c *SiteReplicationSys) InternalRemoveReq(ctx context.Context, objectAPI Ob | |||||||
| 	if !c.isEnabled() { | 	if !c.isEnabled() { | ||||||
| 		return errSRNotEnabled | 		return errSRNotEnabled | ||||||
| 	} | 	} | ||||||
|  | 	if rreq.RequestingDepID != "" { | ||||||
|  | 		// validate if requesting site is still part of site replication | ||||||
|  | 		var foundRequestor bool | ||||||
|  | 		for _, p := range c.state.Peers { | ||||||
|  | 			if p.DeploymentID == rreq.RequestingDepID { | ||||||
|  | 				foundRequestor = true | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if !foundRequestor { | ||||||
|  | 			return errSRRequestorNotFound | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	ourName := "" | 	ourName := "" | ||||||
| 	peerMap := make(map[string]madmin.PeerInfo) | 	peerMap := make(map[string]madmin.PeerInfo) | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -49,7 +49,7 @@ require ( | |||||||
| 	github.com/minio/dperf v0.4.2 | 	github.com/minio/dperf v0.4.2 | ||||||
| 	github.com/minio/highwayhash v1.0.2 | 	github.com/minio/highwayhash v1.0.2 | ||||||
| 	github.com/minio/kes v0.22.2 | 	github.com/minio/kes v0.22.2 | ||||||
| 	github.com/minio/madmin-go/v2 v2.0.2 | 	github.com/minio/madmin-go/v2 v2.0.3 | ||||||
| 	github.com/minio/minio-go/v7 v7.0.45 | 	github.com/minio/minio-go/v7 v7.0.45 | ||||||
| 	github.com/minio/pkg v1.5.8 | 	github.com/minio/pkg v1.5.8 | ||||||
| 	github.com/minio/selfupdate v0.5.0 | 	github.com/minio/selfupdate v0.5.0 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -768,8 +768,8 @@ github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLT | |||||||
| github.com/minio/kes v0.22.2 h1:9NdgTx+TFJco0Pqdrq8WZbrTZVv0ichg+sbPRQiJ2HU= | github.com/minio/kes v0.22.2 h1:9NdgTx+TFJco0Pqdrq8WZbrTZVv0ichg+sbPRQiJ2HU= | ||||||
| github.com/minio/kes v0.22.2/go.mod h1:J9sD6Pe8obPt7+JXFcznkWaYaj9pBWCfN9U9j//NsNw= | github.com/minio/kes v0.22.2/go.mod h1:J9sD6Pe8obPt7+JXFcznkWaYaj9pBWCfN9U9j//NsNw= | ||||||
| github.com/minio/madmin-go v1.6.6/go.mod h1:ATvkBOLiP3av4D++2v1UEHC/QzsGtgXD5kYvvRYzdKs= | github.com/minio/madmin-go v1.6.6/go.mod h1:ATvkBOLiP3av4D++2v1UEHC/QzsGtgXD5kYvvRYzdKs= | ||||||
| github.com/minio/madmin-go/v2 v2.0.2 h1:VvCVnGMWiWIe/ds4frrZT4wQP/NpuAHC+pKU6LfjWDQ= | github.com/minio/madmin-go/v2 v2.0.3 h1:Q8qco+JrbRIim25tGrs0enVRJGoIMUHfULa5nJoSiqM= | ||||||
| github.com/minio/madmin-go/v2 v2.0.2/go.mod h1:5aFi/VLWBHC2DEFfGIlUmAeJhaF4ZAjuYpEWZFU14Zw= | github.com/minio/madmin-go/v2 v2.0.3/go.mod h1:5aFi/VLWBHC2DEFfGIlUmAeJhaF4ZAjuYpEWZFU14Zw= | ||||||
| github.com/minio/mc v0.0.0-20221209193822-daa06599e44d h1:6ixpv/LgK9KK/2oEdAGImS58oDi0jL/sSF4Iwy6MGEc= | github.com/minio/mc v0.0.0-20221209193822-daa06599e44d h1:6ixpv/LgK9KK/2oEdAGImS58oDi0jL/sSF4Iwy6MGEc= | ||||||
| github.com/minio/mc v0.0.0-20221209193822-daa06599e44d/go.mod h1:zt7TJevWacrSFrVkQ6Ba2ZY9PCZpp3A8qNeFBq7b8rI= | github.com/minio/mc v0.0.0-20221209193822-daa06599e44d/go.mod h1:zt7TJevWacrSFrVkQ6Ba2ZY9PCZpp3A8qNeFBq7b8rI= | ||||||
| github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= | github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user