go.temporal.io/server@v1.23.0/common/persistence/visibility/visibility_manager_dual.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 visibility 26 27 import ( 28 "context" 29 30 "go.temporal.io/server/common/namespace" 31 "go.temporal.io/server/common/persistence/visibility/manager" 32 ) 33 34 type ( 35 VisibilityManagerDual struct { 36 visibilityManager manager.VisibilityManager 37 secondaryVisibilityManager manager.VisibilityManager 38 managerSelector managerSelector 39 } 40 ) 41 42 var _ manager.VisibilityManager = (*VisibilityManagerDual)(nil) 43 44 // NewVisibilityManagerDual create a visibility manager that operate on multiple manager 45 // implementations based on dynamic config. 46 func NewVisibilityManagerDual( 47 visibilityManager manager.VisibilityManager, 48 secondaryVisibilityManager manager.VisibilityManager, 49 managerSelector managerSelector, 50 ) *VisibilityManagerDual { 51 return &VisibilityManagerDual{ 52 visibilityManager: visibilityManager, 53 secondaryVisibilityManager: secondaryVisibilityManager, 54 managerSelector: managerSelector, 55 } 56 } 57 58 func (v *VisibilityManagerDual) GetPrimaryVisibility() manager.VisibilityManager { 59 return v.visibilityManager 60 } 61 62 func (v *VisibilityManagerDual) GetSecondaryVisibility() manager.VisibilityManager { 63 return v.secondaryVisibilityManager 64 } 65 66 func (v *VisibilityManagerDual) Close() { 67 v.visibilityManager.Close() 68 v.secondaryVisibilityManager.Close() 69 } 70 71 func (v *VisibilityManagerDual) GetReadStoreName(nsName namespace.Name) string { 72 return v.managerSelector.readManager(nsName).GetReadStoreName(nsName) 73 } 74 75 func (v *VisibilityManagerDual) GetStoreNames() []string { 76 return append(v.visibilityManager.GetStoreNames(), v.secondaryVisibilityManager.GetStoreNames()...) 77 } 78 79 func (v *VisibilityManagerDual) HasStoreName(stName string) bool { 80 for _, sn := range v.GetStoreNames() { 81 if sn == stName { 82 return true 83 } 84 } 85 return false 86 } 87 88 func (v *VisibilityManagerDual) GetIndexName() string { 89 return v.visibilityManager.GetIndexName() 90 } 91 92 func (v *VisibilityManagerDual) ValidateCustomSearchAttributes( 93 searchAttributes map[string]any, 94 ) (map[string]any, error) { 95 ms, err := v.managerSelector.writeManagers() 96 if err != nil { 97 return nil, err 98 } 99 for _, m := range ms { 100 searchAttributes, err = m.ValidateCustomSearchAttributes(searchAttributes) 101 if err != nil { 102 return nil, err 103 } 104 } 105 return searchAttributes, nil 106 } 107 108 func (v *VisibilityManagerDual) RecordWorkflowExecutionStarted( 109 ctx context.Context, 110 request *manager.RecordWorkflowExecutionStartedRequest, 111 ) error { 112 ms, err := v.managerSelector.writeManagers() 113 if err != nil { 114 return err 115 } 116 for _, m := range ms { 117 err = m.RecordWorkflowExecutionStarted(ctx, request) 118 if err != nil { 119 return err 120 } 121 } 122 return nil 123 } 124 125 func (v *VisibilityManagerDual) RecordWorkflowExecutionClosed( 126 ctx context.Context, 127 request *manager.RecordWorkflowExecutionClosedRequest, 128 ) error { 129 ms, err := v.managerSelector.writeManagers() 130 if err != nil { 131 return err 132 } 133 for _, m := range ms { 134 err = m.RecordWorkflowExecutionClosed(ctx, request) 135 if err != nil { 136 return err 137 } 138 } 139 return nil 140 } 141 142 func (v *VisibilityManagerDual) UpsertWorkflowExecution( 143 ctx context.Context, 144 request *manager.UpsertWorkflowExecutionRequest, 145 ) error { 146 ms, err := v.managerSelector.writeManagers() 147 if err != nil { 148 return err 149 } 150 for _, m := range ms { 151 err = m.UpsertWorkflowExecution(ctx, request) 152 if err != nil { 153 return err 154 } 155 } 156 return nil 157 } 158 159 func (v *VisibilityManagerDual) DeleteWorkflowExecution( 160 ctx context.Context, 161 request *manager.VisibilityDeleteWorkflowExecutionRequest, 162 ) error { 163 ms, err := v.managerSelector.writeManagers() 164 if err != nil { 165 return err 166 } 167 for _, m := range ms { 168 err = m.DeleteWorkflowExecution(ctx, request) 169 if err != nil { 170 return err 171 } 172 } 173 return nil 174 } 175 176 func (v *VisibilityManagerDual) ListOpenWorkflowExecutions( 177 ctx context.Context, 178 request *manager.ListWorkflowExecutionsRequest, 179 ) (*manager.ListWorkflowExecutionsResponse, error) { 180 return v.managerSelector.readManager(request.Namespace).ListOpenWorkflowExecutions(ctx, request) 181 } 182 183 func (v *VisibilityManagerDual) ListClosedWorkflowExecutions( 184 ctx context.Context, 185 request *manager.ListWorkflowExecutionsRequest, 186 ) (*manager.ListWorkflowExecutionsResponse, error) { 187 return v.managerSelector.readManager(request.Namespace).ListClosedWorkflowExecutions(ctx, request) 188 } 189 190 func (v *VisibilityManagerDual) ListOpenWorkflowExecutionsByType( 191 ctx context.Context, 192 request *manager.ListWorkflowExecutionsByTypeRequest, 193 ) (*manager.ListWorkflowExecutionsResponse, error) { 194 return v.managerSelector.readManager(request.Namespace).ListOpenWorkflowExecutionsByType(ctx, request) 195 } 196 197 func (v *VisibilityManagerDual) ListClosedWorkflowExecutionsByType( 198 ctx context.Context, 199 request *manager.ListWorkflowExecutionsByTypeRequest, 200 ) (*manager.ListWorkflowExecutionsResponse, error) { 201 return v.managerSelector.readManager(request.Namespace).ListClosedWorkflowExecutionsByType(ctx, request) 202 } 203 204 func (v *VisibilityManagerDual) ListOpenWorkflowExecutionsByWorkflowID( 205 ctx context.Context, 206 request *manager.ListWorkflowExecutionsByWorkflowIDRequest, 207 ) (*manager.ListWorkflowExecutionsResponse, error) { 208 return v.managerSelector.readManager(request.Namespace).ListOpenWorkflowExecutionsByWorkflowID(ctx, request) 209 } 210 211 func (v *VisibilityManagerDual) ListClosedWorkflowExecutionsByWorkflowID( 212 ctx context.Context, 213 request *manager.ListWorkflowExecutionsByWorkflowIDRequest, 214 ) (*manager.ListWorkflowExecutionsResponse, error) { 215 return v.managerSelector.readManager(request.Namespace).ListClosedWorkflowExecutionsByWorkflowID(ctx, request) 216 } 217 218 func (v *VisibilityManagerDual) ListClosedWorkflowExecutionsByStatus( 219 ctx context.Context, 220 request *manager.ListClosedWorkflowExecutionsByStatusRequest, 221 ) (*manager.ListWorkflowExecutionsResponse, error) { 222 return v.managerSelector.readManager(request.Namespace).ListClosedWorkflowExecutionsByStatus(ctx, request) 223 } 224 225 func (v *VisibilityManagerDual) ListWorkflowExecutions( 226 ctx context.Context, 227 request *manager.ListWorkflowExecutionsRequestV2, 228 ) (*manager.ListWorkflowExecutionsResponse, error) { 229 return v.managerSelector.readManager(request.Namespace).ListWorkflowExecutions(ctx, request) 230 } 231 232 func (v *VisibilityManagerDual) ScanWorkflowExecutions( 233 ctx context.Context, 234 request *manager.ListWorkflowExecutionsRequestV2, 235 ) (*manager.ListWorkflowExecutionsResponse, error) { 236 return v.managerSelector.readManager(request.Namespace).ScanWorkflowExecutions(ctx, request) 237 } 238 239 func (v *VisibilityManagerDual) CountWorkflowExecutions( 240 ctx context.Context, 241 request *manager.CountWorkflowExecutionsRequest, 242 ) (*manager.CountWorkflowExecutionsResponse, error) { 243 return v.managerSelector.readManager(request.Namespace).CountWorkflowExecutions(ctx, request) 244 } 245 246 func (v *VisibilityManagerDual) GetWorkflowExecution( 247 ctx context.Context, 248 request *manager.GetWorkflowExecutionRequest, 249 ) (*manager.GetWorkflowExecutionResponse, error) { 250 return v.managerSelector.readManager(request.Namespace).GetWorkflowExecution(ctx, request) 251 }