Atlas › Test

TestTQMDoesFinalUpdateOnIdleUnload

Exact test identity: go.temporal.io/server/service/matching/TestPhysicalTaskQueueManager_Classic_Suite/TestTQMDoesFinalUpdateOnIdleUnload

Package
go.temporal.io/server/service/matching
Suite / test hierarchy
TestPhysicalTaskQueueManager_Classic_Suite/TestTQMDoesFinalUpdateOnIdleUnload
Test
TestTQMDoesFinalUpdateOnIdleUnload
Introduced at
TestTQMDoesFinalUpdateOnIdleUnload, TestTQMDoesFinalUpdateOnIdleUnload Frontier kind: Test frontier
Covered ranges
868
Covered lines
4706
Covered files
190

Co-introduced tests

1 other test enter at the same concept.

Covered source

Expand a file to inspect source; the > gutter marks covered lines.

go.temporal.io/server/common/dynamicconfig/setting_gen.go 316 covered LOC · 68 ranges

Open complete file

26 type GlobalBoolConstrainedDefaultSetting = GlobalTypedConstrainedDefaultSetting[bool]
27
28 > func NewGlobalBoolSetting(key string, def bool, description string) GlobalBoolSetting { setting_gen.go
29 > return NewGlobalTypedSettingWithConverter[bool](key, convertBool, def, description)
30 > }
31
32 func NewGlobalBoolSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[bool], description string) GlobalBoolConstrainedDefaultSetting {
43 type NamespaceBoolConstrainedDefaultSetting = NamespaceTypedConstrainedDefaultSetting[bool]
44
45 > func NewNamespaceBoolSetting(key string, def bool, description string) NamespaceBoolSetting { setting_gen.go
46 > return NewNamespaceTypedSettingWithConverter[bool](key, convertBool, def, description)
47 > }
48
49 func NewNamespaceBoolSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[bool], description string) NamespaceBoolConstrainedDefaultSetting {
60 type NamespaceIDBoolConstrainedDefaultSetting = NamespaceIDTypedConstrainedDefaultSetting[bool]
61
62 > func NewNamespaceIDBoolSetting(key string, def bool, description string) NamespaceIDBoolSetting { setting_gen.go
63 > return NewNamespaceIDTypedSettingWithConverter[bool](key, convertBool, def, description)
64 > }
65
66 func NewNamespaceIDBoolSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[bool], description string) NamespaceIDBoolConstrainedDefaultSetting {
77 type TaskQueueBoolConstrainedDefaultSetting = TaskQueueTypedConstrainedDefaultSetting[bool]
78
79 > func NewTaskQueueBoolSetting(key string, def bool, description string) TaskQueueBoolSetting { setting_gen.go
80 > return NewTaskQueueTypedSettingWithConverter[bool](key, convertBool, def, description)
81 > }
82
83 func NewTaskQueueBoolSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[bool], description string) TaskQueueBoolConstrainedDefaultSetting {
87 type BoolPropertyFnWithTaskQueueFilter = TypedPropertyFnWithTaskQueueFilter[bool]
88
89 > func GetBoolPropertyFnFilteredByTaskQueue(value bool) BoolPropertyFnWithTaskQueueFilter { setting_gen.go
90 > return GetTypedPropertyFnFilteredByTaskQueue(value)
91 > }
92
93 type ShardIDBoolSetting = ShardIDTypedSetting[bool]
128 type DestinationBoolConstrainedDefaultSetting = DestinationTypedConstrainedDefaultSetting[bool]
129
130 > func NewDestinationBoolSetting(key string, def bool, description string) DestinationBoolSetting { setting_gen.go
131 > return NewDestinationTypedSettingWithConverter[bool](key, convertBool, def, description)
132 > }
133
134 func NewDestinationBoolSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[bool], description string) DestinationBoolConstrainedDefaultSetting {
162 type GlobalIntConstrainedDefaultSetting = GlobalTypedConstrainedDefaultSetting[int]
163
164 > func NewGlobalIntSetting(key string, def int, description string) GlobalIntSetting { setting_gen.go
165 > return NewGlobalTypedSettingWithConverter[int](key, convertInt, def, description)
166 > }
167
168 func NewGlobalIntSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[int], description string) GlobalIntConstrainedDefaultSetting {
179 type NamespaceIntConstrainedDefaultSetting = NamespaceTypedConstrainedDefaultSetting[int]
180
181 > func NewNamespaceIntSetting(key string, def int, description string) NamespaceIntSetting { setting_gen.go
182 > return NewNamespaceTypedSettingWithConverter[int](key, convertInt, def, description)
183 > }
184
185 func NewNamespaceIntSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[int], description string) NamespaceIntConstrainedDefaultSetting {
189 type IntPropertyFnWithNamespaceFilter = TypedPropertyFnWithNamespaceFilter[int]
190
191 > func GetIntPropertyFnFilteredByNamespace(value int) IntPropertyFnWithNamespaceFilter { setting_gen.go
192 > return GetTypedPropertyFnFilteredByNamespace(value)
193 > }
194
195 type NamespaceIDIntSetting = NamespaceIDTypedSetting[int]
213 type TaskQueueIntConstrainedDefaultSetting = TaskQueueTypedConstrainedDefaultSetting[int]
214
215 > func NewTaskQueueIntSetting(key string, def int, description string) TaskQueueIntSetting { setting_gen.go
216 > return NewTaskQueueTypedSettingWithConverter[int](key, convertInt, def, description)
217 > }
218
219 > func NewTaskQueueIntSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[int], description string) TaskQueueIntConstrainedDefaultSetting { setting_gen.go
220 > return NewTaskQueueTypedSettingWithConstrainedDefault[int](key, convertInt, cdef, description)
221 > }
222
223 type IntPropertyFnWithTaskQueueFilter = TypedPropertyFnWithTaskQueueFilter[int]
224
225 > func GetIntPropertyFnFilteredByTaskQueue(value int) IntPropertyFnWithTaskQueueFilter { setting_gen.go
226 > return GetTypedPropertyFnFilteredByTaskQueue(value)
227 > }
228
229 type ShardIDIntSetting = ShardIDTypedSetting[int]
230 type ShardIDIntConstrainedDefaultSetting = ShardIDTypedConstrainedDefaultSetting[int]
231
232 > func NewShardIDIntSetting(key string, def int, description string) ShardIDIntSetting { setting_gen.go
233 > return NewShardIDTypedSettingWithConverter[int](key, convertInt, def, description)
234 > }
235
236 func NewShardIDIntSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[int], description string) ShardIDIntConstrainedDefaultSetting {
264 type DestinationIntConstrainedDefaultSetting = DestinationTypedConstrainedDefaultSetting[int]
265
266 > func NewDestinationIntSetting(key string, def int, description string) DestinationIntSetting { setting_gen.go
267 > return NewDestinationTypedSettingWithConverter[int](key, convertInt, def, description)
268 > }
269
270 func NewDestinationIntSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[int], description string) DestinationIntConstrainedDefaultSetting {
298 type GlobalFloatConstrainedDefaultSetting = GlobalTypedConstrainedDefaultSetting[float64]
299
300 > func NewGlobalFloatSetting(key string, def float64, description string) GlobalFloatSetting { setting_gen.go
301 > return NewGlobalTypedSettingWithConverter[float64](key, convertFloat, def, description)
302 > }
303
304 func NewGlobalFloatSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[float64], description string) GlobalFloatConstrainedDefaultSetting {
315 type NamespaceFloatConstrainedDefaultSetting = NamespaceTypedConstrainedDefaultSetting[float64]
316
317 > func NewNamespaceFloatSetting(key string, def float64, description string) NamespaceFloatSetting { setting_gen.go
318 > return NewNamespaceTypedSettingWithConverter[float64](key, convertFloat, def, description)
319 > }
320
321 func NewNamespaceFloatSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[float64], description string) NamespaceFloatConstrainedDefaultSetting {
349 type TaskQueueFloatConstrainedDefaultSetting = TaskQueueTypedConstrainedDefaultSetting[float64]
350
351 > func NewTaskQueueFloatSetting(key string, def float64, description string) TaskQueueFloatSetting { setting_gen.go
352 > return NewTaskQueueTypedSettingWithConverter[float64](key, convertFloat, def, description)
353 > }
354
355 func NewTaskQueueFloatSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[float64], description string) TaskQueueFloatConstrainedDefaultSetting {
366 type ShardIDFloatConstrainedDefaultSetting = ShardIDTypedConstrainedDefaultSetting[float64]
367
368 > func NewShardIDFloatSetting(key string, def float64, description string) ShardIDFloatSetting { setting_gen.go
369 > return NewShardIDTypedSettingWithConverter[float64](key, convertFloat, def, description)
370 > }
371
372 func NewShardIDFloatSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[float64], description string) ShardIDFloatConstrainedDefaultSetting {
400 type DestinationFloatConstrainedDefaultSetting = DestinationTypedConstrainedDefaultSetting[float64]
401
402 > func NewDestinationFloatSetting(key string, def float64, description string) DestinationFloatSetting { setting_gen.go
403 > return NewDestinationTypedSettingWithConverter[float64](key, convertFloat, def, description)
404 > }
405
406 func NewDestinationFloatSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[float64], description string) DestinationFloatConstrainedDefaultSetting {
434 type GlobalStringConstrainedDefaultSetting = GlobalTypedConstrainedDefaultSetting[string]
435
436 > func NewGlobalStringSetting(key string, def string, description string) GlobalStringSetting { setting_gen.go
437 > return NewGlobalTypedSettingWithConverter[string](key, convertString, def, description)
438 > }
439
440 func NewGlobalStringSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[string], description string) GlobalStringConstrainedDefaultSetting {
570 type GlobalDurationConstrainedDefaultSetting = GlobalTypedConstrainedDefaultSetting[time.Duration]
571
572 > func NewGlobalDurationSetting(key string, def time.Duration, description string) GlobalDurationSetting { setting_gen.go
573 > return NewGlobalTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
574 > }
575
576 func NewGlobalDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) GlobalDurationConstrainedDefaultSetting {
580 type DurationPropertyFn = TypedPropertyFn[time.Duration]
581
582 > func GetDurationPropertyFn(value time.Duration) DurationPropertyFn { setting_gen.go
583 > return GetTypedPropertyFn(value)
584 > }
585
586 type NamespaceDurationSetting = NamespaceTypedSetting[time.Duration]
587 type NamespaceDurationConstrainedDefaultSetting = NamespaceTypedConstrainedDefaultSetting[time.Duration]
588
589 > func NewNamespaceDurationSetting(key string, def time.Duration, description string) NamespaceDurationSetting { setting_gen.go
590 > return NewNamespaceTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
591 > }
592
593 func NewNamespaceDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) NamespaceDurationConstrainedDefaultSetting {
604 type NamespaceIDDurationConstrainedDefaultSetting = NamespaceIDTypedConstrainedDefaultSetting[time.Duration]
605
606 > func NewNamespaceIDDurationSetting(key string, def time.Duration, description string) NamespaceIDDurationSetting { setting_gen.go
607 > return NewNamespaceIDTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
608 > }
609
610 func NewNamespaceIDDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) NamespaceIDDurationConstrainedDefaultSetting {
621 type TaskQueueDurationConstrainedDefaultSetting = TaskQueueTypedConstrainedDefaultSetting[time.Duration]
622
623 > func NewTaskQueueDurationSetting(key string, def time.Duration, description string) TaskQueueDurationSetting { setting_gen.go
624 > return NewTaskQueueTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
625 > }
626
627 > func NewTaskQueueDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) TaskQueueDurationConstrainedDefaultSetting { setting_gen.go
628 > return NewTaskQueueTypedSettingWithConstrainedDefault[time.Duration](key, convertDuration, cdef, description)
629 > }
630
631 type DurationPropertyFnWithTaskQueueFilter = TypedPropertyFnWithTaskQueueFilter[time.Duration]
632
633 > func GetDurationPropertyFnFilteredByTaskQueue(value time.Duration) DurationPropertyFnWithTaskQueueFilter { setting_gen.go
634 > return GetTypedPropertyFnFilteredByTaskQueue(value)
635 > }
636
637 type ShardIDDurationSetting = ShardIDTypedSetting[time.Duration]
638 type ShardIDDurationConstrainedDefaultSetting = ShardIDTypedConstrainedDefaultSetting[time.Duration]
639
640 > func NewShardIDDurationSetting(key string, def time.Duration, description string) ShardIDDurationSetting { setting_gen.go
641 > return NewShardIDTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
642 > }
643
644 func NewShardIDDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) ShardIDDurationConstrainedDefaultSetting {
655 type TaskTypeDurationConstrainedDefaultSetting = TaskTypeTypedConstrainedDefaultSetting[time.Duration]
656
657 > func NewTaskTypeDurationSetting(key string, def time.Duration, description string) TaskTypeDurationSetting { setting_gen.go
658 > return NewTaskTypeTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
659 > }
660
661 func NewTaskTypeDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) TaskTypeDurationConstrainedDefaultSetting {
672 type DestinationDurationConstrainedDefaultSetting = DestinationTypedConstrainedDefaultSetting[time.Duration]
673
674 > func NewDestinationDurationSetting(key string, def time.Duration, description string) DestinationDurationSetting { setting_gen.go
675 > return NewDestinationTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
676 > }
677
678 func NewDestinationDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) DestinationDurationConstrainedDefaultSetting {
689 type ChasmTaskTypeDurationConstrainedDefaultSetting = ChasmTaskTypeTypedConstrainedDefaultSetting[time.Duration]
690
691 > func NewChasmTaskTypeDurationSetting(key string, def time.Duration, description string) ChasmTaskTypeDurationSetting { setting_gen.go
692 > return NewChasmTaskTypeTypedSettingWithConverter[time.Duration](key, convertDuration, def, description)
693 > }
694
695 func NewChasmTaskTypeDurationSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[time.Duration], description string) ChasmTaskTypeDurationConstrainedDefaultSetting {
723 type NamespaceMapConstrainedDefaultSetting = NamespaceTypedConstrainedDefaultSetting[map[string]any]
724
725 > func NewNamespaceMapSetting(key string, def map[string]any, description string) NamespaceMapSetting { setting_gen.go
726 > return NewNamespaceTypedSettingWithConverter[map[string]any](key, convertMap, def, description)
727 > }
728
729 func NewNamespaceMapSettingWithConstrainedDefault(key string, cdef []TypedConstrainedValue[map[string]any], description string) NamespaceMapConstrainedDefaultSetting {
845 // values. The value from dynamic config will be _merged_ over a deep copy of 'def'. Be very careful
846 // when using non-empty maps or slices as defaults, the result may not be what you want.
847 > func NewGlobalTypedSetting[T any](key string, def T, description string) GlobalTypedSetting[T] { setting_gen.go
848 > // Warn on any shared structure used with ConvertStructure, even though we handle it by deep copying.
849 > warnDefaultSharedStructure(key, def)
850 > // If even deep copy won't even work, we should panic early. Do that by calling deep copy once here.
851 > _ = deepCopyForMapstructure(def)
852 >
853 > s := GlobalTypedSetting[T]{
854 > key: MakeKey(key),
855 > def: def,
856 > convert: ConvertStructure[T](def),
857 > description: description,
858 > }
859 > register(s)
860 > return s
861 > }
862
863 // NewGlobalTypedSettingWithConverter creates a setting with a custom converter function.
864 > func NewGlobalTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) GlobalTypedSetting[T] { setting_gen.go
865 > s := GlobalTypedSetting[T]{
866 > key: MakeKey(key),
867 > def: def,
868 > convert: convert,
869 > description: description,
870 > }
871 > register(s)
872 > return s
873 > }
874
875 // NewGlobalTypedSettingWithConstrainedDefault creates a setting with a compound default value.
885 }
886
887 > func (s GlobalTypedSetting[T]) Key() Key { return s.key } setting_gen.go
888 func (s GlobalTypedSetting[T]) Precedence() Precedence { return PrecedenceGlobal }
889 func (s GlobalTypedSetting[T]) Validate(v any) error {
907 type TypedPropertyFn[T any] func() T
908
909 > func (s GlobalTypedSetting[T]) Get(c *Collection) TypedPropertyFn[T] { setting_gen.go
910 > return func() T {
911 prec := []Constraints{{}}
912 return matchAndConvert(
969 }
970
971 > func GetTypedPropertyFn[T any](value T) TypedPropertyFn[T] { setting_gen.go
972 > return func() T {
973 return value
974 }
981 // values. The value from dynamic config will be _merged_ over a deep copy of 'def'. Be very careful
982 // when using non-empty maps or slices as defaults, the result may not be what you want.
983 > func NewNamespaceTypedSetting[T any](key string, def T, description string) NamespaceTypedSetting[T] { setting_gen.go
984 > // Warn on any shared structure used with ConvertStructure, even though we handle it by deep copying.
985 > warnDefaultSharedStructure(key, def)
986 > // If even deep copy won't even work, we should panic early. Do that by calling deep copy once here.
987 > _ = deepCopyForMapstructure(def)
988 >
989 > s := NamespaceTypedSetting[T]{
990 > key: MakeKey(key),
991 > def: def,
992 > convert: ConvertStructure[T](def),
993 > description: description,
994 > }
995 > register(s)
996 > return s
997 > }
998
999 // NewNamespaceTypedSettingWithConverter creates a setting with a custom converter function.
1000 > func NewNamespaceTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) NamespaceTypedSetting[T] { setting_gen.go
1001 > s := NamespaceTypedSetting[T]{
1002 > key: MakeKey(key),
1003 > def: def,
1004 > convert: convert,
1005 > description: description,
1006 > }
1007 > register(s)
1008 > return s
1009 > }
1010
1011 // NewNamespaceTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1021 }
1022
1023 > func (s NamespaceTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1024 func (s NamespaceTypedSetting[T]) Precedence() Precedence { return PrecedenceNamespace }
1025 func (s NamespaceTypedSetting[T]) Validate(v any) error {
1043 type TypedPropertyFnWithNamespaceFilter[T any] func(namespace string) T
1044
1045 > func (s NamespaceTypedSetting[T]) Get(c *Collection) TypedPropertyFnWithNamespaceFilter[T] { setting_gen.go
1046 > return func(namespace string) T {
1047 > prec := []Constraints{{Namespace: namespace}, {}} setting_gen.go
1048 > return matchAndConvert(
1049 > c,
1050 > s.key,
1051 > s.def,
1052 > s.convert,
1053 > prec,
1054 > )
1055 > }
1056 }
1057
1071 type TypedSubscribableWithNamespaceFilter[T any] func(namespace string, callback func(T)) (v T, cancel func())
1072
1073 > func (s NamespaceTypedSetting[T]) Subscribe(c *Collection) TypedSubscribableWithNamespaceFilter[T] { setting_gen.go
1074 > return func(namespace string, callback func(T)) (T, func()) {
1075 prec := []Constraints{{Namespace: namespace}, {}}
1076 return subscribe(c, s.key, s.def, s.convert, prec, callback)
1105 }
1106
1107 > func GetTypedPropertyFnFilteredByNamespace[T any](value T) TypedPropertyFnWithNamespaceFilter[T] { setting_gen.go
1108 > return func(namespace string) T {
1109 return value
1110 }
1134
1135 // NewNamespaceIDTypedSettingWithConverter creates a setting with a custom converter function.
1136 > func NewNamespaceIDTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) NamespaceIDTypedSetting[T] { setting_gen.go
1137 > s := NamespaceIDTypedSetting[T]{
1138 > key: MakeKey(key),
1139 > def: def,
1140 > convert: convert,
1141 > description: description,
1142 > }
1143 > register(s)
1144 > return s
1145 > }
1146
1147 // NewNamespaceIDTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1157 }
1158
1159 > func (s NamespaceIDTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1160 func (s NamespaceIDTypedSetting[T]) Precedence() Precedence { return PrecedenceNamespaceID }
1161 func (s NamespaceIDTypedSetting[T]) Validate(v any) error {
1253 // values. The value from dynamic config will be _merged_ over a deep copy of 'def'. Be very careful
1254 // when using non-empty maps or slices as defaults, the result may not be what you want.
1255 > func NewTaskQueueTypedSetting[T any](key string, def T, description string) TaskQueueTypedSetting[T] { setting_gen.go
1256 > // Warn on any shared structure used with ConvertStructure, even though we handle it by deep copying.
1257 > warnDefaultSharedStructure(key, def)
1258 > // If even deep copy won't even work, we should panic early. Do that by calling deep copy once here.
1259 > _ = deepCopyForMapstructure(def)
1260 >
1261 > s := TaskQueueTypedSetting[T]{
1262 > key: MakeKey(key),
1263 > def: def,
1264 > convert: ConvertStructure[T](def),
1265 > description: description,
1266 > }
1267 > register(s)
1268 > return s
1269 > }
1270
1271 // NewTaskQueueTypedSettingWithConverter creates a setting with a custom converter function.
1272 > func NewTaskQueueTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) TaskQueueTypedSetting[T] { setting_gen.go
1273 > s := TaskQueueTypedSetting[T]{
1274 > key: MakeKey(key),
1275 > def: def,
1276 > convert: convert,
1277 > description: description,
1278 > }
1279 > register(s)
1280 > return s
1281 > }
1282
1283 // NewTaskQueueTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1284 > func NewTaskQueueTypedSettingWithConstrainedDefault[T any](key string, convert func(any) (T, error), cdef []TypedConstrainedValue[T], description string) TaskQueueTypedConstrainedDefaultSetting[T] { setting_gen.go
1285 > s := TaskQueueTypedConstrainedDefaultSetting[T]{
1286 > key: MakeKey(key),
1287 > cdef: cdef,
1288 > convert: convert,
1289 > description: description,
1290 > }
1291 > register(s)
1292 > return s
1293 > }
1294
1295 > func (s TaskQueueTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1296 func (s TaskQueueTypedSetting[T]) Precedence() Precedence { return PrecedenceTaskQueue }
1297 func (s TaskQueueTypedSetting[T]) Validate(v any) error {
1300 }
1301
1302 > func (s TaskQueueTypedConstrainedDefaultSetting[T]) Key() Key { return s.key } setting_gen.go
1303 func (s TaskQueueTypedConstrainedDefaultSetting[T]) Precedence() Precedence { return PrecedenceTaskQueue }
1304 func (s TaskQueueTypedConstrainedDefaultSetting[T]) Validate(v any) error {
1315 type TypedPropertyFnWithTaskQueueFilter[T any] func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType) T
1316
1317 > func (s TaskQueueTypedSetting[T]) Get(c *Collection) TypedPropertyFnWithTaskQueueFilter[T] { setting_gen.go
1318 > return func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType) T {
1319 > prec := []Constraints{ setting_gen.go
1320 > {Namespace: namespace, TaskQueueName: taskQueue, TaskQueueType: taskQueueType},
1321 > {Namespace: namespace, TaskQueueName: taskQueue},
1322 > {TaskQueueName: taskQueue},
1323 > {Namespace: namespace},
1324 > {},
1325 > }
1326 > return matchAndConvert(
1327 > c,
1328 > s.key,
1329 > s.def,
1330 > s.convert,
1331 > prec,
1332 > )
1333 > }
1334 }
1335
1336 > func (s TaskQueueTypedConstrainedDefaultSetting[T]) Get(c *Collection) TypedPropertyFnWithTaskQueueFilter[T] { setting_gen.go
1337 > return func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType) T {
1338 > prec := []Constraints{ setting_gen.go
1339 > {Namespace: namespace, TaskQueueName: taskQueue, TaskQueueType: taskQueueType},
1340 > {Namespace: namespace, TaskQueueName: taskQueue},
1341 > {TaskQueueName: taskQueue},
1342 > {Namespace: namespace},
1343 > {},
1344 > }
1345 > return matchAndConvertWithConstrainedDefault(
1346 > c,
1347 > s.key,
1348 > s.cdef,
1349 > s.convert,
1350 > prec,
1351 > )
1352 > }
1353 }
1354
1355 type TypedSubscribableWithTaskQueueFilter[T any] func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType, callback func(T)) (v T, cancel func())
1356
1357 > func (s TaskQueueTypedSetting[T]) Subscribe(c *Collection) TypedSubscribableWithTaskQueueFilter[T] { setting_gen.go
1358 > return func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType, callback func(T)) (T, func()) {
1359 prec := []Constraints{
1360 {Namespace: namespace, TaskQueueName: taskQueue, TaskQueueType: taskQueueType},
1378 }
1379
1380 > func (s TaskQueueTypedConstrainedDefaultSetting[T]) Subscribe(c *Collection) TypedSubscribableWithTaskQueueFilter[T] { setting_gen.go
1381 > return func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType, callback func(T)) (T, func()) {
1382 prec := []Constraints{
1383 {Namespace: namespace, TaskQueueName: taskQueue, TaskQueueType: taskQueueType},
1401 }
1402
1403 > func GetTypedPropertyFnFilteredByTaskQueue[T any](value T) TypedPropertyFnWithTaskQueueFilter[T] { setting_gen.go
1404 > return func(namespace string, taskQueue string, taskQueueType enumspb.TaskQueueType) T {
1405 > return value setting_gen.go
1406 > }
1407 }
1408
1430
1431 // NewShardIDTypedSettingWithConverter creates a setting with a custom converter function.
1432 > func NewShardIDTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) ShardIDTypedSetting[T] { setting_gen.go
1433 > s := ShardIDTypedSetting[T]{
1434 > key: MakeKey(key),
1435 > def: def,
1436 > convert: convert,
1437 > description: description,
1438 > }
1439 > register(s)
1440 > return s
1441 > }
1442
1443 // NewShardIDTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1453 }
1454
1455 > func (s ShardIDTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1456 func (s ShardIDTypedSetting[T]) Precedence() Precedence { return PrecedenceShardID }
1457 func (s ShardIDTypedSetting[T]) Validate(v any) error {
1566
1567 // NewTaskTypeTypedSettingWithConverter creates a setting with a custom converter function.
1568 > func NewTaskTypeTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) TaskTypeTypedSetting[T] { setting_gen.go
1569 > s := TaskTypeTypedSetting[T]{
1570 > key: MakeKey(key),
1571 > def: def,
1572 > convert: convert,
1573 > description: description,
1574 > }
1575 > register(s)
1576 > return s
1577 > }
1578
1579 // NewTaskTypeTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1589 }
1590
1591 > func (s TaskTypeTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1592 func (s TaskTypeTypedSetting[T]) Precedence() Precedence { return PrecedenceTaskType }
1593 func (s TaskTypeTypedSetting[T]) Validate(v any) error {
1685 // values. The value from dynamic config will be _merged_ over a deep copy of 'def'. Be very careful
1686 // when using non-empty maps or slices as defaults, the result may not be what you want.
1687 > func NewDestinationTypedSetting[T any](key string, def T, description string) DestinationTypedSetting[T] { setting_gen.go
1688 > // Warn on any shared structure used with ConvertStructure, even though we handle it by deep copying.
1689 > warnDefaultSharedStructure(key, def)
1690 > // If even deep copy won't even work, we should panic early. Do that by calling deep copy once here.
1691 > _ = deepCopyForMapstructure(def)
1692 >
1693 > s := DestinationTypedSetting[T]{
1694 > key: MakeKey(key),
1695 > def: def,
1696 > convert: ConvertStructure[T](def),
1697 > description: description,
1698 > }
1699 > register(s)
1700 > return s
1701 > }
1702
1703 // NewDestinationTypedSettingWithConverter creates a setting with a custom converter function.
1704 > func NewDestinationTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) DestinationTypedSetting[T] { setting_gen.go
1705 > s := DestinationTypedSetting[T]{
1706 > key: MakeKey(key),
1707 > def: def,
1708 > convert: convert,
1709 > description: description,
1710 > }
1711 > register(s)
1712 > return s
1713 > }
1714
1715 // NewDestinationTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1725 }
1726
1727 > func (s DestinationTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1728 func (s DestinationTypedSetting[T]) Precedence() Precedence { return PrecedenceDestination }
1729 func (s DestinationTypedSetting[T]) Validate(v any) error {
1858
1859 // NewChasmTaskTypeTypedSettingWithConverter creates a setting with a custom converter function.
1860 > func NewChasmTaskTypeTypedSettingWithConverter[T any](key string, convert func(any) (T, error), def T, description string) ChasmTaskTypeTypedSetting[T] { setting_gen.go
1861 > s := ChasmTaskTypeTypedSetting[T]{
1862 > key: MakeKey(key),
1863 > def: def,
1864 > convert: convert,
1865 > description: description,
1866 > }
1867 > register(s)
1868 > return s
1869 > }
1870
1871 // NewChasmTaskTypeTypedSettingWithConstrainedDefault creates a setting with a compound default value.
1881 }
1882
1883 > func (s ChasmTaskTypeTypedSetting[T]) Key() Key { return s.key } setting_gen.go
1884 func (s ChasmTaskTypeTypedSetting[T]) Precedence() Precedence { return PrecedenceChasmTaskType }
1885 func (s ChasmTaskTypeTypedSetting[T]) Validate(v any) error {
go.temporal.io/server/service/matching/db.go 209 covered LOC · 39 ranges

Open complete file

101 metricsHandler metrics.Handler,
102 isDraining bool,
103 > ) *taskQueueDB { db.go
104 > return &taskQueueDB{
105 > config: config,
106 > queue: queue,
107 > isDraining: isDraining,
108 > store: store,
109 > logger: logger,
110 > metricsHandler: metricsHandler,
111 > }
112 > }
113
114 // RangeID returns the current persistence view of rangeID
120
121 // GetMaxReadLevel returns the current maxReadLevel
122 > func (db *taskQueueDB) GetMaxReadLevel(subqueue subqueueIndex) int64 { db.go
123 > db.Lock()
124 > defer db.Unlock()
125 > return db.getMaxReadLevelLocked(subqueue)
126 > }
127
128 > func (db *taskQueueDB) getMaxReadLevelLocked(subqueue subqueueIndex) int64 { db.go
129 > return db.subqueues[subqueue].maxReadLevel
130 > }
131
132 // GetMaxReadLevel returns the current maxReadLevel
152 func (db *taskQueueDB) RenewLease(
153 ctx context.Context,
154 > ) (taskQueueState, error) { db.go
155 > db.Lock()
156 > defer db.Unlock()
157 >
158 > if db.rangeID == 0 {
159 > if err := db.takeOverTaskQueueLocked(ctx); err != nil {
160 return taskQueueState{}, err
161 }
165 }
166 }
167 > return taskQueueState{ db.go
168 > rangeID: db.rangeID,
169 > ackLevel: db.subqueues[subqueueZero].AckLevel, // TODO(pri): cleanup, only used by old backlog manager
170 > subqueues: db.cloneSubqueues(),
171 > otherHasTasks: !db.isDraining && db.otherHasTasks,
172 > scaleState: db.scaleState,
173 > }, nil
174 }
175
176 func (db *taskQueueDB) takeOverTaskQueueLocked(
177 ctx context.Context,
178 > ) error { db.go
179 > response, err := db.store.GetTaskQueue(ctx, &persistence.GetTaskQueueRequest{
180 > NamespaceID: db.queue.NamespaceId(),
181 > TaskQueue: db.queue.PersistenceName(),
182 > TaskType: db.queue.TaskType(),
183 > })
184 > switch err.(type) {
185 case nil:
186 db.rangeID = response.RangeID
208 return nil
209
210 > case *serviceerror.NotFound: db.go
211 > db.rangeID = initialRangeID
212 > db.subqueues = db.ensureDefaultSubqueuesLocked(nil, 0, 0)
213 >
214 > // If we are the draining one, then assume the other has tasks, so we can migrate
215 > // backwards safely. Also assume other has tasks if the config allows for migration
216 > // (and the partition supports fairness) since we may have just turned on fairness and need to migrate.
217 > canMigrate := (db.config.NewMatcher || db.config.EnableFairness) && db.queue.Partition().SupportsFairness()
218 > db.otherHasTasks = canMigrate || db.isDraining
219 >
220 > if _, err := db.store.CreateTaskQueue(ctx, &persistence.CreateTaskQueueRequest{
221 > RangeID: db.rangeID,
222 > TaskQueueInfo: db.cachedQueueInfo(),
223 > }); err != nil {
224 db.rangeID = 0
225 return err
226 }
227 > db.lastWrite = time.Now() db.go
228 > // In this case, ensureDefaultSubqueuesLocked already initialized subqueue 0 to have
229 > // ackLevel and maxReadLevel 0, so we don't need to initialize them.
230 > softassert.That(db.logger, db.subqueues[0].maxReadLevel == 0, "should have maxReadLevel 0 here")
231 > softassert.That(db.logger, db.subqueues[0].FairMaxReadLevel == nil, "should have maxReadLevel 0 here")
232 > softassert.That(db.logger, db.subqueues[0].AckLevel == 0, "should have ackLevel 0 here")
233 > softassert.That(db.logger, db.subqueues[0].FairAckLevel == nil, "should have ackLevel 0 here")
234 > return nil
235
236 default:
239 }
240
241 > func (db *taskQueueDB) updateTaskQueueLocked(ctx context.Context, incrementRangeId bool) error { db.go
242 > newRangeID := db.rangeID
243 > if incrementRangeId {
244 newRangeID++
245 }
246 > if _, err := db.store.UpdateTaskQueue(ctx, &persistence.UpdateTaskQueueRequest{ db.go
247 > RangeID: newRangeID,
248 > TaskQueueInfo: db.cachedQueueInfo(),
249 > PrevRangeID: db.rangeID,
250 > }); err != nil {
251 return err
252 }
253 > db.lastWrite = time.Now() db.go
254 > db.rangeID = newRangeID
255 > return nil
256 }
257
262 ctx context.Context,
263 ackLevel int64,
264 > ) error { db.go
265 > db.Lock()
266 > defer db.Unlock()
267 > // We don't need to update lastWrite/lastChange in here since this function is only used by
268 > // the old backlog manager and those fields are only used by the new backlog manager.
269 >
270 > // Reset approximateBacklogCount to fix the count divergence issue
271 > maxReadLevel := db.getMaxReadLevelLocked(subqueueZero)
272 > if ackLevel == maxReadLevel {
273 > db.subqueues[subqueueZero].ApproximateBacklogCount = 0 db.go
274 > db.subqueues[subqueueZero].oldestTime = time.Time{} // zero time means no backlog
275 > }
276
277 > prevAckLevel := db.subqueues[subqueueZero].AckLevel db.go
278 > db.subqueues[subqueueZero].AckLevel = ackLevel
279 >
280 > err := db.updateTaskQueueLocked(ctx, false)
281 > if err != nil {
282 db.subqueues[subqueueZero].AckLevel = prevAckLevel
283 }
284 > db.emitPhysicalBacklogGaugesLocked() db.go
285 > return err
286 }
287
474 }
475
476 > func (db *taskQueueDB) getTotalApproximateBacklogCount() int64 { db.go
477 > db.Lock()
478 > defer db.Unlock()
479 >
480 > var total int64
481 > for _, s := range db.subqueues {
482 > total += s.ApproximateBacklogCount
483 > }
484 > return total
485 }
486
814 }
815
816 > func (db *taskQueueDB) expiryTime() *timestamppb.Timestamp { db.go
817 > if ttl := db.queue.Partition().PersistenceTTL(); ttl > 0 {
818 return timestamppb.New(time.Now().Add(ttl))
819 }
820 > return nil db.go
821 }
822
823 > func (db *taskQueueDB) cachedQueueInfo() *persistencespb.TaskQueueInfo { db.go
824 > infos := make([]*persistencespb.SubqueueInfo, len(db.subqueues))
825 > for i := range db.subqueues {
826 > infos[i] = &db.subqueues[i].SubqueueInfo
827 > }
828 > return &persistencespb.TaskQueueInfo{
829 > NamespaceId: db.queue.NamespaceId(),
830 > Name: db.queue.PersistenceName(),
831 > TaskType: db.queue.TaskType(),
832 > Kind: db.queue.Partition().Kind(),
833 > AckLevel: db.subqueues[subqueueZero].AckLevel, // backwards compatibility
834 > ExpiryTime: db.expiryTime(),
835 > LastUpdateTime: timestamp.TimeNowPtrUtc(),
836 > ApproximateBacklogCount: db.subqueues[subqueueZero].ApproximateBacklogCount, // backwards compatibility
837 > Subqueues: infos,
838 > OtherHasTasks: db.otherHasTasks,
839 > PartitionScaleState: db.scaleState,
840 > }
841 }
842
853 // to emitting the original approximate_backlog_count and approximate_backlog_age_seconds for
854 // all queues (including versioned queues when BreakdownMetricsByBuildID is enabled).
855 > func (db *taskQueueDB) emitPhysicalBacklogGaugesLocked() { db.go
856 > if !db.config.BreakdownMetricsByTaskQueue() || !db.config.BreakdownMetricsByPartition() {
857 return
858 }
859
860 > attributionEnabled := db.config.BacklogMetricsEmitInterval() > 0 db.go
861 >
862 > if attributionEnabled {
863 > if db.queue.IsVersioned() {
864 return
865 }
870 }
871
872 > var totalLag int64 db.go
873 > var oldestTime time.Time
874 > counts := make(map[int32]int64)
875 > for _, s := range db.subqueues {
876 > counts[s.Key.Priority] += s.ApproximateBacklogCount
877 > oldestTime = minNonZeroTime(oldestTime, s.oldestTime)
878 > // note: this metric is only an estimation for the lag.
879 > // taskID in DB may not be continuous, especially when task list ownership changes.
880 > if s.FairMaxReadLevel != nil && s.FairAckLevel != nil {
881 // TODO(fairness): this is not a good estimate of anything, we should probably just
882 // get rid of this metric.
883 totalLag += s.FairMaxReadLevel.TaskId - s.FairAckLevel.TaskId
884 > } else { db.go
885 > totalLag += s.maxReadLevel - s.AckLevel db.go
886 > }
887 }
888
889 > backlogCountGauge := metrics.ApproximateBacklogCount db.go
890 > backlogAgeGauge := metrics.ApproximateBacklogAgeSeconds
891 > if attributionEnabled {
892 > backlogCountGauge = metrics.PhysicalApproximateBacklogCount
893 > backlogAgeGauge = metrics.PhysicalApproximateBacklogAgeSeconds
894 > }
895
896 > for priority, count := range counts { db.go
897 > backlogCountGauge.With(db.metricsHandler).Record(float64(count), metrics.MatchingTaskPriorityTag(priority))
898 > }
899 > if oldestTime.IsZero() {
900 > backlogAgeGauge.With(db.metricsHandler).Record(0) db.go
901 > } else { db.go
902 backlogAgeGauge.With(db.metricsHandler).Record(time.Since(oldestTime).Seconds())
903 }
904 > metrics.TaskLagPerTaskQueueGauge.With(db.metricsHandler).Record(float64(totalLag)) db.go
905 }
906
909 initAckLevel int64,
910 initApproxCount int64,
911 > ) []*dbSubqueue { db.go
912 > // convert+copy protos to []*dbSubqueue
913 > subqueues := make([]*dbSubqueue, len(infos))
914 > for i, info := range infos {
915 subqueues[i] = &dbSubqueue{}
916 proto.Merge(&subqueues[i].SubqueueInfo, info)
918
919 // check for default priority and add if not present (this may be initializing subqueue 0)
920 > defKey := &persistencespb.SubqueueKey{ db.go
921 > Priority: int32(db.config.DefaultPriorityKey),
922 > }
923 > hasDefault := slices.ContainsFunc(subqueues, func(s *dbSubqueue) bool {
924 return proto.Equal(s.Key, defKey)
925 })
926 > if !hasDefault { db.go
927 > subqueues = append(subqueues, db.newSubqueueLocked(defKey))
928 > // If we are transitioning from no-subqueues to subqueues, initialize subqueue 0 with
929 > // the ack level and approx count from TaskQueueInfo.
930 > if len(subqueues) == 1 {
931 > subqueues[subqueueZero].AckLevel = initAckLevel
932 > subqueues[subqueueZero].ApproximateBacklogCount = initApproxCount
933 > }
934 }
935 > return subqueues db.go
936 }
937
938 > func (db *taskQueueDB) newSubqueueLocked(key *persistencespb.SubqueueKey) *dbSubqueue { db.go
939 > // For fifo queues: start ack level + max read level just before the current block.
940 > // For fair queues: ack level and max read level don't matter here.
941 > initAckLevel := rangeIDToTaskIDBlock(db.rangeID, db.config.RangeSize).start - 1
942 > softassert.That(db.logger, initAckLevel >= 0, "initAckLevel should not be negative")
943 >
944 > s := &dbSubqueue{maxReadLevel: initAckLevel}
945 > s.Key = key
946 > s.AckLevel = initAckLevel
947 > return s
948 > }
949
950 // clone db.subqueues so we can return it outside our lock
951 > func (db *taskQueueDB) cloneSubqueues() []persistencespb.SubqueueInfo { db.go
952 > infos := make([]persistencespb.SubqueueInfo, len(db.subqueues))
953 > for i := range db.subqueues {
954 > proto.Merge(&infos[i], &db.subqueues[i].SubqueueInfo)
955 > }
956 > return infos
957 }
958
959 > func (db *taskQueueDB) emitZeroPhysicalBacklogGauges() { db.go
960 > if !db.config.BreakdownMetricsByTaskQueue() || !db.config.BreakdownMetricsByPartition() {
961 return
962 }
963
964 > attributionEnabled := db.config.BacklogMetricsEmitInterval() > 0 db.go
965 >
966 > if attributionEnabled {
967 > if db.queue.IsVersioned() {
968 return
969 }
974 }
975
976 > priorities := make(map[int32]struct{}) db.go
977 > db.Lock()
978 > for _, s := range db.subqueues {
979 > priorities[s.Key.Priority] = struct{}{}
980 > }
981 > db.Unlock()
982 >
983 > backlogCountGauge := metrics.ApproximateBacklogCount
984 > backlogAgeGauge := metrics.ApproximateBacklogAgeSeconds
985 > if attributionEnabled {
986 > backlogCountGauge = metrics.PhysicalApproximateBacklogCount
987 > backlogAgeGauge = metrics.PhysicalApproximateBacklogAgeSeconds
988 > }
989
990 > for k := range priorities { db.go
991 > backlogCountGauge.With(db.metricsHandler).Record(0, metrics.MatchingTaskPriorityTag(k))
992 > }
993 > backlogAgeGauge.With(db.metricsHandler).Record(0)
994 > metrics.TaskLagPerTaskQueueGauge.With(db.metricsHandler).Record(0)
995 }
go.temporal.io/server/service/matching/config.go 174 covered LOC · 15 ranges

Open complete file

278 func NewConfig(
279 dc *dynamicconfig.Collection,
280 > ) *Config { config.go
281 > return &Config{
282 > PersistenceMaxQPS: dynamicconfig.MatchingPersistenceMaxQPS.Get(dc),
283 > PersistenceGlobalMaxQPS: dynamicconfig.MatchingPersistenceGlobalMaxQPS.Get(dc),
284 > PersistenceNamespaceMaxQPS: dynamicconfig.MatchingPersistenceNamespaceMaxQPS.Get(dc),
285 > PersistenceGlobalNamespaceMaxQPS: dynamicconfig.MatchingPersistenceGlobalNamespaceMaxQPS.Get(dc),
286 > PersistencePerShardNamespaceMaxQPS: dynamicconfig.DefaultPerShardNamespaceRPSMax,
287 > PersistenceDynamicRateLimitingParams: dynamicconfig.MatchingPersistenceDynamicRateLimitingParams.Get(dc),
288 > PersistenceQPSBurstRatio: dynamicconfig.PersistenceQPSBurstRatio.Get(dc),
289 > SyncMatchWaitDuration: dynamicconfig.MatchingSyncMatchWaitDuration.Get(dc),
290 > HistoryMaxPageSize: dynamicconfig.MatchingHistoryMaxPageSize.Get(dc),
291 > EnableDeployments: dynamicconfig.EnableDeployments.Get(dc), // [cleanup-wv-pre-release]
292 > EnableDeploymentVersions: dynamicconfig.EnableDeploymentVersions.Get(dc),
293 > UseRevisionNumberForWorkerVersioning: dynamicconfig.UseRevisionNumberForWorkerVersioning.Get(dc),
294 > MaxTaskQueuesInDeployment: dynamicconfig.MatchingMaxTaskQueuesInDeployment.Get(dc),
295 > MaxVersionsInTaskQueue: dynamicconfig.MatchingMaxVersionsInTaskQueue.Get(dc),
296 > RPS: dynamicconfig.MatchingRPS.Get(dc),
297 > NamespaceRPS: dynamicconfig.MatchingNamespaceRPS.Get(dc),
298 > OperatorRPSRatio: dynamicconfig.OperatorRPSRatio.Get(dc),
299 > PollWaitForNamespaceRateLimitToken: dynamicconfig.PollWaitForNamespaceRateLimitToken.Get(dc),
300 > RangeSize: 100000,
301 > NewMatcherSub: dynamicconfig.MatchingUseNewMatcher.Subscribe(dc),
302 > EnableFairnessSub: dynamicconfig.MatchingEnableFairness.Subscribe(dc),
303 > EnableMigration: dynamicconfig.MatchingEnableMigration.Get(dc),
304 > AutoEnableV2Sub: dynamicconfig.MatchingAutoEnableV2.Subscribe(dc),
305 > GetTasksBatchSize: dynamicconfig.MatchingGetTasksBatchSize.Get(dc),
306 > GetTasksReloadAt: dynamicconfig.MatchingGetTasksReloadAt.Get(dc),
307 > ForceReadTasksOnWrite: dynamicconfig.MatchingForceReadTasksOnWrite.Get(dc),
308 > UpdateAckInterval: dynamicconfig.MatchingUpdateAckInterval.Get(dc),
309 > MetadataUpdateOnAppendInterval: dynamicconfig.MatchingMetadataUpdateOnAppendInterval.Get(dc),
310 > MaxTaskQueueIdleTime: dynamicconfig.MatchingMaxTaskQueueIdleTime.Get(dc),
311 > LongPollExpirationInterval: dynamicconfig.MatchingLongPollExpirationInterval.Get(dc),
312 > BacklogTaskForwardTimeout: dynamicconfig.MatchingBacklogTaskForwardTimeout.Get(dc),
313 > ForwardPollRetryMaxInterval: dynamicconfig.MatchingForwardPollRetryMaxInterval.Get(dc),
314 > MinTaskThrottlingBurstSize: dynamicconfig.MatchingMinTaskThrottlingBurstSize.Get(dc),
315 > MaxTaskDeleteBatchSize: dynamicconfig.MatchingMaxTaskDeleteBatchSize.Get(dc),
316 > TaskDeleteInterval: dynamicconfig.MatchingTaskDeleteInterval.Get(dc),
317 > OutstandingTaskAppendsThreshold: dynamicconfig.MatchingOutstandingTaskAppendsThreshold.Get(dc),
318 > MaxTaskBatchSize: dynamicconfig.MatchingMaxTaskBatchSize.Get(dc),
319 > ThrottledLogRPS: dynamicconfig.MatchingThrottledLogRPS.Get(dc),
320 > NumTaskqueueWritePartitions: dynamicconfig.MatchingNumTaskqueueWritePartitions.Get(dc),
321 > NumTaskqueueReadPartitions: dynamicconfig.MatchingNumTaskqueueReadPartitions.Get(dc),
322 > NumTaskqueueReadPartitionsSub: dynamicconfig.MatchingNumTaskqueueReadPartitions.Subscribe(dc),
323 > BreakdownMetricsByTaskQueue: dynamicconfig.MetricsBreakdownByTaskQueue.Get(dc),
324 > BreakdownMetricsByPartition: dynamicconfig.MetricsBreakdownByPartition.Get(dc),
325 > BreakdownMetricsByBuildID: dynamicconfig.MetricsBreakdownByBuildID.Get(dc),
326 > EnableWorkerPluginMetrics: dynamicconfig.MatchingEnableWorkerPluginMetrics.Get(dc),
327 > EnablePollerAutoscalingMetrics: dynamicconfig.MatchingEnablePollerAutoscalingMetrics.Get(dc),
328 > ExternalPayloadsEnabled: dynamicconfig.ExternalPayloadsEnabled.Get(dc),
329 > WorkerRegistryNumBuckets: dynamicconfig.MatchingWorkerRegistryNumBuckets.Get(dc),
330 > WorkerRegistryEntryTTL: dynamicconfig.MatchingWorkerRegistryEntryTTL.Get(dc),
331 > WorkerRegistryMinEvictAge: dynamicconfig.MatchingWorkerRegistryMinEvictAge.Get(dc),
332 > WorkerRegistryMaxEntries: dynamicconfig.MatchingWorkerRegistryMaxEntries.Get(dc),
333 > WorkerRegistryEvictionInterval: dynamicconfig.MatchingWorkerRegistryEvictionInterval.Get(dc),
334 > ForwarderMaxOutstandingPolls: dynamicconfig.MatchingForwarderMaxOutstandingPolls.Get(dc),
335 > ForwarderMaxOutstandingTasks: dynamicconfig.MatchingForwarderMaxOutstandingTasks.Get(dc),
336 > ForwarderMaxRatePerSecond: dynamicconfig.MatchingForwarderMaxRatePerSecond.Get(dc),
337 > ForwarderMaxChildrenPerNode: dynamicconfig.MatchingForwarderMaxChildrenPerNode.Get(dc),
338 > AlignMembershipChange: dynamicconfig.MatchingAlignMembershipChange.Get(dc),
339 > ShutdownDrainDuration: dynamicconfig.MatchingShutdownDrainDuration.Get(dc),
340 > VersionCompatibleSetLimitPerQueue: dynamicconfig.VersionCompatibleSetLimitPerQueue.Get(dc),
341 > VersionBuildIdLimitPerQueue: dynamicconfig.VersionBuildIdLimitPerQueue.Get(dc),
342 > AssignmentRuleLimitPerQueue: dynamicconfig.AssignmentRuleLimitPerQueue.Get(dc),
343 > RedirectRuleLimitPerQueue: dynamicconfig.RedirectRuleLimitPerQueue.Get(dc),
344 > RedirectRuleMaxUpstreamBuildIDsPerQueue: dynamicconfig.RedirectRuleMaxUpstreamBuildIDsPerQueue.Get(dc),
345 > DeletedRuleRetentionTime: dynamicconfig.MatchingDeletedRuleRetentionTime.Get(dc),
346 > PollerHistoryTTL: dynamicconfig.PollerHistoryTTL.Get(dc),
347 > EnableMatchingFanOutForPollCancellation: dynamicconfig.EnableMatchingFanOutForPollCancellation.Get(dc),
348 > ReachabilityBuildIdVisibilityGracePeriod: dynamicconfig.ReachabilityBuildIdVisibilityGracePeriod.Get(dc),
349 > ReachabilityCacheOpenWFsTTL: dynamicconfig.ReachabilityCacheOpenWFsTTL.Get(dc),
350 > ReachabilityCacheClosedWFsTTL: dynamicconfig.ReachabilityCacheClosedWFsTTL.Get(dc),
351 > TaskQueueLimitPerBuildId: dynamicconfig.TaskQueuesPerBuildIdLimit.Get(dc),
352 > GetUserDataLongPollTimeout: dynamicconfig.MatchingGetUserDataLongPollTimeout.Get(dc), // Use -10 seconds so that we send back empty response instead of timeout
353 > GetUserDataRefresh: dynamicconfig.MatchingGetUserDataRefresh.Get(dc),
354 > EphemeralDataUpdateInterval: dynamicconfig.MatchingEphemeralDataUpdateInterval.Get(dc),
355 > BacklogMetricsEmitInterval: dynamicconfig.MatchingBacklogMetricsEmitInterval.Get(dc),
356 > PriorityBacklogForwarding: dynamicconfig.MatchingPriorityBacklogForwarding.Get(dc),
357 > BacklogNegligibleAge: dynamicconfig.MatchingBacklogNegligibleAge.Get(dc),
358 > MaxWaitForPollerBeforeFwd: dynamicconfig.MatchingMaxWaitForPollerBeforeFwd.Get(dc),
359 > QueryPollerUnavailableWindow: dynamicconfig.QueryPollerUnavailableWindow.Get(dc),
360 > WorkerControllerNoPollerHookWindow: dynamicconfig.WorkerControllerNoPollerHookWindow.Get(dc),
361 > EmitTaskDispatchLatencyAtPoll: dynamicconfig.MatchingEmitTaskDispatchLatencyAtPoll.Get(dc),
362 > QueryWorkflowTaskTimeoutLogRate: dynamicconfig.MatchingQueryWorkflowTaskTimeoutLogRate.Get(dc),
363 > MembershipUnloadDelay: dynamicconfig.MatchingMembershipUnloadDelay.Get(dc),
364 > TaskQueueInfoByBuildIdTTL: dynamicconfig.TaskQueueInfoByBuildIdTTL.Get(dc),
365 > PriorityLevels: dynamicconfig.MatchingPriorityLevels.Get(dc),
366 > RateLimiterRefreshInterval: time.Minute,
367 > FairnessKeyRateLimitCacheSize: dynamicconfig.MatchingFairnessKeyRateLimitCacheSize.Get(dc),
368 > MaxFairnessKeyWeightOverrides: dynamicconfig.MatchingMaxFairnessKeyWeightOverrides.Get(dc),
369 > MaxIDLengthLimit: dynamicconfig.MaxIDLengthLimit.Get(dc),
370 >
371 > AdminNamespaceToPartitionDispatchRate: dynamicconfig.AdminMatchingNamespaceToPartitionDispatchRate.Get(dc),
372 > AdminNamespaceToPartitionRateSub: dynamicconfig.AdminMatchingNamespaceToPartitionDispatchRate.Subscribe(dc),
373 > AdminNamespaceTaskqueueToPartitionDispatchRate: dynamicconfig.AdminMatchingNamespaceTaskqueueToPartitionDispatchRate.Get(dc),
374 > AdminNamespaceTaskqueueToPartitionRateSub: dynamicconfig.AdminMatchingNamespaceTaskqueueToPartitionDispatchRate.Subscribe(dc),
375 >
376 > VisibilityPersistenceMaxReadQPS: dynamicconfig.VisibilityPersistenceMaxReadQPS.Get(dc),
377 > VisibilityPersistenceMaxWriteQPS: dynamicconfig.VisibilityPersistenceMaxWriteQPS.Get(dc),
378 > VisibilityPersistenceSlowQueryThreshold: dynamicconfig.VisibilityPersistenceSlowQueryThreshold.Get(dc),
379 > EnableReadFromSecondaryVisibility: dynamicconfig.EnableReadFromSecondaryVisibility.Get(dc),
380 > VisibilityEnableShadowReadMode: dynamicconfig.VisibilityEnableShadowReadMode.Get(dc),
381 > VisibilityDisableOrderByClause: dynamicconfig.VisibilityDisableOrderByClause.Get(dc),
382 > VisibilityEnableManualPagination: dynamicconfig.VisibilityEnableManualPagination.Get(dc),
383 > VisibilityEnableUnifiedQueryConverter: dynamicconfig.VisibilityEnableUnifiedQueryConverter.Get(dc),
384 >
385 > ListNexusEndpointsLongPollTimeout: dynamicconfig.MatchingListNexusEndpointsLongPollTimeout.Get(dc),
386 > NexusEndpointsRefreshInterval: dynamicconfig.MatchingNexusEndpointsRefreshInterval.Get(dc),
387 > MinDispatchTaskTimeout: nexusoperations.MinDispatchTaskTimeout.Get(dc),
388 >
389 > PollerScalingBacklogAgeScaleUp: dynamicconfig.MatchingPollerScalingBacklogAgeScaleUp.Get(dc),
390 > PollerScalingWaitTime: dynamicconfig.MatchingPollerScalingWaitTime.Get(dc),
391 > PollerScalingDecisionsPerSecond: dynamicconfig.MatchingPollerScalingDecisionsPerSecond.Get(dc),
392 > PollerScalingTaskAddToDispatchRatio: dynamicconfig.MatchingPollerScalingTaskAddToDispatchRatio.Get(dc),
393 > EnablePollerScalingDecisionMetrics: dynamicconfig.MatchingEnablePollerScalingDecisionMetrics.Get(dc),
394 >
395 > FairnessCounter: dynamicconfig.MatchingFairnessCounter.Get(dc),
396 > FairnessPassDither: dynamicconfig.MatchingFairnessPassDither.Get(dc),
397 > PartitionScaleAllowedDrift: dynamicconfig.MatchingPartitionScaleAllowedDrift.Get(dc),
398 > PartitionScaleManagerSettings: dynamicconfig.MatchingPartitionScaleManager.Get(dc),
399 >
400 > LogAllReqErrors: dynamicconfig.LogAllReqErrors.Get(dc),
401 >
402 > RateLimitFractionProvider: defaultTaskQueueRateLimitFractionProvider,
403 > }
404 > }
405
406 > func newTaskQueueConfig(tq *tqid.TaskQueue, config *Config, ns namespace.Name) *taskQueueConfig { config.go
407 > taskQueueName := tq.Name()
408 > taskType := tq.TaskType()
409 > priorityLevels := priorityKey(config.PriorityLevels(ns.String(), taskQueueName, taskType))
410 > priorityLevels = max(priorityLevels, min(priorityLevels, maxPriorityLevels), 1)
411 > defaultPriorityKey := (priorityLevels + 1) / 2
412 >
413 > return &taskQueueConfig{
414 > RangeSize: config.RangeSize,
415 > NewMatcherSub: func(cb func(dynamicconfig.GradualChange[bool])) (dynamicconfig.GradualChange[bool], func()) {
416 return config.NewMatcherSub(ns.String(), taskQueueName, taskType, cb)
417 },
429 return config.AutoEnableV2Sub(ns.String(), taskQueueName, taskType, cb)
430 },
431 > GetTasksBatchSize: func() int { config.go
432 > return config.GetTasksBatchSize(ns.String(), taskQueueName, taskType)
433 > },
434 GetTasksReloadAt: func() int {
435 return config.GetTasksReloadAt(ns.String(), taskQueueName, taskType)
438 return config.ForceReadTasksOnWrite(ns.String(), taskQueueName, taskType)
439 },
440 > UpdateAckInterval: func() time.Duration { config.go
441 > return config.UpdateAckInterval(ns.String(), taskQueueName, taskType)
442 > },
443 MetadataUpdateOnAppendInterval: func() time.Duration {
444 return config.MetadataUpdateOnAppendInterval(ns.String(), taskQueueName, taskType)
445 },
446 > MaxTaskQueueIdleTime: func() time.Duration { config.go
447 > return config.MaxTaskQueueIdleTime(ns.String(), taskQueueName, taskType)
448 > },
449 MinTaskThrottlingBurstSize: func() int {
450 return config.MinTaskThrottlingBurstSize(ns.String(), taskQueueName, taskType)
456 return config.EphemeralDataUpdateInterval(ns.String(), taskQueueName, taskType)
457 },
458 > BacklogMetricsEmitInterval: func() time.Duration { config.go
459 > return config.BacklogMetricsEmitInterval(ns.String(), taskQueueName, taskType)
460 > },
461 PriorityBacklogForwarding: func() bool {
462 return config.PriorityBacklogForwarding(ns.String(), taskQueueName, taskType)
482 return config.ForwardPollRetryMaxInterval(ns.String(), taskQueueName, taskType)
483 },
484 > MaxTaskDeleteBatchSize: func() int { config.go
485 > return config.MaxTaskDeleteBatchSize(ns.String(), taskQueueName, taskType)
486 > },
487 TaskDeleteInterval: func() time.Duration {
488 return config.TaskDeleteInterval(ns.String(), taskQueueName, taskType)
495 GetUserDataInitialRefresh: ioTimeout,
496 GetUserDataRefresh: config.GetUserDataRefresh,
497 > OutstandingTaskAppendsThreshold: func() int { config.go
498 > return config.OutstandingTaskAppendsThreshold(ns.String(), taskQueueName, taskType)
499 > },
500 MaxTaskBatchSize: func() int {
501 return config.MaxTaskBatchSize(ns.String(), taskQueueName, taskType)
510 return config.NumTaskqueueReadPartitionsSub(ns.String(), taskQueueName, taskType, cb)
511 },
512 > BreakdownMetricsByTaskQueue: func() bool { config.go
513 > return config.BreakdownMetricsByTaskQueue(ns.String(), taskQueueName, taskType)
514 > },
515 > BreakdownMetricsByPartition: func() bool { config.go
516 > return config.BreakdownMetricsByPartition(ns.String(), taskQueueName, taskType)
517 > },
518 > BreakdownMetricsByBuildID: func() bool { config.go
519 > return config.BreakdownMetricsByBuildID(ns.String(), taskQueueName, taskType)
520 > },
521 AdminNamespaceToPartitionDispatchRate: func() float64 {
522 return config.AdminNamespaceToPartitionDispatchRate(ns.String())
546 },
547 GetUserDataRetryPolicy: backoff.NewExponentialRetryPolicy(1 * time.Second).WithMaximumInterval(5 * time.Minute).WithExpirationInterval(backoff.NoInterval),
548 > TaskQueueInfoByBuildIdTTL: func() time.Duration { config.go
549 > return config.TaskQueueInfoByBuildIdTTL(ns.String(), taskQueueName, taskType)
550 > },
551 RateLimitFraction: func() float64 {
552 return config.RateLimitFractionProvider.GetRateLimitFraction(ns, taskQueueName, taskType)
553 },
554 RateLimiterRefreshInterval: config.RateLimiterRefreshInterval,
555 > FairnessKeyRateLimitCacheSize: func() int { config.go
556 > return config.FairnessKeyRateLimitCacheSize(ns.String(), taskQueueName, taskType)
557 > },
558 MaxFairnessKeyWeightOverrides: func() int {
559 return config.MaxFairnessKeyWeightOverrides(ns.String(), taskQueueName, taskType)
560 },
561 > PollerHistoryTTL: func() time.Duration { config.go
562 > return config.PollerHistoryTTL(ns.String())
563 > },
564 PollerScalingBacklogAgeScaleUp: func() time.Duration {
565 return config.PollerScalingBacklogAgeScaleUp(ns.String(), taskQueueName, taskType)
568 return config.PollerScalingWaitTime(ns.String(), taskQueueName, taskType)
569 },
570 > PollerScalingDecisionsPerSecond: func() float64 { config.go
571 > return config.PollerScalingDecisionsPerSecond(ns.String(), taskQueueName, taskType)
572 > },
573 PollerScalingTaskAddToDispatchRatio: func() float64 {
574 return config.PollerScalingTaskAddToDispatchRatio(ns.String(), taskQueueName, taskType)
go.temporal.io/server/service/matching/physical_task_queue_manager.go 123 covered LOC · 16 ranges

Open complete file

130 partitionMgr *taskQueuePartitionManagerImpl,
131 queue *PhysicalTaskQueueKey,
132 > ) (*physicalTaskQueueManagerImpl, error) { physical_task_queue_manager.go
133 > e := partitionMgr.engine
134 > config := partitionMgr.config
135 > versionTagValue := queue.Version().MetricsTagValue()
136 > buildIDTag := tag.WorkerVersion(versionTagValue)
137 > taggedMetricsHandler := partitionMgr.metricsHandler.WithTags(
138 > metrics.OperationTag(metrics.MatchingTaskQueueMgrScope),
139 > metrics.WorkerVersionTag(versionTagValue, config.BreakdownMetricsByBuildID()),
140 > metrics.WorkerDeploymentNameTag(queue.Version().Deployment().GetSeriesName(), config.BreakdownMetricsByBuildID()),
141 > metrics.WorkerDeploymentBuildIDTag(queue.Version().Deployment().GetBuildId(), config.BreakdownMetricsByBuildID()),
142 > )
143 >
144 > tqCtx, tqCancel := context.WithCancel(partitionMgr.callerInfoContext(context.Background()))
145 >
146 > // We multiply by a big number so that we can later divide it by the number of pollers when grabbing permits,
147 > // to allow us to make more decisions per second when there are more pollers.
148 > pollerScalingRateLimitFn := func() float64 {
149 > return config.PollerScalingDecisionsPerSecond() * 1e6
150 > }
151 > pqMgr := &physicalTaskQueueManagerImpl{
152 > status: common.DaemonStatusInitialized,
153 > partitionMgr: partitionMgr,
154 > queue: queue,
155 > config: config,
156 > tqCtx: tqCtx,
157 > tqCtxCancel: tqCancel,
158 > namespaceRegistry: e.namespaceRegistry,
159 > matchingClient: e.matchingRawClient,
160 > clusterMeta: e.clusterMeta,
161 > metricsHandler: taggedMetricsHandler,
162 > tasksAdded: make(map[priorityKey]*taskTracker),
163 > tasksDispatched: make(map[priorityKey]*taskTracker),
164 > tasksRateLimited: e.newTaskTracker(),
165 > pollerScalingRateLimiter: quotas.NewDefaultOutgoingRateLimiter(pollerScalingRateLimitFn),
166 > deploymentRegistrationCh: make(chan struct{}, 1),
167 > }
168 > pqMgr.deploymentRegistrationCh <- struct{}{} // seed
169 >
170 > pqMgr.pollerHistory = newPollerHistory(partitionMgr.config.PollerHistoryTTL())
171 >
172 > pqMgr.liveness = newLiveness(
173 > clock.NewRealTimeSource(),
174 > config.MaxTaskQueueIdleTime,
175 > func() { pqMgr.UnloadFromPartitionManager(unloadCauseIdle) },
176 )
177
178 > pqMgr.taskValidator = newTaskValidator( physical_task_queue_manager.go
179 > tqCtx,
180 > pqMgr.clusterMeta,
181 > pqMgr.namespaceRegistry,
182 > pqMgr.partitionMgr.engine.historyClient,
183 > )
184 >
185 > switch {
186 case config.EnableFairness:
187 pqMgr.logger = log.With(partitionMgr.logger, buildIDTag, backlogTagFairness)
264 pqMgr.matcher = pqMgr.priMatcher
265 return pqMgr, nil
267 > pqMgr.logger = log.With(partitionMgr.logger, buildIDTag, backlogTagClassic)
268 > pqMgr.throttledLogger = log.With(partitionMgr.throttledLogger, buildIDTag, backlogTagClassic)
269 >
270 > pqMgr.backlogMgr = newBacklogManager(
271 > tqCtx,
272 > pqMgr,
273 > config,
274 > e.taskManager,
275 > pqMgr.logger,
276 > pqMgr.throttledLogger,
277 > e.matchingRawClient,
278 > taggedMetricsHandler,
279 > )
280 > var fwdr *Forwarder
281 > var err error
282 > if queue.Partition().IsChild() {
283 // Every DB Queue needs its own forwarder so that the throttles do not interfere
284 fwdr, err = newForwarder(&config.forwarderConfig, queue, e.matchingRawClient)
287 }
288 }
289 > pqMgr.oldMatcher = newTaskMatcher(config, fwdr, taggedMetricsHandler, pqMgr.partitionMgr.GetRateLimitManager().GetRateLimiter()) physical_task_queue_manager.go
290 > pqMgr.matcher = pqMgr.oldMatcher
291 > return pqMgr, nil
292 }
293 }
294
295 > func (c *physicalTaskQueueManagerImpl) Start() { physical_task_queue_manager.go
296 > if !atomic.CompareAndSwapInt32(
297 > &c.status,
298 > common.DaemonStatusInitialized,
299 > common.DaemonStatusStarted,
300 > ) {
301 return
302 }
303 > c.liveness.Start() physical_task_queue_manager.go
304 > c.backlogMgr.Start()
305 > c.matcher.Start()
306 > c.logger.Info("Started physicalTaskQueueManager", tag.LifeCycleStarted, tag.Cause(c.config.loadCause.String()))
307 > c.metricsHandler.Counter(metrics.TaskQueueStartedCounter.Name()).Record(1)
308 > c.partitionMgr.engine.updatePhysicalTaskQueueGauge(c.partitionMgr.ns, c.partitionMgr.partition, c.queue.version, 1)
309 }
310
311 // Stop does not unload the queue from its partition. It is intended to be called by the partition manager when
312 // unloading a queues. For stopping and unloading a queue call UnloadFromPartitionManager instead.
313 > func (c *physicalTaskQueueManagerImpl) Stop(unloadCause unloadCause) { physical_task_queue_manager.go
314 > if !atomic.CompareAndSwapInt32(
315 > &c.status,
316 > common.DaemonStatusStarted,
317 > common.DaemonStatusStopped,
318 > ) {
320 > }
321 // this may attempt to write one final ack update, do this before canceling tqCtx
322 > c.backlogMgr.Stop() physical_task_queue_manager.go
323 > if m := c.getDrainBacklogMgr(); m != nil {
324 m.Stop()
325 }
326 > c.matcher.Stop() physical_task_queue_manager.go
327 > c.liveness.Stop()
328 > c.tqCtxCancel()
329 >
330 > // Emitting zero values for backlog gauges to prevent stale values persisting after a partition is unloaded.
331 > // The call is placed here instead of backlogMgr.Stop() since there could be a race condition where a task is
332 > // added to the backlog after we have emitted the zero values inside of the backlogMgr.Stop() call. This happens
333 > // since task reader's and writer's contexts are cancelled after the backlogMgr.Stop() call.
334 > c.backlogMgr.getDB().emitZeroPhysicalBacklogGauges()
335 > c.logger.Info("Stopped physicalTaskQueueManager", tag.LifeCycleStopped, tag.Cause(unloadCause.String()))
336 > c.metricsHandler.Counter(metrics.TaskQueueStoppedCounter.Name()).Record(1)
337 > c.partitionMgr.engine.updatePhysicalTaskQueueGauge(c.partitionMgr.ns, c.partitionMgr.partition, c.queue.version, -1)
338 }
339
340 // getDrainBacklogMgr returns the draining backlog manager, or nil if none.
341 > func (c *physicalTaskQueueManagerImpl) getDrainBacklogMgr() backlogManager { physical_task_queue_manager.go
342 > c.drainBacklogMgrLock.Lock()
343 > defer c.drainBacklogMgrLock.Unlock()
344 > return c.drainBacklogMgr
345 > }
346
347 func (c *physicalTaskQueueManagerImpl) WaitUntilInitialized(ctx context.Context) error {
679 }
680
681 > func (c *physicalTaskQueueManagerImpl) GetStatsByPriority(includeRates bool) map[int32]*taskqueuepb.TaskQueueStats { physical_task_queue_manager.go
682 > stats := c.backlogMgr.BacklogStatsByPriority()
683 >
684 > if m := c.getDrainBacklogMgr(); m != nil {
685 drainStats := m.BacklogStatsByPriority()
686 for pri, tqs := range drainStats {
865 }
866
867 > func (c *physicalTaskQueueManagerImpl) QueueKey() *PhysicalTaskQueueKey { physical_task_queue_manager.go
868 > return c.queue
869 > }
870
871 > func (c *physicalTaskQueueManagerImpl) UnloadFromPartitionManager(unloadCause unloadCause) { physical_task_queue_manager.go
872 > c.partitionMgr.unloadPhysicalQueue(c, unloadCause)
873 > }
874
875 func (c *physicalTaskQueueManagerImpl) counterFactory() counter.Counter {
go.temporal.io/server/common/testing/testlogger/testlogger.go 107 covered LOC · 22 ranges

Open complete file

235 )
236
237 > func getGlobalFileCore() zapcore.Core { testlogger.go
238 > globalFileCoreOnce.Do(func() {
239 > logFile := os.Getenv(log.TestLogFileEnvVar)
240 > if logFile == "" {
241 return
242 }
243 > if err := os.MkdirAll(filepath.Dir(logFile), 0o755); err != nil { testlogger.go
244 fmt.Fprintf(os.Stderr, "testlogger: failed to create log file dir %s: %v\n", filepath.Dir(logFile), err)
245 return
246 }
247 > f, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) testlogger.go
248 > if err != nil {
249 fmt.Fprintf(os.Stderr, "testlogger: failed to open log file %s: %v\n", logFile, err)
250 return
251 }
252 > format := cmp.Or(os.Getenv(log.TestLogFileFormatEnvVar), "json") testlogger.go
253 > var enc zapcore.Encoder
254 > switch strings.ToLower(format) {
255 case "console":
256 enc = zapcore.NewConsoleEncoder(log.DefaultZapEncoderConfig)
257 > default: // "json" and anything unrecognized testlogger.go
258 > enc = zapcore.NewJSONEncoder(log.DefaultZapEncoderConfig)
259 }
260 > level := zapcore.DebugLevel testlogger.go
261 > if levelV := os.Getenv(log.TestLogFileLevelEnvVar); levelV != "" {
262 level = log.ParseZapLevel(levelV)
263 }
264 > globalFileCore = zapcore.NewCore(enc, zapcore.AddSync(f), level) testlogger.go
265 > fmt.Fprintf(os.Stderr, "testlogger: file logging enabled → %s (format=%s level=%s)\n", logFile, format, level)
266 })
267 > return globalFileCore testlogger.go
268 }
269
270 // NewTestLogger creates a new TestLogger that logs to the provided testing.T.
271 // Mode controls the behavior of the logger for when an expected or unexpected error is encountered.
272 > func NewTestLogger(t TestingT, mode Mode, opts ...LoggerOption) *TestLogger { testlogger.go
273 > tl := &TestLogger{
274 > state: &sharedTestLoggerState{
275 > t: t,
276 > logExpectations: false,
277 > level: zapcore.DebugLevel,
278 > logCaller: true,
279 > mode: mode,
280 > },
281 > }
282 > tl.state.mu.expectations = make(map[Level]*list.List)
283 > tl.state.failOnError.Store(true)
284 > tl.state.failOnDPanic.Store(true)
285 > tl.state.failOnFatal.Store(true)
286 > for _, opt := range opts {
287 opt(tl)
288 }
289 > if tl.wrapped == nil { testlogger.go
290 > writer := zaptest.NewTestingWriter(t)
291 >
292 > // Console core: format and level controlled by TEMPORAL_TEST_LOG_FORMAT / TEMPORAL_TEST_LOG_LEVEL.
293 > var consoleEnc zapcore.Encoder
294 > format := cmp.Or(os.Getenv(log.TestLogFormatEnvVar), "console")
295 > switch strings.ToLower(format) {
296 > case "console":
297 > consoleEnc = zapcore.NewConsoleEncoder(log.DefaultZapEncoderConfig)
298 case "json":
299 consoleEnc = zapcore.NewJSONEncoder(log.DefaultZapEncoderConfig)
301 t.Fatalf("unknown log encoding %q", format)
302 }
303 > consoleLevel := tl.state.level testlogger.go
304 > if levelV := os.Getenv(log.TestLogLevelEnvVar); levelV != "" {
305 consoleLevel = log.ParseZapLevel(levelV)
306 }
307 > core := zapcore.NewTee( testlogger.go
308 > zapcore.NewCore(consoleEnc, writer, consoleLevel),
309 > getGlobalFileCore())
310 >
311 > zapOptions := []zap.Option{
312 > zap.ErrorOutput(writer.WithMarkFailed(true)),
313 > zap.AddStacktrace(zap.ErrorLevel), // only include stack traces for logs with level error and above
314 > zap.WithCaller(tl.state.logCaller),
315 > }
316 >
317 > // Skip(1) skips the TestLogger itself
318 > tl.wrapped = log.NewZapLogger(zap.New(core, zapOptions...)).Skip(1)
319 }
320
321 // Only possible with a *testing.T until *rapid.T supports `Cleanup`
322 > if ct, ok := t.(CleanupCapableT); ok { testlogger.go
323 > // NOTE(tim): We don't care about anything logged after the test completes. Sure, this is racy,
324 > // but it reduces the likelihood that we see stupid errors due to testing.T.Logf race conditions...
325 > ct.Cleanup(tl.Close)
326 > }
327
328 > return tl testlogger.go
329 }
330
385 // observational: it never affects whether the test fails (that remains the sole
386 // job of shouldFailTest), so it is safe to call for any log at any level.
387 > func (tl *TestLogger) recordExpectationMatches(level Level, msg string, tags []tag.Tag) { testlogger.go
388 > expectations, found := tl.state.mu.expectations[level]
389 > if !found {
390 > return testlogger.go
391 > }
392 for e := expectations.Front(); e != nil; e = e.Next() {
393 m, ok := e.Value.(matcher)
444 }
445
446 > func (tl *TestLogger) mergeWithLoggerTags(tags []tag.Tag) []tag.Tag { testlogger.go
447 > if len(tl.tags) == 0 {
448 > return tags
449 > }
450 > tagMap := make(map[string]tag.Tag, len(tl.tags)+len(tags)) testlogger.go
451 > // Iterate over the logger's tags first so that explicitly specified tags override them
452 > for _, t := range tl.tags {
453 > tagMap[t.Key()] = t
454 > }
455 > for _, t := range tags {
456 > tagMap[t.Key()] = t
457 > }
458 > newTags := make([]tag.Tag, 0, len(tagMap))
459 > for _, t := range tagMap {
460 > newTags = append(newTags, t)
461 > }
462 > slices.SortStableFunc(newTags, func(a, b tag.Tag) int {
463 > return cmp.Compare(a.Key(), b.Key())
464 > })
465 > return newTags
466 }
467
545
546 // Info implements log.Logger.
547 > func (tl *TestLogger) Info(msg string, tags ...tag.Tag) { testlogger.go
548 > tl.state.mu.RLock()
549 > defer tl.state.mu.RUnlock()
550 > if tl.state.mu.closed {
551 return
552 }
553 > tags = tl.mergeWithLoggerTags(tags) testlogger.go
554 > tl.recordExpectationMatches(Info, msg, tags)
555 > tl.wrapped.Info(msg, tags...)
556 }
557
635 // Close disallows any further logging, preventing the test framework from complaining about
636 // logging post-test.
637 > func (tl *TestLogger) Close() { testlogger.go
638 > // Taking the write lock ensures all in-progress log calls complete before we close.
639 > // This prevents a race condition after the test has completed.
640 > tl.state.mu.Lock()
641 > tl.state.mu.closed = true
642 > tl.state.mu.Unlock()
643 > }
644
645 func (tl *TestLogger) T() TestingT {
650
651 // With implements log.WithLogger
652 > func (tl *TestLogger) With(tags ...tag.Tag) log.Logger { testlogger.go
653 > return &TestLogger{
654 > wrapped: tl.wrapped,
655 > state: tl.state,
656 > tags: tl.mergeWithLoggerTags(tags),
657 > }
658 > }
659
660 // Format the log.Logger tags and such into a useful message
go.temporal.io/server/service/matching/task_queue_partition_manager.go 104 covered LOC · 25 ranges

Open complete file

135 metricsHandler metrics.Handler,
136 userDataManager userDataManager,
137 > ) (*taskQueuePartitionManagerImpl, error) { task_queue_partition_manager.go
138 > rateLimitManager := newRateLimitManager(
139 > userDataManager,
140 > tqConfig,
141 > partition.TaskQueue().TaskType())
142 >
143 > var taskHooks []hooks.TaskHook
144 > for _, hookFactory := range e.taskHookFactories {
145 taskHook := hookFactory.Create(&hooks.TaskHookFactoryCreateDetails{
146 Namespace: ns,
153
154 // create partition scaler + manager if root
155 > var scaleManager *scaleManager task_queue_partition_manager.go
156 > if partition.IsRoot() && e.partitionScalerFactory != nil {
157 partitionScaler := e.partitionScalerFactory.New(
158 ns.Name(),
178 }
179
180 > pm := &taskQueuePartitionManagerImpl{ task_queue_partition_manager.go
181 > engine: e,
182 > partition: partition,
183 > ns: ns,
184 > config: tqConfig,
185 > logger: logger,
186 > throttledLogger: throttledLogger,
187 > matchingClient: e.matchingRawClient,
188 > metricsHandler: metricsHandler,
189 > versionedQueues: make(map[PhysicalTaskQueueVersion]physicalTaskQueueManager),
190 > userDataManager: userDataManager,
191 > rateLimitManager: rateLimitManager,
192 > scaleManager: scaleManager,
193 > defaultQueueFuture: future.NewFuture[physicalTaskQueueManager](),
194 > autoEnableRateLimiter: quotas.NewRateLimiter(1.0/60, 1),
195 > taskHooks: taskHooks,
196 > }
197 > pm.initCtx, pm.initCancel = context.WithCancel(context.Background())
198 >
199 > if pm.partition.IsRoot() {
200 > pm.cache = cache.New(10000, &cache.Options{ task_queue_partition_manager.go
201 > TTL: max(1, tqConfig.TaskQueueInfoByBuildIdTTL())}, // ensure TTL is never zero (which would disable TTL)
202 > )
203 > }
204
205 > return pm, nil task_queue_partition_manager.go
206 }
207
286 }
287
288 > func (pm *taskQueuePartitionManagerImpl) defaultQueue() physicalTaskQueueManager { task_queue_partition_manager.go
289 > queue, err := pm.defaultQueueFuture.GetIfReady()
290 > if err != nil {
291 softassert.Fail(pm.logger, "defaultQueue used but not initialized or initialization failed", tag.Error(err))
292 }
293 > return queue task_queue_partition_manager.go
294 }
295
309 // Stop does not unload the partition from matching engine. It is intended to be called by matching engine when
310 // unloading the partition. For stopping and unloading a partition call unloadFromEngine instead.
311 > func (pm *taskQueuePartitionManagerImpl) Stop(unloadCause unloadCause) { task_queue_partition_manager.go
312 > pm.initCancel()
313 > queue, err := pm.defaultQueueFuture.Get(context.Background())
314 > if err == nil {
315 > queue.Stop(unloadCause)
316 > pm.emitZeroLogicalBacklogForQueue(queue.QueueKey().Version(), queue)
317 > }
318
319 > if pm.cancelFairnessSub != nil { task_queue_partition_manager.go
320 pm.cancelFairnessSub()
321 }
322 > if pm.cancelNewMatcherSub != nil { task_queue_partition_manager.go
323 pm.cancelNewMatcherSub()
324 }
325 > if pm.cancelAutoEnableSub != nil { task_queue_partition_manager.go
326 pm.cancelAutoEnableSub()
327 }
328 > pm.scaleManager.Stop() task_queue_partition_manager.go
329 >
330 > pm.versionedQueuesLock.Lock()
331 > for version, vq := range pm.versionedQueues {
332 vq.Stop(unloadCause)
333 pm.emitZeroLogicalBacklogForQueue(version, vq)
334 }
335 > pm.versionedQueuesLock.Unlock() task_queue_partition_manager.go
336 >
337 > for _, hook := range pm.taskHooks {
338 hook.Stop()
339 }
340
341 // Then, stop user data manager to wrap up any reads/writes.
342 > pm.userDataManager.Stop() task_queue_partition_manager.go
343 >
344 > // Finally, stop rate limit manager (used by queues and using user data manager).
345 > pm.rateLimitManager.Stop()
346 >
347 > pm.engine.updateTaskQueuePartitionGauge(pm.Namespace(), pm.partition, -1)
348 >
349 > pm.goroGroup.Cancel()
350 }
351
471 }
472
473 > func (pm *taskQueuePartitionManagerImpl) GetRateLimitManager() *rateLimitManager { task_queue_partition_manager.go
474 > return pm.rateLimitManager
475 > }
476
477 > func (pm *taskQueuePartitionManagerImpl) Namespace() *namespace.Namespace { task_queue_partition_manager.go
478 > return pm.ns
479 > }
480
481 func (pm *taskQueuePartitionManagerImpl) MarkAlive() {
1648 // Those attributed-only keys are not zeroed here, which could leave stale gauge values for
1649 // priority keys that existed only through attribution.
1650 > func (pm *taskQueuePartitionManagerImpl) emitZeroLogicalBacklogForQueue(version PhysicalTaskQueueVersion, pq physicalTaskQueueManager) { task_queue_partition_manager.go
1651 > if !pm.config.BreakdownMetricsByTaskQueue() || !pm.config.BreakdownMetricsByPartition() {
1652 return
1653 }
1654 > deploymentName, buildID := parseDeploymentFromVersionKey(version.MetricsTagValue()) task_queue_partition_manager.go
1655 > handler := pm.metricsHandler.WithTags(
1656 > metrics.WorkerVersionTag(version.MetricsTagValue(), pm.config.BreakdownMetricsByBuildID()),
1657 > metrics.WorkerDeploymentNameTag(deploymentName, pm.config.BreakdownMetricsByBuildID()),
1658 > metrics.WorkerDeploymentBuildIDTag(buildID, pm.config.BreakdownMetricsByBuildID()),
1659 > )
1660 > for pri := range pq.GetStatsByPriority(false) {
1661 > metrics.ApproximateBacklogCount.With(handler).Record(0, metrics.MatchingTaskPriorityTag(pri))
1662 > }
1663 > metrics.ApproximateBacklogAgeSeconds.With(handler).Record(0)
1664 }
1665
1669 // unversioned queues. Returns empty strings when the delimiter is not found (unversioned or
1670 // V2 version-set keys).
1671 > func parseDeploymentFromVersionKey(versionKey string) (deploymentName, buildID string) { task_queue_partition_manager.go
1672 > if name, id, found := strings.Cut(versionKey, worker_versioning.WorkerDeploymentVersionDelimiter); found {
1673 return name, id
1674 }
1675 > return "", "" task_queue_partition_manager.go
1676 }
1677
1877 }
1878
1879 > func (pm *taskQueuePartitionManagerImpl) Partition() tqid.Partition { task_queue_partition_manager.go
1880 > return pm.partition
1881 > }
1882
1883 func (pm *taskQueuePartitionManagerImpl) PartitionCount() int {
1892 }
1893
1894 > func (pm *taskQueuePartitionManagerImpl) callerInfoContext(ctx context.Context) context.Context { task_queue_partition_manager.go
1895 > return headers.SetCallerInfo(ctx, headers.NewBackgroundHighCallerInfo(pm.ns.Name().String()))
1896 > }
1897
1898 // ForceLoadAllChildPartitions force-loads known child (read) partitions in new goroutines.
1942 }
1943
1944 > func (pm *taskQueuePartitionManagerImpl) unloadPhysicalQueue(unloadedDbq physicalTaskQueueManager, unloadCause unloadCause) { task_queue_partition_manager.go
1945 > version := unloadedDbq.QueueKey().Version()
1946 >
1947 > if !version.IsVersioned() {
1948 > dbq := pm.defaultQueue() task_queue_partition_manager.go
1949 > // this is the default queue, unload the whole partition if it is not healthy
1950 > if dbq != nil && dbq == unloadedDbq {
1951 > pm.unloadFromEngine(unloadCause)
1952 > }
1953 > return
1954 }
1955
1972 }
1973
1974 > func (pm *taskQueuePartitionManagerImpl) unloadFromEngine(unloadCause unloadCause) { task_queue_partition_manager.go
1975 > pm.engine.unloadTaskQueuePartition(pm, unloadCause)
1976 > }
1977
1978 func (pm *taskQueuePartitionManagerImpl) getPhysicalQueue(ctx context.Context, buildId string, deployment *deploymentpb.Deployment) (physicalTaskQueueManager, error) {
go.temporal.io/server/service/matching/matching_engine.go 100 covered LOC · 12 ranges

Open complete file

3135 // partitions map), then does nothing.
3136 // partitions map), unloadPM.Stop(...) is still called.
3137 > func (e *matchingEngineImpl) unloadTaskQueuePartition(unloadPM taskQueuePartitionManager, unloadCause unloadCause) { matching_engine.go
3138 > e.unloadTaskQueuePartitionByKey(unloadPM.Partition(), unloadPM, unloadCause)
3139 > }
3140
3141 // Unloads a task queue partition by id. If unloadPM is given and the loaded partition for queueID does not match
3146 unloadPM taskQueuePartitionManager,
3147 unloadCause unloadCause,
3148 > ) bool { matching_engine.go
3149 > key := partition.Key()
3150 > e.partitionsLock.Lock()
3151 > foundTQM, ok := e.partitions[key]
3152 > if !ok || (unloadPM != nil && foundTQM != unloadPM) {
3153 e.partitionsLock.Unlock()
3154 return false
3155 }
3156 > delete(e.partitions, key) matching_engine.go
3157 > e.partitionsLock.Unlock()
3158 > foundTQM.Stop(unloadCause)
3159 > return true
3160 }
3161
3166 version PhysicalTaskQueueVersion,
3167 delta int,
3168 > ) { matching_engine.go
3169 > // calculating versioned to be one of: “unversioned” or "buildId” or “versionSet”
3170 > versioned := "unversioned"
3171 > if dep := version.Deployment(); dep != nil {
3172 versioned = "deployment"
3173 > } else if buildID := version.BuildId(); buildID != "" { matching_engine.go
3174 versioned = "buildId"
3175 > } else if versionSet := version.VersionSet(); versionSet != "" { matching_engine.go
3176 versioned = "versionSet"
3177 }
3178
3179 > physicalTaskQueueParameters := taskQueueCounterKey{ matching_engine.go
3180 > namespaceID: partition.NamespaceId(),
3181 > taskType: partition.TaskType(),
3182 > partitionType: partition.Kind(),
3183 > versioned: versioned,
3184 > }
3185 >
3186 > e.gaugeMetrics.lock.Lock()
3187 > e.gaugeMetrics.loadedPhysicalTaskQueueCount[physicalTaskQueueParameters] += delta
3188 > loadedPhysicalTaskQueueCounter := e.gaugeMetrics.loadedPhysicalTaskQueueCount[physicalTaskQueueParameters]
3189 > e.gaugeMetrics.lock.Unlock()
3190 >
3191 > metrics.LoadedPhysicalTaskQueueGauge.With(
3192 > metrics.GetPerTaskQueuePartitionTypeScope(
3193 > e.metricsHandler,
3194 > ns.Name().String(),
3195 > partition,
3196 > // TODO: Track counters per TQ name so we can honor pm.config.BreakdownMetricsByTaskQueue(),
3197 > false,
3198 > )).Record(
3199 > float64(loadedPhysicalTaskQueueCounter),
3200 > metrics.VersionedTag(versioned),
3201 > )
3202 }
3203
3208 partition tqid.Partition,
3209 delta int,
3210 > ) { matching_engine.go
3211 > // each metric shall be accessed based on the mentioned parameters
3212 > taskQueueFamilyParameters := taskQueueCounterKey{
3213 > namespaceID: partition.NamespaceId(),
3214 > }
3215 >
3216 > taskQueueParameters := taskQueueCounterKey{
3217 > namespaceID: partition.NamespaceId(),
3218 > taskType: partition.TaskType(),
3219 > }
3220 >
3221 > taskQueuePartitionParameters := taskQueueCounterKey{
3222 > namespaceID: partition.NamespaceId(),
3223 > taskType: partition.TaskType(),
3224 > partitionType: partition.Kind(),
3225 > }
3226 >
3227 > rootPartition := partition.IsRoot()
3228 > e.gaugeMetrics.lock.Lock()
3229 >
3230 > loadedTaskQueueFamilyCounter, loadedTaskQueueCounter, loadedTaskQueuePartitionCounter :=
3231 > e.gaugeMetrics.loadedTaskQueueFamilyCount[taskQueueFamilyParameters], e.gaugeMetrics.loadedTaskQueueCount[taskQueueParameters],
3232 > e.gaugeMetrics.loadedTaskQueuePartitionCount[taskQueuePartitionParameters]
3233 >
3234 > loadedTaskQueuePartitionCounter += delta
3235 > e.gaugeMetrics.loadedTaskQueuePartitionCount[taskQueuePartitionParameters] = loadedTaskQueuePartitionCounter
3236 > if rootPartition {
3237 > loadedTaskQueueCounter += delta matching_engine.go
3238 > e.gaugeMetrics.loadedTaskQueueCount[taskQueueParameters] = loadedTaskQueueCounter
3239 > if partition.TaskType() == enumspb.TASK_QUEUE_TYPE_WORKFLOW {
3240 > loadedTaskQueueFamilyCounter += delta matching_engine.go
3241 > e.gaugeMetrics.loadedTaskQueueFamilyCount[taskQueueFamilyParameters] = loadedTaskQueueFamilyCounter
3242 > }
3243 }
3244 > e.gaugeMetrics.lock.Unlock() matching_engine.go
3245 >
3246 > nsName := ns.Name().String()
3247 >
3248 > e.metricsHandler.Gauge(metrics.LoadedTaskQueueFamilyGauge.Name()).Record(
3249 > float64(loadedTaskQueueFamilyCounter),
3250 > metrics.NamespaceTag(nsName),
3251 > )
3252 >
3253 > metrics.LoadedTaskQueueGauge.With(e.metricsHandler).Record(
3254 > float64(loadedTaskQueueCounter),
3255 > metrics.NamespaceTag(nsName),
3256 > metrics.TaskQueueTypeTag(taskQueueParameters.taskType),
3257 > )
3258 >
3259 > taggedHandler := metrics.GetPerTaskQueuePartitionTypeScope(
3260 > e.metricsHandler,
3261 > nsName,
3262 > partition,
3263 > // TODO: Track counters per TQ name so we can honor pm.config.BreakdownMetricsByTaskQueue(),
3264 > false,
3265 > )
3266 > metrics.LoadedTaskQueuePartitionGauge.With(taggedHandler).Record(float64(loadedTaskQueuePartitionCounter))
3267 }
3268
3816 }
3817
3818 > func (e *matchingEngineImpl) newTaskTracker() *taskTracker { matching_engine.go
3819 > return newTaskTracker(e.timeSource, 5*time.Second, 30*time.Second)
3820 > }
3821
3822 // migrateOldFormatVersions moves versions present in the given deployment from the
go.temporal.io/server/chasm/search_attribute.go 84 covered LOC · 13 ranges

Open complete file

136 }
137
138 > func newSearchAttributeFieldBool(index int) SearchAttributeFieldBool { search_attribute.go
139 > return SearchAttributeFieldBool{
140 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_BOOL, index),
141 > }
142 > }
143
144 // SearchAttributeFieldDateTime is a search attribute field for a datetime value.
147 }
148
149 > func newSearchAttributeFieldDateTime(index int) SearchAttributeFieldDateTime { search_attribute.go
150 > return SearchAttributeFieldDateTime{
151 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_DATETIME, index),
152 > }
153 > }
154
155 // SearchAttributeFieldInt is a search attribute field for an integer value.
158 }
159
160 > func newSearchAttributeFieldInt(index int) SearchAttributeFieldInt { search_attribute.go
161 > return SearchAttributeFieldInt{
162 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_INT, index),
163 > }
164 > }
165
166 // SearchAttributeFieldDouble is a search attribute field for a double value.
169 }
170
171 > func newSearchAttributeFieldDouble(index int) SearchAttributeFieldDouble { search_attribute.go
172 > return SearchAttributeFieldDouble{
173 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_DOUBLE, index),
174 > }
175 > }
176
177 // SearchAttributeFieldKeyword is a search attribute field for a keyword value.
180 }
181
182 > func newSearchAttributeFieldKeyword(index int) SearchAttributeFieldKeyword { search_attribute.go
183 > return SearchAttributeFieldKeyword{
184 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_KEYWORD, index),
185 > }
186 > }
187
188 > func newSearchAttributeFieldLowCardinalityKeyword(index int) SearchAttributeFieldKeyword { search_attribute.go
189 > return SearchAttributeFieldKeyword{
190 > field: fmt.Sprintf("%s%s%02d", sadefs.ReservedPrefix, "LowCardinalityKeyword", index),
191 > }
192 > }
193
194 // SearchAttributeFieldKeywordList is a search attribute field for a keyword list value.
197 }
198
199 > func newSearchAttributeFieldKeywordList(index int) SearchAttributeFieldKeywordList { search_attribute.go
200 > return SearchAttributeFieldKeywordList{
201 > field: resolveFieldName(enumspb.INDEXED_VALUE_TYPE_KEYWORD_LIST, index),
202 > }
203 > }
204
205 // SearchAttributeFieldText is a search attribute field for a text value.
214 }
215
216 > func resolveFieldName(valueType enumspb.IndexedValueType, index int) string { search_attribute.go
217 > // Columns are named like TemporalBool01, TemporalDatetime01, TemporalDouble01, TemporalInt01.
218 > return fmt.Sprintf("%s%s%02d", sadefs.ReservedPrefix, valueType.String(), index)
219 > }
220
221 func (s searchAttributeDefinition) definition() searchAttributeDefinition {
239 }
240
241 > func newSearchAttributeBoolByField(field string) SearchAttributeBool { search_attribute.go
242 > return SearchAttributeBool{
243 > searchAttributeDefinition: searchAttributeDefinition{
244 > alias: field,
245 > field: field,
246 > valueType: enumspb.INDEXED_VALUE_TYPE_BOOL,
247 > },
248 > }
249 > }
250
251 // Value sets the boolean value of the search attribute.
276 }
277
278 > func newSearchAttributeDateTimeByField(field string) SearchAttributeDateTime { search_attribute.go
279 > return SearchAttributeDateTime{
280 > searchAttributeDefinition: searchAttributeDefinition{
281 > alias: field,
282 > field: field,
283 > valueType: enumspb.INDEXED_VALUE_TYPE_DATETIME,
284 > },
285 > }
286 > }
287
288 // Value sets the date time value of the search attribute.
367
368 // NewSearchAttributeKeyword creates a new keyword search attribute given a predefined chasm field
369 > func NewSearchAttributeKeyword(alias string, keywordField SearchAttributeFieldKeyword) SearchAttributeKeyword { search_attribute.go
370 > return SearchAttributeKeyword{
371 > searchAttributeDefinition: searchAttributeDefinition{
372 > alias: alias,
373 > field: keywordField.field,
374 > valueType: enumspb.INDEXED_VALUE_TYPE_KEYWORD,
375 > },
376 > }
377 > }
378
379 > func newSearchAttributeKeywordByField(field string) SearchAttributeKeyword { search_attribute.go
380 > return SearchAttributeKeyword{
381 > searchAttributeDefinition: searchAttributeDefinition{
382 > alias: field,
383 > field: field,
384 > valueType: enumspb.INDEXED_VALUE_TYPE_KEYWORD,
385 > },
386 > }
387 > }
388
389 // Value sets the string value of the search attribute.
414 }
415
416 > func newSearchAttributeKeywordListByField(field string) SearchAttributeKeywordList { search_attribute.go
417 > return SearchAttributeKeywordList{
418 > searchAttributeDefinition: searchAttributeDefinition{
419 > alias: field,
420 > field: field,
421 > valueType: enumspb.INDEXED_VALUE_TYPE_KEYWORD_LIST,
422 > },
423 > }
424 > }
425
426 // Value sets the string list value of the search attribute.
go.temporal.io/server/common/tqid/task_queue_id.go 84 covered LOC · 29 ranges

Open complete file

128 // NewTaskQueueFamily takes a user-provided task queue name (aka family name) and returns a TaskQueueFamily. Returns an
129 // error if name looks like a mangled name.
130 > func NewTaskQueueFamily(namespaceId string, name string) (*TaskQueueFamily, error) { task_queue_id.go
131 > if strings.HasPrefix(name, nonRootPartitionPrefix) {
132 return nil, serviceerror.NewInvalidArgument("task queue family name cannot have prefix /_sys/ " + name)
133 }
134 > return &TaskQueueFamily{ task_queue_id.go
135 > namespaceId: namespaceId,
136 > name: name,
137 > }, nil
138 }
139
211 }
212
213 > func NormalPartitionFromRpcName(rpcName string, namespaceId string, taskType enumspb.TaskQueueType) (*NormalPartition, error) { task_queue_id.go
214 > baseName, partition, err := parseRpcName(rpcName)
215 > if err != nil {
216 return nil, err
217 }
218 > tq := &TaskQueue{TaskQueueFamily{namespaceId, baseName}, taskType} task_queue_id.go
219 > return tq.NormalPartition(partition), nil
220 }
221
222 > func MustNormalPartitionFromRpcName(rpcName string, namespaceId string, taskType enumspb.TaskQueueType) *NormalPartition { task_queue_id.go
223 > p, err := NormalPartitionFromRpcName(rpcName, namespaceId, taskType)
224 > if err != nil {
225 panic(err)
226 }
227 > return p task_queue_id.go
228 }
229
230 > func (n *TaskQueueFamily) Name() string { task_queue_id.go
231 > return n.name
232 > }
233
234 func (n *TaskQueueFamily) NamespaceId() string {
236 }
237
238 > func (n *TaskQueueFamily) TaskQueue(taskType enumspb.TaskQueueType) *TaskQueue { task_queue_id.go
239 > return &TaskQueue{
240 > family: *n,
241 > taskType: taskType,
242 > }
243 > }
244
245 > func (n *TaskQueue) Name() string { task_queue_id.go
246 > return n.family.Name()
247 > }
248
249 > func (n *TaskQueue) Family() *TaskQueueFamily { task_queue_id.go
250 > return &n.family
251 > }
252
253 func (n *TaskQueue) NamespaceId() string {
255 }
256
257 > func (n *TaskQueue) TaskType() enumspb.TaskQueueType { task_queue_id.go
258 > return n.taskType
259 > }
260
261 > func (n *TaskQueue) NormalPartition(partitionId int) *NormalPartition { task_queue_id.go
262 > return &NormalPartition{
263 > taskQueue: n,
264 > partitionId: partitionId,
265 > }
266 > }
267
268 func (n *TaskQueue) StickyPartition(stickyName string) *StickyPartition {
388 }
389
390 > func (p *NormalPartition) TaskQueue() *TaskQueue { task_queue_id.go
391 > return p.taskQueue
392 > }
393
394 > func (p *NormalPartition) IsRoot() bool { task_queue_id.go
395 > return p.partitionId == 0
396 > }
397
398 > func (p *NormalPartition) IsChild() bool { task_queue_id.go
399 > return !p.IsRoot()
400 > }
401
402 > func (p *NormalPartition) PersistenceTTL() time.Duration { return 0 } task_queue_id.go
403 func (p *NormalPartition) SupportsFairness() bool { return true }
404 func (p *NormalPartition) SupportsVersioning() bool { return true }
405 func (p *NormalPartition) SupportsPartitions() bool { return true }
406 > func (p *NormalPartition) MetricTag(partitionIDBreakdown bool) string { task_queue_id.go
407 > if partitionIDBreakdown {
408 return strconv.Itoa(p.partitionId)
409 }
410 > return "__normal__" task_queue_id.go
411 }
412
413 > func (p *NormalPartition) Kind() enumspb.TaskQueueKind { task_queue_id.go
414 > return enumspb.TASK_QUEUE_KIND_NORMAL
415 > }
416
417 func (p *NormalPartition) PartitionId() int {
419 }
420
421 > func (p *NormalPartition) NamespaceId() string { task_queue_id.go
422 > return p.taskQueue.family.namespaceId
423 > }
424
425 > func (p *NormalPartition) TaskType() enumspb.TaskQueueType { task_queue_id.go
426 > return p.taskQueue.taskType
427 > }
428
429 // ParentPartition returns a NormalPartition for the parent partition, using the given branching degree.
438 }
439
440 > func (p *NormalPartition) RpcName() string { task_queue_id.go
441 > if p.IsRoot() {
442 > return p.TaskQueue().family.Name() task_queue_id.go
443 > }
444 return nonRootPartitionPrefix + p.TaskQueue().Name() + partitionDelimiter + strconv.Itoa(p.partitionId)
445 }
446
447 > func (p *NormalPartition) Key() PartitionKey { task_queue_id.go
448 > return PartitionKey{
449 > namespaceId: p.NamespaceId(),
450 > name: p.TaskQueue().Name(),
451 > partitionId: p.partitionId,
452 > taskType: p.TaskType(),
453 > }
454 > }
455
456 > func (p *NormalPartition) RoutingKey(batchSize int) (string, int) { task_queue_id.go
457 > if batchSize == 0 {
458 > return fmt.Sprintf("%s:%s:%d", p.NamespaceId(), p.RpcName(), p.TaskType()), 0 task_queue_id.go
459 > }
460 // We want to use LookupN to spread partitions across available nodes, but LookupN takes O(n)
461 // time and space, so we should limit the n that we pass to it. Reduce the partition id by some
479 // parseRpcName takes the rpc name of a task queue partition and returns a ParseTaskQueuePartition.
480 // Returns an error if the given name is not a valid rpc name.
481 > func parseRpcName(rpcName string) (string, int, error) { task_queue_id.go
482 > baseName := rpcName
483 > partition := 0
484 >
485 > if strings.HasPrefix(rpcName, nonRootPartitionPrefix) {
486 suffixOff := strings.LastIndex(rpcName, partitionDelimiter)
487 if suffixOff <= len(nonRootPartitionPrefix) {
498 }
499
500 > if strings.HasPrefix(baseName, nonRootPartitionPrefix) { task_queue_id.go
501 return "", 0, serviceerror.NewInvalidArgument("task queue family name cannot have prefix /_sys/ " + baseName)
502 }
503 > return baseName, partition, nil task_queue_id.go
504 }
go.temporal.io/server/api/persistence/v1/predicates.pb.go 82 covered LOC · 22 ranges

Open complete file

57 func (*Predicate) ProtoMessage() {}
58
59 > func (x *Predicate) ProtoReflect() protoreflect.Message { predicates.pb.go
60 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[0]
61 > if x != nil {
62 > ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
63 > if ms.LoadMessageInfo() == nil {
64 > ms.StoreMessageInfo(mi)
65 > }
66 > return ms
67 }
68 return mi.MessageOf(x)
261 func (*UniversalPredicateAttributes) ProtoMessage() {}
262
263 > func (x *UniversalPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
264 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[1]
265 > if x != nil {
266 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
267 if ms.LoadMessageInfo() == nil {
297 func (*EmptyPredicateAttributes) ProtoMessage() {}
298
299 > func (x *EmptyPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
300 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[2]
301 > if x != nil {
302 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
303 if ms.LoadMessageInfo() == nil {
334 func (*AndPredicateAttributes) ProtoMessage() {}
335
336 > func (x *AndPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
337 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[3]
338 > if x != nil {
339 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
340 if ms.LoadMessageInfo() == nil {
378 func (*OrPredicateAttributes) ProtoMessage() {}
379
380 > func (x *OrPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
381 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[4]
382 > if x != nil {
383 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
384 if ms.LoadMessageInfo() == nil {
422 func (*NotPredicateAttributes) ProtoMessage() {}
423
424 > func (x *NotPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
425 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[5]
426 > if x != nil {
427 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
428 if ms.LoadMessageInfo() == nil {
466 func (*NamespaceIdPredicateAttributes) ProtoMessage() {}
467
468 > func (x *NamespaceIdPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
469 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[6]
470 > if x != nil {
471 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
472 if ms.LoadMessageInfo() == nil {
510 func (*TaskTypePredicateAttributes) ProtoMessage() {}
511
512 > func (x *TaskTypePredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
513 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[7]
514 > if x != nil {
515 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
516 if ms.LoadMessageInfo() == nil {
554 func (*DestinationPredicateAttributes) ProtoMessage() {}
555
556 > func (x *DestinationPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
557 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[8]
558 > if x != nil {
559 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
560 if ms.LoadMessageInfo() == nil {
598 func (*OutboundTaskGroupPredicateAttributes) ProtoMessage() {}
599
600 > func (x *OutboundTaskGroupPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
601 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[9]
602 > if x != nil {
603 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
604 if ms.LoadMessageInfo() == nil {
642 func (*OutboundTaskPredicateAttributes) ProtoMessage() {}
643
644 > func (x *OutboundTaskPredicateAttributes) ProtoReflect() protoreflect.Message { predicates.pb.go
645 > mi := &file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[10]
646 > if x != nil {
647 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
648 if ms.LoadMessageInfo() == nil {
828 }
829
830 > func init() { file_temporal_server_api_persistence_v1_predicates_proto_init() } predicates.pb.go
831 > func file_temporal_server_api_persistence_v1_predicates_proto_init() {
832 > if File_temporal_server_api_persistence_v1_predicates_proto != nil {
833 > return
834 > }
835 > file_temporal_server_api_persistence_v1_predicates_proto_msgTypes[0].OneofWrappers = []any{
836 > (*Predicate_UniversalPredicateAttributes)(nil),
837 > (*Predicate_EmptyPredicateAttributes)(nil),
838 > (*Predicate_AndPredicateAttributes)(nil),
839 > (*Predicate_OrPredicateAttributes)(nil),
840 > (*Predicate_NotPredicateAttributes)(nil),
841 > (*Predicate_NamespaceIdPredicateAttributes)(nil),
842 > (*Predicate_TaskTypePredicateAttributes)(nil),
843 > (*Predicate_DestinationPredicateAttributes)(nil),
844 > (*Predicate_OutboundTaskGroupPredicateAttributes)(nil),
845 > (*Predicate_OutboundTaskPredicateAttributes)(nil),
846 > }
847 > type x struct{}
848 > out := protoimpl.TypeBuilder{
849 > File: protoimpl.DescBuilder{
850 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
851 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_predicates_proto_rawDesc), len(file_temporal_server_api_persistence_v1_predicates_proto_rawDesc)),
852 > NumEnums: 0,
853 > NumMessages: 12,
854 > NumExtensions: 0,
855 > NumServices: 0,
856 > },
857 > GoTypes: file_temporal_server_api_persistence_v1_predicates_proto_goTypes,
858 > DependencyIndexes: file_temporal_server_api_persistence_v1_predicates_proto_depIdxs,
859 > MessageInfos: file_temporal_server_api_persistence_v1_predicates_proto_msgTypes,
860 > }.Build()
861 > File_temporal_server_api_persistence_v1_predicates_proto = out.File
862 > file_temporal_server_api_persistence_v1_predicates_proto_goTypes = nil
863 > file_temporal_server_api_persistence_v1_predicates_proto_depIdxs = nil
864 }
go.temporal.io/server/service/matching/task_reader.go 77 covered LOC · 17 ranges

Open complete file

38 )
39
40 > func newTaskReader(backlogMgr *backlogManagerImpl) *taskReader { task_reader.go
41 > tr := &taskReader{
42 > backlogMgr: backlogMgr,
43 > notifyC: make(chan struct{}, 1),
44 > // we always dequeue the head of the buffer and try to dispatch it to a poller
45 > // so allocate one less than desired target buffer size
46 > taskBuffer: make(chan *persistencespb.AllocatedTaskInfo, backlogMgr.config.GetTasksBatchSize()-1),
47 > retrier: backoff.NewRetrier(
48 > common.CreateReadTaskRetryPolicy(),
49 > clock.NewRealTimeSource(),
50 > ),
51 > }
52 > tr.backlogHeadCreateTime.Store(-1)
53 > return tr
54 > }
55
56 // Start taskReader background goroutines.
57 > func (tr *taskReader) Start() { task_reader.go
58 > go tr.dispatchBufferedTasks()
59 > go tr.getTasksPump()
60 > }
61
62 > func (tr *taskReader) Signal() { task_reader.go
63 > var event struct{}
64 > select {
65 > case tr.notifyC <- event:
66 default: // channel already has an event, don't block
67 }
76 }
77
78 > func (tr *taskReader) getBacklogHeadAge() time.Duration { task_reader.go
79 > if tr.backlogHeadCreateTime.Load() == -1 {
80 > return time.Duration(0) task_reader.go
81 > }
82 return time.Since(time.Unix(0, tr.backlogHeadCreateTime.Load()))
83 }
84
85 > func (tr *taskReader) dispatchBufferedTasks() { task_reader.go
86 > ctx := tr.backlogMgr.tqCtx
87 >
88 > dispatchLoop:
89 > for ctx.Err() == nil {
90 > if len(tr.taskBuffer) == 0 {
91 > // reset the atomic since we have no tasks from the backlog
92 > tr.backlogHeadCreateTime.Store(-1)
93 > }
94 > select {
95 case taskInfo, ok := <-tr.taskBuffer:
96 if !ok { // Task queue getTasks pump is shutdown
118 }
119 return
120 > case <-ctx.Done(): task_reader.go
121 > return
122 }
123 }
130
131 // nolint:revive // can improve this later
132 > func (tr *taskReader) getTasksPump() { task_reader.go
133 > ctx := tr.backlogMgr.tqCtx
134 >
135 > if err := tr.backlogMgr.WaitUntilInitialized(ctx); err != nil {
136 return
137 }
138
139 > updateAckTimer := time.NewTimer(tr.backlogMgr.config.UpdateAckInterval()) task_reader.go
140 > defer updateAckTimer.Stop()
141 >
142 > tr.Signal() // prime pump
143 > Loop:
144 > for {
145 > // Prioritize exiting over other processing
146 > select {
147 case <-ctx.Done():
148 return
149 > default: task_reader.go
150 }
151
152 > select { task_reader.go
153 > case <-ctx.Done(): task_reader.go
154 > return
155
156 > case <-tr.notifyC: task_reader.go
157 > batch, err := tr.getTaskBatch(ctx)
158 > tr.backlogMgr.signalIfFatal(err)
159 > if err != nil {
160 // TODO: Should we ever stop retrying on db errors?
161 if common.IsResourceExhausted(err) {
166 continue Loop
167 }
168 > tr.retrier.Reset() task_reader.go
169 >
170 > if len(batch.tasks) == 0 {
171 > tr.backlogMgr.taskAckManager.setReadLevelAfterGap(batch.readLevel)
172 > if !batch.isReadBatchDone {
173 tr.Signal()
174 }
175 > continue Loop task_reader.go
176 }
177
218 // Also return a number that can be used to update readLevel
219 // Also return a bool to indicate whether read is finished
220 > func (tr *taskReader) getTaskBatch(ctx context.Context) (*getTasksBatchResponse, error) { task_reader.go
221 > var tasks []*persistencespb.AllocatedTaskInfo
222 > readLevel := tr.backlogMgr.taskAckManager.getReadLevel()
223 > maxReadLevel := tr.backlogMgr.db.GetMaxReadLevel(subqueueZero)
224 >
225 > // counter i is used to break and let caller check whether taskqueue is still alive and needs to resume read.
226 > for i := 0; i < 10 && readLevel < maxReadLevel; i++ {
227 upper := min(readLevel+tr.backlogMgr.config.RangeSize, maxReadLevel)
228 tasks, err := tr.getTaskBatchWithRange(ctx, readLevel, upper)
240 readLevel = upper
241 }
242 > return &getTasksBatchResponse{ task_reader.go
243 > tasks: tasks,
244 > readLevel: readLevel,
245 > isReadBatchDone: readLevel == maxReadLevel,
246 > }, nil // caller will update readLevel when no task grabbed
247 }
248
go.temporal.io/server/common/dynamicconfig/collection.go 70 covered LOC · 18 ranges

Open complete file

111 // NewCollection creates a new collection. For subscriptions to work, you must call Start/Stop.
112 // Get will work without Start/Stop.
113 > func NewCollection(client Client, logger log.Logger) *Collection { collection.go
114 > // Do this at the first convenient place we have a logger:
115 > logSharedStructureWarnings(logger)
116 >
117 > return &Collection{
118 > client: client,
119 > logger: logger,
120 > errCount: -1,
121 > subscriptions: make(map[Key]map[int]any),
122 > convertCache: new(sync.Map),
123 > indexCache: new(sync.Map),
124 > }
125 > }
126
127 func (c *Collection) Start() {
212 cvs []ConstrainedValue,
213 precedence []Constraints,
214 > ) (*ConstrainedValue, error) { collection.go
215 > if len(cvs) == 0 {
216 > return nil, errKeyNotPresent collection.go
217 > } else if len(cvs) > constraintsCacheThreshold && len(cvs) <= math.MaxInt32 { collection.go
218 return findMatchWithCache(cache, cvs, precedence)
219 }
279 convert func(value any) (T, error),
280 precedence []Constraints,
281 > ) T { collection.go
282 > cvs := c.client.GetValue(key)
283 > v, _ := matchAndConvertCvs(c, key, def, convert, precedence, cvs)
284 > return v
285 > }
286
287 func matchAndConvertCvs[T any](
292 precedence []Constraints,
293 cvs []ConstrainedValue,
294 > ) (T, any) { collection.go
295 > cvp, err := findMatch(c.indexCache, cvs, precedence)
296 > if err != nil {
297 > // couldn't find a constrained match, use default collection.go
298 > return def, usingDefaultValue
299 > }
300
301 typedVal, err := convertWithCache(c, key, convert, cvp)
317 valueOrder int,
318 defaultOrder int,
319 > ) { collection.go
320 > order := 0
321 > for _, m := range precedence {
322 > for idx, cv := range cvs {
323 order++
324 if m == cv.Constraints {
332 }
333 }
334 > for _, cv := range defaultCVs { collection.go
335 > order++
336 > if m == cv.Constraints {
337 > if defaultOrder == 0 {
338 > defaultOrder = order
339 > matchedDefault = cv.Value
340 > }
341 }
342 }
343 }
344 > return collection.go
345 }
346
352 defaultCVs []TypedConstrainedValue[T],
353 precedence []Constraints,
354 > ) (value T, raw any) { collection.go
355 > cvp, defVal, valOrder, defOrder := findMatchWithConstrainedDefaults(cvs, defaultCVs, precedence)
356 >
357 > if defOrder == 0 {
358 // This is a server bug: all precedence lists must end with no-constraints, and all
359 // constrained defaults must have a no-constraints value, so we should have gotten a match.
361 // leave value as the zero value, that's the best we can do
362 return value, usingDefaultValue
363 > } else if valOrder == 0 { collection.go
364 > return defVal, usingDefaultValue collection.go
365 > } else if defOrder < valOrder { collection.go
366 // value was present but constrained default took precedence
367 return defVal, usingDefaultValue // use sentinel since we're using default
384 convert func(value any) (T, error),
385 precedence []Constraints,
386 > ) T { collection.go
387 > cvs := c.client.GetValue(key)
388 > value, _ := findAndResolveWithConstrainedDefaults(c, key, convert, cvs, cdef, precedence)
389 > return value
390 > }
391
392 func subscribe[T any](
676 // treat the fields independently), or the zero value of its type (if you want to treat the fields
677 // as a group and default unset fields to zero).
678 > func ConvertStructure[T any](def T) func(v any) (T, error) { collection.go
679 > return func(v any) (T, error) {
680 > // if we already have the right type, no conversion is necessary
681 > if typedV, ok := v.(T); ok {
682 return typedV, nil
683 }
685 // Deep-copy the default and decode over it. This allows using e.g. a struct with some
686 // default fields filled in and a config that only set some fields.
687 > out := deepCopyForMapstructure(def) collection.go
688 >
689 > dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
690 > Result: &out,
691 > DecodeHook: mapstructure.ComposeDecodeHookFunc(
692 > mapstructureHookDuration,
693 > mapstructureHookTimestamp,
694 > mapstructureHookProtoEnum,
695 > mapstructureHookGeneric,
696 > ),
697 > })
698 > if err != nil {
699 return out, err
700 }
701 > err = dec.Decode(v) collection.go
702 > return out, err
703 }
704 }
go.temporal.io/server/service/matching/backlog_manager.go 68 covered LOC · 11 ranges

Open complete file

87 matchingClient matchingservice.MatchingServiceClient,
88 metricsHandler metrics.Handler,
89 > ) *backlogManagerImpl { backlog_manager.go
90 > bmg := &backlogManagerImpl{
91 > pqMgr: pqMgr,
92 > tqCtx: tqCtx,
93 > matchingClient: matchingClient,
94 > metricsHandler: metricsHandler,
95 > logger: logger,
96 > throttledLogger: throttledLogger,
97 > config: config,
98 > initializedError: future.NewFuture[struct{}](),
99 > }
100 > isDraining := false // newBacklogManager can't be used for draining
101 > bmg.db = newTaskQueueDB(config, taskManager, pqMgr.QueueKey(), logger, metricsHandler, isDraining)
102 > bmg.taskWriter = newTaskWriter(bmg)
103 > bmg.taskReader = newTaskReader(bmg)
104 > bmg.taskAckManager = newAckManager(bmg.db, logger)
105 > bmg.taskGC = newTaskGC(tqCtx, bmg.db, config)
106 >
107 > return bmg
108 > }
109
110 // signalIfFatal calls UnloadFromPartitionManager of the physicalTaskQueueManager
112 // of a newer lease by another backlogManager. Returns true if the unload signal
113 // is emitted, false otherwise.
114 > func (c *backlogManagerImpl) signalIfFatal(err error) bool { backlog_manager.go
115 > if err == nil {
116 > return false backlog_manager.go
117 > }
118 var condfail *persistence.ConditionFailedError
119 if errors.As(err, &condfail) {
126 }
127
128 > func (c *backlogManagerImpl) Start() { backlog_manager.go
129 > c.taskWriter.Start()
130 > c.taskReader.Start()
131 > }
132
133 > func (c *backlogManagerImpl) Stop() { backlog_manager.go
134 > // Maybe try to write one final update of ack level and GC some tasks.
135 > // Skip the update if we never initialized (ackLevel will be -1 in that case).
136 > // Also skip if we're stopping due to lost ownership (the update will fail in that case).
137 > // Ignore any errors.
138 > // Note that it's fine to GC even if the update ack level fails because we did match the
139 > // tasks, the next owner will just read over an empty range.
140 > ackLevel := c.taskAckManager.getAckLevel()
141 > if ackLevel >= 0 && !c.skipFinalUpdate.Load() {
142 > ctx, cancel := context.WithTimeout(c.tqCtx, ioTimeout) backlog_manager.go
143 > defer cancel()
144 >
145 > _ = c.db.OldUpdateState(ctx, ackLevel)
146 > c.taskGC.RunNow(ackLevel)
147 > }
148 }
149
150 > func (c *backlogManagerImpl) SetInitializedError(err error) { backlog_manager.go
151 > c.initializedError.Set(struct{}{}, err)
152 > if err != nil {
153 // We can't recover from here without starting over, so unload the whole task queue.
154 // Skip final update since we never initialized.
158 }
159
160 > func (c *backlogManagerImpl) WaitUntilInitialized(ctx context.Context) error { backlog_manager.go
161 > _, err := c.initializedError.Get(ctx)
162 > return err
163 > }
164
165 func (c *backlogManagerImpl) SpoolTask(taskInfo *persistencespb.TaskInfo) error {
198 }
199
200 > func (c *backlogManagerImpl) BacklogStatsByPriority() map[int32]*taskqueuepb.TaskQueueStats { backlog_manager.go
201 > defaultPriority := int32(c.config.DefaultPriorityKey)
202 > return map[int32]*taskqueuepb.TaskQueueStats{
203 > defaultPriority: &taskqueuepb.TaskQueueStats{
204 > ApproximateBacklogCount: c.db.getTotalApproximateBacklogCount(),
205 > ApproximateBacklogAge: durationpb.New(c.taskReader.getBacklogHeadAge()),
206 > },
207 > }
208 > }
209
210 func (c *backlogManagerImpl) InternalStatus() []*taskqueuespb.InternalTaskQueueStatus {
272 }
273
274 > func rangeIDToTaskIDBlock(rangeID int64, rangeSize int64) taskIDBlock { backlog_manager.go
275 > return taskIDBlock{
276 > start: (rangeID-1)*rangeSize + 1,
277 > end: rangeID * rangeSize,
278 > }
279 > }
280
281 // Retry operation on transient error.
299 }
300
301 > func (c *backlogManagerImpl) getDB() *taskQueueDB { backlog_manager.go
302 > return c.db
303 > }
304
305 func (c *backlogManagerImpl) FinalGC() {
go.temporal.io/server/api/persistence/v1/executions.pb.go 60 covered LOC · 1 range

Open complete file

5706 }
5707
5708 > func init() { file_temporal_server_api_persistence_v1_executions_proto_init() } executions.pb.go
5709 > func file_temporal_server_api_persistence_v1_executions_proto_init() {
5710 > if File_temporal_server_api_persistence_v1_executions_proto != nil {
5711 > return
5712 > }
5713 > file_temporal_server_api_persistence_v1_chasm_proto_init()
5714 > file_temporal_server_api_persistence_v1_hsm_proto_init()
5715 > file_temporal_server_api_persistence_v1_queues_proto_init()
5716 > file_temporal_server_api_persistence_v1_update_proto_init()
5717 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[1].OneofWrappers = []any{
5718 > (*WorkflowExecutionInfo_LastWorkflowTaskFailureCause)(nil),
5719 > (*WorkflowExecutionInfo_LastWorkflowTaskTimedOutType)(nil),
5720 > }
5721 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[8].OneofWrappers = []any{
5722 > (*TransferTaskInfo_CloseExecutionTaskDetails_)(nil),
5723 > (*TransferTaskInfo_ChasmTaskInfo)(nil),
5724 > }
5725 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[10].OneofWrappers = []any{
5726 > (*VisibilityTaskInfo_ChasmTaskInfo)(nil),
5727 > }
5728 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[11].OneofWrappers = []any{
5729 > (*TimerTaskInfo_ChasmTaskInfo)(nil),
5730 > }
5731 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[13].OneofWrappers = []any{
5732 > (*OutboundTaskInfo_StateMachineInfo)(nil),
5733 > (*OutboundTaskInfo_ChasmTaskInfo)(nil),
5734 > (*OutboundTaskInfo_WorkerCommandsTask)(nil),
5735 > }
5736 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[17].OneofWrappers = []any{
5737 > (*ActivityInfo_UseWorkflowBuildIdInfo_)(nil),
5738 > (*ActivityInfo_LastIndependentlyAssignedBuildId)(nil),
5739 > }
5740 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[23].OneofWrappers = []any{
5741 > (*Callback_Nexus_)(nil),
5742 > (*Callback_Hsm)(nil),
5743 > }
5744 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[40].OneofWrappers = []any{
5745 > (*ActivityInfo_PauseInfo_Manual_)(nil),
5746 > (*ActivityInfo_PauseInfo_RuleId)(nil),
5747 > }
5748 > file_temporal_server_api_persistence_v1_executions_proto_msgTypes[46].OneofWrappers = []any{
5749 > (*CallbackInfo_Trigger_WorkflowClosed)(nil),
5750 > }
5751 > type x struct{}
5752 > out := protoimpl.TypeBuilder{
5753 > File: protoimpl.DescBuilder{
5754 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
5755 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_executions_proto_rawDesc), len(file_temporal_server_api_persistence_v1_executions_proto_rawDesc)),
5756 > NumEnums: 0,
5757 > NumMessages: 47,
5758 > NumExtensions: 0,
5759 > NumServices: 0,
5760 > },
5761 > GoTypes: file_temporal_server_api_persistence_v1_executions_proto_goTypes,
5762 > DependencyIndexes: file_temporal_server_api_persistence_v1_executions_proto_depIdxs,
5763 > MessageInfos: file_temporal_server_api_persistence_v1_executions_proto_msgTypes,
5764 > }.Build()
5765 > File_temporal_server_api_persistence_v1_executions_proto = out.File
5766 > file_temporal_server_api_persistence_v1_executions_proto_goTypes = nil
5767 > file_temporal_server_api_persistence_v1_executions_proto_depIdxs = nil
5768 }
go.temporal.io/server/service/matching/physical_task_queue_key.go 51 covered LOC · 21 ranges

Open complete file

47 )
48
49 > func (q *PhysicalTaskQueueKey) NamespaceId() string { physical_task_queue_key.go
50 > return q.partition.NamespaceId()
51 > }
52
53 > func (q *PhysicalTaskQueueKey) TaskQueueFamily() *tqid.TaskQueueFamily { physical_task_queue_key.go
54 > return q.partition.TaskQueue().Family()
55 > }
56
57 > func (q *PhysicalTaskQueueKey) TaskType() enumspb.TaskQueueType { physical_task_queue_key.go
58 > return q.partition.TaskType()
59 > }
60
61 > func (q *PhysicalTaskQueueKey) Partition() tqid.Partition { physical_task_queue_key.go
62 > return q.partition
63 > }
64
65 // UnversionedQueueKey returns the unversioned PhysicalTaskQueueKey of a task queue partition
66 > func UnversionedQueueKey(p tqid.Partition) *PhysicalTaskQueueKey { physical_task_queue_key.go
67 > return &PhysicalTaskQueueKey{
68 > partition: p,
69 > }
70 > }
71
72 // VersionSetQueueKey returns a PhysicalTaskQueueKey of a task queue partition with the given version set id.
114 // with build ID: /_sys/<base name>/<build ID base64 URL encoded>#<partition id>
115 // with version set: /_sys/<base name>/<version set id>:<partition id>
116 > func (q *PhysicalTaskQueueKey) PersistenceName() string { physical_task_queue_key.go
117 > switch p := q.Partition().(type) {
118 case *tqid.StickyPartition:
119 return p.StickyName()
120 case *tqid.WorkerCommandsPartition:
121 return p.TaskQueue().Name()
122 > case *tqid.NormalPartition: physical_task_queue_key.go
123 > baseName := q.TaskQueueFamily().Name()
124 >
125 > if len(q.version.versionSet) > 0 {
126 return nonRootPartitionPrefix + baseName + partitionDelimiter + q.version.versionSet + versionSetDelimiter + strconv.Itoa(p.PartitionId())
127 }
128
129 > if len(q.version.deploymentSeriesName) > 0 { physical_task_queue_key.go
130 encodedBuildId := base64.RawURLEncoding.EncodeToString([]byte(q.version.buildId))
131 encodedDeploymentName := base64.RawURLEncoding.EncodeToString([]byte(q.version.deploymentSeriesName))
132 return nonRootPartitionPrefix + baseName + partitionDelimiter + encodedDeploymentName + deploymentNameDelimiter + encodedBuildId + buildIdDelimiter + strconv.Itoa(p.PartitionId())
133 > } else if len(q.version.buildId) > 0 { physical_task_queue_key.go
134 encodedBuildId := base64.URLEncoding.EncodeToString([]byte(q.version.buildId))
135 return nonRootPartitionPrefix + baseName + partitionDelimiter + encodedBuildId + buildIdDelimiter + strconv.Itoa(p.PartitionId())
146 }
147
148 > func (q *PhysicalTaskQueueKey) IsVersioned() bool { physical_task_queue_key.go
149 > return q.version.IsVersioned()
150 > }
151
152 // Version returns a pointer to the physical queue version key. Caller must not manipulate the
153 // returned value.
154 > func (q *PhysicalTaskQueueKey) Version() PhysicalTaskQueueVersion { physical_task_queue_key.go
155 > return q.version
156 > }
157
158 > func (v PhysicalTaskQueueVersion) IsVersioned() bool { physical_task_queue_key.go
159 > return v.versionSet != "" || v.buildId != ""
160 > }
161
162 > func (v PhysicalTaskQueueVersion) Deployment() *deploymentpb.Deployment { physical_task_queue_key.go
163 > if len(v.deploymentSeriesName) > 0 {
164 return &deploymentpb.Deployment{
165 SeriesName: v.deploymentSeriesName,
183
184 // BuildId returns empty if this is not a Versioning v2 queue.
185 > func (v PhysicalTaskQueueVersion) BuildId() string { physical_task_queue_key.go
186 > if len(v.deploymentSeriesName) > 0 {
187 return ""
188 }
189 > return v.buildId physical_task_queue_key.go
190 }
191
192 > func (v PhysicalTaskQueueVersion) VersionSet() string { physical_task_queue_key.go
193 > return v.versionSet
194 > }
195
196 // MetricsTagValue returns the build ID tag value for this version.
197 > func (v PhysicalTaskQueueVersion) MetricsTagValue() string { physical_task_queue_key.go
198 > if v.versionSet != "" {
199 return v.versionSet
200 > } else if v.deploymentSeriesName == "" { physical_task_queue_key.go
201 > return v.buildId
202 > }
203 return v.deploymentSeriesName + worker_versioning.WorkerDeploymentVersionDelimiter + v.buildId
204 }
go.temporal.io/server/api/persistence/v1/tasks.pb.go 49 covered LOC · 12 ranges

Open complete file

273 func (*TaskQueueInfo) ProtoMessage() {}
274
275 > func (x *TaskQueueInfo) ProtoReflect() protoreflect.Message { tasks.pb.go
276 > mi := &file_temporal_server_api_persistence_v1_tasks_proto_msgTypes[2]
277 > if x != nil {
278 > ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
279 > if ms.LoadMessageInfo() == nil {
280 > ms.StoreMessageInfo(mi)
281 > }
282 > return ms
283 }
284 return mi.MessageOf(x)
399 func (*SubqueueInfo) ProtoMessage() {}
400
401 > func (x *SubqueueInfo) ProtoReflect() protoreflect.Message { tasks.pb.go
402 > mi := &file_temporal_server_api_persistence_v1_tasks_proto_msgTypes[3]
403 > if x != nil {
404 > ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) tasks.pb.go
405 > if ms.LoadMessageInfo() == nil {
406 > ms.StoreMessageInfo(mi)
407 > }
408 > return ms
409 }
410 > return mi.MessageOf(x) tasks.pb.go
411 }
412
479 func (*FairnessKeyCount) ProtoMessage() {}
480
481 > func (x *FairnessKeyCount) ProtoReflect() protoreflect.Message { tasks.pb.go
482 > mi := &file_temporal_server_api_persistence_v1_tasks_proto_msgTypes[4]
483 > if x != nil {
484 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
485 if ms.LoadMessageInfo() == nil {
488 return ms
489 }
490 > return mi.MessageOf(x) tasks.pb.go
491 }
492
531 func (*SubqueueKey) ProtoMessage() {}
532
533 > func (x *SubqueueKey) ProtoReflect() protoreflect.Message { tasks.pb.go
534 > mi := &file_temporal_server_api_persistence_v1_tasks_proto_msgTypes[5]
535 > if x != nil {
536 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
537 if ms.LoadMessageInfo() == nil {
540 return ms
541 }
542 > return mi.MessageOf(x) tasks.pb.go
543 }
544
600 func (*PartitionScaleState) ProtoMessage() {}
601
602 > func (x *PartitionScaleState) ProtoReflect() protoreflect.Message { tasks.pb.go
603 > mi := &file_temporal_server_api_persistence_v1_tasks_proto_msgTypes[6]
604 > if x != nil {
605 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
606 if ms.LoadMessageInfo() == nil {
609 return ms
610 }
611 > return mi.MessageOf(x) tasks.pb.go
612 }
613
846 }
847
848 > func init() { file_temporal_server_api_persistence_v1_tasks_proto_init() } tasks.pb.go
849 > func file_temporal_server_api_persistence_v1_tasks_proto_init() {
850 > if File_temporal_server_api_persistence_v1_tasks_proto != nil {
851 return
852 }
853 > type x struct{} tasks.pb.go
854 > out := protoimpl.TypeBuilder{
855 > File: protoimpl.DescBuilder{
856 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
857 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_tasks_proto_rawDesc), len(file_temporal_server_api_persistence_v1_tasks_proto_rawDesc)),
858 > NumEnums: 0,
859 > NumMessages: 8,
860 > NumExtensions: 0,
861 > NumServices: 0,
862 > },
863 > GoTypes: file_temporal_server_api_persistence_v1_tasks_proto_goTypes,
864 > DependencyIndexes: file_temporal_server_api_persistence_v1_tasks_proto_depIdxs,
865 > MessageInfos: file_temporal_server_api_persistence_v1_tasks_proto_msgTypes,
866 > }.Build()
867 > File_temporal_server_api_persistence_v1_tasks_proto = out.File
868 > file_temporal_server_api_persistence_v1_tasks_proto_goTypes = nil
869 > file_temporal_server_api_persistence_v1_tasks_proto_depIdxs = nil
870 }
go.temporal.io/server/common/future/future_impl.go 47 covered LOC · 12 ranges

Open complete file

29 )
30
31 > func NewFuture[T any]() *FutureImpl[T] { future_impl.go
32 > var value T
33 > return &FutureImpl[T]{
34 > status: pending,
35 > readyCh: make(chan struct{}),
36 >
37 > value: value,
38 > err: nil,
39 > }
40 > }
41
42 func (f *FutureImpl[T]) Get(
43 ctx context.Context,
44 > ) (T, error) { future_impl.go
45 > if f.Ready() {
46 > return f.value, f.err future_impl.go
47 > }
48
49 > select { future_impl.go
50 > case <-f.readyCh: future_impl.go
51 > return f.value, f.err
52 case <-ctx.Done():
53 var value T
56 }
57
58 > func (f *FutureImpl[T]) GetIfReady() (T, error) { future_impl.go
59 > if f.Ready() {
60 > return f.value, f.err future_impl.go
61 > }
62 var value T
63 return value, errorFutureNotReady
67 value T,
68 err error,
69 > ) { future_impl.go
70 > // cannot directly set status to `ready`, to prevent data race in case multiple `Get` occurs
71 > // instead set status to `setting` to prevent concurrent completion of this future
72 > if !atomic.CompareAndSwapInt32(
73 > &f.status,
74 > pending,
75 > setting,
76 > ) {
77 panic("future has already been completed")
78 }
79
80 > f.value = value future_impl.go
81 > f.err = err
82 > atomic.CompareAndSwapInt32(&f.status, setting, ready)
83 > close(f.readyCh)
84 }
85
88 value T,
89 err error,
90 > ) bool { future_impl.go
91 > if !atomic.CompareAndSwapInt32(
92 > &f.status,
93 > pending,
94 > setting,
95 > ) {
96 return false
97 }
98
99 > f.value = value future_impl.go
100 > f.err = err
101 > atomic.CompareAndSwapInt32(&f.status, setting, ready)
102 > close(f.readyCh)
103 > return true
104 }
105
106 > func (f *FutureImpl[T]) Ready() bool { future_impl.go
107 > return atomic.LoadInt32(&f.status) == ready
108 > }
go.temporal.io/server/common/backoff/retrypolicy.go 46 covered LOC · 8 ranges

Open complete file

80
81 // NewExponentialRetryPolicy returns an instance of ExponentialRetryPolicy using the provided initialInterval
82 > func NewExponentialRetryPolicy(initialInterval time.Duration) *ExponentialRetryPolicy { retrypolicy.go
83 > p := &ExponentialRetryPolicy{
84 > initialInterval: initialInterval,
85 > backoffCoefficient: defaultBackoffCoefficient,
86 > maximumInterval: defaultMaximumInterval,
87 > expirationInterval: defaultExpirationInterval,
88 > maximumAttempts: defaultMaximumAttempts,
89 > }
90 >
91 > return p
92 > }
93
94 // NewRetrier is used for creating a new instance of Retrier
95 > func NewRetrier(policy RetryPolicy, timeSource clock.TimeSource) Retrier { retrypolicy.go
96 > return &retrierImpl{
97 > policy: policy,
98 > timeSource: timeSource,
99 > startTime: timeSource.Now(),
100 > currentAttempt: 1,
101 > }
102 > }
103
104 // WithInitialInterval sets the initial interval used by ExponentialRetryPolicy for the very first retry
121 // This does *not* cause the policy to stop retrying when the interval between retries reaches the supplied duration.
122 // That is what WithExpirationInterval does. Instead, this prevents the interval from exceeding maximumInterval.
123 > func (p *ExponentialRetryPolicy) WithMaximumInterval(maximumInterval time.Duration) *ExponentialRetryPolicy { retrypolicy.go
124 > p.maximumInterval = maximumInterval
125 > return p
126 > }
127
128 // WithExpirationInterval sets the absolute expiration interval for all retries
129 > func (p *ExponentialRetryPolicy) WithExpirationInterval(expirationInterval time.Duration) *ExponentialRetryPolicy { retrypolicy.go
130 > p.expirationInterval = expirationInterval
131 > return p
132 > }
133
134 // WithMaximumAttempts sets the maximum number of retry attempts
135 > func (p *ExponentialRetryPolicy) WithMaximumAttempts(maximumAttempts int) *ExponentialRetryPolicy { retrypolicy.go
136 > p.maximumAttempts = maximumAttempts
137 > return p
138 > }
139
140 // ComputeNextDelay returns the next delay interval. This is used by Retrier to delay calling the operation again
219
220 // Reset will set the Retrier into initial state
221 > func (r *retrierImpl) Reset() { retrypolicy.go
222 > r.startTime = r.timeSource.Now()
223 > r.currentAttempt = 1
224 > }
225
226 // NextBackOff returns the next delay interval. This is used by Retry to delay calling the operation again
267 var _ RetryPolicy = (*ConstantDelayRetryPolicy)(nil)
268
269 > func NewConstantDelayRetryPolicy(delay time.Duration) *ConstantDelayRetryPolicy { retrypolicy.go
270 > return &ConstantDelayRetryPolicy{
271 > maximumAttempts: defaultMaximumAttempts,
272 > jitterPct: defaultJitterPct,
273 > delay: delay,
274 > }
275 > }
276
277 > func (p *ConstantDelayRetryPolicy) WithMaximumAttempts(maximumAttempts int) *ConstantDelayRetryPolicy { retrypolicy.go
278 > p.maximumAttempts = maximumAttempts
279 > return p
280 > }
281
282 func (p *ConstantDelayRetryPolicy) WithJitter(jitterPct float64) *ConstantDelayRetryPolicy {
go.temporal.io/server/api/historyservice/v1/request_response.pb.go 45 covered LOC · 1 range

Open complete file

11956 }
11957
11958 > func init() { file_temporal_server_api_historyservice_v1_request_response_proto_init() } request_response.pb.go
11959 > func file_temporal_server_api_historyservice_v1_request_response_proto_init() {
11960 > if File_temporal_server_api_historyservice_v1_request_response_proto != nil {
11961 > return
11962 > }
11963 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[107].OneofWrappers = []any{
11964 > (*StreamWorkflowReplicationMessagesRequest_SyncReplicationState)(nil),
11965 > }
11966 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[108].OneofWrappers = []any{
11967 > (*StreamWorkflowReplicationMessagesResponse_Messages)(nil),
11968 > }
11969 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[134].OneofWrappers = []any{
11970 > (*CompleteNexusOperationChasmRequest_Success)(nil),
11971 > (*CompleteNexusOperationChasmRequest_Failure)(nil),
11972 > }
11973 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[136].OneofWrappers = []any{
11974 > (*CompleteNexusOperationRequest_Success)(nil),
11975 > (*CompleteNexusOperationRequest_Failure)(nil),
11976 > }
11977 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[162].OneofWrappers = []any{
11978 > (*ExecuteMultiOperationRequest_Operation_StartWorkflow)(nil),
11979 > (*ExecuteMultiOperationRequest_Operation_UpdateWorkflow)(nil),
11980 > }
11981 > file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes[163].OneofWrappers = []any{
11982 > (*ExecuteMultiOperationResponse_Response_StartWorkflow)(nil),
11983 > (*ExecuteMultiOperationResponse_Response_UpdateWorkflow)(nil),
11984 > }
11985 > type x struct{}
11986 > out := protoimpl.TypeBuilder{
11987 > File: protoimpl.DescBuilder{
11988 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
11989 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_historyservice_v1_request_response_proto_rawDesc), len(file_temporal_server_api_historyservice_v1_request_response_proto_rawDesc)),
11990 > NumEnums: 0,
11991 > NumMessages: 171,
11992 > NumExtensions: 1,
11993 > NumServices: 0,
11994 > },
11995 > GoTypes: file_temporal_server_api_historyservice_v1_request_response_proto_goTypes,
11996 > DependencyIndexes: file_temporal_server_api_historyservice_v1_request_response_proto_depIdxs,
11997 > MessageInfos: file_temporal_server_api_historyservice_v1_request_response_proto_msgTypes,
11998 > ExtensionInfos: file_temporal_server_api_historyservice_v1_request_response_proto_extTypes,
11999 > }.Build()
12000 > File_temporal_server_api_historyservice_v1_request_response_proto = out.File
12001 > file_temporal_server_api_historyservice_v1_request_response_proto_goTypes = nil
12002 > file_temporal_server_api_historyservice_v1_request_response_proto_depIdxs = nil
12003 }
go.temporal.io/server/common/quotas/rate_burst.go 45 covered LOC · 15 ranges

Open complete file

85 rateFn RateFn,
86 burstFn BurstFn,
87 > ) *RateBurstImpl { rate_burst.go
88 > return &RateBurstImpl{
89 > rateFn: rateFn,
90 > burstFn: burstFn,
91 > }
92 > }
93
94 func NewDefaultIncomingRateBurst(
102 func NewDefaultOutgoingRateBurst(
103 rateFn RateFn,
104 > ) *RateBurstImpl { rate_burst.go
105 > return NewDefaultRateBurst(rateFn, func() float64 {
106 > return defaultOutgoingRateBurstRatio
107 > })
108 }
109
111 rateFn RateFn,
112 rateToBurstRatio BurstRatioFn,
113 > ) *RateBurstImpl { rate_burst.go
114 > burstFn := func() int {
115 > rate := rateFn() rate_burst.go
116 > if rate < 0 {
117 rate = 0
118 }
119
120 > ratio := rateToBurstRatio() rate_burst.go
121 > if ratio < 0 {
122 ratio = 0
123 }
124 > burst := int(rate * ratio) rate_burst.go
125 > if burst == 0 && rate > 0 && ratio > 0 {
126 burst = 1
127 }
128 > return burst rate_burst.go
129 }
130 > return NewRateBurst(rateFn, burstFn) rate_burst.go
131 }
132
133 > func (d *RateBurstImpl) Rate() float64 { rate_burst.go
134 > return d.rateFn()
135 > }
136
137 > func (d *RateBurstImpl) Burst() int { rate_burst.go
138 > return d.burstFn()
139 > }
140
141 func NewMutableRateBurst(
142 rate float64,
143 burst int,
144 > ) *MutableRateBurstImpl { rate_burst.go
145 > d := &MutableRateBurstImpl{}
146 > d.SetRPS(rate)
147 > d.SetBurst(burst)
148 >
149 > return d
150 > }
151
152 > func (d *MutableRateBurstImpl) SetRPS(rate float64) { rate_burst.go
153 > d.rate.Store(math.Float64bits(rate))
154 > }
155
156 > func (d *MutableRateBurstImpl) SetBurst(burst int) { rate_burst.go
157 > d.burst.Store(int64(burst))
158 > }
159
160 > func (d *MutableRateBurstImpl) Rate() float64 { rate_burst.go
161 > return math.Float64frombits(d.rate.Load())
162 > }
163
164 > func (d *MutableRateBurstImpl) Burst() int { rate_burst.go
165 > return int(d.burst.Load())
166 > }
167
168 func NewNamespaceRateBurst(
go.temporal.io/server/common/metrics/defs.go 44 covered LOC · 8 ranges

Open complete file

20 )
21
22 > func NewTimerDef(name string, opts ...Option) timerDefinition { defs.go
23 > // This line cannot be combined with others!
24 > // This ensures the stack trace has information of the caller.
25 > def := newMetricDefinition(name, opts...)
26 > globalRegistry.register(def)
27 > return timerDefinition{def}
28 > }
29
30 > func NewBytesHistogramDef(name string, opts ...Option) histogramDefinition { defs.go
31 > // This line cannot be combined with others!
32 > // This ensures the stack trace has information of the caller.
33 > def := newMetricDefinition(name, append(opts, WithUnit(Bytes))...)
34 > globalRegistry.register(def)
35 > return histogramDefinition{def}
36 > }
37
38 > func NewDimensionlessHistogramDef(name string, opts ...Option) histogramDefinition { defs.go
39 > // This line cannot be combined with others!
40 > // This ensures the stack trace has information of the caller.
41 > def := newMetricDefinition(name, append(opts, WithUnit(Dimensionless))...)
42 > globalRegistry.register(def)
43 > return histogramDefinition{def}
44 > }
45
46 > func NewCounterDef(name string, opts ...Option) counterDefinition { defs.go
47 > // This line cannot be combined with others!
48 > // This ensures the stack trace has information of the caller.
49 > def := newMetricDefinition(name, opts...)
50 > globalRegistry.register(def)
51 > return counterDefinition{def}
52 > }
53
54 > func NewGaugeDef(name string, opts ...Option) gaugeDefinition { defs.go
55 > // This line cannot be combined with others!
56 > // This ensures the stack trace has information of the caller.
57 > def := newMetricDefinition(name, opts...)
58 > globalRegistry.register(def)
59 > return gaugeDefinition{def}
60 > }
61
62 func (d histogramDefinition) With(handler Handler) HistogramIface {
64 }
65
66 > func (d counterDefinition) With(handler Handler) CounterIface { defs.go
67 > return handler.Counter(d.name)
68 > }
69
70 > func (d gaugeDefinition) With(handler Handler) GaugeIface { defs.go
71 > return handler.Gauge(d.name)
72 > }
73
74 > func (d timerDefinition) With(handler Handler) TimerIface { defs.go
75 > return handler.Timer(d.name)
76 > }
go.temporal.io/server/api/matchingservice/v1/request_response.pb.go 43 covered LOC · 1 range

Open complete file

6833 }
6834
6835 > func init() { file_temporal_server_api_matchingservice_v1_request_response_proto_init() } request_response.pb.go
6836 > func file_temporal_server_api_matchingservice_v1_request_response_proto_init() {
6837 > if File_temporal_server_api_matchingservice_v1_request_response_proto != nil {
6838 > return
6839 > }
6840 > file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes[27].OneofWrappers = []any{
6841 > (*UpdateWorkerBuildIdCompatibilityRequest_ApplyPublicRequest_)(nil),
6842 > (*UpdateWorkerBuildIdCompatibilityRequest_RemoveBuildIds_)(nil),
6843 > (*UpdateWorkerBuildIdCompatibilityRequest_PersistUnknownBuildId)(nil),
6844 > }
6845 > file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes[29].OneofWrappers = []any{
6846 > (*GetWorkerVersioningRulesRequest_Request)(nil),
6847 > }
6848 > file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes[31].OneofWrappers = []any{
6849 > (*UpdateWorkerVersioningRulesRequest_Request)(nil),
6850 > }
6851 > file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes[37].OneofWrappers = []any{
6852 > (*SyncDeploymentUserDataRequest_UpdateVersionData)(nil),
6853 > (*SyncDeploymentUserDataRequest_ForgetVersion)(nil),
6854 > }
6855 > file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes[56].OneofWrappers = []any{
6856 > (*DispatchNexusTaskResponse_HandlerError)(nil),
6857 > (*DispatchNexusTaskResponse_Response)(nil),
6858 > (*DispatchNexusTaskResponse_RequestTimeout)(nil),
6859 > (*DispatchNexusTaskResponse_Failure)(nil),
6860 > }
6861 > type x struct{}
6862 > out := protoimpl.TypeBuilder{
6863 > File: protoimpl.DescBuilder{
6864 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
6865 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_matchingservice_v1_request_response_proto_rawDesc), len(file_temporal_server_api_matchingservice_v1_request_response_proto_rawDesc)),
6866 > NumEnums: 0,
6867 > NumMessages: 97,
6868 > NumExtensions: 0,
6869 > NumServices: 0,
6870 > },
6871 > GoTypes: file_temporal_server_api_matchingservice_v1_request_response_proto_goTypes,
6872 > DependencyIndexes: file_temporal_server_api_matchingservice_v1_request_response_proto_depIdxs,
6873 > MessageInfos: file_temporal_server_api_matchingservice_v1_request_response_proto_msgTypes,
6874 > }.Build()
6875 > File_temporal_server_api_matchingservice_v1_request_response_proto = out.File
6876 > file_temporal_server_api_matchingservice_v1_request_response_proto_goTypes = nil
6877 > file_temporal_server_api_matchingservice_v1_request_response_proto_depIdxs = nil
6878 }
go.temporal.io/server/service/matching/task_writer.go 43 covered LOC · 8 ranges

Open complete file

54 func newTaskWriter(
55 backlogMgr *backlogManagerImpl,
56 > ) *taskWriter { task_writer.go
57 > return &taskWriter{
58 > backlogMgr: backlogMgr,
59 > config: backlogMgr.config,
60 > db: backlogMgr.db,
61 > logger: backlogMgr.logger,
62 > appendCh: make(chan *writeTaskRequest, backlogMgr.config.OutstandingTaskAppendsThreshold()),
63 > taskIDBlock: noTaskIDs,
64 > }
65 > }
66
67 // Start taskWriter background goroutine.
68 > func (w *taskWriter) Start() { task_writer.go
69 > go w.taskWriterLoop()
70 > }
71
72 > func (w *taskWriter) initReadWriteState() error { task_writer.go
73 > state, err := w.renewLeaseWithRetry(foreverRetryPolicy, common.IsPersistenceTransientError)
74 > if err != nil {
75 return err
76 }
77 > softassert.That(w.logger, !state.otherHasTasks, "found otherHasTasks in classic metadata") task_writer.go
78 > w.taskIDBlock = rangeIDToTaskIDBlock(state.rangeID, w.config.RangeSize)
79 > w.currentTaskIDBlock = w.taskIDBlock
80 > w.backlogMgr.taskAckManager.setAckLevel(state.ackLevel)
81 >
82 > return nil
83 }
84
152 }
153
154 > func (w *taskWriter) taskWriterLoop() { task_writer.go
155 > err := w.initReadWriteState()
156 > w.backlogMgr.SetInitializedError(err)
157 >
158 > for {
159 > atomic.StoreInt64(&w.currentTaskIDBlock.start, w.taskIDBlock.start)
160 > atomic.StoreInt64(&w.currentTaskIDBlock.end, w.taskIDBlock.end)
161 >
162 > select {
163 case request := <-w.appendCh:
164 // read a batch of requests from the channel
174 }
175
176 > case <-w.backlogMgr.tqCtx.Done(): task_writer.go
177 > return
178 }
179 }
196 retryPolicy backoff.RetryPolicy,
197 retryErrors backoff.IsRetryable,
198 > ) (taskQueueState, error) { task_writer.go
199 > var newState taskQueueState
200 > op := func(ctx context.Context) (err error) {
201 > newState, err = w.db.RenewLease(ctx)
202 > return
203 > }
204 > metrics.LeaseRequestPerTaskQueueCounter.With(w.backlogMgr.metricsHandler).Record(1)
205 > err := backoff.ThrottleRetryContext(w.backlogMgr.tqCtx, op, retryPolicy, retryErrors)
206 > if err != nil {
207 metrics.LeaseFailurePerTaskQueueCounter.With(w.backlogMgr.metricsHandler).Record(1)
208 return newState, err
209 }
210 > return newState, nil task_writer.go
211 }
212
go.temporal.io/server/service/matching/ack_manager.go 41 covered LOC · 7 ranges

Open complete file

22 }
23
24 > func newAckManager(db *taskQueueDB, logger log.Logger) *ackManager { ack_manager.go
25 > return &ackManager{
26 > db: db,
27 > logger: logger,
28 > outstandingTasks: treemap.NewWith(godsutils.Int64Comparator),
29 > readLevel: -1,
30 > ackLevel: -1,
31 > }
32 > }
33
34 // Registers task as in-flight and moves read level to it. Tasks can be added in increasing order of taskID only.
49 }
50
51 > func (m *ackManager) getReadLevel() int64 { ack_manager.go
52 > m.RLock()
53 > defer m.RUnlock()
54 > return m.readLevel
55 > }
56
57 func (m *ackManager) setReadLevel(readLevel int64) {
61 }
62
63 > func (m *ackManager) setReadLevelAfterGap(newReadLevel int64) { ack_manager.go
64 > m.Lock()
65 > defer m.Unlock()
66 > if m.ackLevel == m.readLevel {
67 > // This is called after we read a range and find no tasks. The range we read was m.readLevel to newReadLevel. ack_manager.go
68 > // (We know this because nothing should change m.readLevel except the getTasksPump loop itself, after initialization.
69 > // And getTasksPump doesn't start until it gets a signal from taskWriter that it's initialized the levels.)
70 > // If we've acked all tasks up to m.readLevel, and there are no tasks between that and newReadLevel, then we've
71 > // acked all tasks up to newReadLevel too. This lets us advance the ack level on a task queue with no activity
72 > // but where the rangeid has moved higher, to prevent excessive reads on the next load.
73 > m.ackLevel = newReadLevel
74 > }
75 > m.readLevel = newReadLevel ack_manager.go
76 }
77
78 > func (m *ackManager) getAckLevel() int64 { ack_manager.go
79 > m.RLock()
80 > defer m.RUnlock()
81 > return m.ackLevel
82 > }
83
84 // Moves ack level to the new level if it is higher than the current one.
85 // Also updates the read level if it is lower than the ackLevel.
86 > func (m *ackManager) setAckLevel(ackLevel int64) { ack_manager.go
87 > m.Lock()
88 > defer m.Unlock()
89 > if ackLevel > m.ackLevel {
90 > m.ackLevel = ackLevel
91 > }
92 > if ackLevel > m.readLevel {
93 > m.readLevel = ackLevel
94 > }
95 }
96
go.temporal.io/server/common/cluster/metadata.go 40 covered LOC · 19 ranges

Open complete file

142 refreshDuration dynamicconfig.DurationPropertyFn,
143 logger log.Logger,
144 > ) Metadata { metadata.go
145 > if len(clusterInfo) == 0 {
146 panic("Empty cluster information")
147 > } else if len(masterClusterName) == 0 { metadata.go
148 panic("Master cluster name is empty")
149 > } else if len(currentClusterName) == 0 { metadata.go
150 panic("Current cluster name is empty")
151 > } else if failoverVersionIncrement == 0 || failoverVersionIncrement > math.MaxInt32 { metadata.go
152 panic("Version increment <= 0 or > 2147483647")
153 }
154
155 > versionToClusterName, err := updateVersionToClusterName(clusterInfo, failoverVersionIncrement) metadata.go
156 > if err != nil {
157 // nolint:forbidigo // matches the other startup-config panics in this constructor
158 panic(err.Error())
159 }
160 > if _, ok := clusterInfo[currentClusterName]; !ok { metadata.go
161 panic("Current cluster is not specified in cluster info")
162 }
163 > if _, ok := clusterInfo[masterClusterName]; !ok { metadata.go
164 panic("Master cluster is not specified in cluster info")
165 }
166
167 > copyClusterInfo := make(map[string]ClusterInformation) metadata.go
168 > maps.Copy(copyClusterInfo, clusterInfo)
169 > if refreshDuration == nil {
170 > refreshDuration = dynamicconfig.GetDurationPropertyFn(refreshInterval) metadata.go
171 > }
172 > return &metadataImpl{ metadata.go
173 > status: common.DaemonStatusInitialized,
174 > enableGlobalNamespace: enableGlobalNamespace,
175 > failoverVersionIncrement: failoverVersionIncrement,
176 > masterClusterName: masterClusterName,
177 > currentClusterName: currentClusterName,
178 > clusterInfo: copyClusterInfo,
179 > versionToClusterName: versionToClusterName,
180 > clusterChangeCallback: make(map[any]CallbackFn),
181 > clusterMetadataStore: clusterMetadataStore,
182 > logger: logger,
183 > refreshDuration: refreshDuration,
184 > }
185 }
186
502 info ClusterInformation,
503 failoverVersionIncrement int64,
504 > ) error { metadata.go
505 > if clusterName == "" {
506 return errors.New("cluster name must not be empty")
507 }
508 > if info.InitialFailoverVersion <= 0 { metadata.go
509 return fmt.Errorf("cluster %q: InitialFailoverVersion must be > 0, got %d",
510 clusterName, info.InitialFailoverVersion)
511 }
512 > if info.InitialFailoverVersion >= failoverVersionIncrement { metadata.go
513 return fmt.Errorf("cluster %q: InitialFailoverVersion (%d) must be < FailoverVersionIncrement (%d)",
514 clusterName, info.InitialFailoverVersion, failoverVersionIncrement)
515 }
516 > if info.Enabled && info.RPCAddress == "" { metadata.go
517 return fmt.Errorf("cluster %q: RPCAddress must not be empty when Enabled=true", clusterName)
518 }
519 > return nil metadata.go
520 }
521
522 > func updateVersionToClusterName(clusterInfo map[string]ClusterInformation, failoverVersionIncrement int64) (map[int64]string, error) { metadata.go
523 > versionToClusterName := make(map[int64]string)
524 > for clusterName, info := range clusterInfo {
525 > if err := ValidateClusterInformation(clusterName, info, failoverVersionIncrement); err != nil {
526 return nil, err
527 }
528 > if existing, dup := versionToClusterName[info.InitialFailoverVersion]; dup { metadata.go
529 return nil, fmt.Errorf(
530 "duplicate InitialFailoverVersion %d for clusters %q and %q",
531 info.InitialFailoverVersion, existing, clusterName)
532 }
533 > versionToClusterName[info.InitialFailoverVersion] = clusterName metadata.go
534 }
535 > return versionToClusterName, nil metadata.go
536 }
537
go.temporal.io/server/common/log/zap_logger.go 38 covered LOC · 10 ranges

Open complete file

82
83 // NewZapLogger returns a new zap based logger from zap.Logger
84 > func NewZapLogger(zl *zap.Logger) *zapLogger { zap_logger.go
85 > return &zapLogger{
86 > zl: zl,
87 > skip: skipForZapLogger,
88 > baseZl: zl,
89 > }
90 > }
91
92 // BuildZapLogger builds and returns a new zap.Logger for this logging configuration
95 }
96
97 > func caller(skip int) string { zap_logger.go
98 > _, path, line, ok := runtime.Caller(skip)
99 > if !ok {
100 return ""
101 }
102 > return path + ":" + strconv.Itoa(line) zap_logger.go
103 }
104
105 > func (l *zapLogger) buildFieldsWithCallAt(tags []tag.Tag) []zap.Field { zap_logger.go
106 > fields := make([]zap.Field, len(tags)+1)
107 > l.fillFields(tags, fields)
108 > fields[len(fields)-1] = zap.String(tag.LoggingCallAtKey, caller(l.skip))
109 > return fields
110 > }
111
112 // fillFields fill fields parameter with fields read from tags. Optimized for performance.
113 > func (l *zapLogger) fillFields(tags []tag.Tag, fields []zap.Field) { zap_logger.go
114 > for i, t := range tags {
115 > if zt, ok := t.(tag.ZapTag); ok { zap_logger.go
116 > fields[i] = zt.Field()
117 > } else {
118 fields[i] = zap.Any(t.Key(), t.Value())
119 }
121 }
122
123 > func setDefaultMsg(msg string) string { zap_logger.go
124 > if msg == "" {
125 return defaultMsgForEmpty
126 }
127 > return msg zap_logger.go
128 }
129
136 }
137
138 > func (l *zapLogger) Info(msg string, tags ...tag.Tag) { zap_logger.go
139 > if l.zl.Core().Enabled(zap.InfoLevel) {
140 > msg = setDefaultMsg(msg)
141 > fields := l.buildFieldsWithCallAt(tags)
142 > l.zl.Info(msg, fields...)
143 > }
144 }
145
211 }
212
213 > func (l *zapLogger) Skip(extraSkip int) Logger { zap_logger.go
214 > return &zapLogger{
215 > zl: l.zl,
216 > skip: l.skip + extraSkip,
217 > baseZl: l.baseZl,
218 > }
219 > }
220
221 func mergeTags(oldTags, newTags []tag.Tag) (outTags []tag.Tag) {
go.temporal.io/server/common/namespace/testconstructors.go 38 covered LOC · 9 ranges

Open complete file

13 config *persistencespb.NamespaceConfig,
14 targetCluster string,
15 > ) *Namespace { testconstructors.go
16 > detail := &persistencespb.NamespaceDetail{
17 > Info: ensureInfo(info),
18 > Config: ensureConfig(config),
19 > ReplicationConfig: &persistencespb.NamespaceReplicationConfig{
20 > ActiveClusterName: targetCluster,
21 > Clusters: []string{targetCluster},
22 > },
23 > FailoverVersion: common.EmptyVersion,
24 > }
25 > factory := NewDefaultReplicationResolverFactory()
26 > resolver := factory(detail)
27 > ns, _ := FromPersistentState(detail, resolver, WithGlobalFlag(false))
28 > return ns
29 > }
30
31 // NewNamespaceForTest returns an entry with test data
55 repConfig *persistencespb.NamespaceReplicationConfig,
56 failoverVersion int64,
57 > ) *Namespace { testconstructors.go
58 > detail := &persistencespb.NamespaceDetail{
59 > Info: ensureInfo(info),
60 > Config: ensureConfig(config),
61 > ReplicationConfig: ensureRepConfig(repConfig),
62 > FailoverVersion: failoverVersion,
63 > }
64 > factory := NewDefaultReplicationResolverFactory()
65 > resolver := factory(detail)
66 > ns, _ := FromPersistentState(detail, resolver, WithGlobalFlag(true))
67 > return ns
68 > }
69
70 > func ensureInfo(proto *persistencespb.NamespaceInfo) *persistencespb.NamespaceInfo { testconstructors.go
71 > if proto == nil {
72 return &persistencespb.NamespaceInfo{}
73 }
74 > return proto testconstructors.go
75 }
76
77 > func ensureConfig(proto *persistencespb.NamespaceConfig) *persistencespb.NamespaceConfig { testconstructors.go
78 > if proto == nil {
79 > return &persistencespb.NamespaceConfig{} testconstructors.go
80 > }
81 > return proto testconstructors.go
82 }
83
84 > func ensureRepConfig(proto *persistencespb.NamespaceReplicationConfig) *persistencespb.NamespaceReplicationConfig { testconstructors.go
85 > if proto == nil {
86 return &persistencespb.NamespaceReplicationConfig{}
87 }
88 > return proto testconstructors.go
89 }
go.temporal.io/server/api/taskqueue/v1/message.pb.go 37 covered LOC · 6 ranges

Open complete file

81 func (*TaskVersionDirective) ProtoMessage() {}
82
83 > func (x *TaskVersionDirective) ProtoReflect() protoreflect.Message { message.pb.go
84 > mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0]
85 > if x != nil {
86 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
87 if ms.LoadMessageInfo() == nil {
90 return ms
91 }
92 > return mi.MessageOf(x) message.pb.go
93 }
94
201 func (*FairLevel) ProtoMessage() {}
202
203 > func (x *FairLevel) ProtoReflect() protoreflect.Message { message.pb.go
204 > mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1]
205 > if x != nil {
206 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
207 if ms.LoadMessageInfo() == nil {
210 return ms
211 }
212 > return mi.MessageOf(x) message.pb.go
213 }
214
1330 }
1331
1332 > func init() { file_temporal_server_api_taskqueue_v1_message_proto_init() } message.pb.go
1333 > func file_temporal_server_api_taskqueue_v1_message_proto_init() {
1334 > if File_temporal_server_api_taskqueue_v1_message_proto != nil {
1335 return
1336 }
1337 > file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0].OneofWrappers = []any{ message.pb.go
1338 > (*TaskVersionDirective_UseAssignmentRules)(nil),
1339 > (*TaskVersionDirective_AssignedBuildId)(nil),
1340 > }
1341 > file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5].OneofWrappers = []any{
1342 > (*TaskQueuePartition_NormalPartitionId)(nil),
1343 > (*TaskQueuePartition_StickyName)(nil),
1344 > (*TaskQueuePartition_WorkerCommands)(nil),
1345 > }
1346 > type x struct{}
1347 > out := protoimpl.TypeBuilder{
1348 > File: protoimpl.DescBuilder{
1349 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1350 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_taskqueue_v1_message_proto_rawDesc), len(file_temporal_server_api_taskqueue_v1_message_proto_rawDesc)),
1351 > NumEnums: 0,
1352 > NumMessages: 16,
1353 > NumExtensions: 0,
1354 > NumServices: 0,
1355 > },
1356 > GoTypes: file_temporal_server_api_taskqueue_v1_message_proto_goTypes,
1357 > DependencyIndexes: file_temporal_server_api_taskqueue_v1_message_proto_depIdxs,
1358 > MessageInfos: file_temporal_server_api_taskqueue_v1_message_proto_msgTypes,
1359 > }.Build()
1360 > File_temporal_server_api_taskqueue_v1_message_proto = out.File
1361 > file_temporal_server_api_taskqueue_v1_message_proto_goTypes = nil
1362 > file_temporal_server_api_taskqueue_v1_message_proto_depIdxs = nil
1363 }
go.temporal.io/server/api/adminservice/v1/request_response.pb.go 36 covered LOC · 1 range

Open complete file

6623 }
6624
6625 > func init() { file_temporal_server_api_adminservice_v1_request_response_proto_init() } request_response.pb.go
6626 > func file_temporal_server_api_adminservice_v1_request_response_proto_init() {
6627 > if File_temporal_server_api_adminservice_v1_request_response_proto != nil {
6628 > return
6629 > }
6630 > file_temporal_server_api_adminservice_v1_request_response_proto_msgTypes[59].OneofWrappers = []any{
6631 > (*StreamWorkflowReplicationMessagesRequest_SyncReplicationState)(nil),
6632 > }
6633 > file_temporal_server_api_adminservice_v1_request_response_proto_msgTypes[60].OneofWrappers = []any{
6634 > (*StreamWorkflowReplicationMessagesResponse_Messages)(nil),
6635 > }
6636 > file_temporal_server_api_adminservice_v1_request_response_proto_msgTypes[61].OneofWrappers = []any{
6637 > (*GetNamespaceRequest_Namespace)(nil),
6638 > (*GetNamespaceRequest_Id)(nil),
6639 > }
6640 > file_temporal_server_api_adminservice_v1_request_response_proto_msgTypes[90].OneofWrappers = []any{
6641 > (*StartAdminBatchOperationRequest_RefreshTasksOperation)(nil),
6642 > }
6643 > type x struct{}
6644 > out := protoimpl.TypeBuilder{
6645 > File: protoimpl.DescBuilder{
6646 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
6647 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_adminservice_v1_request_response_proto_rawDesc), len(file_temporal_server_api_adminservice_v1_request_response_proto_rawDesc)),
6648 > NumEnums: 1,
6649 > NumMessages: 105,
6650 > NumExtensions: 0,
6651 > NumServices: 0,
6652 > },
6653 > GoTypes: file_temporal_server_api_adminservice_v1_request_response_proto_goTypes,
6654 > DependencyIndexes: file_temporal_server_api_adminservice_v1_request_response_proto_depIdxs,
6655 > EnumInfos: file_temporal_server_api_adminservice_v1_request_response_proto_enumTypes,
6656 > MessageInfos: file_temporal_server_api_adminservice_v1_request_response_proto_msgTypes,
6657 > }.Build()
6658 > File_temporal_server_api_adminservice_v1_request_response_proto = out.File
6659 > file_temporal_server_api_adminservice_v1_request_response_proto_goTypes = nil
6660 > file_temporal_server_api_adminservice_v1_request_response_proto_depIdxs = nil
6661 }
go.temporal.io/server/api/replication/v1/message.pb.go 36 covered LOC · 2 ranges

Open complete file

2441 }
2442
2443 > func init() { file_temporal_server_api_replication_v1_message_proto_init() } message.pb.go
2444 > func file_temporal_server_api_replication_v1_message_proto_init() {
2445 > if File_temporal_server_api_replication_v1_message_proto != nil {
2446 return
2447 }
2448 > file_temporal_server_api_replication_v1_message_proto_msgTypes[0].OneofWrappers = []any{ message.pb.go
2449 > (*ReplicationTask_NamespaceTaskAttributes)(nil),
2450 > (*ReplicationTask_SyncShardStatusTaskAttributes)(nil),
2451 > (*ReplicationTask_SyncActivityTaskAttributes)(nil),
2452 > (*ReplicationTask_HistoryTaskAttributes)(nil),
2453 > (*ReplicationTask_SyncWorkflowStateTaskAttributes)(nil),
2454 > (*ReplicationTask_TaskQueueUserDataAttributes)(nil),
2455 > (*ReplicationTask_SyncHsmAttributes)(nil),
2456 > (*ReplicationTask_BackfillHistoryTaskAttributes)(nil),
2457 > (*ReplicationTask_VerifyVersionedTransitionTaskAttributes)(nil),
2458 > (*ReplicationTask_SyncVersionedTransitionTaskAttributes)(nil),
2459 > }
2460 > file_temporal_server_api_replication_v1_message_proto_msgTypes[21].OneofWrappers = []any{
2461 > (*VersionedTransitionArtifact_SyncWorkflowStateMutationAttributes)(nil),
2462 > (*VersionedTransitionArtifact_SyncWorkflowStateSnapshotAttributes)(nil),
2463 > }
2464 > type x struct{}
2465 > out := protoimpl.TypeBuilder{
2466 > File: protoimpl.DescBuilder{
2467 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
2468 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_replication_v1_message_proto_rawDesc), len(file_temporal_server_api_replication_v1_message_proto_rawDesc)),
2469 > NumEnums: 0,
2470 > NumMessages: 23,
2471 > NumExtensions: 0,
2472 > NumServices: 0,
2473 > },
2474 > GoTypes: file_temporal_server_api_replication_v1_message_proto_goTypes,
2475 > DependencyIndexes: file_temporal_server_api_replication_v1_message_proto_depIdxs,
2476 > MessageInfos: file_temporal_server_api_replication_v1_message_proto_msgTypes,
2477 > }.Build()
2478 > File_temporal_server_api_replication_v1_message_proto = out.File
2479 > file_temporal_server_api_replication_v1_message_proto_goTypes = nil
2480 > file_temporal_server_api_replication_v1_message_proto_depIdxs = nil
2481 }
go.temporal.io/server/common/cache/lru.go 35 covered LOC · 9 ranges

Open complete file

135
136 // New creates a new cache with the given options
137 > func New(maxSize int, opts *Options) StoppableCache { lru.go
138 > return NewWithMetrics(maxSize, opts, metrics.NoopMetricsHandler)
139 > }
140
141 // NewWithMetrics creates a new cache that will emit capacity and ttl metrics.
142 // handler should be tagged with metrics.CacheTypeTag.
143 > func NewWithMetrics(maxSize int, opts *Options, handler metrics.Handler) StoppableCache { lru.go
144 > if opts == nil {
145 > opts = &Options{} lru.go
146 > }
147
148 > backgroundEvict := opts.BackgroundEvict lru.go
149 > if backgroundEvict == nil {
150 > backgroundEvict = func() dynamicconfig.CacheBackgroundEvictSettings { lru.go
151 > return dynamicconfig.CacheBackgroundEvictSettings{
152 > Enabled: false,
153 > }
154 > }
155 }
156
157 > timeSource := opts.TimeSource lru.go
158 > if timeSource == nil {
159 > timeSource = clock.NewRealTimeSource() lru.go
160 > }
161
162 > metrics.CacheSize.With(handler).Record(float64(maxSize)) lru.go
163 > metrics.CacheTtl.With(handler).Record(opts.TTL)
164 > c := &lru{
165 > byAccess: list.New(),
166 > byKey: make(map[any]*list.Element),
167 > ttl: opts.TTL,
168 > maxSize: maxSize,
169 > currSize: 0,
170 > pin: opts.Pin,
171 > onPut: opts.OnPut,
172 > onEvict: opts.OnEvict,
173 > timeSource: timeSource,
174 > metricsHandler: handler,
175 > backgroundEvict: backgroundEvict,
176 > }
177 > if c.backgroundEvict().Enabled {
178 c.loops.Go(c.bgEvictLoop)
179 }
180 > return c lru.go
181 }
182
go.temporal.io/server/common/log/tag/tags.go 35 covered LOC · 13 ranges

Open complete file

70
71 // WorkflowAction returns tag for WorkflowAction
72 > func workflowAction(action string) ZapTag { tags.go
73 > return NewStringTag("wf-action", action)
74 > }
75
76 // WorkflowListFilterType returns tag for WorkflowListFilterType
77 > func workflowListFilterType(listFilterType string) ZapTag { tags.go
78 > return NewStringTag("wf-list-filter-type", listFilterType)
79 > }
80
81 // general
298
299 // WorkerVersion returns tag for worker build ID
300 > func WorkerVersion(version string) ZapTag { tags.go
301 > if version == "" {
302 > version = "_unversioned_" tags.go
303 > }
304 > return NewStringTag("worker-version", version) tags.go
305 }
306
376
377 // Component returns tag for Component
378 > func component(component string) ZapTag { tags.go
379 > return NewStringTag("component", component)
380 > }
381
382 // Lifecycle returns tag for Lifecycle
383 > func lifecycle(lifecycle string) ZapTag { tags.go
384 > return NewStringTag("lifecycle", lifecycle)
385 > }
386
387 // StoreOperation returns tag for StoreOperation
388 > func storeOperation(storeOperation string) ZapTag { tags.go
389 > return NewStringTag("store-operation", storeOperation)
390 > }
391
392 // OperationResult returns tag for OperationResult
393 > func operationResult(operationResult string) ZapTag { tags.go
394 > return NewStringTag("operation-result", operationResult)
395 > }
396
397 // ErrorType returns tag for ErrorType
401
402 // errorType returns tag for ErrorType given a string
403 > func errorType(errorType string) ZapTag { tags.go
404 > return NewStringTag("error-type", errorType)
405 > }
406
407 // Shardupdate returns tag for Shardupdate
408 > func shardupdate(shardupdate string) ZapTag { tags.go
409 > return NewStringTag("shard-update", shardupdate)
410 > }
411
412 // scope returns a tag for scope
413 // Pre-defined scope tags are in values.go.
414 > func scope(scope string) ZapTag { tags.go
415 > return NewStringTag("scope", scope)
416 > }
417
418 // general
1006 }
1007
1008 > func Cause(cause string) ZapTag { tags.go
1009 > return NewStringTag("cause", cause)
1010 > }
1011
1012 func NexusOperation(operation string) ZapTag {
go.temporal.io/server/common/metrics/tags.go 35 covered LOC · 19 ranges

Open complete file

101 // dual emit the metric with the all tag. If a blank namespace is provided then
102 // this converts that to an unknown namespace.
103 > func NamespaceTag(value string) Tag { tags.go
104 > if len(value) == 0 {
105 value = unknownValue
106 }
107 > return Tag{Key: namespace, Value: value} tags.go
108 }
109
177 // - `tqid.PerTaskQueueScope`
178 // - `tqid.PerTaskQueuePartitionScope`
179 > func UnsafeTaskQueueTag(value string) Tag { tags.go
180 > if len(value) == 0 {
181 value = unknownValue
182 }
183 > return Tag{Key: taskQueue, Value: value} tags.go
184 }
185
186 > func TaskQueueTypeTag(tqType enumspb.TaskQueueType) Tag { tags.go
187 > return Tag{Key: TaskTypeTagName, Value: tqType.String()}
188 > }
189
190 // Consider passing the value of "metrics.breakdownByBuildID" dynamic config to this function.
191 > func WorkerVersionTag(version string, versionBreakdown bool) Tag { tags.go
192 > if version == "" {
193 > version = "__unversioned__" tags.go
194 > } else if !versionBreakdown { tags.go
195 version = "__versioned__"
196 }
197 > return Tag{Key: workerVersion, Value: version} tags.go
198 }
199
200 > func WorkerDeploymentNameTag(deploymentName string, versionBreakdown bool) Tag { tags.go
201 > if !versionBreakdown {
202 deploymentName = ""
203 }
204 > return Tag{Key: workerDeploymentName, Value: deploymentName} tags.go
205 }
206
207 > func WorkerDeploymentBuildIDTag(buildID string, versionBreakdown bool) Tag { tags.go
208 > if !versionBreakdown {
209 buildID = ""
210 }
211 > return Tag{Key: workerDeploymentBuildID, Value: buildID} tags.go
212 }
213
300 }
301
302 > func PartitionTag(partition string) Tag { tags.go
303 > return Tag{Key: PartitionTagName, Value: partition}
304 > }
305
306 func TaskPriorityTag(value string) Tag {
354 }
355
356 > func MatchingTaskPriorityTag(value int32) Tag { tags.go
357 > priStr := ""
358 > if value != 0 {
359 > priStr = strconv.FormatInt(int64(value), 10) tags.go
360 > }
361 > return Tag{Key: TaskPriorityTagName, Value: priStr} tags.go
362 }
363
403
404 // VersionedTag represents whether a loaded task queue manager represents a specific version set or build ID or not.
405 > func VersionedTag(versioned string) Tag { tags.go
406 > return Tag{Key: versionedTagName, Value: versioned}
407 > }
408
409 func ServiceErrorTypeTag(err error) Tag {
455 }
456
457 > func OperationTag(value string) Tag { tags.go
458 > return Tag{Key: OperationTagName, Value: value}
459 > }
460
461 func StringTag(key string, value string) Tag {
go.temporal.io/server/service/matching/user_data_manager.go 34 covered LOC · 7 ranges

Open complete file

147 logger log.Logger,
148 registry namespace.Registry,
149 > ) *userDataManagerImpl { user_data_manager.go
150 > m := &userDataManagerImpl{
151 > onFatalErr: onFatalErr,
152 > onUserDataChanged: onUserDataChanged,
153 > onEphemeralDataChanged: onEphemeralDataChanged,
154 > partition: partition,
155 > userDataChanged: make(chan struct{}),
156 > config: config,
157 > namespaceRegistry: registry,
158 > logger: logger,
159 > matchingClient: matchingClient,
160 > userDataReady: future.NewFuture[struct{}](),
161 > ephemeralDataChanged: make(chan struct{}),
162 > }
163 >
164 > if partition.IsRoot() && partition.TaskType() == enumspb.TASK_QUEUE_TYPE_WORKFLOW {
165 > m.store = store user_data_manager.go
166 > }
167
168 > return m user_data_manager.go
169 }
170
182 }
183
184 > func (m *userDataManagerImpl) Stop() { user_data_manager.go
185 > m.goroGroup.Cancel()
186 > // Set user data state on stop to wake up anyone blocked on the user data changed channel.
187 > m.setUserDataState(userDataClosed, nil)
188 > }
189
190 // GetUserData returns the user data for this task queue and a channel that signals when the data has been updated.
222 // futureError is the error to set on the ready future. If this is non-nil, the task queue will
223 // be unloaded.
224 > func (m *userDataManagerImpl) setUserDataState(userDataState userDataState, futureError error) { user_data_manager.go
225 > m.lock.Lock()
226 > defer m.lock.Unlock()
227 >
228 > if userDataState != m.userDataState && m.userDataState != userDataClosed {
229 > m.userDataState = userDataState user_data_manager.go
230 > close(m.userDataChanged)
231 > m.userDataChanged = make(chan struct{})
232 > }
233
234 > _ = m.userDataReady.SetIfNotReady(struct{}{}, futureError) user_data_manager.go
235 }
236
go.temporal.io/server/api/persistence/v1/chasm.pb.go 33 covered LOC · 1 range

Open complete file

1180 }
1181
1182 > func init() { file_temporal_server_api_persistence_v1_chasm_proto_init() } chasm.pb.go
1183 > func file_temporal_server_api_persistence_v1_chasm_proto_init() {
1184 > if File_temporal_server_api_persistence_v1_chasm_proto != nil {
1185 > return
1186 > }
1187 > file_temporal_server_api_persistence_v1_hsm_proto_init()
1188 > file_temporal_server_api_persistence_v1_chasm_proto_msgTypes[1].OneofWrappers = []any{
1189 > (*ChasmNodeMetadata_ComponentAttributes)(nil),
1190 > (*ChasmNodeMetadata_DataAttributes)(nil),
1191 > (*ChasmNodeMetadata_CollectionAttributes)(nil),
1192 > (*ChasmNodeMetadata_PointerAttributes)(nil),
1193 > }
1194 > file_temporal_server_api_persistence_v1_chasm_proto_msgTypes[10].OneofWrappers = []any{
1195 > (*ChasmNexusCompletion_Success)(nil),
1196 > (*ChasmNexusCompletion_Failure)(nil),
1197 > }
1198 > type x struct{}
1199 > out := protoimpl.TypeBuilder{
1200 > File: protoimpl.DescBuilder{
1201 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1202 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_chasm_proto_rawDesc), len(file_temporal_server_api_persistence_v1_chasm_proto_rawDesc)),
1203 > NumEnums: 0,
1204 > NumMessages: 15,
1205 > NumExtensions: 0,
1206 > NumServices: 0,
1207 > },
1208 > GoTypes: file_temporal_server_api_persistence_v1_chasm_proto_goTypes,
1209 > DependencyIndexes: file_temporal_server_api_persistence_v1_chasm_proto_depIdxs,
1210 > MessageInfos: file_temporal_server_api_persistence_v1_chasm_proto_msgTypes,
1211 > }.Build()
1212 > File_temporal_server_api_persistence_v1_chasm_proto = out.File
1213 > file_temporal_server_api_persistence_v1_chasm_proto_goTypes = nil
1214 > file_temporal_server_api_persistence_v1_chasm_proto_depIdxs = nil
1215 }
go.temporal.io/server/api/persistence/v1/hsm.pb.go 32 covered LOC · 1 range

Open complete file

895 }
896
897 > func init() { file_temporal_server_api_persistence_v1_hsm_proto_init() } hsm.pb.go
898 > func file_temporal_server_api_persistence_v1_hsm_proto_init() {
899 > if File_temporal_server_api_persistence_v1_hsm_proto != nil {
900 > return
901 > }
902 > file_temporal_server_api_persistence_v1_hsm_proto_msgTypes[8].OneofWrappers = []any{
903 > (*StateMachineTombstone_ActivityScheduledEventId)(nil),
904 > (*StateMachineTombstone_TimerId)(nil),
905 > (*StateMachineTombstone_ChildExecutionInitiatedEventId)(nil),
906 > (*StateMachineTombstone_RequestCancelInitiatedEventId)(nil),
907 > (*StateMachineTombstone_SignalExternalInitiatedEventId)(nil),
908 > (*StateMachineTombstone_UpdateId)(nil),
909 > (*StateMachineTombstone_StateMachinePath)(nil),
910 > (*StateMachineTombstone_ChasmNodePath)(nil),
911 > }
912 > type x struct{}
913 > out := protoimpl.TypeBuilder{
914 > File: protoimpl.DescBuilder{
915 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
916 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_hsm_proto_rawDesc), len(file_temporal_server_api_persistence_v1_hsm_proto_rawDesc)),
917 > NumEnums: 0,
918 > NumMessages: 12,
919 > NumExtensions: 0,
920 > NumServices: 0,
921 > },
922 > GoTypes: file_temporal_server_api_persistence_v1_hsm_proto_goTypes,
923 > DependencyIndexes: file_temporal_server_api_persistence_v1_hsm_proto_depIdxs,
924 > MessageInfos: file_temporal_server_api_persistence_v1_hsm_proto_msgTypes,
925 > }.Build()
926 > File_temporal_server_api_persistence_v1_hsm_proto = out.File
927 > file_temporal_server_api_persistence_v1_hsm_proto_goTypes = nil
928 > file_temporal_server_api_persistence_v1_hsm_proto_depIdxs = nil
929 }
go.temporal.io/server/common/membership/interfaces_mock.go 32 covered LOC · 8 ranges

Open complete file

169
170 // NewMockServiceResolver creates a new mock instance.
171 > func NewMockServiceResolver(ctrl *gomock.Controller) *MockServiceResolver { interfaces_mock.go
172 > mock := &MockServiceResolver{ctrl: ctrl}
173 > mock.recorder = &MockServiceResolverMockRecorder{mock}
174 > return mock
175 > }
176
177 // EXPECT returns an object that allows the caller to indicate expected use.
178 > func (m *MockServiceResolver) EXPECT() *MockServiceResolverMockRecorder { interfaces_mock.go
179 > return m.recorder
180 > }
181
182 // AddListener mocks base method.
189
190 // AddListener indicates an expected call of AddListener.
191 > func (mr *MockServiceResolverMockRecorder) AddListener(name, notifyChannel any) *gomock.Call { interfaces_mock.go
192 > mr.mock.ctrl.T.Helper()
193 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddListener", reflect.TypeOf((*MockServiceResolver)(nil).AddListener), name, notifyChannel)
194 > }
195
196 // AvailableMemberCount mocks base method.
232
233 // Lookup indicates an expected call of Lookup.
234 > func (mr *MockServiceResolverMockRecorder) Lookup(key any) *gomock.Call { interfaces_mock.go
235 > mr.mock.ctrl.T.Helper()
236 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Lookup", reflect.TypeOf((*MockServiceResolver)(nil).Lookup), key)
237 > }
238
239 // LookupN mocks base method.
288
289 // RemoveListener indicates an expected call of RemoveListener.
290 > func (mr *MockServiceResolverMockRecorder) RemoveListener(name any) *gomock.Call { interfaces_mock.go
291 > mr.mock.ctrl.T.Helper()
292 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveListener", reflect.TypeOf((*MockServiceResolver)(nil).RemoveListener), name)
293 > }
294
295 // RequestRefresh mocks base method.
318
319 // NewMockHostInfoProvider creates a new mock instance.
320 > func NewMockHostInfoProvider(ctrl *gomock.Controller) *MockHostInfoProvider { interfaces_mock.go
321 > mock := &MockHostInfoProvider{ctrl: ctrl}
322 > mock.recorder = &MockHostInfoProviderMockRecorder{mock}
323 > return mock
324 > }
325
326 // EXPECT returns an object that allows the caller to indicate expected use.
327 > func (m *MockHostInfoProvider) EXPECT() *MockHostInfoProviderMockRecorder { interfaces_mock.go
328 > return m.recorder
329 > }
330
331 // HostInfo mocks base method.
338
339 // HostInfo indicates an expected call of HostInfo.
340 > func (mr *MockHostInfoProviderMockRecorder) HostInfo() *gomock.Call { interfaces_mock.go
341 > mr.mock.ctrl.T.Helper()
342 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostInfo", reflect.TypeOf((*MockHostInfoProvider)(nil).HostInfo))
343 > }
go.temporal.io/server/api/persistence/v1/update.pb.go 31 covered LOC · 1 range

Open complete file

422 }
423
424 > func init() { file_temporal_server_api_persistence_v1_update_proto_init() } update.pb.go
425 > func file_temporal_server_api_persistence_v1_update_proto_init() {
426 > if File_temporal_server_api_persistence_v1_update_proto != nil {
427 > return
428 > }
429 > file_temporal_server_api_persistence_v1_hsm_proto_init()
430 > file_temporal_server_api_persistence_v1_update_proto_msgTypes[0].OneofWrappers = []any{
431 > (*UpdateAdmissionInfo_HistoryPointer_)(nil),
432 > }
433 > file_temporal_server_api_persistence_v1_update_proto_msgTypes[3].OneofWrappers = []any{
434 > (*UpdateInfo_Acceptance)(nil),
435 > (*UpdateInfo_Completion)(nil),
436 > (*UpdateInfo_Admission)(nil),
437 > }
438 > type x struct{}
439 > out := protoimpl.TypeBuilder{
440 > File: protoimpl.DescBuilder{
441 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
442 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_update_proto_rawDesc), len(file_temporal_server_api_persistence_v1_update_proto_rawDesc)),
443 > NumEnums: 0,
444 > NumMessages: 5,
445 > NumExtensions: 0,
446 > NumServices: 0,
447 > },
448 > GoTypes: file_temporal_server_api_persistence_v1_update_proto_goTypes,
449 > DependencyIndexes: file_temporal_server_api_persistence_v1_update_proto_depIdxs,
450 > MessageInfos: file_temporal_server_api_persistence_v1_update_proto_msgTypes,
451 > }.Build()
452 > File_temporal_server_api_persistence_v1_update_proto = out.File
453 > file_temporal_server_api_persistence_v1_update_proto_goTypes = nil
454 > file_temporal_server_api_persistence_v1_update_proto_depIdxs = nil
455 }
go.temporal.io/server/common/dynamicconfig/deepcopy.go 31 covered LOC · 6 ranges

Open complete file

9 // deepCopyForMapstructure does a simple deep copy of T. Fancy cases (anything other than plain old data)
10 // is not handled and will panic.
11 > func deepCopyForMapstructure[T any](t T) T { deepcopy.go
12 > // nolint:revive // this will be triggered from a static initializer before it can be triggered from production code
13 > return deepCopyValue(reflect.ValueOf(t)).Interface().(T)
14 > }
15
16 > func deepCopyValue(v reflect.Value) reflect.Value { deepcopy.go
17 > switch v.Kind() {
18 case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
19 reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
20 > reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.String: deepcopy.go
21 > nv := reflect.New(v.Type()).Elem()
22 > nv.Set(v)
23 > return nv
24 case reflect.Array:
25 nv := reflect.New(v.Type()).Elem()
42 }
43 return deepCopyValue(v.Elem()).Addr()
44 > case reflect.Slice: deepcopy.go
45 > if v.IsNil() {
46 > return v
47 > }
48 nv := reflect.MakeSlice(v.Type(), v.Len(), v.Len())
49 for i := range v.Len() {
51 }
52 return nv
53 > case reflect.Struct: deepcopy.go
54 > // Special case for time.Time: it has unexported fields so we can't copy it field by
55 > // field, but we can copy zero values (which is all we need for default values).
56 > if v.Type() == reflect.TypeFor[time.Time]() {
57 > if v.Interface().(time.Time).IsZero() {
58 > return reflect.ValueOf(time.Time{})
59 > }
60 // nolint:forbidigo // this will be triggered from a static initializer before it can be triggered from production code
61 panic(fmt.Sprintf("Can't deep copy non-zero time.Time: %v", v.Interface()))
62 }
63 > nv := reflect.New(v.Type()).Elem() deepcopy.go
64 > for i := range v.Type().NumField() {
65 > nv.Field(i).Set(deepCopyValue(v.Field(i)))
66 > }
67 > return nv
68 > case reflect.Interface, reflect.Func, reflect.Chan:
69 > // only nil values of any other reference types allowed!
70 > if v.IsNil() {
71 > return v
72 > }
73 fallthrough
74 default:
go.temporal.io/server/common/persistence/sql/sqlplugin/mysql/execution_maps.go 30 covered LOC · 5 ranges

Open complete file

53 )
54
55 > func stringMap(a []string, f func(string) string) []string { execution_maps.go
56 > b := make([]string, len(a))
57 > for i, v := range a {
58 > b[i] = f(v)
59 > }
60 > return b
61 }
62
63 > func makeDeleteMapQry(tableName string) string { execution_maps.go
64 > return fmt.Sprintf(deleteMapQryTemplate, tableName)
65 > }
66
67 > func makeSetKeyInMapQry(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
68 > return fmt.Sprintf(setKeyInMapQryTemplate,
69 > tableName,
70 > strings.Join(nonPrimaryKeyColumns, ","),
71 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string {
72 > return ":" + x
73 > }), ","),
74 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string {
75 > return x + "=VALUES(" + x + ")"
76 > }), ","),
77 mapKeyName)
78 }
79
80 > func makeDeleteKeyInMapQry(tableName string, mapKeyName string) string { execution_maps.go
81 > return fmt.Sprintf(deleteKeyInMapQryTemplate,
82 > tableName,
83 > mapKeyName)
84 > }
85
86 > func makeGetMapQryTemplate(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
87 > return fmt.Sprintf(getMapQryTemplate,
88 > tableName,
89 > mapKeyName,
90 > strings.Join(nonPrimaryKeyColumns, ","))
91 > }
92
93 var (
go.temporal.io/server/common/persistence/sql/sqlplugin/postgresql/execution_maps.go 30 covered LOC · 6 ranges

Open complete file

86 )
87
88 > func stringMap(a []string, f func(string) string) []string { execution_maps.go
89 > b := make([]string, len(a))
90 > for i, v := range a {
91 > b[i] = f(v)
92 > }
93 > return b
94 }
95
96 > func makeDeleteMapQry(tableName string) string { execution_maps.go
97 > return fmt.Sprintf(deleteMapQueryTemplate, tableName)
98 > }
99
100 > func makeSetKeyInMapQry(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
101 > return fmt.Sprintf(setKeyInMapQueryTemplate,
102 > tableName,
103 > strings.Join(nonPrimaryKeyColumns, ","),
104 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string {
105 > return ":" + x
106 > }), ","),
107 mapKeyName,
108 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string { execution_maps.go
109 > return "excluded." + x
110 > }), ","))
111 }
112
113 > func makeDeleteKeyInMapQry(tableName string, mapKeyName string) string { execution_maps.go
114 > return fmt.Sprintf(deleteKeyInMapQueryTemplate,
115 > tableName,
116 > mapKeyName)
117 > }
118
119 > func makeGetMapQryTemplate(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
120 > return fmt.Sprintf(getMapQueryTemplate,
121 > tableName,
122 > mapKeyName,
123 > strings.Join(nonPrimaryKeyColumns, ","))
124 > }
125
126 var (
go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite/execution_maps.go 30 covered LOC · 5 ranges

Open complete file

52 )
53
54 > func stringMap(a []string, f func(string) string) []string { execution_maps.go
55 > b := make([]string, len(a))
56 > for i, v := range a {
57 > b[i] = f(v)
58 > }
59 > return b
60 }
61
62 > func makeDeleteMapQry(tableName string) string { execution_maps.go
63 > return fmt.Sprintf(deleteMapQryTemplate, tableName)
64 > }
65
66 > func makeSetKeyInMapQry(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
67 > return fmt.Sprintf(setKeyInMapQryTemplate,
68 > tableName,
69 > strings.Join(nonPrimaryKeyColumns, ","),
70 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string {
71 > return ":" + x
72 > }), ","),
73 > strings.Join(stringMap(nonPrimaryKeyColumns, func(x string) string {
74 > return x + "=" + x
75 > }), ","),
76 mapKeyName)
77 }
78
79 > func makeDeleteKeyInMapQry(tableName string, mapKeyName string) string { execution_maps.go
80 > return fmt.Sprintf(deleteKeyInMapQryTemplate,
81 > tableName,
82 > mapKeyName)
83 > }
84
85 > func makeGetMapQryTemplate(tableName string, nonPrimaryKeyColumns []string, mapKeyName string) string { execution_maps.go
86 > return fmt.Sprintf(getMapQryTemplate,
87 > tableName,
88 > mapKeyName,
89 > strings.Join(nonPrimaryKeyColumns, ","))
90 > }
91
92 var (
go.temporal.io/server/common/searchattribute/sadefs/constants.go 30 covered LOC · 9 ranges

Open complete file

261 }
262
263 > dbCustomSearchAttributeFieldNameRE = func() map[enumspb.IndexedValueType]*regexp.Regexp { constants.go
264 > res := map[enumspb.IndexedValueType]*regexp.Regexp{}
265 > for t := range defaultNumDBCustomSearchAttributes {
266 > res[t] = regexp.MustCompile(fmt.Sprintf(`^%s(0[1-9]|[1-9][0-9])$`, t.String()))
267 > }
268 > return res
269 }()
270 )
271
272 // System returns a clone of the system search attributes map.
273 > func System() map[string]enumspb.IndexedValueType { constants.go
274 > return maps.Clone(system)
275 > }
276
277 // Predefined returns a clone of the predefined search attributes map.
278 > func Predefined() map[string]enumspb.IndexedValueType { constants.go
279 > return maps.Clone(predefined)
280 > }
281
282 // PredefinedWhiteList returns a clone of the predefined whitelist search attributes map.
283 > func PredefinedWhiteList() map[string]enumspb.IndexedValueType { constants.go
284 > return maps.Clone(predefinedWhiteList)
285 > }
286
287 // Reserved returns a clone of the reserved field names map.
343 // GetSqlDbColName maps system and reserved search attributes to column names for SQL tables.
344 // If the input is not a system or reserved search attribute, then it returns the input.
345 > func GetSqlDbColName(name string) string { constants.go
346 > if fieldName, ok := sqlDbSystemNameToColName[name]; ok {
347 > return fieldName constants.go
348 > }
349 return name
350 }
352 func GetDBIndexSearchAttributes(
353 override map[enumspb.IndexedValueType]int,
354 > ) *persistencespb.IndexSearchAttributes { constants.go
355 > csa := map[string]enumspb.IndexedValueType{}
356 > for saType, defaultNumAttrs := range defaultNumDBCustomSearchAttributes {
357 > numAttrs := defaultNumAttrs
358 > if value, ok := override[saType]; ok {
359 numAttrs = value
360 }
361 > for i := range numAttrs { constants.go
362 > csa[fmt.Sprintf("%s%02d", saType.String(), i+1)] = saType
363 > }
364 }
365 > return &persistencespb.IndexSearchAttributes{ constants.go
366 > CustomSearchAttributes: csa,
367 > }
368 }
369
go.temporal.io/server/service/matching/task_gc.go 28 covered LOC · 9 ranges

Open complete file

36 db *taskQueueDB,
37 config *taskQueueConfig,
38 > ) *taskGC { task_gc.go
39 > return &taskGC{
40 > tqCtx: tqCtx,
41 > db: db,
42 > config: config,
43 > }
44 > }
45
46 // Run deletes a batch of completed tasks, if it's possible to do so
52 // RunNow deletes a batch of completed tasks if it's possible to do so
53 // This method attempts deletions without waiting for size/time threshold to be met
54 > func (tgc *taskGC) RunNow(ackLevel int64) { task_gc.go
55 > tgc.tryDeleteNextBatch(ackLevel, true)
56 > }
57
58 > func (tgc *taskGC) tryDeleteNextBatch(ackLevel int64, ignoreTimeCond bool) { task_gc.go
59 > if !tgc.tryLock() {
60 return
61 }
62 > defer tgc.unlock() task_gc.go
63 >
64 > batchSize := tgc.config.MaxTaskDeleteBatchSize()
65 > if !tgc.checkPrecond(ackLevel, batchSize, ignoreTimeCond) {
66 > return task_gc.go
67 > }
68 tgc.lastDeleteTime = time.Now().UTC()
69
85 }
86
87 > func (tgc *taskGC) checkPrecond(ackLevel int64, batchSize int, ignoreTimeCond bool) bool { task_gc.go
88 > backlog := ackLevel - tgc.ackLevel
89 > if backlog >= int64(batchSize) {
90 return true
91 }
92 > return backlog > 0 && (ignoreTimeCond || time.Now().UTC().Sub(tgc.lastDeleteTime) > maxTimeBetweenTaskDeletes) task_gc.go
93 }
94
95 > func (tgc *taskGC) tryLock() bool { task_gc.go
96 > return atomic.CompareAndSwapInt64(&tgc.lock, 0, 1)
97 > }
98
99 > func (tgc *taskGC) unlock() { task_gc.go
100 > atomic.StoreInt64(&tgc.lock, 0)
101 > }
go.temporal.io/server/api/enums/v1/task.pb.go 26 covered LOC · 4 ranges

Open complete file

69 }
70
71 > func (TaskSource) Descriptor() protoreflect.EnumDescriptor { task.pb.go
72 > return file_temporal_server_api_enums_v1_task_proto_enumTypes[0].Descriptor()
73 > }
74
75 func (TaskSource) Type() protoreflect.EnumType {
303 }
304
305 > func (TaskType) Descriptor() protoreflect.EnumDescriptor { task.pb.go
306 > return file_temporal_server_api_enums_v1_task_proto_enumTypes[1].Descriptor()
307 > }
308
309 func (TaskType) Type() protoreflect.EnumType {
456 }
457
458 > func init() { file_temporal_server_api_enums_v1_task_proto_init() } task.pb.go
459 > func file_temporal_server_api_enums_v1_task_proto_init() {
460 > if File_temporal_server_api_enums_v1_task_proto != nil {
461 return
462 }
463 > type x struct{} task.pb.go
464 > out := protoimpl.TypeBuilder{
465 > File: protoimpl.DescBuilder{
466 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
467 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_task_proto_rawDesc), len(file_temporal_server_api_enums_v1_task_proto_rawDesc)),
468 > NumEnums: 3,
469 > NumMessages: 0,
470 > NumExtensions: 0,
471 > NumServices: 0,
472 > },
473 > GoTypes: file_temporal_server_api_enums_v1_task_proto_goTypes,
474 > DependencyIndexes: file_temporal_server_api_enums_v1_task_proto_depIdxs,
475 > EnumInfos: file_temporal_server_api_enums_v1_task_proto_enumTypes,
476 > }.Build()
477 > File_temporal_server_api_enums_v1_task_proto = out.File
478 > file_temporal_server_api_enums_v1_task_proto_goTypes = nil
479 > file_temporal_server_api_enums_v1_task_proto_depIdxs = nil
480 }
go.temporal.io/server/common/namespace/namespace.go 26 covered LOC · 8 ranges

Open complete file

81 resolver ReplicationResolver,
82 mutations ...Mutation,
83 > ) (*Namespace, error) { namespace.go
84 > if resolver == nil {
85 return nil, serviceerror.NewInvalidArgument("replicationResolver must be provided")
86 }
87 > ns := &Namespace{ namespace.go
88 > info: detail.Info,
89 > config: detail.Config,
90 > configVersion: detail.ConfigVersion,
91 > customSearchAttributesMapper: CustomSearchAttributesMapper{
92 > fieldToAlias: detail.Config.CustomSearchAttributeAliases,
93 > aliasToField: util.InverseMap(detail.Config.CustomSearchAttributeAliases),
94 > },
95 > replicationResolver: resolver,
96 > }
97 >
98 > for _, m := range mutations {
99 > m.apply(ns) namespace.go
100 > }
101
102 > return ns, nil namespace.go
103 }
104
167
168 // Name observes this namespace's configured name.
169 > func (ns *Namespace) Name() Name { namespace.go
170 > if ns.info == nil {
171 return Name("")
172 }
173 > return Name(ns.info.Name) namespace.go
174 }
175
337 }
338
339 > func (id ID) String() string { namespace.go
340 > return string(id)
341 > }
342
343 func (id ID) IsEmpty() bool {
345 }
346
347 > func (n Name) String() string { namespace.go
348 > return string(n)
349 > }
350
351 func (n Name) IsEmpty() bool {
go.temporal.io/server/service/matching/ratelimit_manager.go 26 covered LOC · 4 ranges

Open complete file

70 config *taskQueueConfig,
71 taskQueueType enumspb.TaskQueueType,
72 > ) *rateLimitManager { ratelimit_manager.go
73 > r := &rateLimitManager{
74 > userDataManager: userDataManager,
75 > config: config,
76 > taskQueueType: taskQueueType,
77 > perKeyReady: cache.New(config.FairnessKeyRateLimitCacheSize(), nil),
78 > timeSource: clock.NewRealTimeSource(),
79 > }
80 > r.dynamicRateBurst = quotas.NewMutableRateBurst(
81 > defaultTaskDispatchRPS,
82 > int(defaultTaskDispatchRPS),
83 > )
84 > r.dynamicRateLimiter = quotas.NewDynamicRateLimiter(
85 > r.dynamicRateBurst,
86 > config.RateLimiterRefreshInterval,
87 > )
88 > return r
89 > }
90
91 // Start registers dynamic config subscriptions and computes the initial rate limits.
207 }
208
209 > func (r *rateLimitManager) GetRateLimiter() quotas.RateLimiter { ratelimit_manager.go
210 > return r.dynamicRateLimiter
211 > }
212
213 // Updates the API-configured RPS based on the latest user data
385 }
386
387 > func (r *rateLimitManager) Stop() { ratelimit_manager.go
388 > r.mu.Lock()
389 > defer r.mu.Unlock()
390 > for _, cancel := range r.cancels {
391 cancel()
392 }
393 > r.cancels = nil ratelimit_manager.go
394 }
go.temporal.io/server/chasm/lib/activity/gen/activitypb/v1/activity_state.pb.go 25 covered LOC · 2 ranges

Open complete file

1382 }
1383
1384 > func init() { file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_init() } activity_state.pb.go
1385 > func file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_init() {
1386 > if File_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto != nil {
1387 return
1388 }
1389 > file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_msgTypes[7].OneofWrappers = []any{ activity_state.pb.go
1390 > (*ActivityOutcome_Successful_)(nil),
1391 > (*ActivityOutcome_Failed_)(nil),
1392 > }
1393 > type x struct{}
1394 > out := protoimpl.TypeBuilder{
1395 > File: protoimpl.DescBuilder{
1396 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1397 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_rawDesc), len(file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_rawDesc)),
1398 > NumEnums: 2,
1399 > NumMessages: 11,
1400 > NumExtensions: 0,
1401 > NumServices: 0,
1402 > },
1403 > GoTypes: file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_goTypes,
1404 > DependencyIndexes: file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_depIdxs,
1405 > EnumInfos: file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_enumTypes,
1406 > MessageInfos: file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_msgTypes,
1407 > }.Build()
1408 > File_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto = out.File
1409 > file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_goTypes = nil
1410 > file_temporal_server_chasm_lib_activity_proto_v1_activity_state_proto_depIdxs = nil
1411 }
go.temporal.io/server/chasm/lib/nexusoperation/gen/nexusoperationpb/v1/operation.pb.go 25 covered LOC · 2 ranges

Open complete file

998 }
999
1000 > func init() { file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_init() } operation.pb.go
1001 > func file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_init() {
1002 > if File_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto != nil {
1003 return
1004 }
1005 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_msgTypes[2].OneofWrappers = []any{ operation.pb.go
1006 > (*OperationOutcome_Successful_)(nil),
1007 > (*OperationOutcome_Failed_)(nil),
1008 > }
1009 > type x struct{}
1010 > out := protoimpl.TypeBuilder{
1011 > File: protoimpl.DescBuilder{
1012 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1013 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_rawDesc), len(file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_rawDesc)),
1014 > NumEnums: 2,
1015 > NumMessages: 8,
1016 > NumExtensions: 0,
1017 > NumServices: 0,
1018 > },
1019 > GoTypes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_goTypes,
1020 > DependencyIndexes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_depIdxs,
1021 > EnumInfos: file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_enumTypes,
1022 > MessageInfos: file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_msgTypes,
1023 > }.Build()
1024 > File_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto = out.File
1025 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_goTypes = nil
1026 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_operation_proto_depIdxs = nil
1027 }
go.temporal.io/server/common/routing/route.go 25 covered LOC · 8 ranges

Open complete file

36
37 // NewRoute returns a new [Route] instance with the given components.
38 > func NewRoute[T any](components ...Component[T]) Route[T] { route.go
39 > return Route[T]{components: components}
40 > }
41
42 // RouteBuilder is a builder for the [Route] interface.
46
47 // NewBuilder creates a new [RouteBuilder] instance, which can be used to define a new [Route] via a fluent API.
48 > func NewBuilder[T any]() *RouteBuilder[T] { route.go
49 > return &RouteBuilder[T]{}
50 > }
51
52 // With adds a series of [Component] instances to the [Route].
53 > func (r *RouteBuilder[T]) With(c ...Component[T]) *RouteBuilder[T] { route.go
54 > r.components = append(r.components, c...)
55 > return r
56 > }
57
58 // Constant adds a [Constant] component to the [Route].
59 > func (r *RouteBuilder[T]) Constant(values ...string) *RouteBuilder[T] { route.go
60 > return r.With(Constant[T](values...))
61 > }
62
63 // StringVariable adds a [StringVariable] component to the [Route].
64 > func (r *RouteBuilder[T]) StringVariable(name string, getter func(*T) *string) *RouteBuilder[T] { route.go
65 > return r.With(StringVariable[T](name, getter))
66 > }
67
68 // Build returns a read-only [Route].
69 > func (r *RouteBuilder[T]) Build() Route[T] { route.go
70 > return NewRoute[T](r.components...)
71 > }
72
73 // Representation returns the [github.com/gorilla/mux] compatible string representation of the route for usage in a
111 // Constant returns a [Component] that represents a series of constant HTTP path components in a Route.
112 // They will be joined via strings when used to construct a path or path representation.
113 > func Constant[T any](values ...string) constant[T] { route.go
114 > return values
115 > }
116
117 type constant[T any] []string
128
129 // StringVariable returns a [Component] that represents a string variable in a Route.
130 > func StringVariable[T any](name string, getter func(*T) *string) stringVariable[T] { route.go
131 > return stringVariable[T]{name, getter}
132 > }
133
134 type stringVariable[T any] struct {
go.temporal.io/server/api/clock/v1/message.pb.go 24 covered LOC · 4 ranges

Open complete file

45 func (*VectorClock) ProtoMessage() {}
46
47 > func (x *VectorClock) ProtoReflect() protoreflect.Message { message.pb.go
48 > mi := &file_temporal_server_api_clock_v1_message_proto_msgTypes[0]
49 > if x != nil {
50 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
51 if ms.LoadMessageInfo() == nil {
54 return ms
55 }
56 > return mi.MessageOf(x) message.pb.go
57 }
58
193 }
194
195 > func init() { file_temporal_server_api_clock_v1_message_proto_init() } message.pb.go
196 > func file_temporal_server_api_clock_v1_message_proto_init() {
197 > if File_temporal_server_api_clock_v1_message_proto != nil {
198 return
199 }
200 > type x struct{} message.pb.go
201 > out := protoimpl.TypeBuilder{
202 > File: protoimpl.DescBuilder{
203 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
204 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_clock_v1_message_proto_rawDesc), len(file_temporal_server_api_clock_v1_message_proto_rawDesc)),
205 > NumEnums: 0,
206 > NumMessages: 2,
207 > NumExtensions: 0,
208 > NumServices: 0,
209 > },
210 > GoTypes: file_temporal_server_api_clock_v1_message_proto_goTypes,
211 > DependencyIndexes: file_temporal_server_api_clock_v1_message_proto_depIdxs,
212 > MessageInfos: file_temporal_server_api_clock_v1_message_proto_msgTypes,
213 > }.Build()
214 > File_temporal_server_api_clock_v1_message_proto = out.File
215 > file_temporal_server_api_clock_v1_message_proto_goTypes = nil
216 > file_temporal_server_api_clock_v1_message_proto_depIdxs = nil
217 }
go.temporal.io/server/api/deployment/v1/message.pb.go 24 covered LOC · 4 ranges

Open complete file

54 func (*WorkerDeploymentVersion) ProtoMessage() {}
55
56 > func (x *WorkerDeploymentVersion) ProtoReflect() protoreflect.Message { message.pb.go
57 > mi := &file_temporal_server_api_deployment_v1_message_proto_msgTypes[0]
58 > if x != nil {
59 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
60 if ms.LoadMessageInfo() == nil {
63 return ms
64 }
65 > return mi.MessageOf(x) message.pb.go
66 }
67
4626 }
4627
4628 > func init() { file_temporal_server_api_deployment_v1_message_proto_init() } message.pb.go
4629 > func file_temporal_server_api_deployment_v1_message_proto_init() {
4630 > if File_temporal_server_api_deployment_v1_message_proto != nil {
4631 return
4632 }
4633 > type x struct{} message.pb.go
4634 > out := protoimpl.TypeBuilder{
4635 > File: protoimpl.DescBuilder{
4636 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
4637 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_deployment_v1_message_proto_rawDesc), len(file_temporal_server_api_deployment_v1_message_proto_rawDesc)),
4638 > NumEnums: 0,
4639 > NumMessages: 75,
4640 > NumExtensions: 0,
4641 > NumServices: 0,
4642 > },
4643 > GoTypes: file_temporal_server_api_deployment_v1_message_proto_goTypes,
4644 > DependencyIndexes: file_temporal_server_api_deployment_v1_message_proto_depIdxs,
4645 > MessageInfos: file_temporal_server_api_deployment_v1_message_proto_msgTypes,
4646 > }.Build()
4647 > File_temporal_server_api_deployment_v1_message_proto = out.File
4648 > file_temporal_server_api_deployment_v1_message_proto_goTypes = nil
4649 > file_temporal_server_api_deployment_v1_message_proto_depIdxs = nil
4650 }
go.temporal.io/server/api/persistence/v1/nexus.pb.go 24 covered LOC · 2 ranges

Open complete file

481 }
482
483 > func init() { file_temporal_server_api_persistence_v1_nexus_proto_init() } nexus.pb.go
484 > func file_temporal_server_api_persistence_v1_nexus_proto_init() {
485 > if File_temporal_server_api_persistence_v1_nexus_proto != nil {
486 return
487 }
488 > file_temporal_server_api_persistence_v1_nexus_proto_msgTypes[1].OneofWrappers = []any{ nexus.pb.go
489 > (*NexusEndpointTarget_Worker_)(nil),
490 > (*NexusEndpointTarget_External_)(nil),
491 > }
492 > type x struct{}
493 > out := protoimpl.TypeBuilder{
494 > File: protoimpl.DescBuilder{
495 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
496 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_nexus_proto_rawDesc), len(file_temporal_server_api_persistence_v1_nexus_proto_rawDesc)),
497 > NumEnums: 0,
498 > NumMessages: 6,
499 > NumExtensions: 0,
500 > NumServices: 0,
501 > },
502 > GoTypes: file_temporal_server_api_persistence_v1_nexus_proto_goTypes,
503 > DependencyIndexes: file_temporal_server_api_persistence_v1_nexus_proto_depIdxs,
504 > MessageInfos: file_temporal_server_api_persistence_v1_nexus_proto_msgTypes,
505 > }.Build()
506 > File_temporal_server_api_persistence_v1_nexus_proto = out.File
507 > file_temporal_server_api_persistence_v1_nexus_proto_goTypes = nil
508 > file_temporal_server_api_persistence_v1_nexus_proto_depIdxs = nil
509 }
go.temporal.io/server/api/persistence/v1/workflow_mutable_state.pb.go 24 covered LOC · 2 ranges

Open complete file

532 }
533
534 > func init() { file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_init() } workflow_mutable_state.pb.go
535 > func file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_init() {
536 > if File_temporal_server_api_persistence_v1_workflow_mutable_state_proto != nil {
537 return
538 }
539 > file_temporal_server_api_persistence_v1_chasm_proto_init() workflow_mutable_state.pb.go
540 > file_temporal_server_api_persistence_v1_executions_proto_init()
541 > file_temporal_server_api_persistence_v1_hsm_proto_init()
542 > file_temporal_server_api_persistence_v1_update_proto_init()
543 > type x struct{}
544 > out := protoimpl.TypeBuilder{
545 > File: protoimpl.DescBuilder{
546 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
547 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_rawDesc), len(file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_rawDesc)),
548 > NumEnums: 0,
549 > NumMessages: 16,
550 > NumExtensions: 0,
551 > NumServices: 0,
552 > },
553 > GoTypes: file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_goTypes,
554 > DependencyIndexes: file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_depIdxs,
555 > MessageInfos: file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_msgTypes,
556 > }.Build()
557 > File_temporal_server_api_persistence_v1_workflow_mutable_state_proto = out.File
558 > file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_goTypes = nil
559 > file_temporal_server_api_persistence_v1_workflow_mutable_state_proto_depIdxs = nil
560 }
go.temporal.io/server/chasm/lib/callback/gen/callbackpb/v1/message.pb.go 24 covered LOC · 2 ranges

Open complete file

462 }
463
464 > func init() { file_temporal_server_chasm_lib_callback_proto_v1_message_proto_init() } message.pb.go
465 > func file_temporal_server_chasm_lib_callback_proto_v1_message_proto_init() {
466 > if File_temporal_server_chasm_lib_callback_proto_v1_message_proto != nil {
467 return
468 }
469 > file_temporal_server_chasm_lib_callback_proto_v1_message_proto_msgTypes[1].OneofWrappers = []any{ message.pb.go
470 > (*Callback_Nexus_)(nil),
471 > }
472 > type x struct{}
473 > out := protoimpl.TypeBuilder{
474 > File: protoimpl.DescBuilder{
475 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
476 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_callback_proto_v1_message_proto_rawDesc), len(file_temporal_server_chasm_lib_callback_proto_v1_message_proto_rawDesc)),
477 > NumEnums: 1,
478 > NumMessages: 5,
479 > NumExtensions: 0,
480 > NumServices: 0,
481 > },
482 > GoTypes: file_temporal_server_chasm_lib_callback_proto_v1_message_proto_goTypes,
483 > DependencyIndexes: file_temporal_server_chasm_lib_callback_proto_v1_message_proto_depIdxs,
484 > EnumInfos: file_temporal_server_chasm_lib_callback_proto_v1_message_proto_enumTypes,
485 > MessageInfos: file_temporal_server_chasm_lib_callback_proto_v1_message_proto_msgTypes,
486 > }.Build()
487 > File_temporal_server_chasm_lib_callback_proto_v1_message_proto = out.File
488 > file_temporal_server_chasm_lib_callback_proto_v1_message_proto_goTypes = nil
489 > file_temporal_server_chasm_lib_callback_proto_v1_message_proto_depIdxs = nil
490 }
go.temporal.io/server/api/enums/v1/predicate.pb.go 23 covered LOC · 3 ranges

Open complete file

111 }
112
113 > func (PredicateType) Descriptor() protoreflect.EnumDescriptor { predicate.pb.go
114 > return file_temporal_server_api_enums_v1_predicate_proto_enumTypes[0].Descriptor()
115 > }
116
117 func (PredicateType) Type() protoreflect.EnumType {
170 }
171
172 > func init() { file_temporal_server_api_enums_v1_predicate_proto_init() } predicate.pb.go
173 > func file_temporal_server_api_enums_v1_predicate_proto_init() {
174 > if File_temporal_server_api_enums_v1_predicate_proto != nil {
175 return
176 }
177 > type x struct{} predicate.pb.go
178 > out := protoimpl.TypeBuilder{
179 > File: protoimpl.DescBuilder{
180 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
181 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_predicate_proto_rawDesc), len(file_temporal_server_api_enums_v1_predicate_proto_rawDesc)),
182 > NumEnums: 1,
183 > NumMessages: 0,
184 > NumExtensions: 0,
185 > NumServices: 0,
186 > },
187 > GoTypes: file_temporal_server_api_enums_v1_predicate_proto_goTypes,
188 > DependencyIndexes: file_temporal_server_api_enums_v1_predicate_proto_depIdxs,
189 > EnumInfos: file_temporal_server_api_enums_v1_predicate_proto_enumTypes,
190 > }.Build()
191 > File_temporal_server_api_enums_v1_predicate_proto = out.File
192 > file_temporal_server_api_enums_v1_predicate_proto_goTypes = nil
193 > file_temporal_server_api_enums_v1_predicate_proto_depIdxs = nil
194 }
go.temporal.io/server/api/persistence/v1/queues.pb.go 23 covered LOC · 1 range

Open complete file

616 }
617
618 > func init() { file_temporal_server_api_persistence_v1_queues_proto_init() } queues.pb.go
619 > func file_temporal_server_api_persistence_v1_queues_proto_init() {
620 > if File_temporal_server_api_persistence_v1_queues_proto != nil {
621 > return
622 > }
623 > file_temporal_server_api_persistence_v1_predicates_proto_init()
624 > type x struct{}
625 > out := protoimpl.TypeBuilder{
626 > File: protoimpl.DescBuilder{
627 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
628 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_queues_proto_rawDesc), len(file_temporal_server_api_persistence_v1_queues_proto_rawDesc)),
629 > NumEnums: 0,
630 > NumMessages: 12,
631 > NumExtensions: 0,
632 > NumServices: 0,
633 > },
634 > GoTypes: file_temporal_server_api_persistence_v1_queues_proto_goTypes,
635 > DependencyIndexes: file_temporal_server_api_persistence_v1_queues_proto_depIdxs,
636 > MessageInfos: file_temporal_server_api_persistence_v1_queues_proto_msgTypes,
637 > }.Build()
638 > File_temporal_server_api_persistence_v1_queues_proto = out.File
639 > file_temporal_server_api_persistence_v1_queues_proto_goTypes = nil
640 > file_temporal_server_api_persistence_v1_queues_proto_depIdxs = nil
641 }
go.temporal.io/server/common/dynamicconfig/shared_structure.go 23 covered LOC · 6 ranges

Open complete file

17 )
18
19 > func warnDefaultSharedStructure(key string, def any) { shared_structure.go
20 > if path := hasSharedStructure(reflect.ValueOf(def), "root"); path != "" {
21 sharedStructureWarnings.Store(key, path)
22 }
23 }
24
25 > func logSharedStructureWarnings(logger log.Logger) { shared_structure.go
26 > // If you see this warning, it means that a default value used in New*TypedSetting has a
27 > // non-nil slice or map in it. That can lead to confusing behavior since the value from
28 > // dynamic config will be merged over the default value (e.g. the slice will be appended
29 > // to, not replaced). If that behavior is desired, you can avoid this warning by using
30 > // New*TypedSettingWithConverter and referring to dynamicconfig.ConvertStructure
31 > // explicitly. Otherwise use nil slices and maps, including at the top level
32 > // (so `[]string(nil)` instead of `[]string{}`).
33 > logSharedStructureWarningsOnce.Do(func() {
34 > sharedStructureWarnings.Range(func(key, path any) bool {
35 softassert.Fail(logger,
36 "default value contains shared structure",
42 }
43
44 > func hasSharedStructure(v reflect.Value, path string) string { shared_structure.go
45 > // nolint:exhaustive // deliberately not exhaustive
46 > switch v.Kind() {
47 > case reflect.Map, reflect.Slice, reflect.Pointer:
48 > if !v.IsNil() {
49 return path
50 }
51 > case reflect.Interface: shared_structure.go
52 > if !v.IsNil() {
53 return hasSharedStructure(v.Elem(), path)
54 }
55 > case reflect.Struct: shared_structure.go
56 > for i := range v.NumField() {
57 > if p := hasSharedStructure(v.Field(i), path+"."+v.Type().Field(i).Name); p != "" {
58 return p
59 }
go.temporal.io/server/api/common/v1/api_category.pb.go 22 covered LOC · 2 ranges

Open complete file

204 }
205
206 > func init() { file_temporal_server_api_common_v1_api_category_proto_init() } api_category.pb.go
207 > func file_temporal_server_api_common_v1_api_category_proto_init() {
208 > if File_temporal_server_api_common_v1_api_category_proto != nil {
209 return
210 }
211 > type x struct{} api_category.pb.go
212 > out := protoimpl.TypeBuilder{
213 > File: protoimpl.DescBuilder{
214 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
215 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_common_v1_api_category_proto_rawDesc), len(file_temporal_server_api_common_v1_api_category_proto_rawDesc)),
216 > NumEnums: 1,
217 > NumMessages: 1,
218 > NumExtensions: 1,
219 > NumServices: 0,
220 > },
221 > GoTypes: file_temporal_server_api_common_v1_api_category_proto_goTypes,
222 > DependencyIndexes: file_temporal_server_api_common_v1_api_category_proto_depIdxs,
223 > EnumInfos: file_temporal_server_api_common_v1_api_category_proto_enumTypes,
224 > MessageInfos: file_temporal_server_api_common_v1_api_category_proto_msgTypes,
225 > ExtensionInfos: file_temporal_server_api_common_v1_api_category_proto_extTypes,
226 > }.Build()
227 > File_temporal_server_api_common_v1_api_category_proto = out.File
228 > file_temporal_server_api_common_v1_api_category_proto_goTypes = nil
229 > file_temporal_server_api_common_v1_api_category_proto_depIdxs = nil
230 }
go.temporal.io/server/chasm/lib/activity/gen/activitypb/v1/request_response.pb.go 22 covered LOC · 1 range

Open complete file

1057 }
1058
1059 > func init() { file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_init() } request_response.pb.go
1060 > func file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_init() {
1061 > if File_temporal_server_chasm_lib_activity_proto_v1_request_response_proto != nil {
1062 > return
1063 > }
1064 > type x struct{}
1065 > out := protoimpl.TypeBuilder{
1066 > File: protoimpl.DescBuilder{
1067 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1068 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_rawDesc), len(file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_rawDesc)),
1069 > NumEnums: 0,
1070 > NumMessages: 20,
1071 > NumExtensions: 0,
1072 > NumServices: 0,
1073 > },
1074 > GoTypes: file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_goTypes,
1075 > DependencyIndexes: file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_depIdxs,
1076 > MessageInfos: file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_msgTypes,
1077 > }.Build()
1078 > File_temporal_server_chasm_lib_activity_proto_v1_request_response_proto = out.File
1079 > file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_goTypes = nil
1080 > file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_depIdxs = nil
1081 }
go.temporal.io/server/chasm/lib/nexusoperation/gen/nexusoperationpb/v1/request_response.pb.go 22 covered LOC · 1 range

Open complete file

672 }
673
674 > func init() { file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_init() } request_response.pb.go
675 > func file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_init() {
676 > if File_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto != nil {
677 > return
678 > }
679 > type x struct{}
680 > out := protoimpl.TypeBuilder{
681 > File: protoimpl.DescBuilder{
682 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
683 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_rawDesc), len(file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_rawDesc)),
684 > NumEnums: 0,
685 > NumMessages: 12,
686 > NumExtensions: 0,
687 > NumServices: 0,
688 > },
689 > GoTypes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_goTypes,
690 > DependencyIndexes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_depIdxs,
691 > MessageInfos: file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_msgTypes,
692 > }.Build()
693 > File_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto = out.File
694 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_goTypes = nil
695 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_depIdxs = nil
696 }
go.temporal.io/server/common/metrics/metricstest/capture_handler.go 22 covered LOC · 5 ranges

Open complete file

55
56 // NewCaptureHandler creates a new [metrics.Handler] that captures.
57 > func NewCaptureHandler() *CaptureHandler { capture_handler.go
58 > return &CaptureHandler{
59 > captures: map[*Capture]struct{}{},
60 > capturesLock: &sync.RWMutex{},
61 > captureCount: &atomic.Int32{},
62 > }
63 > }
64
65 // StartCapture returns a started capture. StopCapture should be called on
85
86 // WithTags implements [metrics.Handler.WithTags].
87 > func (c *CaptureHandler) WithTags(tags ...metrics.Tag) metrics.Handler { capture_handler.go
88 > return &CaptureHandler{
89 > tags: append(append(make([]metrics.Tag, 0, len(c.tags)+len(tags)), c.tags...), tags...),
90 > captures: c.captures,
91 > capturesLock: c.capturesLock,
92 > captureCount: c.captureCount,
93 > }
94 > }
95
96 > func (c *CaptureHandler) record(name string, v any, unit metrics.MetricUnit, tags ...metrics.Tag) { capture_handler.go
97 > // If no captures are active, discard the metric to save memory.
98 > if c.captureCount.Load() == 0 {
99 > return capture_handler.go
100 > }
101
102 rec := &CapturedRecording{Value: v, Tags: make(map[string]string, len(c.tags)+len(tags)), Unit: unit}
120
121 // Gauge implements [metrics.Handler.Gauge].
122 > func (c *CaptureHandler) Gauge(name string) metrics.GaugeIface { capture_handler.go
123 > return metrics.GaugeFunc(func(v float64, tags ...metrics.Tag) { c.record(name, v, "", tags...) })
124 }
125
go.temporal.io/server/api/persistence/v1/task_queues.pb.go 21 covered LOC · 2 ranges

Open complete file

899 }
900
901 > func init() { file_temporal_server_api_persistence_v1_task_queues_proto_init() } task_queues.pb.go
902 > func file_temporal_server_api_persistence_v1_task_queues_proto_init() {
903 > if File_temporal_server_api_persistence_v1_task_queues_proto != nil {
904 return
905 }
906 > type x struct{} task_queues.pb.go
907 > out := protoimpl.TypeBuilder{
908 > File: protoimpl.DescBuilder{
909 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
910 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_task_queues_proto_rawDesc), len(file_temporal_server_api_persistence_v1_task_queues_proto_rawDesc)),
911 > NumEnums: 1,
912 > NumMessages: 13,
913 > NumExtensions: 0,
914 > NumServices: 0,
915 > },
916 > GoTypes: file_temporal_server_api_persistence_v1_task_queues_proto_goTypes,
917 > DependencyIndexes: file_temporal_server_api_persistence_v1_task_queues_proto_depIdxs,
918 > EnumInfos: file_temporal_server_api_persistence_v1_task_queues_proto_enumTypes,
919 > MessageInfos: file_temporal_server_api_persistence_v1_task_queues_proto_msgTypes,
920 > }.Build()
921 > File_temporal_server_api_persistence_v1_task_queues_proto = out.File
922 > file_temporal_server_api_persistence_v1_task_queues_proto_goTypes = nil
923 > file_temporal_server_api_persistence_v1_task_queues_proto_depIdxs = nil
924 }
go.temporal.io/server/api/routing/v1/extension.pb.go 21 covered LOC · 2 ranges

Open complete file

144 }
145
146 > func init() { file_temporal_server_api_routing_v1_extension_proto_init() } extension.pb.go
147 > func file_temporal_server_api_routing_v1_extension_proto_init() {
148 > if File_temporal_server_api_routing_v1_extension_proto != nil {
149 return
150 }
151 > type x struct{} extension.pb.go
152 > out := protoimpl.TypeBuilder{
153 > File: protoimpl.DescBuilder{
154 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
155 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_routing_v1_extension_proto_rawDesc), len(file_temporal_server_api_routing_v1_extension_proto_rawDesc)),
156 > NumEnums: 0,
157 > NumMessages: 1,
158 > NumExtensions: 1,
159 > NumServices: 0,
160 > },
161 > GoTypes: file_temporal_server_api_routing_v1_extension_proto_goTypes,
162 > DependencyIndexes: file_temporal_server_api_routing_v1_extension_proto_depIdxs,
163 > MessageInfos: file_temporal_server_api_routing_v1_extension_proto_msgTypes,
164 > ExtensionInfos: file_temporal_server_api_routing_v1_extension_proto_extTypes,
165 > }.Build()
166 > File_temporal_server_api_routing_v1_extension_proto = out.File
167 > file_temporal_server_api_routing_v1_extension_proto_goTypes = nil
168 > file_temporal_server_api_routing_v1_extension_proto_depIdxs = nil
169 }
go.temporal.io/server/chasm/lib/activity/gen/activitypb/v1/tasks.pb.go 21 covered LOC · 2 ranges

Open complete file

495 }
496
497 > func init() { file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_init() } tasks.pb.go
498 > func file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_init() {
499 > if File_temporal_server_chasm_lib_activity_proto_v1_tasks_proto != nil {
500 return
501 }
502 > type x struct{} tasks.pb.go
503 > out := protoimpl.TypeBuilder{
504 > File: protoimpl.DescBuilder{
505 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
506 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_rawDesc), len(file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_rawDesc)),
507 > NumEnums: 2,
508 > NumMessages: 5,
509 > NumExtensions: 0,
510 > NumServices: 0,
511 > },
512 > GoTypes: file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_goTypes,
513 > DependencyIndexes: file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_depIdxs,
514 > EnumInfos: file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_enumTypes,
515 > MessageInfos: file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_msgTypes,
516 > }.Build()
517 > File_temporal_server_chasm_lib_activity_proto_v1_tasks_proto = out.File
518 > file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_goTypes = nil
519 > file_temporal_server_chasm_lib_activity_proto_v1_tasks_proto_depIdxs = nil
520 }
go.temporal.io/server/api/adminservice/v1/service.pb.go 20 covered LOC · 2 ranges

Open complete file

273 }
274
275 > func init() { file_temporal_server_api_adminservice_v1_service_proto_init() } service.pb.go
276 > func file_temporal_server_api_adminservice_v1_service_proto_init() {
277 > if File_temporal_server_api_adminservice_v1_service_proto != nil {
278 return
279 }
280 > file_temporal_server_api_adminservice_v1_request_response_proto_init() service.pb.go
281 > type x struct{}
282 > out := protoimpl.TypeBuilder{
283 > File: protoimpl.DescBuilder{
284 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
285 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_adminservice_v1_service_proto_rawDesc), len(file_temporal_server_api_adminservice_v1_service_proto_rawDesc)),
286 > NumEnums: 0,
287 > NumMessages: 0,
288 > NumExtensions: 0,
289 > NumServices: 1,
290 > },
291 > GoTypes: file_temporal_server_api_adminservice_v1_service_proto_goTypes,
292 > DependencyIndexes: file_temporal_server_api_adminservice_v1_service_proto_depIdxs,
293 > }.Build()
294 > File_temporal_server_api_adminservice_v1_service_proto = out.File
295 > file_temporal_server_api_adminservice_v1_service_proto_goTypes = nil
296 > file_temporal_server_api_adminservice_v1_service_proto_depIdxs = nil
297 }
go.temporal.io/server/api/archiver/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

431 }
432
433 > func init() { file_temporal_server_api_archiver_v1_message_proto_init() } message.pb.go
434 > func file_temporal_server_api_archiver_v1_message_proto_init() {
435 > if File_temporal_server_api_archiver_v1_message_proto != nil {
436 return
437 }
438 > type x struct{} message.pb.go
439 > out := protoimpl.TypeBuilder{
440 > File: protoimpl.DescBuilder{
441 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
442 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_archiver_v1_message_proto_rawDesc), len(file_temporal_server_api_archiver_v1_message_proto_rawDesc)),
443 > NumEnums: 0,
444 > NumMessages: 4,
445 > NumExtensions: 0,
446 > NumServices: 0,
447 > },
448 > GoTypes: file_temporal_server_api_archiver_v1_message_proto_goTypes,
449 > DependencyIndexes: file_temporal_server_api_archiver_v1_message_proto_depIdxs,
450 > MessageInfos: file_temporal_server_api_archiver_v1_message_proto_msgTypes,
451 > }.Build()
452 > File_temporal_server_api_archiver_v1_message_proto = out.File
453 > file_temporal_server_api_archiver_v1_message_proto_goTypes = nil
454 > file_temporal_server_api_archiver_v1_message_proto_depIdxs = nil
455 }
go.temporal.io/server/api/chasm/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

206 }
207
208 > func init() { file_temporal_server_api_chasm_v1_message_proto_init() } message.pb.go
209 > func file_temporal_server_api_chasm_v1_message_proto_init() {
210 > if File_temporal_server_api_chasm_v1_message_proto != nil {
211 return
212 }
213 > type x struct{} message.pb.go
214 > out := protoimpl.TypeBuilder{
215 > File: protoimpl.DescBuilder{
216 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
217 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_chasm_v1_message_proto_rawDesc), len(file_temporal_server_api_chasm_v1_message_proto_rawDesc)),
218 > NumEnums: 0,
219 > NumMessages: 1,
220 > NumExtensions: 0,
221 > NumServices: 0,
222 > },
223 > GoTypes: file_temporal_server_api_chasm_v1_message_proto_goTypes,
224 > DependencyIndexes: file_temporal_server_api_chasm_v1_message_proto_depIdxs,
225 > MessageInfos: file_temporal_server_api_chasm_v1_message_proto_msgTypes,
226 > }.Build()
227 > File_temporal_server_api_chasm_v1_message_proto = out.File
228 > file_temporal_server_api_chasm_v1_message_proto_goTypes = nil
229 > file_temporal_server_api_chasm_v1_message_proto_depIdxs = nil
230 }
go.temporal.io/server/api/checksum/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

334 }
335
336 > func init() { file_temporal_server_api_checksum_v1_message_proto_init() } message.pb.go
337 > func file_temporal_server_api_checksum_v1_message_proto_init() {
338 > if File_temporal_server_api_checksum_v1_message_proto != nil {
339 return
340 }
341 > type x struct{} message.pb.go
342 > out := protoimpl.TypeBuilder{
343 > File: protoimpl.DescBuilder{
344 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
345 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_checksum_v1_message_proto_rawDesc), len(file_temporal_server_api_checksum_v1_message_proto_rawDesc)),
346 > NumEnums: 0,
347 > NumMessages: 1,
348 > NumExtensions: 0,
349 > NumServices: 0,
350 > },
351 > GoTypes: file_temporal_server_api_checksum_v1_message_proto_goTypes,
352 > DependencyIndexes: file_temporal_server_api_checksum_v1_message_proto_depIdxs,
353 > MessageInfos: file_temporal_server_api_checksum_v1_message_proto_msgTypes,
354 > }.Build()
355 > File_temporal_server_api_checksum_v1_message_proto = out.File
356 > file_temporal_server_api_checksum_v1_message_proto_goTypes = nil
357 > file_temporal_server_api_checksum_v1_message_proto_depIdxs = nil
358 }
go.temporal.io/server/api/cluster/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

342 }
343
344 > func init() { file_temporal_server_api_cluster_v1_message_proto_init() } message.pb.go
345 > func file_temporal_server_api_cluster_v1_message_proto_init() {
346 > if File_temporal_server_api_cluster_v1_message_proto != nil {
347 return
348 }
349 > type x struct{} message.pb.go
350 > out := protoimpl.TypeBuilder{
351 > File: protoimpl.DescBuilder{
352 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
353 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_cluster_v1_message_proto_rawDesc), len(file_temporal_server_api_cluster_v1_message_proto_rawDesc)),
354 > NumEnums: 0,
355 > NumMessages: 4,
356 > NumExtensions: 0,
357 > NumServices: 0,
358 > },
359 > GoTypes: file_temporal_server_api_cluster_v1_message_proto_goTypes,
360 > DependencyIndexes: file_temporal_server_api_cluster_v1_message_proto_depIdxs,
361 > MessageInfos: file_temporal_server_api_cluster_v1_message_proto_msgTypes,
362 > }.Build()
363 > File_temporal_server_api_cluster_v1_message_proto = out.File
364 > file_temporal_server_api_cluster_v1_message_proto_goTypes = nil
365 > file_temporal_server_api_cluster_v1_message_proto_depIdxs = nil
366 }
go.temporal.io/server/api/common/v1/dlq.pb.go 20 covered LOC · 2 ranges

Open complete file

295 }
296
297 > func init() { file_temporal_server_api_common_v1_dlq_proto_init() } dlq.pb.go
298 > func file_temporal_server_api_common_v1_dlq_proto_init() {
299 > if File_temporal_server_api_common_v1_dlq_proto != nil {
300 return
301 }
302 > type x struct{} dlq.pb.go
303 > out := protoimpl.TypeBuilder{
304 > File: protoimpl.DescBuilder{
305 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
306 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_common_v1_dlq_proto_rawDesc), len(file_temporal_server_api_common_v1_dlq_proto_rawDesc)),
307 > NumEnums: 0,
308 > NumMessages: 4,
309 > NumExtensions: 0,
310 > NumServices: 0,
311 > },
312 > GoTypes: file_temporal_server_api_common_v1_dlq_proto_goTypes,
313 > DependencyIndexes: file_temporal_server_api_common_v1_dlq_proto_depIdxs,
314 > MessageInfos: file_temporal_server_api_common_v1_dlq_proto_msgTypes,
315 > }.Build()
316 > File_temporal_server_api_common_v1_dlq_proto = out.File
317 > file_temporal_server_api_common_v1_dlq_proto_goTypes = nil
318 > file_temporal_server_api_common_v1_dlq_proto_depIdxs = nil
319 }
go.temporal.io/server/api/contextpropagation/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

109 }
110
111 > func init() { file_temporal_server_api_contextpropagation_v1_message_proto_init() } message.pb.go
112 > func file_temporal_server_api_contextpropagation_v1_message_proto_init() {
113 > if File_temporal_server_api_contextpropagation_v1_message_proto != nil {
114 return
115 }
116 > type x struct{} message.pb.go
117 > out := protoimpl.TypeBuilder{
118 > File: protoimpl.DescBuilder{
119 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
120 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_contextpropagation_v1_message_proto_rawDesc), len(file_temporal_server_api_contextpropagation_v1_message_proto_rawDesc)),
121 > NumEnums: 0,
122 > NumMessages: 2,
123 > NumExtensions: 0,
124 > NumServices: 0,
125 > },
126 > GoTypes: file_temporal_server_api_contextpropagation_v1_message_proto_goTypes,
127 > DependencyIndexes: file_temporal_server_api_contextpropagation_v1_message_proto_depIdxs,
128 > MessageInfos: file_temporal_server_api_contextpropagation_v1_message_proto_msgTypes,
129 > }.Build()
130 > File_temporal_server_api_contextpropagation_v1_message_proto = out.File
131 > file_temporal_server_api_contextpropagation_v1_message_proto_goTypes = nil
132 > file_temporal_server_api_contextpropagation_v1_message_proto_depIdxs = nil
133 }
go.temporal.io/server/api/enums/v1/cluster.pb.go 20 covered LOC · 2 ranges

Open complete file

209 }
210
211 > func init() { file_temporal_server_api_enums_v1_cluster_proto_init() } cluster.pb.go
212 > func file_temporal_server_api_enums_v1_cluster_proto_init() {
213 > if File_temporal_server_api_enums_v1_cluster_proto != nil {
214 return
215 }
216 > type x struct{} cluster.pb.go
217 > out := protoimpl.TypeBuilder{
218 > File: protoimpl.DescBuilder{
219 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
220 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_cluster_proto_rawDesc), len(file_temporal_server_api_enums_v1_cluster_proto_rawDesc)),
221 > NumEnums: 2,
222 > NumMessages: 0,
223 > NumExtensions: 0,
224 > NumServices: 0,
225 > },
226 > GoTypes: file_temporal_server_api_enums_v1_cluster_proto_goTypes,
227 > DependencyIndexes: file_temporal_server_api_enums_v1_cluster_proto_depIdxs,
228 > EnumInfos: file_temporal_server_api_enums_v1_cluster_proto_enumTypes,
229 > }.Build()
230 > File_temporal_server_api_enums_v1_cluster_proto = out.File
231 > file_temporal_server_api_enums_v1_cluster_proto_goTypes = nil
232 > file_temporal_server_api_enums_v1_cluster_proto_depIdxs = nil
233 }
go.temporal.io/server/api/enums/v1/common.pb.go 20 covered LOC · 2 ranges

Open complete file

264 }
265
266 > func init() { file_temporal_server_api_enums_v1_common_proto_init() } common.pb.go
267 > func file_temporal_server_api_enums_v1_common_proto_init() {
268 > if File_temporal_server_api_enums_v1_common_proto != nil {
269 return
270 }
271 > type x struct{} common.pb.go
272 > out := protoimpl.TypeBuilder{
273 > File: protoimpl.DescBuilder{
274 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
275 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_common_proto_rawDesc), len(file_temporal_server_api_enums_v1_common_proto_rawDesc)),
276 > NumEnums: 3,
277 > NumMessages: 0,
278 > NumExtensions: 0,
279 > NumServices: 0,
280 > },
281 > GoTypes: file_temporal_server_api_enums_v1_common_proto_goTypes,
282 > DependencyIndexes: file_temporal_server_api_enums_v1_common_proto_depIdxs,
283 > EnumInfos: file_temporal_server_api_enums_v1_common_proto_enumTypes,
284 > }.Build()
285 > File_temporal_server_api_enums_v1_common_proto = out.File
286 > file_temporal_server_api_enums_v1_common_proto_goTypes = nil
287 > file_temporal_server_api_enums_v1_common_proto_depIdxs = nil
288 }
go.temporal.io/server/api/enums/v1/dlq.pb.go 20 covered LOC · 2 ranges

Open complete file

187 }
188
189 > func init() { file_temporal_server_api_enums_v1_dlq_proto_init() } dlq.pb.go
190 > func file_temporal_server_api_enums_v1_dlq_proto_init() {
191 > if File_temporal_server_api_enums_v1_dlq_proto != nil {
192 return
193 }
194 > type x struct{} dlq.pb.go
195 > out := protoimpl.TypeBuilder{
196 > File: protoimpl.DescBuilder{
197 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
198 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_dlq_proto_rawDesc), len(file_temporal_server_api_enums_v1_dlq_proto_rawDesc)),
199 > NumEnums: 2,
200 > NumMessages: 0,
201 > NumExtensions: 0,
202 > NumServices: 0,
203 > },
204 > GoTypes: file_temporal_server_api_enums_v1_dlq_proto_goTypes,
205 > DependencyIndexes: file_temporal_server_api_enums_v1_dlq_proto_depIdxs,
206 > EnumInfos: file_temporal_server_api_enums_v1_dlq_proto_enumTypes,
207 > }.Build()
208 > File_temporal_server_api_enums_v1_dlq_proto = out.File
209 > file_temporal_server_api_enums_v1_dlq_proto_goTypes = nil
210 > file_temporal_server_api_enums_v1_dlq_proto_depIdxs = nil
211 }
go.temporal.io/server/api/enums/v1/fairness_state.pb.go 20 covered LOC · 2 ranges

Open complete file

123 }
124
125 > func init() { file_temporal_server_api_enums_v1_fairness_state_proto_init() } fairness_state.pb.go
126 > func file_temporal_server_api_enums_v1_fairness_state_proto_init() {
127 > if File_temporal_server_api_enums_v1_fairness_state_proto != nil {
128 return
129 }
130 > type x struct{} fairness_state.pb.go
131 > out := protoimpl.TypeBuilder{
132 > File: protoimpl.DescBuilder{
133 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
134 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_fairness_state_proto_rawDesc), len(file_temporal_server_api_enums_v1_fairness_state_proto_rawDesc)),
135 > NumEnums: 1,
136 > NumMessages: 0,
137 > NumExtensions: 0,
138 > NumServices: 0,
139 > },
140 > GoTypes: file_temporal_server_api_enums_v1_fairness_state_proto_goTypes,
141 > DependencyIndexes: file_temporal_server_api_enums_v1_fairness_state_proto_depIdxs,
142 > EnumInfos: file_temporal_server_api_enums_v1_fairness_state_proto_enumTypes,
143 > }.Build()
144 > File_temporal_server_api_enums_v1_fairness_state_proto = out.File
145 > file_temporal_server_api_enums_v1_fairness_state_proto_goTypes = nil
146 > file_temporal_server_api_enums_v1_fairness_state_proto_depIdxs = nil
147 }
go.temporal.io/server/api/enums/v1/nexus.pb.go 20 covered LOC · 2 ranges

Open complete file

158 }
159
160 > func init() { file_temporal_server_api_enums_v1_nexus_proto_init() } nexus.pb.go
161 > func file_temporal_server_api_enums_v1_nexus_proto_init() {
162 > if File_temporal_server_api_enums_v1_nexus_proto != nil {
163 return
164 }
165 > type x struct{} nexus.pb.go
166 > out := protoimpl.TypeBuilder{
167 > File: protoimpl.DescBuilder{
168 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
169 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_nexus_proto_rawDesc), len(file_temporal_server_api_enums_v1_nexus_proto_rawDesc)),
170 > NumEnums: 1,
171 > NumMessages: 0,
172 > NumExtensions: 0,
173 > NumServices: 0,
174 > },
175 > GoTypes: file_temporal_server_api_enums_v1_nexus_proto_goTypes,
176 > DependencyIndexes: file_temporal_server_api_enums_v1_nexus_proto_depIdxs,
177 > EnumInfos: file_temporal_server_api_enums_v1_nexus_proto_enumTypes,
178 > }.Build()
179 > File_temporal_server_api_enums_v1_nexus_proto = out.File
180 > file_temporal_server_api_enums_v1_nexus_proto_goTypes = nil
181 > file_temporal_server_api_enums_v1_nexus_proto_depIdxs = nil
182 }
go.temporal.io/server/api/enums/v1/replication.pb.go 20 covered LOC · 2 ranges

Open complete file

314 }
315
316 > func init() { file_temporal_server_api_enums_v1_replication_proto_init() } replication.pb.go
317 > func file_temporal_server_api_enums_v1_replication_proto_init() {
318 > if File_temporal_server_api_enums_v1_replication_proto != nil {
319 return
320 }
321 > type x struct{} replication.pb.go
322 > out := protoimpl.TypeBuilder{
323 > File: protoimpl.DescBuilder{
324 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
325 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_replication_proto_rawDesc), len(file_temporal_server_api_enums_v1_replication_proto_rawDesc)),
326 > NumEnums: 3,
327 > NumMessages: 0,
328 > NumExtensions: 0,
329 > NumServices: 0,
330 > },
331 > GoTypes: file_temporal_server_api_enums_v1_replication_proto_goTypes,
332 > DependencyIndexes: file_temporal_server_api_enums_v1_replication_proto_depIdxs,
333 > EnumInfos: file_temporal_server_api_enums_v1_replication_proto_enumTypes,
334 > }.Build()
335 > File_temporal_server_api_enums_v1_replication_proto = out.File
336 > file_temporal_server_api_enums_v1_replication_proto_goTypes = nil
337 > file_temporal_server_api_enums_v1_replication_proto_depIdxs = nil
338 }
go.temporal.io/server/api/enums/v1/workflow.pb.go 20 covered LOC · 2 ranges

Open complete file

275 }
276
277 > func init() { file_temporal_server_api_enums_v1_workflow_proto_init() } workflow.pb.go
278 > func file_temporal_server_api_enums_v1_workflow_proto_init() {
279 > if File_temporal_server_api_enums_v1_workflow_proto != nil {
280 return
281 }
282 > type x struct{} workflow.pb.go
283 > out := protoimpl.TypeBuilder{
284 > File: protoimpl.DescBuilder{
285 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
286 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_workflow_proto_rawDesc), len(file_temporal_server_api_enums_v1_workflow_proto_rawDesc)),
287 > NumEnums: 3,
288 > NumMessages: 0,
289 > NumExtensions: 0,
290 > NumServices: 0,
291 > },
292 > GoTypes: file_temporal_server_api_enums_v1_workflow_proto_goTypes,
293 > DependencyIndexes: file_temporal_server_api_enums_v1_workflow_proto_depIdxs,
294 > EnumInfos: file_temporal_server_api_enums_v1_workflow_proto_enumTypes,
295 > }.Build()
296 > File_temporal_server_api_enums_v1_workflow_proto = out.File
297 > file_temporal_server_api_enums_v1_workflow_proto_goTypes = nil
298 > file_temporal_server_api_enums_v1_workflow_proto_depIdxs = nil
299 }
go.temporal.io/server/api/enums/v1/workflow_task_type.pb.go 20 covered LOC · 2 ranges

Open complete file

124 }
125
126 > func init() { file_temporal_server_api_enums_v1_workflow_task_type_proto_init() } workflow_task_type.pb.go
127 > func file_temporal_server_api_enums_v1_workflow_task_type_proto_init() {
128 > if File_temporal_server_api_enums_v1_workflow_task_type_proto != nil {
129 return
130 }
131 > type x struct{} workflow_task_type.pb.go
132 > out := protoimpl.TypeBuilder{
133 > File: protoimpl.DescBuilder{
134 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
135 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_enums_v1_workflow_task_type_proto_rawDesc), len(file_temporal_server_api_enums_v1_workflow_task_type_proto_rawDesc)),
136 > NumEnums: 1,
137 > NumMessages: 0,
138 > NumExtensions: 0,
139 > NumServices: 0,
140 > },
141 > GoTypes: file_temporal_server_api_enums_v1_workflow_task_type_proto_goTypes,
142 > DependencyIndexes: file_temporal_server_api_enums_v1_workflow_task_type_proto_depIdxs,
143 > EnumInfos: file_temporal_server_api_enums_v1_workflow_task_type_proto_enumTypes,
144 > }.Build()
145 > File_temporal_server_api_enums_v1_workflow_task_type_proto = out.File
146 > file_temporal_server_api_enums_v1_workflow_task_type_proto_goTypes = nil
147 > file_temporal_server_api_enums_v1_workflow_task_type_proto_depIdxs = nil
148 }
go.temporal.io/server/api/errordetails/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

625 }
626
627 > func init() { file_temporal_server_api_errordetails_v1_message_proto_init() } message.pb.go
628 > func file_temporal_server_api_errordetails_v1_message_proto_init() {
629 > if File_temporal_server_api_errordetails_v1_message_proto != nil {
630 return
631 }
632 > type x struct{} message.pb.go
633 > out := protoimpl.TypeBuilder{
634 > File: protoimpl.DescBuilder{
635 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
636 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_errordetails_v1_message_proto_rawDesc), len(file_temporal_server_api_errordetails_v1_message_proto_rawDesc)),
637 > NumEnums: 0,
638 > NumMessages: 10,
639 > NumExtensions: 0,
640 > NumServices: 0,
641 > },
642 > GoTypes: file_temporal_server_api_errordetails_v1_message_proto_goTypes,
643 > DependencyIndexes: file_temporal_server_api_errordetails_v1_message_proto_depIdxs,
644 > MessageInfos: file_temporal_server_api_errordetails_v1_message_proto_msgTypes,
645 > }.Build()
646 > File_temporal_server_api_errordetails_v1_message_proto = out.File
647 > file_temporal_server_api_errordetails_v1_message_proto_goTypes = nil
648 > file_temporal_server_api_errordetails_v1_message_proto_depIdxs = nil
649 }
go.temporal.io/server/api/health/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

300 }
301
302 > func init() { file_temporal_server_api_health_v1_message_proto_init() } message.pb.go
303 > func file_temporal_server_api_health_v1_message_proto_init() {
304 > if File_temporal_server_api_health_v1_message_proto != nil {
305 return
306 }
307 > type x struct{} message.pb.go
308 > out := protoimpl.TypeBuilder{
309 > File: protoimpl.DescBuilder{
310 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
311 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_health_v1_message_proto_rawDesc), len(file_temporal_server_api_health_v1_message_proto_rawDesc)),
312 > NumEnums: 0,
313 > NumMessages: 3,
314 > NumExtensions: 0,
315 > NumServices: 0,
316 > },
317 > GoTypes: file_temporal_server_api_health_v1_message_proto_goTypes,
318 > DependencyIndexes: file_temporal_server_api_health_v1_message_proto_depIdxs,
319 > MessageInfos: file_temporal_server_api_health_v1_message_proto_msgTypes,
320 > }.Build()
321 > File_temporal_server_api_health_v1_message_proto = out.File
322 > file_temporal_server_api_health_v1_message_proto_goTypes = nil
323 > file_temporal_server_api_health_v1_message_proto_depIdxs = nil
324 }
go.temporal.io/server/api/history/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

498 }
499
500 > func init() { file_temporal_server_api_history_v1_message_proto_init() } message.pb.go
501 > func file_temporal_server_api_history_v1_message_proto_init() {
502 > if File_temporal_server_api_history_v1_message_proto != nil {
503 return
504 }
505 > type x struct{} message.pb.go
506 > out := protoimpl.TypeBuilder{
507 > File: protoimpl.DescBuilder{
508 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
509 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_history_v1_message_proto_rawDesc), len(file_temporal_server_api_history_v1_message_proto_rawDesc)),
510 > NumEnums: 0,
511 > NumMessages: 8,
512 > NumExtensions: 0,
513 > NumServices: 0,
514 > },
515 > GoTypes: file_temporal_server_api_history_v1_message_proto_goTypes,
516 > DependencyIndexes: file_temporal_server_api_history_v1_message_proto_depIdxs,
517 > MessageInfos: file_temporal_server_api_history_v1_message_proto_msgTypes,
518 > }.Build()
519 > File_temporal_server_api_history_v1_message_proto = out.File
520 > file_temporal_server_api_history_v1_message_proto_goTypes = nil
521 > file_temporal_server_api_history_v1_message_proto_depIdxs = nil
522 }
go.temporal.io/server/api/historyservice/v1/service.pb.go 20 covered LOC · 2 ranges

Open complete file

428 }
429
430 > func init() { file_temporal_server_api_historyservice_v1_service_proto_init() } service.pb.go
431 > func file_temporal_server_api_historyservice_v1_service_proto_init() {
432 > if File_temporal_server_api_historyservice_v1_service_proto != nil {
433 return
434 }
435 > file_temporal_server_api_historyservice_v1_request_response_proto_init() service.pb.go
436 > type x struct{}
437 > out := protoimpl.TypeBuilder{
438 > File: protoimpl.DescBuilder{
439 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
440 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_historyservice_v1_service_proto_rawDesc), len(file_temporal_server_api_historyservice_v1_service_proto_rawDesc)),
441 > NumEnums: 0,
442 > NumMessages: 0,
443 > NumExtensions: 0,
444 > NumServices: 1,
445 > },
446 > GoTypes: file_temporal_server_api_historyservice_v1_service_proto_goTypes,
447 > DependencyIndexes: file_temporal_server_api_historyservice_v1_service_proto_depIdxs,
448 > }.Build()
449 > File_temporal_server_api_historyservice_v1_service_proto = out.File
450 > file_temporal_server_api_historyservice_v1_service_proto_goTypes = nil
451 > file_temporal_server_api_historyservice_v1_service_proto_depIdxs = nil
452 }
go.temporal.io/server/api/matchingservice/v1/service.pb.go 20 covered LOC · 2 ranges

Open complete file

250 }
251
252 > func init() { file_temporal_server_api_matchingservice_v1_service_proto_init() } service.pb.go
253 > func file_temporal_server_api_matchingservice_v1_service_proto_init() {
254 > if File_temporal_server_api_matchingservice_v1_service_proto != nil {
255 return
256 }
257 > file_temporal_server_api_matchingservice_v1_request_response_proto_init() service.pb.go
258 > type x struct{}
259 > out := protoimpl.TypeBuilder{
260 > File: protoimpl.DescBuilder{
261 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
262 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_matchingservice_v1_service_proto_rawDesc), len(file_temporal_server_api_matchingservice_v1_service_proto_rawDesc)),
263 > NumEnums: 0,
264 > NumMessages: 0,
265 > NumExtensions: 0,
266 > NumServices: 1,
267 > },
268 > GoTypes: file_temporal_server_api_matchingservice_v1_service_proto_goTypes,
269 > DependencyIndexes: file_temporal_server_api_matchingservice_v1_service_proto_depIdxs,
270 > }.Build()
271 > File_temporal_server_api_matchingservice_v1_service_proto = out.File
272 > file_temporal_server_api_matchingservice_v1_service_proto_goTypes = nil
273 > file_temporal_server_api_matchingservice_v1_service_proto_depIdxs = nil
274 }
go.temporal.io/server/api/metrics/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

104 }
105
106 > func init() { file_temporal_server_api_metrics_v1_message_proto_init() } message.pb.go
107 > func file_temporal_server_api_metrics_v1_message_proto_init() {
108 > if File_temporal_server_api_metrics_v1_message_proto != nil {
109 return
110 }
111 > type x struct{} message.pb.go
112 > out := protoimpl.TypeBuilder{
113 > File: protoimpl.DescBuilder{
114 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
115 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_metrics_v1_message_proto_rawDesc), len(file_temporal_server_api_metrics_v1_message_proto_rawDesc)),
116 > NumEnums: 0,
117 > NumMessages: 2,
118 > NumExtensions: 0,
119 > NumServices: 0,
120 > },
121 > GoTypes: file_temporal_server_api_metrics_v1_message_proto_goTypes,
122 > DependencyIndexes: file_temporal_server_api_metrics_v1_message_proto_depIdxs,
123 > MessageInfos: file_temporal_server_api_metrics_v1_message_proto_msgTypes,
124 > }.Build()
125 > File_temporal_server_api_metrics_v1_message_proto = out.File
126 > file_temporal_server_api_metrics_v1_message_proto_goTypes = nil
127 > file_temporal_server_api_metrics_v1_message_proto_depIdxs = nil
128 }
go.temporal.io/server/api/namespace/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

114 }
115
116 > func init() { file_temporal_server_api_namespace_v1_message_proto_init() } message.pb.go
117 > func file_temporal_server_api_namespace_v1_message_proto_init() {
118 > if File_temporal_server_api_namespace_v1_message_proto != nil {
119 return
120 }
121 > type x struct{} message.pb.go
122 > out := protoimpl.TypeBuilder{
123 > File: protoimpl.DescBuilder{
124 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
125 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_namespace_v1_message_proto_rawDesc), len(file_temporal_server_api_namespace_v1_message_proto_rawDesc)),
126 > NumEnums: 0,
127 > NumMessages: 1,
128 > NumExtensions: 0,
129 > NumServices: 0,
130 > },
131 > GoTypes: file_temporal_server_api_namespace_v1_message_proto_goTypes,
132 > DependencyIndexes: file_temporal_server_api_namespace_v1_message_proto_depIdxs,
133 > MessageInfos: file_temporal_server_api_namespace_v1_message_proto_msgTypes,
134 > }.Build()
135 > File_temporal_server_api_namespace_v1_message_proto = out.File
136 > file_temporal_server_api_namespace_v1_message_proto_goTypes = nil
137 > file_temporal_server_api_namespace_v1_message_proto_depIdxs = nil
138 }
go.temporal.io/server/api/persistence/v1/chasm_visibility.pb.go 20 covered LOC · 2 ranges

Open complete file

146 }
147
148 > func init() { file_temporal_server_api_persistence_v1_chasm_visibility_proto_init() } chasm_visibility.pb.go
149 > func file_temporal_server_api_persistence_v1_chasm_visibility_proto_init() {
150 > if File_temporal_server_api_persistence_v1_chasm_visibility_proto != nil {
151 return
152 }
153 > type x struct{} chasm_visibility.pb.go
154 > out := protoimpl.TypeBuilder{
155 > File: protoimpl.DescBuilder{
156 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
157 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_chasm_visibility_proto_rawDesc), len(file_temporal_server_api_persistence_v1_chasm_visibility_proto_rawDesc)),
158 > NumEnums: 0,
159 > NumMessages: 2,
160 > NumExtensions: 0,
161 > NumServices: 0,
162 > },
163 > GoTypes: file_temporal_server_api_persistence_v1_chasm_visibility_proto_goTypes,
164 > DependencyIndexes: file_temporal_server_api_persistence_v1_chasm_visibility_proto_depIdxs,
165 > MessageInfos: file_temporal_server_api_persistence_v1_chasm_visibility_proto_msgTypes,
166 > }.Build()
167 > File_temporal_server_api_persistence_v1_chasm_visibility_proto = out.File
168 > file_temporal_server_api_persistence_v1_chasm_visibility_proto_goTypes = nil
169 > file_temporal_server_api_persistence_v1_chasm_visibility_proto_depIdxs = nil
170 }
go.temporal.io/server/api/persistence/v1/cluster_metadata.pb.go 20 covered LOC · 2 ranges

Open complete file

289 }
290
291 > func init() { file_temporal_server_api_persistence_v1_cluster_metadata_proto_init() } cluster_metadata.pb.go
292 > func file_temporal_server_api_persistence_v1_cluster_metadata_proto_init() {
293 > if File_temporal_server_api_persistence_v1_cluster_metadata_proto != nil {
294 return
295 }
296 > type x struct{} cluster_metadata.pb.go
297 > out := protoimpl.TypeBuilder{
298 > File: protoimpl.DescBuilder{
299 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
300 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_cluster_metadata_proto_rawDesc), len(file_temporal_server_api_persistence_v1_cluster_metadata_proto_rawDesc)),
301 > NumEnums: 0,
302 > NumMessages: 5,
303 > NumExtensions: 0,
304 > NumServices: 0,
305 > },
306 > GoTypes: file_temporal_server_api_persistence_v1_cluster_metadata_proto_goTypes,
307 > DependencyIndexes: file_temporal_server_api_persistence_v1_cluster_metadata_proto_depIdxs,
308 > MessageInfos: file_temporal_server_api_persistence_v1_cluster_metadata_proto_msgTypes,
309 > }.Build()
310 > File_temporal_server_api_persistence_v1_cluster_metadata_proto = out.File
311 > file_temporal_server_api_persistence_v1_cluster_metadata_proto_goTypes = nil
312 > file_temporal_server_api_persistence_v1_cluster_metadata_proto_depIdxs = nil
313 }
go.temporal.io/server/api/persistence/v1/history_tree.pb.go 20 covered LOC · 2 ranges

Open complete file

274 }
275
276 > func init() { file_temporal_server_api_persistence_v1_history_tree_proto_init() } history_tree.pb.go
277 > func file_temporal_server_api_persistence_v1_history_tree_proto_init() {
278 > if File_temporal_server_api_persistence_v1_history_tree_proto != nil {
279 return
280 }
281 > type x struct{} history_tree.pb.go
282 > out := protoimpl.TypeBuilder{
283 > File: protoimpl.DescBuilder{
284 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
285 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_history_tree_proto_rawDesc), len(file_temporal_server_api_persistence_v1_history_tree_proto_rawDesc)),
286 > NumEnums: 0,
287 > NumMessages: 3,
288 > NumExtensions: 0,
289 > NumServices: 0,
290 > },
291 > GoTypes: file_temporal_server_api_persistence_v1_history_tree_proto_goTypes,
292 > DependencyIndexes: file_temporal_server_api_persistence_v1_history_tree_proto_depIdxs,
293 > MessageInfos: file_temporal_server_api_persistence_v1_history_tree_proto_msgTypes,
294 > }.Build()
295 > File_temporal_server_api_persistence_v1_history_tree_proto = out.File
296 > file_temporal_server_api_persistence_v1_history_tree_proto_goTypes = nil
297 > file_temporal_server_api_persistence_v1_history_tree_proto_depIdxs = nil
298 }
go.temporal.io/server/api/persistence/v1/namespaces.pb.go 20 covered LOC · 2 ranges

Open complete file

536 }
537
538 > func init() { file_temporal_server_api_persistence_v1_namespaces_proto_init() } namespaces.pb.go
539 > func file_temporal_server_api_persistence_v1_namespaces_proto_init() {
540 > if File_temporal_server_api_persistence_v1_namespaces_proto != nil {
541 return
542 }
543 > type x struct{} namespaces.pb.go
544 > out := protoimpl.TypeBuilder{
545 > File: protoimpl.DescBuilder{
546 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
547 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_namespaces_proto_rawDesc), len(file_temporal_server_api_persistence_v1_namespaces_proto_rawDesc)),
548 > NumEnums: 0,
549 > NumMessages: 8,
550 > NumExtensions: 0,
551 > NumServices: 0,
552 > },
553 > GoTypes: file_temporal_server_api_persistence_v1_namespaces_proto_goTypes,
554 > DependencyIndexes: file_temporal_server_api_persistence_v1_namespaces_proto_depIdxs,
555 > MessageInfos: file_temporal_server_api_persistence_v1_namespaces_proto_msgTypes,
556 > }.Build()
557 > File_temporal_server_api_persistence_v1_namespaces_proto = out.File
558 > file_temporal_server_api_persistence_v1_namespaces_proto_goTypes = nil
559 > file_temporal_server_api_persistence_v1_namespaces_proto_depIdxs = nil
560 }
go.temporal.io/server/api/persistence/v1/queue_metadata.pb.go 20 covered LOC · 2 ranges

Open complete file

105 }
106
107 > func init() { file_temporal_server_api_persistence_v1_queue_metadata_proto_init() } queue_metadata.pb.go
108 > func file_temporal_server_api_persistence_v1_queue_metadata_proto_init() {
109 > if File_temporal_server_api_persistence_v1_queue_metadata_proto != nil {
110 return
111 }
112 > type x struct{} queue_metadata.pb.go
113 > out := protoimpl.TypeBuilder{
114 > File: protoimpl.DescBuilder{
115 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
116 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_persistence_v1_queue_metadata_proto_rawDesc), len(file_temporal_server_api_persistence_v1_queue_metadata_proto_rawDesc)),
117 > NumEnums: 0,
118 > NumMessages: 2,
119 > NumExtensions: 0,
120 > NumServices: 0,
121 > },
122 > GoTypes: file_temporal_server_api_persistence_v1_queue_metadata_proto_goTypes,
123 > DependencyIndexes: file_temporal_server_api_persistence_v1_queue_metadata_proto_depIdxs,
124 > MessageInfos: file_temporal_server_api_persistence_v1_queue_metadata_proto_msgTypes,
125 > }.Build()
126 > File_temporal_server_api_persistence_v1_queue_metadata_proto = out.File
127 > file_temporal_server_api_persistence_v1_queue_metadata_proto_goTypes = nil
128 > file_temporal_server_api_persistence_v1_queue_metadata_proto_depIdxs = nil
129 }
go.temporal.io/server/api/token/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

785 }
786
787 > func init() { file_temporal_server_api_token_v1_message_proto_init() } message.pb.go
788 > func file_temporal_server_api_token_v1_message_proto_init() {
789 > if File_temporal_server_api_token_v1_message_proto != nil {
790 return
791 }
792 > type x struct{} message.pb.go
793 > out := protoimpl.TypeBuilder{
794 > File: protoimpl.DescBuilder{
795 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
796 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_token_v1_message_proto_rawDesc), len(file_temporal_server_api_token_v1_message_proto_rawDesc)),
797 > NumEnums: 0,
798 > NumMessages: 7,
799 > NumExtensions: 0,
800 > NumServices: 0,
801 > },
802 > GoTypes: file_temporal_server_api_token_v1_message_proto_goTypes,
803 > DependencyIndexes: file_temporal_server_api_token_v1_message_proto_depIdxs,
804 > MessageInfos: file_temporal_server_api_token_v1_message_proto_msgTypes,
805 > }.Build()
806 > File_temporal_server_api_token_v1_message_proto = out.File
807 > file_temporal_server_api_token_v1_message_proto_goTypes = nil
808 > file_temporal_server_api_token_v1_message_proto_depIdxs = nil
809 }
go.temporal.io/server/api/visibilityservice/v1/request_response.pb.go 20 covered LOC · 2 ranges

Open complete file

402 }
403
404 > func init() { file_temporal_server_api_visibilityservice_v1_request_response_proto_init() } request_response.pb.go
405 > func file_temporal_server_api_visibilityservice_v1_request_response_proto_init() {
406 > if File_temporal_server_api_visibilityservice_v1_request_response_proto != nil {
407 return
408 }
409 > type x struct{} request_response.pb.go
410 > out := protoimpl.TypeBuilder{
411 > File: protoimpl.DescBuilder{
412 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
413 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_visibilityservice_v1_request_response_proto_rawDesc), len(file_temporal_server_api_visibilityservice_v1_request_response_proto_rawDesc)),
414 > NumEnums: 0,
415 > NumMessages: 5,
416 > NumExtensions: 0,
417 > NumServices: 0,
418 > },
419 > GoTypes: file_temporal_server_api_visibilityservice_v1_request_response_proto_goTypes,
420 > DependencyIndexes: file_temporal_server_api_visibilityservice_v1_request_response_proto_depIdxs,
421 > MessageInfos: file_temporal_server_api_visibilityservice_v1_request_response_proto_msgTypes,
422 > }.Build()
423 > File_temporal_server_api_visibilityservice_v1_request_response_proto = out.File
424 > file_temporal_server_api_visibilityservice_v1_request_response_proto_goTypes = nil
425 > file_temporal_server_api_visibilityservice_v1_request_response_proto_depIdxs = nil
426 }
go.temporal.io/server/api/workflow/v1/message.pb.go 20 covered LOC · 2 ranges

Open complete file

278 }
279
280 > func init() { file_temporal_server_api_workflow_v1_message_proto_init() } message.pb.go
281 > func file_temporal_server_api_workflow_v1_message_proto_init() {
282 > if File_temporal_server_api_workflow_v1_message_proto != nil {
283 return
284 }
285 > type x struct{} message.pb.go
286 > out := protoimpl.TypeBuilder{
287 > File: protoimpl.DescBuilder{
288 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
289 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_workflow_v1_message_proto_rawDesc), len(file_temporal_server_api_workflow_v1_message_proto_rawDesc)),
290 > NumEnums: 0,
291 > NumMessages: 3,
292 > NumExtensions: 0,
293 > NumServices: 0,
294 > },
295 > GoTypes: file_temporal_server_api_workflow_v1_message_proto_goTypes,
296 > DependencyIndexes: file_temporal_server_api_workflow_v1_message_proto_depIdxs,
297 > MessageInfos: file_temporal_server_api_workflow_v1_message_proto_msgTypes,
298 > }.Build()
299 > File_temporal_server_api_workflow_v1_message_proto = out.File
300 > file_temporal_server_api_workflow_v1_message_proto_goTypes = nil
301 > file_temporal_server_api_workflow_v1_message_proto_depIdxs = nil
302 }
go.temporal.io/server/chasm/lib/activity/gen/activitypb/v1/service.pb.go 20 covered LOC · 2 ranges

Open complete file

91 }
92
93 > func init() { file_temporal_server_chasm_lib_activity_proto_v1_service_proto_init() } service.pb.go
94 > func file_temporal_server_chasm_lib_activity_proto_v1_service_proto_init() {
95 > if File_temporal_server_chasm_lib_activity_proto_v1_service_proto != nil {
96 return
97 }
98 > file_temporal_server_chasm_lib_activity_proto_v1_request_response_proto_init() service.pb.go
99 > type x struct{}
100 > out := protoimpl.TypeBuilder{
101 > File: protoimpl.DescBuilder{
102 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
103 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_activity_proto_v1_service_proto_rawDesc), len(file_temporal_server_chasm_lib_activity_proto_v1_service_proto_rawDesc)),
104 > NumEnums: 0,
105 > NumMessages: 0,
106 > NumExtensions: 0,
107 > NumServices: 1,
108 > },
109 > GoTypes: file_temporal_server_chasm_lib_activity_proto_v1_service_proto_goTypes,
110 > DependencyIndexes: file_temporal_server_chasm_lib_activity_proto_v1_service_proto_depIdxs,
111 > }.Build()
112 > File_temporal_server_chasm_lib_activity_proto_v1_service_proto = out.File
113 > file_temporal_server_chasm_lib_activity_proto_v1_service_proto_goTypes = nil
114 > file_temporal_server_chasm_lib_activity_proto_v1_service_proto_depIdxs = nil
115 }
go.temporal.io/server/chasm/lib/callback/gen/callbackpb/v1/tasks.pb.go 20 covered LOC · 2 ranges

Open complete file

148 }
149
150 > func init() { file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_init() } tasks.pb.go
151 > func file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_init() {
152 > if File_temporal_server_chasm_lib_callback_proto_v1_tasks_proto != nil {
153 return
154 }
155 > type x struct{} tasks.pb.go
156 > out := protoimpl.TypeBuilder{
157 > File: protoimpl.DescBuilder{
158 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
159 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_rawDesc), len(file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_rawDesc)),
160 > NumEnums: 0,
161 > NumMessages: 2,
162 > NumExtensions: 0,
163 > NumServices: 0,
164 > },
165 > GoTypes: file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_goTypes,
166 > DependencyIndexes: file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_depIdxs,
167 > MessageInfos: file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_msgTypes,
168 > }.Build()
169 > File_temporal_server_chasm_lib_callback_proto_v1_tasks_proto = out.File
170 > file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_goTypes = nil
171 > file_temporal_server_chasm_lib_callback_proto_v1_tasks_proto_depIdxs = nil
172 }
go.temporal.io/server/chasm/lib/nexusoperation/gen/nexusoperationpb/v1/service.pb.go 20 covered LOC · 2 ranges

Open complete file

71 }
72
73 > func init() { file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_init() } service.pb.go
74 > func file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_init() {
75 > if File_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto != nil {
76 return
77 }
78 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_request_response_proto_init() service.pb.go
79 > type x struct{}
80 > out := protoimpl.TypeBuilder{
81 > File: protoimpl.DescBuilder{
82 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
83 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_rawDesc), len(file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_rawDesc)),
84 > NumEnums: 0,
85 > NumMessages: 0,
86 > NumExtensions: 0,
87 > NumServices: 1,
88 > },
89 > GoTypes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_goTypes,
90 > DependencyIndexes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_depIdxs,
91 > }.Build()
92 > File_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto = out.File
93 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_goTypes = nil
94 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_service_proto_depIdxs = nil
95 }
go.temporal.io/server/chasm/lib/nexusoperation/gen/nexusoperationpb/v1/tasks.pb.go 20 covered LOC · 2 ranges

Open complete file

354 }
355
356 > func init() { file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_init() } tasks.pb.go
357 > func file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_init() {
358 > if File_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto != nil {
359 return
360 }
361 > type x struct{} tasks.pb.go
362 > out := protoimpl.TypeBuilder{
363 > File: protoimpl.DescBuilder{
364 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
365 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_rawDesc), len(file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_rawDesc)),
366 > NumEnums: 0,
367 > NumMessages: 7,
368 > NumExtensions: 0,
369 > NumServices: 0,
370 > },
371 > GoTypes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_goTypes,
372 > DependencyIndexes: file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_depIdxs,
373 > MessageInfos: file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_msgTypes,
374 > }.Build()
375 > File_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto = out.File
376 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_goTypes = nil
377 > file_temporal_server_chasm_lib_nexusoperation_proto_v1_tasks_proto_depIdxs = nil
378 }
go.temporal.io/server/chasm/lib/workflow/gen/workflowpb/v1/state.pb.go 20 covered LOC · 2 ranges

Open complete file

211 }
212
213 > func init() { file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_init() } state.pb.go
214 > func file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_init() {
215 > if File_temporal_server_chasm_lib_workflow_proto_v1_state_proto != nil {
216 return
217 }
218 > type x struct{} state.pb.go
219 > out := protoimpl.TypeBuilder{
220 > File: protoimpl.DescBuilder{
221 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
222 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_rawDesc), len(file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_rawDesc)),
223 > NumEnums: 0,
224 > NumMessages: 3,
225 > NumExtensions: 0,
226 > NumServices: 0,
227 > },
228 > GoTypes: file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_goTypes,
229 > DependencyIndexes: file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_depIdxs,
230 > MessageInfos: file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_msgTypes,
231 > }.Build()
232 > File_temporal_server_chasm_lib_workflow_proto_v1_state_proto = out.File
233 > file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_goTypes = nil
234 > file_temporal_server_chasm_lib_workflow_proto_v1_state_proto_depIdxs = nil
235 }
go.temporal.io/server/chasm/lib/workflow/gen/workflowpb/v1/update_state.pb.go 20 covered LOC · 2 ranges

Open complete file

113 }
114
115 > func init() { file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_init() } update_state.pb.go
116 > func file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_init() {
117 > if File_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto != nil {
118 return
119 }
120 > type x struct{} update_state.pb.go
121 > out := protoimpl.TypeBuilder{
122 > File: protoimpl.DescBuilder{
123 > GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
124 > RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_rawDesc), len(file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_rawDesc)),
125 > NumEnums: 0,
126 > NumMessages: 1,
127 > NumExtensions: 0,
128 > NumServices: 0,
129 > },
130 > GoTypes: file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_goTypes,
131 > DependencyIndexes: file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_depIdxs,
132 > MessageInfos: file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_msgTypes,
133 > }.Build()
134 > File_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto = out.File
135 > file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_goTypes = nil
136 > file_temporal_server_chasm_lib_workflow_proto_v1_update_state_proto_depIdxs = nil
137 }
go.temporal.io/server/common/util/wildcard.go 20 covered LOC · 7 ranges

Open complete file

18 // WildCardStringToRegexps converts a given slices of string patterns to a slice of regular expressions matching
19 // wildcards (*) with any substring.
20 > func WildCardStringsToRegexp(patterns []string) (*regexp.Regexp, error) { wildcard.go
21 > var result strings.Builder
22 > result.WriteRune('^')
23 > for i, pattern := range patterns {
24 > result.WriteRune('(')
25 > first := true
26 > for literal := range strings.SplitSeq(pattern, "*") {
27 > if !first {
28 // Replace * with .*
29 result.WriteString(".*")
30 }
31 > result.WriteString(regexp.QuoteMeta(literal)) wildcard.go
32 > first = false
33 }
34 > result.WriteRune(')') wildcard.go
35 > if i < len(patterns)-1 {
36 > result.WriteRune('|') wildcard.go
37 > }
38 }
39 > result.WriteRune('$') wildcard.go
40 > return regexp.Compile(result.String())
41 }
42
43 // MustWildCardStringsToRegexp is like WildCardStringsToRegexp but panics on error.
44 > func MustWildCardStringsToRegexp(patterns []string) *regexp.Regexp { wildcard.go
45 > re, err := WildCardStringsToRegexp(patterns)
46 > if err != nil {
47 panic(err) //nolint:forbidigo // Must* functions conventionally panic on error.
48 }
49 > return re wildcard.go
50 }
go.temporal.io/server/common/log/tag/zap_tag.go 19 covered LOC · 5 ranges

Open complete file

26 }
27
28 > func (t ZapTag) Field() zap.Field { zap_tag.go
29 > return t.field
30 > }
31
32 > func (t ZapTag) Key() string { zap_tag.go
33 > return t.field.Key
34 > }
35
36 func (t ZapTag) Value() any {
44 }
45
46 > func NewStringTag(key string, value string) ZapTag { zap_tag.go
47 > return ZapTag{
48 > field: zap.String(key, value),
49 > }
50 > }
51
52 func NewStringsTag(key string, value []string) ZapTag {
118 }
119
120 > func NewBoolTag(key string, value bool) ZapTag { zap_tag.go
121 > return ZapTag{
122 > field: zap.Bool(key, value),
123 > }
124 > }
125
126 func NewErrorTag(key string, value error) ZapTag {
168 // Shorter helpers (aliases for the New* functions above)
169
170 > func String(key string, value string) ZapTag { zap_tag.go
171 > return NewStringTag(key, value)
172 > }
173
174 func Strings(key string, value []string) ZapTag {
go.temporal.io/server/api/historyservicemock/v1/service_grpc.pb.mock.go 18 covered LOC · 4 ranges

Open complete file

33
34 // NewMockHistoryServiceClient creates a new mock instance.
35 > func NewMockHistoryServiceClient(ctrl *gomock.Controller) *MockHistoryServiceClient { service_grpc.pb.mock.go
36 > mock := &MockHistoryServiceClient{ctrl: ctrl}
37 > mock.recorder = &MockHistoryServiceClientMockRecorder{mock}
38 > return mock
39 > }
40
41 // EXPECT returns an object that allows the caller to indicate expected use.
42 > func (m *MockHistoryServiceClient) EXPECT() *MockHistoryServiceClientMockRecorder { service_grpc.pb.mock.go
43 > return m.recorder
44 > }
45
46 // AddTasks mocks base method.
638
639 // IsActivityTaskValid indicates an expected call of IsActivityTaskValid.
640 > func (mr *MockHistoryServiceClientMockRecorder) IsActivityTaskValid(ctx, in any, opts ...any) *gomock.Call { service_grpc.pb.mock.go
641 > mr.mock.ctrl.T.Helper()
642 > varargs := append([]any{ctx, in}, opts...)
643 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsActivityTaskValid", reflect.TypeOf((*MockHistoryServiceClient)(nil).IsActivityTaskValid), varargs...)
644 > }
645
646 // IsWorkflowTaskValid mocks base method.
658
659 // IsWorkflowTaskValid indicates an expected call of IsWorkflowTaskValid.
660 > func (mr *MockHistoryServiceClientMockRecorder) IsWorkflowTaskValid(ctx, in any, opts ...any) *gomock.Call { service_grpc.pb.mock.go
661 > mr.mock.ctrl.T.Helper()
662 > varargs := append([]any{ctx, in}, opts...)
663 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsWorkflowTaskValid", reflect.TypeOf((*MockHistoryServiceClient)(nil).IsWorkflowTaskValid), varargs...)
664 > }
665
666 // ListQueues mocks base method.
go.temporal.io/server/service/matching/task_tracker.go 18 covered LOC · 2 ranges

Open complete file

13 }
14
15 > func newCircularTaskBuffer(size int) circularTaskBuffer { task_tracker.go
16 > return circularTaskBuffer{
17 > buffer: make([]int32, size),
18 > }
19 > }
20
21 func (cb *circularTaskBuffer) inc(n int) {
53 bucketSize time.Duration,
54 totalInterval time.Duration,
55 > ) *taskTracker { task_tracker.go
56 > bucketSize = max(bucketSize, time.Millisecond)
57 > buckets := int(totalInterval/bucketSize) + 1
58 > return &taskTracker{
59 > clock: timeSource,
60 > startTime: timeSource.Now(),
61 > bucketStartTime: timeSource.Now(),
62 > bucketSize: bucketSize,
63 > buckets: buckets,
64 > totalInterval: totalInterval,
65 > tasks: newCircularTaskBuffer(buckets),
66 > }
67 > }
68
69 // advanceAndReset advances the trackers position and clears out any expired intervals.
go.temporal.io/server/common/metrics/task_queues.go 17 covered LOC · 6 ranges

Open complete file

17 taskQueueBreakdown bool,
18 tags ...Tag,
19 > ) Handler { task_queues.go
20 > metricTaskQueueName := omitted
21 > if taskQueueBreakdown {
22 metricTaskQueueName = taskQueueFamily.Name()
23 }
24
25 > tags = append(tags, NamespaceTag(namespaceName), UnsafeTaskQueueTag(metricTaskQueueName)) task_queues.go
26 > return handler.WithTags(tags...)
27 }
28
34 taskQueueBreakdown bool,
35 tags ...Tag,
36 > ) Handler { task_queues.go
37 > return GetPerTaskQueueFamilyScope(handler, namespaceName, taskQueue.Family(), taskQueueBreakdown,
38 > append(tags, TaskQueueTypeTag(taskQueue.TaskType()))...)
39 > }
40
41 // GetPerTaskQueuePartitionIDScope is similar to GetPerTaskQueuePartitionTypeScope, except that the partition tag will
68 taskQueueBreakdown bool,
69 tags ...Tag,
70 > ) Handler { task_queues.go
71 > var value string
72 > if partition == nil {
73 value = unknownValue
74 > } else { task_queues.go
75 > value = partition.MetricTag(false)
76 > }
77
78 > return GetPerTaskQueueScope(handler, namespaceName, partition.TaskQueue(), taskQueueBreakdown, task_queues.go
79 > append(tags, PartitionTag(value))...)
80 }
go.temporal.io/server/service/matching/matcher.go 17 covered LOC · 3 ranges

Open complete file

53 // newTaskMatcher returns a task matcher instance. The returned instance can be used by task producers and consumers to
54 // find a match. Both sync matches and non-sync matches should use this implementation
55 > func newTaskMatcher(config *taskQueueConfig, fwdr *Forwarder, metricsHandler metrics.Handler, rateLimiter quotas.RateLimiter) *TaskMatcher { matcher.go
56 > return &TaskMatcher{
57 > config: config,
58 > rateLimiter: rateLimiter,
59 > metricsHandler: metricsHandler,
60 > fwdr: fwdr,
61 > taskC: make(chan *internalTask),
62 > queryTaskC: make(chan *internalTask),
63 > closeC: make(chan struct{}),
64 > backlogTasksCreateTime: make(map[int64]int),
65 > }
66 > }
67
68 > func (tm *TaskMatcher) Start() { matcher.go
69 > }
70
71 > func (tm *TaskMatcher) Stop() { matcher.go
72 > close(tm.closeC)
73 > }
74
75 func (tm *TaskMatcher) recycleToken(*internalTask) {
go.temporal.io/server/common/metrics/noop_impl.go 16 covered LOC · 8 ranges

Open complete file

15 )
16
17 > func newNoopMetricsHandler() *noopMetricsHandler { return &noopMetricsHandler{} } noop_impl.go
18
19 // WithTags creates a new MetricProvder with provided []Tag
20 // Tags are merged with registered Tags from the source MetricsHandler
21 > func (n *noopMetricsHandler) WithTags(...Tag) Handler { noop_impl.go
22 > return n
23 > }
24
25 // Counter obtains a counter for the given name.
26 > func (*noopMetricsHandler) Counter(string) CounterIface { noop_impl.go
27 > return NoopCounterMetricFunc
28 > }
29
30 // Gauge obtains a gauge for the given name.
31 > func (*noopMetricsHandler) Gauge(string) GaugeIface { noop_impl.go
32 > return NoopGaugeMetricFunc
33 > }
34
35 // Timer obtains a timer for the given name.
36 > func (*noopMetricsHandler) Timer(string) TimerIface { noop_impl.go
37 > return NoopTimerMetricFunc
38 > }
39
40 // Histogram obtains a histogram for the given name.
53 }
54
55 > var NoopCounterMetricFunc = CounterFunc(func(i int64, t ...Tag) {}) noop_impl.go
56 > var NoopGaugeMetricFunc = GaugeFunc(func(f float64, t ...Tag) {}) noop_impl.go
57 > var NoopTimerMetricFunc = TimerFunc(func(d time.Duration, t ...Tag) {}) noop_impl.go
58 var NoopHistogramMetricFunc = HistogramFunc(func(i int64, t ...Tag) {})
go.temporal.io/server/common/namespace/registry_mock.go 16 covered LOC · 4 ranges

Open complete file

30
31 // NewMockRegistry creates a new mock instance.
32 > func NewMockRegistry(ctrl *gomock.Controller) *MockRegistry { registry_mock.go
33 > mock := &MockRegistry{ctrl: ctrl}
34 > mock.recorder = &MockRegistryMockRecorder{mock}
35 > return mock
36 > }
37
38 // EXPECT returns an object that allows the caller to indicate expected use.
39 > func (m *MockRegistry) EXPECT() *MockRegistryMockRecorder { registry_mock.go
40 > return m.recorder
41 > }
42
43 // GetAllNamespaces mocks base method.
95
96 // GetNamespaceByID indicates an expected call of GetNamespaceByID.
97 > func (mr *MockRegistryMockRecorder) GetNamespaceByID(id any) *gomock.Call { registry_mock.go
98 > mr.mock.ctrl.T.Helper()
99 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceByID", reflect.TypeOf((*MockRegistry)(nil).GetNamespaceByID), id)
100 > }
101
102 // GetNamespaceByIDWithOptions mocks base method.
140
141 // GetNamespaceName indicates an expected call of GetNamespaceName.
142 > func (mr *MockRegistryMockRecorder) GetNamespaceName(id any) *gomock.Call { registry_mock.go
143 > mr.mock.ctrl.T.Helper()
144 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceName", reflect.TypeOf((*MockRegistry)(nil).GetNamespaceName), id)
145 > }
146
147 // GetNamespaceWithOptions mocks base method.
go.temporal.io/server/common/quotas/dynamic_rate_limiter_impl.go 16 covered LOC · 2 ranges

Open complete file

29 rateBurstFn RateBurst,
30 refreshInterval time.Duration,
31 > ) *DynamicRateLimiterImpl { dynamic_rate_limiter_impl.go
32 > rateLimiter := &DynamicRateLimiterImpl{
33 > rateBurstFn: rateBurstFn,
34 > refreshInterval: refreshInterval,
35 >
36 > refreshTimer: time.NewTimer(refreshInterval),
37 > rateLimiter: NewRateLimiter(rateBurstFn.Rate(), rateBurstFn.Burst()),
38 > }
39 > return rateLimiter
40 > }
41
42 // NewDefaultIncomingRateLimiter returns a default rate limiter
57 func NewDefaultOutgoingRateLimiter(
58 rateFn RateFn,
59 > ) *DynamicRateLimiterImpl { dynamic_rate_limiter_impl.go
60 > return NewDynamicRateLimiter(
61 > NewDefaultOutgoingRateBurst(rateFn),
62 > defaultRefreshInterval,
63 > )
64 > }
65
66 // NewDefaultRateLimiter returns a default rate limiter with a dynamic burst ratio
go.temporal.io/server/common/namespace/replication_resolver.go 15 covered LOC · 2 ranges

Open complete file

49 }
50
51 > func NewDefaultReplicationResolverFactory() ReplicationResolverFactory { replication_resolver.go
52 > return func(detail *persistencespb.NamespaceDetail) ReplicationResolver {
53 > // By convention, a namespace with non-zero failover version is a global namespace
54 > // This can be overridden by WithGlobalFlag mutation if needed
55 > isGlobal := detail.FailoverVersion != 0
56 > return &defaultReplicationResolver{
57 > replicationConfig: detail.ReplicationConfig,
58 > isGlobalNamespace: isGlobal,
59 > failoverVersion: detail.FailoverVersion,
60 > failoverNotificationVersion: detail.FailoverNotificationVersion,
61 > }
62 > }
63 }
64
112 }
113
114 > func (r *defaultReplicationResolver) SetGlobalFlag(isGlobal bool) { replication_resolver.go
115 > r.isGlobalNamespace = isGlobal
116 > }
117
118 func (r *defaultReplicationResolver) SetActiveCluster(clusterName string) {
go.temporal.io/server/common/persistence/visibility/store/sql/query_converter_util_legacy.go 15 covered LOC · 3 ranges

Open complete file

68 }
69
70 > func newColName(name string) *colName { query_converter_util_legacy.go
71 > return &colName{Name: name}
72 > }
73
74 func newSAColName(
77 fieldName string,
78 valueType enumspb.IndexedValueType,
79 > ) *saColName { query_converter_util_legacy.go
80 > return &saColName{
81 > dbColName: newColName(dbColName),
82 > alias: alias,
83 > fieldName: fieldName,
84 > valueType: valueType,
85 > }
86 > }
87
88 func newFuncExpr(name string, exprs ...sqlparser.Expr) *sqlparser.FuncExpr {
105 }
106
107 > func getMaxDatetimeValue() time.Time { query_converter_util_legacy.go
108 > t, _ := time.Parse(time.RFC3339, "9999-12-31T23:59:59Z")
109 > return t
110 > }
111
112 // formatComparisonExprStringForError formats comparison expression after
go.temporal.io/server/common/backoff/retry.go 14 covered LOC · 4 ranges

Open complete file

53 policy RetryPolicy,
54 isRetryable IsRetryable,
55 > ) error { retry.go
56 > var err error
57 > var next time.Duration
58 >
59 > if isRetryable == nil {
60 isRetryable = func(error) bool { return true }
61 }
62
63 > deadline, hasDeadline := ctx.Deadline() retry.go
64 >
65 > timeSrc := clock.NewRealTimeSource()
66 > r := NewRetrier(policy, timeSrc)
67 > t := NewRetrier(throttleRetryPolicy, timeSrc)
68 > for ctx.Err() == nil {
69 > if err = operation(ctx); err == nil { retry.go
70 > return nil retry.go
71 > }
72
73 if next = r.NextBackOff(err); next == done {
go.temporal.io/server/common/build/build.go 14 covered LOC · 2 ranges

Open complete file

27 )
28
29 > func init() { build.go
30 > buildInfo, ok := debug.ReadBuildInfo()
31 > if !ok {
32 return
33 }
34
35 > InfoData.Available = true build.go
36 > InfoData.GoVersion = buildInfo.GoVersion
37 >
38 > for _, setting := range buildInfo.Settings {
39 > switch setting.Key {
40 > case "GOARCH":
41 > InfoData.GoArch = setting.Value
42 > case "GOOS":
43 > InfoData.GoOs = setting.Value
44 > case "CGO_ENABLED":
45 > InfoData.CgoEnabled = setting.Value == "1"
46 case "vcs.revision":
47 InfoData.GitRevision = setting.Value
go.temporal.io/server/common/dynamicconfig/gradual_change.go 14 covered LOC · 3 ranges

Open complete file

25 // StaticGradualChange returns a GradualChange whose Value always returns def and whose When
26 // always returns a time in the past.
27 > func StaticGradualChange[T any](def T) GradualChange[T] { gradual_change.go
28 > return GradualChange[T]{New: def}
29 > }
30
31 // Value returns the value for the given key at the given time.
56 // of type GradualChange into a GradualChange.
57 // nolint:revive // cognitive-complexity // this looks complicated but each case is fairly simple
58 > func ConvertGradualChange[T any](def T) func(v any) (GradualChange[T], error) { gradual_change.go
59 > changeConverter := ConvertStructure(StaticGradualChange(def))
60 >
61 > // Call this once so that if it's going to panic, it panics at static init time.
62 > _, _ = changeConverter(nil)
63 >
64 > switch reflect.TypeFor[T]() {
65 > case reflect.TypeFor[bool]():
66 > return func(v any) (GradualChange[T], error) {
67 if b, err := convertBool(v); err == nil {
68 var change GradualChange[T]
72 return changeConverter(v)
73 }
74 > case reflect.TypeFor[int](): gradual_change.go
75 > return func(v any) (GradualChange[T], error) {
76 if i, err := convertInt(v); err == nil {
77 var change GradualChange[T]
go.temporal.io/server/service/matching/liveness.go 14 covered LOC · 3 ranges

Open complete file

25 ttl func() time.Duration,
26 onIdle func(),
27 > ) *liveness { liveness.go
28 > return &liveness{
29 > timeSource: timeSource,
30 > ttl: ttl,
31 > onIdle: onIdle,
32 > }
33 > }
34
35 > func (l *liveness) Start() { liveness.go
36 > l.timer.Store(timerWrapper{l.timeSource.AfterFunc(l.ttl(), l.onIdle)})
37 > }
38
39 > func (l *liveness) Stop() { liveness.go
40 > if t, ok := l.timer.Swap(timerWrapper{}).(timerWrapper); ok && t.Timer != nil {
41 > t.Stop()
42 > }
43 }
44
go.temporal.io/server/common/headers/caller_info.go 13 covered LOC · 2 ranges

Open complete file

79 func NewBackgroundHighCallerInfo(
80 callerName string,
81 > ) CallerInfo { caller_info.go
82 > return CallerInfo{
83 > CallerName: callerName,
84 > CallerType: CallerTypeBackgroundHigh,
85 > }
86 > }
87
88 // NewBackgroundLowCallerInfo creates a new CallerInfo with BackgroundLow callerType
117 ctx context.Context,
118 info CallerInfo,
119 > ) context.Context { caller_info.go
120 > return setIncomingMD(ctx, map[string]string{
121 > CallerNameHeaderName: info.CallerName,
122 > CallerTypeHeaderName: info.CallerType,
123 > CallOriginHeaderName: info.CallOrigin,
124 > })
125 > }
126
127 // SetCallerName set caller name in the context.
go.temporal.io/server/common/metrics/defs_base.go 13 covered LOC · 2 ranges

Open complete file

10 }
11
12 > func newMetricDefinition(name string, opts ...Option) metricDefinition { defs_base.go
13 > d := metricDefinition{
14 > name: name,
15 > description: "",
16 > unit: "",
17 > }
18 > for _, opt := range opts {
19 > opt.apply(&d)
20 > }
21 > return d
22 }
23
24 > func (md metricDefinition) Name() string { defs_base.go
25 > return md.name
26 > }
27
28 func (md metricDefinition) Unit() MetricUnit {
go.temporal.io/server/common/cluster/clustertest/test_metadata.go 12 covered LOC · 1 range

Open complete file

9 func NewMetadataForTest(
10 config *cluster.Config,
11 > ) cluster.Metadata { test_metadata.go
12 > return cluster.NewMetadata(
13 > config.EnableGlobalNamespace,
14 > config.FailoverVersionIncrement,
15 > config.MasterClusterName,
16 > config.CurrentClusterName,
17 > config.ClusterInformation,
18 > nil,
19 > nil,
20 > log.NewNoopLogger(),
21 > )
22 > }
go.temporal.io/server/common/persistence/data_interfaces_mock.go 12 covered LOC · 3 ranges

Open complete file

1240
1241 // NewMockNexusEndpointManager creates a new mock instance.
1242 > func NewMockNexusEndpointManager(ctrl *gomock.Controller) *MockNexusEndpointManager { data_interfaces_mock.go
1243 > mock := &MockNexusEndpointManager{ctrl: ctrl}
1244 > mock.recorder = &MockNexusEndpointManagerMockRecorder{mock}
1245 > return mock
1246 > }
1247
1248 // EXPECT returns an object that allows the caller to indicate expected use.
1249 > func (m *MockNexusEndpointManager) EXPECT() *MockNexusEndpointManagerMockRecorder { data_interfaces_mock.go
1250 > return m.recorder
1251 > }
1252
1253 // Close mocks base method.
1331
1332 // ListNexusEndpoints indicates an expected call of ListNexusEndpoints.
1333 > func (mr *MockNexusEndpointManagerMockRecorder) ListNexusEndpoints(ctx, request any) *gomock.Call { data_interfaces_mock.go
1334 > mr.mock.ctrl.T.Helper()
1335 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListNexusEndpoints", reflect.TypeOf((*MockNexusEndpointManager)(nil).ListNexusEndpoints), ctx, request)
1336 > }
1337
1338 // MockHistoryTaskQueueManager is a mock of HistoryTaskQueueManager interface.
go.temporal.io/server/common/persistence/visibility/manager/visibility_manager_mock.go 12 covered LOC · 3 ranges

Open complete file

32
33 // NewMockVisibilityManager creates a new mock instance.
34 > func NewMockVisibilityManager(ctrl *gomock.Controller) *MockVisibilityManager { visibility_manager_mock.go
35 > mock := &MockVisibilityManager{ctrl: ctrl}
36 > mock.recorder = &MockVisibilityManagerMockRecorder{mock}
37 > return mock
38 > }
39
40 // EXPECT returns an object that allows the caller to indicate expected use.
41 > func (m *MockVisibilityManager) EXPECT() *MockVisibilityManagerMockRecorder { visibility_manager_mock.go
42 > return m.recorder
43 > }
44
45 // AddSearchAttributes mocks base method.
64
65 // Close indicates an expected call of Close.
66 > func (mr *MockVisibilityManagerMockRecorder) Close() *gomock.Call { visibility_manager_mock.go
67 > mr.mock.ctrl.T.Helper()
68 > return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockVisibilityManager)(nil).Close))
69 > }
70
71 // CountChasmExecutions mocks base method.
go.temporal.io/server/common/persistence/visibility/store/elasticsearch/visibility_store.go 12 covered LOC · 3 ranges

Open complete file

101 }
102
103 > defaultSorter = func() []elastic.Sorter { visibility_store.go
104 > ret := make([]elastic.Sorter, 0, len(defaultSorterFields))
105 > for _, item := range defaultSorterFields {
106 > fs := elastic.NewFieldSort(item.name)
107 > if item.desc {
108 > fs.Desc()
109 > }
110 > if item.missing_first {
111 > fs.Missing("_first")
112 > } else {
113 fs.Missing("_last")
114 }
115 > ret = append(ret, fs) visibility_store.go
116 }
117 > return ret visibility_store.go
118 }()
119
go.temporal.io/server/common/quotas/rate_limiter_impl.go 12 covered LOC · 1 range

Open complete file

24 // NewRateLimiter returns a new rate limiter that can handle dynamic
25 // configuration updates
26 > func NewRateLimiter(newRPS float64, newBurst int) *RateLimiterImpl { rate_limiter_impl.go
27 > limiter := rate.NewLimiter(rate.Limit(newRPS), newBurst)
28 > ts := clock.NewRealTimeSource()
29 > rl := &RateLimiterImpl{
30 > rps: newRPS,
31 > burst: newBurst,
32 > timeSource: ts,
33 > ClockedRateLimiter: NewClockedRateLimiter(limiter, ts),
34 > }
35 >
36 > return rl
37 > }
38
39 // SetRPS sets the rate of the rate limiter
go.temporal.io/server/common/util.go 12 covered LOC · 3 ranges

Open complete file

161
162 // CreatePersistenceClientRetryPolicy creates a retry policy for calls to persistence
163 > func CreatePersistenceClientRetryPolicy() backoff.RetryPolicy { util.go
164 > return backoff.NewExponentialRetryPolicy(persistenceClientRetryInitialInterval).
165 > WithMaximumAttempts(persistenceClientRetryMaxAttempts)
166 > }
167
168 // CreateFrontendClientRetryPolicy creates a retry policy for calls to frontend service
235
236 // CreateReadTaskRetryPolicy creates a retry policy for loading background tasks
237 > func CreateReadTaskRetryPolicy() backoff.RetryPolicy { util.go
238 > return backoff.NewExponentialRetryPolicy(readTaskRetryInitialInterval).
239 > WithMaximumInterval(readTaskRetryMaxInterval).
240 > WithExpirationInterval(readTaskRetryExpirationInterval)
241 > }
242
243 // CreateCompleteTaskRetryPolicy creates a retry policy for completing background tasks
688
689 // CloneProto is a generic typed version of proto.Clone from proto.
690 > func CloneProto[T proto.Message](v T) T { util.go
691 > return proto.Clone(v).(T)
692 > }
693
694 func CloneProtoMap[K comparable, T proto.Message](src map[K]T) map[K]T {
go.temporal.io/server/common/cluster/metadata_test_config.go 11 covered LOC · 3 ranges

Open complete file

64
65 // NewTestClusterMetadataConfig return an cluster metadata config
66 > func NewTestClusterMetadataConfig(enableGlobalNamespace bool, isMasterCluster bool) *Config { metadata_test_config.go
67 > masterClusterName := TestCurrentClusterName
68 > if !isMasterCluster {
69 masterClusterName = TestAlternativeClusterName
70 }
71
72 > if enableGlobalNamespace { metadata_test_config.go
73 return &Config{
74 EnableGlobalNamespace: true,
80 }
81
82 > return &Config{ metadata_test_config.go
83 > EnableGlobalNamespace: false,
84 > FailoverVersionIncrement: TestFailoverVersionIncrement,
85 > MasterClusterName: TestCurrentClusterName,
86 > CurrentClusterName: TestCurrentClusterName,
87 > ClusterInformation: TestSingleDCClusterInfo,
88 > }
89 }
go.temporal.io/server/common/headers/headers.go 10 covered LOC · 4 ranges

Open complete file

154 // setIncomingMD sets the key-value pairs in the incoming metadata.
155 // Empty values are ignored.
156 > func setIncomingMD(ctx context.Context, kv map[string]string) context.Context { headers.go
157 > mdIncoming, ok := metadata.FromIncomingContext(ctx)
158 > if !ok {
159 > mdIncoming = metadata.MD{} headers.go
160 > }
161 > for k, v := range kv { headers.go
162 > if v != "" {
163 > mdIncoming.Set(k, v)
164 > }
165 }
166 > return metadata.NewIncomingContext(ctx, mdIncoming) headers.go
167 }
go.temporal.io/server/common/persistence/sql/sqlplugin/postgresql/plugin.go 10 covered LOC · 1 range

Open complete file

36 var _ sqlplugin.Plugin = (*plugin)(nil)
37
38 > func init() { plugin.go
39 > sql.RegisterPlugin(PluginName, &plugin{
40 > driver: &driver.PQDriver{},
41 > queryConverter: &queryConverter{},
42 > })
43 > sql.RegisterPlugin(PluginNamePGX, &plugin{
44 > driver: &driver.PGXDriver{},
45 > queryConverter: &queryConverter{},
46 > })
47 > }
48
49 func (p *plugin) GetVisibilityQueryConverter() sqlplugin.VisibilityQueryConverter {
go.temporal.io/server/common/persistence/sql/sqlplugin/postgresql/visibility.go 10 covered LOC · 1 range

Open complete file

40 )
41
42 > func buildOnDuplicateKeyUpdate(fields ...string) string { visibility.go
43 > items := make([]string, len(fields))
44 > for i, field := range fields {
45 > items[i] = fmt.Sprintf("%s = excluded.%s", field, field)
46 > }
47 > return fmt.Sprintf(
48 > // The WHERE clause ensures that no update occurs if the version is behind the saved version.
49 > "ON CONFLICT (namespace_id, run_id) DO UPDATE SET %s WHERE executions_visibility.%s < EXCLUDED.%s",
50 > strings.Join(items, ", "), sqlplugin.VersionColumnName, sqlplugin.VersionColumnName,
51 > )
52 }
53
go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite/visibility.go 10 covered LOC · 1 range

Open complete file

42 )
43
44 > func buildOnDuplicateKeyUpdate(fields ...string) string { visibility.go
45 > items := make([]string, len(fields))
46 > for i, field := range fields {
47 > items[i] = fmt.Sprintf("%s = excluded.%s", field, field)
48 > }
49 > return fmt.Sprintf(
50 > // The WHERE clause ensures that no update occurs if the version is behind the saved version.
51 > "ON CONFLICT (namespace_id, run_id) DO UPDATE SET %s WHERE executions_visibility.%s < EXCLUDED.%s",
52 > strings.Join(items, ", "), sqlplugin.VersionColumnName, sqlplugin.VersionColumnName,
53 > )
54 }
55
go.temporal.io/server/common/persistence/sql/sqlplugin/visibility.go 10 covered LOC · 2 ranges

Open complete file

219 }
220
221 > func getDbFields() []string { visibility.go
222 > t := reflect.TypeFor[VisibilityRow]()
223 > dbFields := make([]string, t.NumField())
224 > for i := 0; i < t.NumField(); i++ {
225 > f := t.Field(i)
226 > dbFields[i] = f.Tag.Get("db")
227 > if dbFields[i] == "" {
228 > dbFields[i] = strcase.ToSnake(f.Name)
229 > }
230 }
231 > return dbFields visibility.go
232 }
233
go.temporal.io/server/common/persistence/visibility/store/query/util.go 10 covered LOC · 2 ranges

Open complete file

70 }
71
72 > func NewUnsafeSQLString(val string) *UnsafeSQLString { util.go
73 > return &UnsafeSQLString{Val: val}
74 > }
75
76 func NewColName(name string) *ColumnName {
78 }
79
80 > func NewSAColumn(alias string, fieldName string, valueType enumspb.IndexedValueType) *SAColumn { util.go
81 > return &SAColumn{
82 > Alias: alias,
83 > FieldName: fieldName,
84 > ValueType: valueType,
85 > }
86 > }
87
88 func NamespaceDivisionSAColumn() *SAColumn {
go.temporal.io/server/service/matching/poller_history.go 10 covered LOC · 1 range

Open complete file

28 }
29
30 > func newPollerHistory(pollerHistoryTTL time.Duration) *pollerHistory { poller_history.go
31 > opts := &cache.Options{
32 > TTL: pollerHistoryTTL,
33 > Pin: false,
34 > }
35 >
36 > return &pollerHistory{
37 > history: cache.New(pollerHistoryInitMaxSize, opts),
38 > }
39 > }
40
41 func (pollers *pollerHistory) updatePollerInfo(id pollerIdentity, pollMetadata *pollMetadata) {
go.temporal.io/server/common/clock/time_source.go 9 covered LOC · 3 ranges

Open complete file

31
32 // NewRealTimeSource returns a timeSource that uses the real wall timeSource time.
33 > func NewRealTimeSource() RealTimeSource { time_source.go
34 > return RealTimeSource{}
35 > }
36
37 // Now returns the current time, with the location set to UTC.
38 > func (ts RealTimeSource) Now() time.Time { time_source.go
39 > return time.Now().UTC()
40 > }
41
42 // Since returns the time elapsed since t
46
47 // AfterFunc is a pass-through to time.AfterFunc.
48 > func (ts RealTimeSource) AfterFunc(d time.Duration, f func()) Timer { time_source.go
49 > return time.AfterFunc(d, f)
50 > }
51
52 // NewTimer is a pass-through to time.NewTimer.
go.temporal.io/server/common/dynamicconfig/static_client.go 9 covered LOC · 4 ranges

Open complete file

10 )
11
12 > func (s StaticClient) GetValue(key Key) []ConstrainedValue { static_client.go
13 > if v, ok := s[key]; ok {
14 if cvs, ok := v.([]ConstrainedValue); ok {
15 return cvs
17 return []ConstrainedValue{{Value: v}}
18 }
19 > return nil static_client.go
20 }
21
22 // NewNoopClient returns a Client that has no keys (a Collection using it will always return
23 // default values).
24 > func NewNoopClient() Client { static_client.go
25 > return StaticClient(nil)
26 > }
27
28 // NewNoopCollection creates a new noop collection.
29 > func NewNoopCollection() *Collection { static_client.go
30 > return NewCollection(NewNoopClient(), log.NewNoopLogger())
31 > }
go.temporal.io/server/common/persistence/sql/sqlplugin/util.go 9 covered LOC · 2 ranges

Open complete file

5 )
6
7 > func appendPrefix(prefix string, fields []string) []string { util.go
8 > out := make([]string, len(fields))
9 > for i, field := range fields {
10 > out[i] = prefix + field
11 > }
12 > return out
13 }
14
15 > func BuildNamedPlaceholder(fields ...string) string { util.go
16 > return strings.Join(appendPrefix(":", fields), ", ")
17 > }
go.temporal.io/server/common/primitives/timestamp/duration.go 9 covered LOC · 3 ranges

Open complete file

26 }
27
28 > func DurationPtr(td time.Duration) *durationpb.Duration { duration.go
29 > return durationpb.New(td)
30 > }
31
32 func MinDurationPtr(d1 *durationpb.Duration, d2 *durationpb.Duration) *durationpb.Duration {
47 }
48
49 > func DurationFromDays(d int32) *durationpb.Duration { duration.go
50 > return durationMultipleOf(int64(d), time.Hour*24)
51 > }
52
53 > func durationMultipleOf(amt int64, mult time.Duration) *durationpb.Duration { duration.go
54 > return DurationPtr(time.Duration(amt) * mult)
55 > }
56
57 // ValidateAndCapProtoDuration validates protobuf durations for two conditions:
go.temporal.io/server/common/testing/testhooks/test_impl.go 9 covered LOC · 2 ranges

Open complete file

89 var keyCounter atomic.Int64
90
91 > func newKey[T any, S any]() Key[T, S] { test_impl.go
92 > var zero S
93 > var s ScopeType
94 > switch any(zero).(type) {
95 > case namespace.ID, namespace.Name:
96 > s = ScopeNamespace
97 > case global:
98 > s = ScopeGlobal
99 default:
100 panic("testhooks: unknown scope type")
101 }
102 > return Key[T, S]{id: keyCounter.Add(1), scopeType: s} test_impl.go
103 }
go.temporal.io/server/common/log/with_logger.go 8 covered LOC · 4 ranges

Open complete file

14 // With returns Logger instance that prepend every log entry with tags. If logger implements
15 // WithLogger it is used, otherwise every log call will be intercepted.
16 > func With(logger Logger, tags ...tag.Tag) Logger { with_logger.go
17 > if wl, ok := logger.(WithLogger); ok {
18 > return wl.With(tags...) with_logger.go
19 > }
20 > return newWithLogger(logger, tags...) with_logger.go
21 }
22
23 > func newWithLogger(logger Logger, tags ...tag.Tag) *withLogger { with_logger.go
24 > return &withLogger{logger: logger, tags: tags}
25 > }
26
27 func (l *withLogger) prependTags(tags []tag.Tag) []tag.Tag {
go.temporal.io/server/common/namespace/mutate.go 8 covered LOC · 2 ranges

Open complete file

8 type mutationFunc func(*Namespace)
9
10 > func (f mutationFunc) apply(ns *Namespace) { mutate.go
11 > f(ns)
12 > }
13
14 // WithActiveCluster assigns the active cluster to a Namespace during a Clone
43
44 // WithGlobalFlag sets whether or not this Namespace is global.
45 > func WithGlobalFlag(b bool) Mutation { mutate.go
46 > return mutationFunc(
47 > func(ns *Namespace) {
48 > ns.replicationResolver.SetGlobalFlag(b)
49 > })
50 }
51
go.temporal.io/server/common/persistence/sql/sqlplugin/mysql/visibility.go 8 covered LOC · 1 range

Open complete file

73 )
74
75 > func buildOnDuplicateKeyUpdate(fields ...string) string { visibility.go
76 > items := make([]string, len(fields))
77 > for i, field := range fields {
78 > // This line is to ensure that no update occurs (for any column) if the version is behind the saved version.
79 > items[i] = fmt.Sprintf("%v = IF(%v < VALUES(%v), VALUES(%v), %v)",
80 > field, sqlplugin.VersionColumnName, sqlplugin.VersionColumnName, field, field)
81 > }
82 > return fmt.Sprintf("ON DUPLICATE KEY UPDATE %s", strings.Join(items, ", "))
83 }
84
go.temporal.io/server/service/matching/task_validation.go 8 covered LOC · 1 range

Open complete file

55 namespaceRegistry namespace.Registry,
56 historyClient historyservice.HistoryServiceClient,
57 > ) *taskValidatorImpl { task_validation.go
58 > return &taskValidatorImpl{
59 > tqCtx: tqCtx,
60 > clusterMetadata: clusterMetadata,
61 > namespaceRegistry: namespaceRegistry,
62 > historyClient: historyClient,
63 > }
64 > }
65
66 func (v *taskValidatorImpl) maybeValidate(
go.temporal.io/server/chasm/statemachine.go 7 covered LOC · 1 range

Open complete file

34 // The apply function is called after verifying the transition is possible but before setting the destination state,
35 // so it can inspect the current (source) state.
36 > func NewTransition[S comparable, SM StateMachine[S], E any](src []S, dst S, apply func(SM, MutableContext, E) error) Transition[S, SM, E] { statemachine.go
37 > return Transition[S, SM, E]{
38 > Sources: src,
39 > Destination: dst,
40 > apply: apply,
41 > }
42 > }
43
44 // Possible returns a boolean indicating whether the transition is possible for the current state.
go.temporal.io/server/common/definition/workflow_key.go 7 covered LOC · 1 range

Open complete file

19 workflowID string,
20 runID string,
21 > ) WorkflowKey { workflow_key.go
22 > return WorkflowKey{
23 > NamespaceID: namespaceID,
24 > WorkflowID: workflowID,
25 > RunID: runID,
26 > }
27 > }
28
29 func (k *WorkflowKey) GetNamespaceID() string {
go.temporal.io/server/common/dynamicconfig/registry.go 7 covered LOC · 3 ranges

Open complete file

17 )
18
19 > func register(s GenericSetting) { registry.go
20 > if globalRegistry.queried.Load() {
21 panic("dynamicconfig.New*Setting must only be called from static initializers")
22 }
23 > if globalRegistry.settings == nil { registry.go
24 > globalRegistry.settings = make(map[Key]GenericSetting)
25 > }
26 > if globalRegistry.settings[s.Key()] != nil {
27 // nolint:forbidigo // only called during static initialization
28 panic(fmt.Sprintf("duplicate registration of dynamic config key: %q", s.Key().String()))
29 }
30 > globalRegistry.settings[s.Key()] = s registry.go
31 }
32
go.temporal.io/server/common/goro/group.go 7 covered LOC · 2 ranges

Open complete file

36 // Cancel cancels the `context.Context` that was passed to all goroutines
37 // spawned via `Go` on this `Group`.
38 > func (g *Group) Cancel() { group.go
39 > g.initOnce.Do(g.init)
40 > g.cancel()
41 > }
42
43 // Wait blocks waiting for all goroutines spawned via `Go` on this `Group`
48 }
49
50 > func (g *Group) init() { group.go
51 > g.ctx, g.cancel = context.WithCancel(context.Background())
52 > }
go.temporal.io/server/common/membership/grpc_resolver.go 7 covered LOC · 2 ranges

Open complete file

53 )
54
55 > func init() { grpc_resolver.go
56 > // This must be called in init to avoid race conditions.
57 > resolver.Register(&globalGrpcBuilder)
58 > }
59
60 // Most code should not use this, this is only exposed for code that has to recognize and use a
80 }
81
82 > func (m *grpcBuilder) Scheme() string { grpc_resolver.go
83 > return grpcResolverScheme
84 > }
85
86 func (m *grpcBuilder) getServiceResolver(u *url.URL) (ServiceResolver, error) {
go.temporal.io/server/common/quotas/clocked_rate_limiter.go 7 covered LOC · 1 range

Open complete file

25 )
26
27 > func NewClockedRateLimiter(rateLimiter *rate.Limiter, timeSource clock.TimeSource) ClockedRateLimiter { clocked_rate_limiter.go
28 > return ClockedRateLimiter{
29 > rateLimiter: rateLimiter,
30 > timeSource: timeSource,
31 > recycleCh: make(chan struct{}),
32 > }
33 > }
34
35 func (l ClockedRateLimiter) Allow() bool {
go.temporal.io/server/service/history/hsm/sm.go 7 covered LOC · 1 range

Open complete file

41 // NewTransition creates a new [Transition] from the given source states to a destination state for a given event.
42 // The apply function is called after verifying the transition is possible and setting the destination state.
43 > func NewTransition[S comparable, SM StateMachine[S], E any](src []S, dst S, apply func(SM, E) (TransitionOutput, error)) Transition[S, SM, E] { sm.go
44 > return Transition[S, SM, E]{
45 > Sources: src,
46 > Destination: dst,
47 > apply: apply,
48 > }
49 > }
50
51 // Possible returns a boolean indicating whether the transition is possible for the current state.
go.temporal.io/server/service/history/workflow/task_generator_provider.go 7 covered LOC · 2 ranges

Open complete file

23 )
24
25 > func init() { task_generator_provider.go
26 > var defaultProvider TaskGeneratorProvider = new(taskGeneratorProviderImpl)
27 > populateTaskGeneratorProvider(defaultProvider)
28 > }
29
30 > func populateTaskGeneratorProvider(provider TaskGeneratorProvider) { task_generator_provider.go
31 > _taskGeneratorProvider.Store(&provider)
32 > }
33
34 func GetTaskGeneratorProvider() TaskGeneratorProvider {
go.temporal.io/server/service/matching/nexus_endpoint_client.go 7 covered LOC · 1 range

Open complete file

74 endpointsRefreshInterval dynamicconfig.DurationPropertyFn,
75 persistence p.NexusEndpointManager,
76 > ) *nexusEndpointClient { nexus_endpoint_client.go
77 > return &nexusEndpointClient{
78 > endpointsRefreshInterval: endpointsRefreshInterval,
79 > persistence: persistence,
80 > tableVersionChanged: make(chan struct{}),
81 > }
82 > }
83
84 func (m *nexusEndpointClient) CreateNexusEndpoint(
go.temporal.io/server/common/collection/sync_map.go 6 covered LOC · 1 range

Open complete file

15 }
16
17 > func NewSyncMap[K comparable, V any]() SyncMap[K, V] { sync_map.go
18 > return SyncMap[K, V]{
19 > RWMutex: &sync.RWMutex{},
20 > contents: make(map[K]V),
21 > }
22 > }
23
24 func (m *SyncMap[K, V]) Get(key K) (value V, ok bool) {
go.temporal.io/server/common/metrics/option.go 6 covered LOC · 2 ranges

Open complete file

10 type WithDescription string
11
12 > func (h WithDescription) apply(m *metricDefinition) { option.go
13 > m.description = string(h)
14 > }
15
16 // WithUnit sets the unit of a metric. See NewBytesHistogramDef for an example.
17 type WithUnit MetricUnit
18
19 > func (h WithUnit) apply(m *metricDefinition) { option.go
20 > m.unit = MetricUnit(h)
21 > }
go.temporal.io/server/common/persistence/data_interfaces.go 6 covered LOC · 3 ranges

Open complete file

1408 // UnixMilliseconds returns t as a Unix time, the number of milliseconds elapsed since January 1, 1970 UTC.
1409 // It should be used for all CQL timestamp.
1410 > func UnixMilliseconds(t time.Time) int64 { data_interfaces.go
1411 > // Handling zero time separately because UnixNano is undefined for zero times.
1412 > if t.IsZero() {
1413 return 0
1414 }
1415
1416 > unixNano := t.UnixNano() data_interfaces.go
1417 > if unixNano < 0 {
1418 // Time is before January 1, 1970 UTC
1419 return 0
1420 }
1421 > return unixNano / int64(time.Millisecond) data_interfaces.go
1422 }
1423
go.temporal.io/server/common/persistence/nosql/nosqlplugin/cassandra/translator/fixed_address_translator.go 6 covered LOC · 2 ranges

Open complete file

15 )
16
17 > func init() { fixed_address_translator.go
18 > RegisterTranslator(fixedTranslatorName, NewFixedAddressTranslatorPlugin())
19 > }
20
21 type FixedAddressTranslatorPlugin struct {
22 }
23
24 > func NewFixedAddressTranslatorPlugin() TranslatorPlugin { fixed_address_translator.go
25 > return &FixedAddressTranslatorPlugin{}
26 > }
27
28 // GetTranslator What gocql driver does is that it will connect to the first node in the list in configuration
go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite/plugin.go 6 covered LOC · 1 range

Open complete file

43 }
44
45 > func init() { plugin.go
46 > sql.RegisterPlugin(PluginName, &plugin{
47 > queryConverter: &queryConverter{},
48 > connPool: newConnPool(),
49 > })
50 > }
51
52 func (p *plugin) GetVisibilityQueryConverter() sqlplugin.VisibilityQueryConverter {
go.temporal.io/server/common/primitives/timestamp/time.go 6 covered LOC · 2 ranges

Open complete file

7 )
8
9 > func TimePtr(t time.Time) *timestamppb.Timestamp { time.go
10 > return timestamppb.New(t)
11 > }
12
13 func TimeValue(t *timestamppb.Timestamp) time.Time {
46 }
47
48 > func TimeNowPtrUtc() *timestamppb.Timestamp { time.go
49 > return TimePtr(time.Now().UTC())
50 > }
go.temporal.io/server/service/history/tasks/key.go 6 covered LOC · 1 range

Open complete file

35 }
36
37 > func NewKey(fireTime time.Time, taskID int64) Key { key.go
38 > return Key{
39 > FireTime: fireTime,
40 > TaskID: taskID,
41 > }
42 > }
43
44 func ValidateKey(key Key) error {
go.temporal.io/server/chasm/lib/nexusoperation/config.go 5 covered LOC · 1 range

Open complete file

160 }
161
162 > func (cfg RetryPolicyConfig) build() backoff.RetryPolicy { config.go
163 > return backoff.NewExponentialRetryPolicy(cfg.InitialInterval).
164 > WithMaximumInterval(cfg.MaxInterval).
165 > WithExpirationInterval(backoff.NoInterval)
166 > }
167
168 var defaultRetryPolicyConfig = RetryPolicyConfig{
go.temporal.io/server/common/metrics/registry.go 5 covered LOC · 1 range

Open complete file

43
44 // register adds a metric definition to the list of pending metric definitions. This method is thread-safe.
45 > func (c *registry) register(d metricDefinition) { registry.go
46 > c.Lock()
47 > defer c.Unlock()
48 > c.definitions = append(c.definitions, d)
49 > }
50
51 // buildCatalog builds a catalog from the list of pending metric definitions. It is safe to call this method multiple
go.temporal.io/server/common/persistence/sql/sqlplugin/mysql/plugin.go 5 covered LOC · 1 range

Open complete file

24 var _ sqlplugin.Plugin = (*plugin)(nil)
25
26 > func init() { plugin.go
27 > sql.RegisterPlugin(PluginName, &plugin{
28 > queryConverter: &queryConverter{},
29 > })
30 > }
31
32 func (p *plugin) GetVisibilityQueryConverter() sqlplugin.VisibilityQueryConverter {
go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite/conn_pool.go 5 covered LOC · 1 range

Open complete file

23 }
24
25 > func newConnPool() *connPool { conn_pool.go
26 > return &connPool{
27 > pool: make(map[string]entry),
28 > }
29 > }
30
31 // Allocate allocates the shared database in the pool or returns already exists instance with the same DSN. If instance
go.temporal.io/server/common/persistence/sql/sqlplugin/mysql/typeconv.go 4 covered LOC · 2 ranges

Open complete file

33 }
34
35 > func getMinMySQLDateTime() time.Time { typeconv.go
36 > t, err := time.Parse(time.RFC3339, "1000-01-01T00:00:00Z")
37 > if err != nil {
38 return time.Unix(0, 0).UTC()
39 }
40 > return t.UTC() typeconv.go
41 }
go.temporal.io/server/common/persistence/sql/sqlplugin/postgresql/typeconv.go 4 covered LOC · 2 ranges

Open complete file

35 }
36
37 > func getMinPostgreSQLDateTime() time.Time { typeconv.go
38 > t, err := time.Parse(time.RFC3339, "1000-01-01T00:00:00Z")
39 > if err != nil {
40 return time.Unix(0, 0).UTC()
41 }
42 > return t.UTC() typeconv.go
43 }
go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite/typeconv.go 4 covered LOC · 2 ranges

Open complete file

33 }
34
35 > func getMinSQLiteDateTime() time.Time { typeconv.go
36 > t, err := time.Parse(time.RFC3339, "1000-01-01T00:00:00Z")
37 > if err != nil {
38 return time.Unix(0, 0).UTC()
39 }
40 > return t.UTC() typeconv.go
41 }
go.temporal.io/server/common/util/util.go 4 covered LOC · 1 range

Open complete file

68
69 // InverseMap creates the inverse map, ie., for a key-value map, it builds the value-key map.
70 > func InverseMap[M ~map[K]V, K, V comparable](m M) map[V]K { util.go
71 > if m == nil {
72 > return nil
73 > }
74 invm := make(map[V]K, len(m))
75 for k, v := range m {
go.temporal.io/server/service/matching/backlog_age_tracker.go 4 covered LOC · 1 range

Open complete file

51 // minNonZeroTime returns the minimum time of a and b, ignoring zero times.
52 // If both a and b are zero, it returns zero.
53 > func minNonZeroTime(a, b time.Time) time.Time { backlog_age_tracker.go
54 > if a.IsZero() {
55 > return b
56 > } else if b.IsZero() {
57 return a
58 }
go.temporal.io/server/service/matching/scale_manager.go 4 covered LOC · 2 ranges

Open complete file

94 }
95
96 > func (sm *scaleManager) Stop() { scale_manager.go
97 > if sm == nil {
98 > return scale_manager.go
99 > }
100 sm.background.Cancel()
101 sm.partitionScaler.Stop()
go.temporal.io/server/api/persistence/v1/predicates.go-helpers.pb.go 3 covered LOC · 1 range

Open complete file

17
18 // Size returns the size of the object, in bytes, once serialized
19 > func (val *Predicate) Size() int { predicates.go-helpers.pb.go
20 > return proto.Size(val)
21 > }
22
23 // Equal returns whether two Predicate values are equivalent by recursively
go.temporal.io/server/chasm/library.go 3 covered LOC · 1 range

Open complete file

56 // tasks within the CHASM framework.
57 // The format of the returned FQN is: "libName.name"
58 > func FullyQualifiedName(libName, name string) string { library.go
59 > return libName + "." + name
60 > }
go.temporal.io/server/chasm/registrable_component.go 3 covered LOC · 1 range

Open complete file

203 // The generated ID is used to uniquely identify components and tasks within the CHASM framework. The same FQN will
204 // always produce the same ID.
205 > func GenerateTypeID(fqn string) uint32 { registrable_component.go
206 > return farm.Fingerprint32([]byte(fqn))
207 > }
208
209 // hasBusinessIDAlias returns true if the component has a businessID alias configured
go.temporal.io/server/common/dynamicconfig/key.go 3 covered LOC · 1 range

Open complete file

13 )
14
15 > func MakeKey(s string) Key { key.go
16 > return Key{handle: unique.Make(strings.ToLower(s))}
17 > }
18
19 func (k Key) String() string {
go.temporal.io/server/common/log/noop_logger.go 3 covered LOC · 1 range

Open complete file

10
11 // NewNoopLogger return a noopLogger
12 > func NewNoopLogger() *noopLogger { noop_logger.go
13 > return &noopLogger{}
14 > }
15
16 func (n *noopLogger) Debug(string, ...tag.Tag) {}
go.temporal.io/server/common/membership/hostinfo.go 3 covered LOC · 1 range

Open complete file

12
13 // NewHostInfoFromAddress creates a new HostInfo instance from a socket address.
14 > func NewHostInfoFromAddress(address string) HostInfo { hostinfo.go
15 > return hostAddress(address)
16 > }
17
18 // hostAddress is a HostInfo implementation that uses a string as the address and identity.
go.temporal.io/server/common/metrics/metrics.go 3 covered LOC · 3 ranges

Open complete file

80 )
81
82 > func (c CounterFunc) Record(v int64, tags ...Tag) { c(v, tags...) } metrics.go
83 > func (c GaugeFunc) Record(v float64, tags ...Tag) { c(v, tags...) } metrics.go
84 > func (c TimerFunc) Record(v time.Duration, tags ...Tag) { c(v, tags...) } metrics.go
85 func (c HistogramFunc) Record(v int64, tags ...Tag) { c(v, tags...) }
go.temporal.io/server/common/payload/payload.go 3 covered LOC · 1 range

Open complete file

30 }
31
32 > func Encode(value any) (*commonpb.Payload, error) { payload.go
33 > return defaultDataConverter.ToPayload(value)
34 > }
35
36 func Decode(p *commonpb.Payload, valuePtr any) error {
go.temporal.io/server/common/persistence/nosql/nosqlplugin/cassandra/translator/translator_plugin.go 3 covered LOC · 1 range

Open complete file

22 // RegisterPlugin adds an auth plugin to the plugin registry
23 // it is only safe to use from a package init function
24 > func RegisterTranslator(name string, plugin TranslatorPlugin) { translator_plugin.go
25 > translators[name] = plugin
26 > }
27
28 func LookupTranslator(name string) (TranslatorPlugin, error) {
go.temporal.io/server/common/persistence/persistence_rate_limited_clients.go 3 covered LOC · 1 range

Open complete file

go.temporal.io/server/common/persistence/sql/store.go 3 covered LOC · 2 ranges

Open complete file

19
20 // RegisterPlugin will register a SQL plugin
21 > func RegisterPlugin(pluginName string, plugin sqlplugin.Plugin) { store.go
22 > if _, ok := supportedPlugins[pluginName]; ok {
23 panic("plugin " + pluginName + " already registered")
24 }
25 > supportedPlugins[pluginName] = plugin store.go
26 }
27
go.temporal.io/server/common/serviceerror/stale_partition_counts.go 3 covered LOC · 1 range

Open complete file

16
17 // NewStalePartitionCounts returns new StalePartitionCounts error.
18 > func NewStalePartitionCounts(message string) error { stale_partition_counts.go
19 > return &StalePartitionCounts{Message: message}
20 > }
21
22 // Error returns string message.
go.temporal.io/server/common/softassert/softassert.go 3 covered LOC · 2 ranges

Open complete file

26 // Example:
27 // softassert.That(logger, object.state == "ready", "object is not ready")
28 > func That(logger log.Logger, condition bool, staticMessage string, tags ...tag.Tag) bool { softassert.go
29 > if !condition {
30 // By using the same prefix for all assertions, they can be reliably found in logs.
31 logger.Error("failed assertion: "+staticMessage, append([]tag.Tag{tag.FailedAssertion}, tags...)...)
32 }
33 > return condition softassert.go
34 }
35
go.temporal.io/server/common/tasks/priority.go 3 covered LOC · 1 range

Open complete file

77 func getPriority(
78 class, subClass Priority,
79 > ) Priority { priority.go
80 > return class | subClass
81 > }
go.temporal.io/server/common/tasktoken/serializer.go 3 covered LOC · 1 range

Open complete file

9
10 // NewSerializer creates a new instance of Serializer
11 > func NewSerializer() *Serializer { serializer.go
12 > return &Serializer{}
13 > }
14
15 func (s *Serializer) Serialize(taskToken *tokenspb.Task) ([]byte, error) {
go.temporal.io/server/service/history/tasks/category.go 3 covered LOC · 1 range

Open complete file

100 }
101
102 > func (c Category) Name() string { category.go
103 > return c.name
104 > }
105
106 func (c Category) Type() CategoryType {
go.temporal.io/server/service/matching/loadcause_string_gen.go 3 covered LOC · 2 ranges

Open complete file

25 var _loadCause_index = [...]uint8{0, 11, 15, 20, 28, 36, 45, 49, 58, 68, 73}
26
27 > func (i loadCause) String() string { loadcause_string_gen.go
28 > if i < 0 || i >= loadCause(len(_loadCause_index)-1) {
29 return "loadCause(" + strconv.FormatInt(int64(i), 10) + ")"
30 }
31 > return _loadCause_name[_loadCause_index[i]:_loadCause_index[i+1]] loadcause_string_gen.go
32 }
go.temporal.io/server/service/matching/unloadcause_string_gen.go 3 covered LOC · 2 ranges

Open complete file

24 var _unloadCause_index = [...]uint8{0, 11, 20, 24, 34, 42, 54, 59, 71, 81}
25
26 > func (i unloadCause) String() string { unloadcause_string_gen.go
27 > if i < 0 || i >= unloadCause(len(_unloadCause_index)-1) {
28 return "unloadCause(" + strconv.FormatInt(int64(i), 10) + ")"
29 }
30 > return _unloadCause_name[_unloadCause_index[i]:_unloadCause_index[i+1]] unloadcause_string_gen.go
31 }
go.temporal.io/server/common/persistence/client/fx.go 2 covered LOC · 1 range

Open complete file

224 }
225
226 > func managerProvider[T persistence.Closeable](newManagerFn func(Factory) (T, error)) func(Factory, fx.Lifecycle) (T, error) { fx.go
227 > return func(f Factory, lc fx.Lifecycle) (T, error) {
228 manager, err := newManagerFn(f) // passing receiver (Factory) as first argument.
229 if err != nil {
go.temporal.io/server/service/matching/fair_level.go 2 covered LOC · 1 range

Open complete file

26 }
27
28 > func newFairLevelTreeMap() *treemap.Map { fair_level.go
29 > return treemap.NewWith(func(aany, bany any) int {
30 a, b := aany.(fairLevel), bany.(fairLevel) // nolint:revive
31 if a.less(b) {
go.temporal.io/server/service/matching/rate_limit_fraction_provider.go 2 covered LOC · 1 range

Open complete file

26
27 // NewTaskQueueRateLimitFractionProvider wraps inner and enforces [0.0, 1.0] on every call.
28 > func NewTaskQueueRateLimitFractionProvider(inner TaskQueueRateLimitFractionProvider) TaskQueueRateLimitFractionProvider { rate_limit_fraction_provider.go
29 > return TaskQueueRateLimitFractionProviderFunc(func(nsName namespace.Name, tqName string, tqType enumspb.TaskQueueType) float64 {
30 return max(min(inner.GetRateLimitFraction(nsName, tqName, tqType), maxRateLimitFraction), minRateLimitFraction)
31 })
go.temporal.io/server/common/aggregate/noop_moving_window_average.go 1 covered LOC · 1 range

Open complete file

7 )
8
9 > func newNoopMovingWindowAverage() *noopMovingWindowAverage { return &noopMovingWindowAverage{} } noop_moving_window_average.go
10
11 func (a *noopMovingWindowAverage) Record(_ int64) {}
go.temporal.io/server/common/persistence/noop_health_signal_aggregator.go 1 covered LOC · 1 range

Open complete file

11 )
12
13 > func newNoopSignalAggregator() *noopSignalAggregator { return &noopSignalAggregator{} } noop_health_signal_aggregator.go
14
15 func (a *noopSignalAggregator) Start() {}