go.temporal.io/server@v1.23.0/common/persistence/visibility/manager_selector.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 //go:generate mockgen -copyright_file ../../../LICENSE -package $GOPACKAGE -source $GOFILE -destination manager_selector_mock.go 28 29 import ( 30 "fmt" 31 32 "go.temporal.io/api/serviceerror" 33 34 "go.temporal.io/server/common/dynamicconfig" 35 "go.temporal.io/server/common/namespace" 36 "go.temporal.io/server/common/persistence/visibility/manager" 37 ) 38 39 type ( 40 managerSelector interface { 41 readManager(nsName namespace.Name) manager.VisibilityManager 42 writeManagers() ([]manager.VisibilityManager, error) 43 } 44 45 defaultManagerSelector struct { 46 visibilityManager manager.VisibilityManager 47 secondaryVisibilityManager manager.VisibilityManager 48 enableReadFromSecondaryVisibility dynamicconfig.BoolPropertyFnWithNamespaceFilter 49 secondaryVisibilityWritingMode dynamicconfig.StringPropertyFn 50 } 51 ) 52 53 var _ managerSelector = (*defaultManagerSelector)(nil) 54 55 func newDefaultManagerSelector( 56 visibilityManager manager.VisibilityManager, 57 secondaryVisibilityManager manager.VisibilityManager, 58 enableSecondaryVisibilityRead dynamicconfig.BoolPropertyFnWithNamespaceFilter, 59 secondaryVisibilityWritingMode dynamicconfig.StringPropertyFn, 60 ) *defaultManagerSelector { 61 return &defaultManagerSelector{ 62 visibilityManager: visibilityManager, 63 secondaryVisibilityManager: secondaryVisibilityManager, 64 enableReadFromSecondaryVisibility: enableSecondaryVisibilityRead, 65 secondaryVisibilityWritingMode: secondaryVisibilityWritingMode, 66 } 67 } 68 69 func (v *defaultManagerSelector) writeManagers() ([]manager.VisibilityManager, error) { 70 switch v.secondaryVisibilityWritingMode() { 71 case SecondaryVisibilityWritingModeOff: 72 return []manager.VisibilityManager{v.visibilityManager}, nil 73 case SecondaryVisibilityWritingModeOn: 74 return []manager.VisibilityManager{v.secondaryVisibilityManager}, nil 75 case SecondaryVisibilityWritingModeDual: 76 return []manager.VisibilityManager{v.visibilityManager, v.secondaryVisibilityManager}, nil 77 default: 78 return nil, serviceerror.NewInternal(fmt.Sprintf( 79 "Unknown secondary visibility writing mode: %s", 80 v.secondaryVisibilityWritingMode(), 81 )) 82 } 83 } 84 85 func (v *defaultManagerSelector) readManager(nsName namespace.Name) manager.VisibilityManager { 86 if v.enableReadFromSecondaryVisibility(nsName.String()) { 87 return v.secondaryVisibilityManager 88 } 89 return v.visibilityManager 90 }