go.temporal.io/server@v1.23.0/common/namespace/transmission_task_handler.go (about)

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inc.
     6  //
     7  // Permission is hereby granted, free of charge, to any person obtaining a copy
     8  // of this software and associated documentation files (the "Software"), to deal
     9  // in the Software without restriction, including without limitation the rights
    10  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    11  // copies of the Software, and to permit persons to whom the Software is
    12  // furnished to do so, subject to the following conditions:
    13  //
    14  // The above copyright notice and this permission notice shall be included in
    15  // all copies or substantial portions of the Software.
    16  //
    17  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    18  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    19  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    20  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    21  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    22  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    23  // THE SOFTWARE.
    24  
    25  package namespace
    26  
    27  import (
    28  	"context"
    29  
    30  	enumspb "go.temporal.io/api/enums/v1"
    31  	namespacepb "go.temporal.io/api/namespace/v1"
    32  	replicationpb "go.temporal.io/api/replication/v1"
    33  
    34  	enumsspb "go.temporal.io/server/api/enums/v1"
    35  	persistencespb "go.temporal.io/server/api/persistence/v1"
    36  	replicationspb "go.temporal.io/server/api/replication/v1"
    37  	"go.temporal.io/server/common/log"
    38  	"go.temporal.io/server/common/persistence"
    39  )
    40  
    41  // NOTE: the counterpart of namespace replication receiving logic is in service/worker package
    42  
    43  type (
    44  	// Replicator is the interface which can replicate the namespace
    45  	Replicator interface {
    46  		HandleTransmissionTask(
    47  			ctx context.Context,
    48  			namespaceOperation enumsspb.NamespaceOperation,
    49  			info *persistencespb.NamespaceInfo,
    50  			config *persistencespb.NamespaceConfig,
    51  			replicationConfig *persistencespb.NamespaceReplicationConfig,
    52  			replicationClusterListUpdated bool,
    53  			configVersion int64,
    54  			failoverVersion int64,
    55  			isGlobalNamespace bool,
    56  			failoverHistoy []*persistencespb.FailoverStatus,
    57  		) error
    58  	}
    59  
    60  	namespaceReplicatorImpl struct {
    61  		namespaceReplicationQueue persistence.NamespaceReplicationQueue
    62  		logger                    log.Logger
    63  	}
    64  )
    65  
    66  // NewNamespaceReplicator create a new instance of namespace replicator
    67  func NewNamespaceReplicator(
    68  	namespaceReplicationQueue persistence.NamespaceReplicationQueue,
    69  	logger log.Logger,
    70  ) Replicator {
    71  	return &namespaceReplicatorImpl{
    72  		namespaceReplicationQueue: namespaceReplicationQueue,
    73  		logger:                    logger,
    74  	}
    75  }
    76  
    77  // HandleTransmissionTask handle transmission of the namespace replication task
    78  func (namespaceReplicator *namespaceReplicatorImpl) HandleTransmissionTask(
    79  	ctx context.Context,
    80  	namespaceOperation enumsspb.NamespaceOperation,
    81  	info *persistencespb.NamespaceInfo,
    82  	config *persistencespb.NamespaceConfig,
    83  	replicationConfig *persistencespb.NamespaceReplicationConfig,
    84  	replicationClusterListUpdated bool,
    85  	configVersion int64,
    86  	failoverVersion int64,
    87  	isGlobalNamespace bool,
    88  	failoverHistoy []*persistencespb.FailoverStatus,
    89  ) error {
    90  
    91  	if !isGlobalNamespace {
    92  		return nil
    93  	}
    94  	if len(replicationConfig.Clusters) <= 1 && !replicationClusterListUpdated {
    95  		return nil
    96  	}
    97  	if info.State == enumspb.NAMESPACE_STATE_DELETED {
    98  		// Don't replicate deleted namespace changes.
    99  		return nil
   100  	}
   101  
   102  	taskType := enumsspb.REPLICATION_TASK_TYPE_NAMESPACE_TASK
   103  	task := &replicationspb.ReplicationTask_NamespaceTaskAttributes{
   104  		NamespaceTaskAttributes: &replicationspb.NamespaceTaskAttributes{
   105  			NamespaceOperation: namespaceOperation,
   106  			Id:                 info.Id,
   107  			Info: &namespacepb.NamespaceInfo{
   108  				Name:        info.Name,
   109  				State:       info.State,
   110  				Description: info.Description,
   111  				OwnerEmail:  info.Owner,
   112  				Data:        info.Data,
   113  			},
   114  			Config: &namespacepb.NamespaceConfig{
   115  				WorkflowExecutionRetentionTtl: config.Retention,
   116  				HistoryArchivalState:          config.HistoryArchivalState,
   117  				HistoryArchivalUri:            config.HistoryArchivalUri,
   118  				VisibilityArchivalState:       config.VisibilityArchivalState,
   119  				VisibilityArchivalUri:         config.VisibilityArchivalUri,
   120  				BadBinaries:                   config.BadBinaries,
   121  				CustomSearchAttributeAliases:  config.CustomSearchAttributeAliases,
   122  			},
   123  			ReplicationConfig: &replicationpb.NamespaceReplicationConfig{
   124  				ActiveClusterName: replicationConfig.ActiveClusterName,
   125  				Clusters:          convertClusterReplicationConfigToProto(replicationConfig.Clusters),
   126  			},
   127  			ConfigVersion:   configVersion,
   128  			FailoverVersion: failoverVersion,
   129  			FailoverHistory: convertFailoverHistoryToReplicationProto(failoverHistoy),
   130  		},
   131  	}
   132  
   133  	return namespaceReplicator.namespaceReplicationQueue.Publish(
   134  		ctx,
   135  		&replicationspb.ReplicationTask{
   136  			TaskType:   taskType,
   137  			Attributes: task,
   138  		})
   139  }
   140  
   141  func convertClusterReplicationConfigToProto(
   142  	input []string,
   143  ) []*replicationpb.ClusterReplicationConfig {
   144  	output := make([]*replicationpb.ClusterReplicationConfig, 0, len(input))
   145  	for _, clusterName := range input {
   146  		output = append(output, &replicationpb.ClusterReplicationConfig{ClusterName: clusterName})
   147  	}
   148  	return output
   149  }
   150  
   151  func convertFailoverHistoryToReplicationProto(
   152  	failoverHistoy []*persistencespb.FailoverStatus,
   153  ) []*replicationpb.FailoverStatus {
   154  	var replicationProto []*replicationpb.FailoverStatus
   155  	for _, failoverStatus := range failoverHistoy {
   156  		replicationProto = append(replicationProto, &replicationpb.FailoverStatus{
   157  			FailoverTime:    failoverStatus.GetFailoverTime(),
   158  			FailoverVersion: failoverStatus.GetFailoverVersion(),
   159  		})
   160  	}
   161  
   162  	return replicationProto
   163  }