Files
temporal/common/dynamicconfig/client.go
Alan Wu 5845841278 Add chasm task type dynamic config filter and standby task discard delay dynamic config flag (#9506)
## What changed?
Add chasm logical task type dynamic config filter and standby task
discard delay dynamic config flag.

## Why?
Standby tasks have a configurable dynamic config (per task type) that
specifies the timeout for discarding the task and running the
post-discard function. Currently, this is not configurable for CHASM
logical tasks. By default, CHASM tasks need a higher discard timeout
since they are not regenerated from pending tasks in MS, which can lead
to abandoned tasks. For tasks that can be safely dispatched to Matching,
they can be configured with a lower value. (See Standalone activity
tasks).

## How did you test it?
- [X] built
- [X] run locally and tested manually
- [X] covered by existing tests
- [ ] added new unit test(s)
- [ ] added new functional test(s)
2026-03-13 00:57:57 -04:00

98 lines
3.9 KiB
Go

package dynamicconfig
import (
enumspb "go.temporal.io/api/enums/v1"
enumsspb "go.temporal.io/server/api/enums/v1"
)
type (
// Client is a source of dynamic configuration. The default Client, fileBasedClient, reads
// from a file in the filesystem, and refreshes it periodically. You can extend the server
// with an alternate Client using ServerOptions.
Client interface {
// GetValue returns a set of values and associated constraints for a key. Not all
// constraints are valid for all keys.
//
// The returned slice of ConstrainedValues is treated as a set, and order does not
// matter. The effective order of constraints is determined by server logic. See the
// comment on Constraints below.
//
// If none of the ConstrainedValues match the constraints being used for the key, then
// the server default value will be used.
//
// Note that GetValue is called very often! You should not synchronously call out to an
// external system. Instead you should keep a set of all configured values, refresh it
// periodically or when notified, and only do in-memory lookups inside of GetValue.
//
// Implementations should prefer to return the same slice in response to the same key
// as long as the value hasn't changed. Value conversions are cached using weak
// pointers into the returned slice, so new slices will result in unnecessary calls to
// conversion functions.
GetValue(key Key) []ConstrainedValue
}
// NotifyingClient is an optional interface that a Client can also implement, that adds
// support for faster notifications of dynamic config changes.
NotifyingClient interface {
// Adds a subscription to all updates from this Client. `update` will be called on any
// change to the current value set. The caller should call `cancel` to cancel the
// subscription.
Subscribe(update ClientUpdateFunc) (cancel func())
}
// Called with modified keys on any change to the current value set.
// Deleted keys/constraints will get a nil value.
ClientUpdateFunc func(map[Key][]ConstrainedValue)
// ConstrainedValue is a value plus associated constraints.
//
// The type of the Value field depends on the key. Acceptable types will be one of:
// int, float64, bool, string, map[string]any, time.Duration
//
// If time.Duration is expected, a string is also accepted, which will be converted using
// timestamp.ParseDurationDefaultDays. If float64 is expected, int is also accepted. In
// other cases, the exact type must be used. If a Value is returned with an unexpected
// type, it will be ignored.
ConstrainedValue struct {
Constraints Constraints
Value any
}
TypedConstrainedValue[T any] struct {
Constraints Constraints
Value T
}
// Constraints describe under what conditions a ConstrainedValue should be used.
// There are few standard "constraint precedence orders" that the server uses:
// global precedence:
// no constraints
// namespace precedence:
// Namespace
// no constraints
// task queue precedence
// Namespace+TaskQueueName+TaskQueueType
// Namespace+TaskQueueName
// TaskQueueName
// Namespace
// no constraints
// shard id precedence:
// ShardID
// no constraints
// In each case, the constraints that the server is checking and the constraints that apply
// to the value must match exactly, including the fields that are not set (zero values).
// That is, for keys that use namespace precedence, you must either return a
// ConstrainedValue with only Namespace set, or with no fields set. (Or return one of
// each.) If you return a ConstrainedValue with Namespace and ShardID set, for example,
// that value will never be used, even if the Namespace matches.
Constraints struct {
Namespace string
NamespaceID string
TaskQueueName string
Destination string
ChasmTaskType string
TaskQueueType enumspb.TaskQueueType
ShardID int32
TaskType enumsspb.TaskType
}
)