mirror of https://github.com/linkerd/linkerd2.git
				
				
				
			Fix multicluster StatefulSet test (#6577)
The multicluster StatefulSet test seemed to be a bit flakey. In the actual PR, the check passed, but as soon as it was merged it failed. I had a quick look and noticed that the flakiness in the test came from the logic that mirrors a namespace. Specifically, when we have a headless service, we create it and mirror its namespace here: https://github.com/linkerd/linkerd2/blob/main/multicluster/service-mirror/cluster_watcher.go#L1120 But, every time we process a new service, we do the same thing: https://github.com/linkerd/linkerd2/blob/main/multicluster/service-mirror/cluster_watcher.go#L463 The tests were failing when a headless service was being created with the following error: ``` time="2021-07-29T20:58:03Z" level=info msg="Err Inner errors:\n\tnamespaces \"ns2\" already exists: " cluster=remote ``` It seems that the namespace was being created twice in a very short span leading to a race condition (hence why it would pass randomly, I assume). An easy way to fix this is to bail out early in `handleRemoteServiceCreated()` if we have a headless service, before we create the namespace. Signed-off-by: Matei David <matei@buoyant.io>
This commit is contained in:
		
							parent
							
								
									8988d400c3
								
							
						
					
					
						commit
						adf1d33476
					
				| 
						 | 
				
			
			@ -457,6 +457,10 @@ func remapRemoteServicePorts(ports []corev1.ServicePort) []corev1.ServicePort {
 | 
			
		|||
 | 
			
		||||
func (rcsw *RemoteClusterServiceWatcher) handleRemoteServiceCreated(ctx context.Context, ev *RemoteServiceCreated) error {
 | 
			
		||||
	remoteService := ev.service.DeepCopy()
 | 
			
		||||
	if rcsw.headlessServicesEnabled && remoteService.Spec.ClusterIP == corev1.ClusterIPNone {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serviceInfo := fmt.Sprintf("%s/%s", remoteService.Namespace, remoteService.Name)
 | 
			
		||||
	localServiceName := rcsw.mirroredResourceName(remoteService.Name)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -476,10 +480,6 @@ func (rcsw *RemoteClusterServiceWatcher) handleRemoteServiceCreated(ctx context.
 | 
			
		|||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rcsw.headlessServicesEnabled && remoteService.Spec.ClusterIP == corev1.ClusterIPNone {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rcsw.log.Infof("Creating a new service mirror for %s", serviceInfo)
 | 
			
		||||
	if _, err := rcsw.localAPIClient.Client.CoreV1().Services(remoteService.Namespace).Create(ctx, serviceToCreate, metav1.CreateOptions{}); err != nil {
 | 
			
		||||
		if !kerrors.IsAlreadyExists(err) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1080,6 +1080,7 @@ func (rcsw *RemoteClusterServiceWatcher) createOrUpdateHeadlessEndpoints(ctx con
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(errors) > 0 {
 | 
			
		||||
		return RetryableError{errors}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue