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 }