go.temporal.io/server@v1.23.0/common/persistence/visibility/defs.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  	"go.temporal.io/server/common/dynamicconfig"
    29  	"go.temporal.io/server/common/persistence/sql/sqlplugin/mysql"
    30  	"go.temporal.io/server/common/persistence/sql/sqlplugin/postgresql"
    31  	"go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite"
    32  )
    33  
    34  const (
    35  	// SecondaryVisibilityWritingModeOff means do not write to advanced visibility store
    36  	SecondaryVisibilityWritingModeOff = "off"
    37  	// SecondaryVisibilityWritingModeOn means only write to advanced visibility store
    38  	SecondaryVisibilityWritingModeOn = "on"
    39  	// SecondaryVisibilityWritingModeDual means write to both normal visibility and advanced visibility store
    40  	SecondaryVisibilityWritingModeDual = "dual"
    41  )
    42  
    43  // DefaultAdvancedVisibilityWritingMode returns default advancedVisibilityWritingMode based on whether related config exists in static config file.
    44  func DefaultAdvancedVisibilityWritingMode(advancedVisibilityConfigExist bool) string {
    45  	if advancedVisibilityConfigExist {
    46  		return SecondaryVisibilityWritingModeOn
    47  	}
    48  	return SecondaryVisibilityWritingModeOff
    49  }
    50  
    51  //nolint:revive
    52  func GetVisibilityPersistenceMaxReadQPS(
    53  	dc *dynamicconfig.Collection,
    54  	advancedVisibilityStoreConfigExists bool,
    55  ) dynamicconfig.IntPropertyFn {
    56  	if dc.HasKey(dynamicconfig.VisibilityPersistenceMaxReadQPS) {
    57  		return dc.GetIntProperty(dynamicconfig.VisibilityPersistenceMaxReadQPS, 9000)
    58  	}
    59  	if advancedVisibilityStoreConfigExists {
    60  		return dc.GetIntProperty(dynamicconfig.AdvancedVisibilityPersistenceMaxReadQPS, 9000)
    61  	}
    62  	return dc.GetIntProperty(dynamicconfig.StandardVisibilityPersistenceMaxReadQPS, 9000)
    63  }
    64  
    65  //nolint:revive
    66  func GetVisibilityPersistenceMaxWriteQPS(
    67  	dc *dynamicconfig.Collection,
    68  	advancedVisibilityStoreConfigExists bool,
    69  ) dynamicconfig.IntPropertyFn {
    70  	if dc.HasKey(dynamicconfig.VisibilityPersistenceMaxWriteQPS) {
    71  		return dc.GetIntProperty(dynamicconfig.VisibilityPersistenceMaxWriteQPS, 9000)
    72  	}
    73  	if advancedVisibilityStoreConfigExists {
    74  		return dc.GetIntProperty(dynamicconfig.AdvancedVisibilityPersistenceMaxWriteQPS, 9000)
    75  	}
    76  	return dc.GetIntProperty(dynamicconfig.StandardVisibilityPersistenceMaxWriteQPS, 9000)
    77  }
    78  
    79  //nolint:revive
    80  func GetEnableReadFromSecondaryVisibilityConfig(
    81  	dc *dynamicconfig.Collection,
    82  	visibilityStoreConfigExists bool,
    83  	advancedVisibilityStoreConfigExists bool,
    84  ) dynamicconfig.BoolPropertyFnWithNamespaceFilter {
    85  	if dc.HasKey(dynamicconfig.EnableReadFromSecondaryVisibility) {
    86  		return dc.GetBoolPropertyFnWithNamespaceFilter(
    87  			dynamicconfig.EnableReadFromSecondaryVisibility,
    88  			false,
    89  		)
    90  	}
    91  	if visibilityStoreConfigExists && advancedVisibilityStoreConfigExists {
    92  		return dc.GetBoolPropertyFnWithNamespaceFilter(
    93  			dynamicconfig.EnableReadVisibilityFromES,
    94  			advancedVisibilityStoreConfigExists,
    95  		)
    96  	}
    97  	if advancedVisibilityStoreConfigExists {
    98  		return dc.GetBoolPropertyFnWithNamespaceFilter(
    99  			dynamicconfig.EnableReadFromSecondaryAdvancedVisibility,
   100  			false,
   101  		)
   102  	}
   103  	return dynamicconfig.GetBoolPropertyFnFilteredByNamespace(false)
   104  }
   105  
   106  //nolint:revive
   107  func GetSecondaryVisibilityWritingModeConfig(
   108  	dc *dynamicconfig.Collection,
   109  	visibilityStoreConfigExists bool,
   110  	advancedVisibilityStoreConfigExists bool,
   111  ) dynamicconfig.StringPropertyFn {
   112  	if dc.HasKey(dynamicconfig.SecondaryVisibilityWritingMode) {
   113  		return dc.GetStringProperty(
   114  			dynamicconfig.SecondaryVisibilityWritingMode,
   115  			SecondaryVisibilityWritingModeOff,
   116  		)
   117  	}
   118  	if visibilityStoreConfigExists && advancedVisibilityStoreConfigExists {
   119  		return dc.GetStringProperty(
   120  			dynamicconfig.AdvancedVisibilityWritingMode,
   121  			DefaultAdvancedVisibilityWritingMode(advancedVisibilityStoreConfigExists),
   122  		)
   123  	}
   124  	if advancedVisibilityStoreConfigExists {
   125  		enableWriteToSecondaryAdvancedVisibility := dc.GetBoolProperty(
   126  			dynamicconfig.EnableWriteToSecondaryAdvancedVisibility,
   127  			false,
   128  		)
   129  		if enableWriteToSecondaryAdvancedVisibility() {
   130  			return dynamicconfig.GetStringPropertyFn(SecondaryVisibilityWritingModeDual)
   131  		}
   132  	}
   133  	return dynamicconfig.GetStringPropertyFn(SecondaryVisibilityWritingModeOff)
   134  }
   135  
   136  func AllowListForValidation(
   137  	storeNames []string,
   138  	allowList dynamicconfig.BoolPropertyFnWithNamespaceFilter,
   139  ) dynamicconfig.BoolPropertyFnWithNamespaceFilter {
   140  	if len(storeNames) == 0 {
   141  		return dynamicconfig.GetBoolPropertyFnFilteredByNamespace(false)
   142  	}
   143  
   144  	switch storeNames[0] {
   145  	case mysql.PluginNameV8, postgresql.PluginNameV12, postgresql.PluginNameV12PGX, sqlite.PluginName:
   146  		// Advanced visibility with SQL DB don't support list of values
   147  		return dynamicconfig.GetBoolPropertyFnFilteredByNamespace(false)
   148  	case mysql.PluginName, postgresql.PluginName, postgresql.PluginNamePGX:
   149  		// Standard visibility with SQL DB don't support list of values, but pass validation
   150  		return dynamicconfig.GetBoolPropertyFnFilteredByNamespace(true)
   151  	default:
   152  		// Otherwise (ES), check dynamic config
   153  		return allowList
   154  	}
   155  }