temporalio/temporal · error
there are no options for translator plugin
Error message
there are no options for translator plugin
What it means
GetTranslator of FixedAddressTranslatorPlugin reads cfg.AddressTranslator.Options, a string map, to learn the advertised hostname. When the addressTranslator section exists but its Options map is nil/empty, the plugin cannot build the translation rules and returns this error.
Source
Thrown at common/persistence/nosql/nosqlplugin/cassandra/translator/fixed_address_translator.go:59
// visible hostname which a user put into configuration so driver can connect to it, but that is not enough,
// IP addresses behind a proxy are not reachable from client's perspective. These are not translatable
// with service resolver so client can not connect to them directly - that is what gocql address
// translator is exactly for.
//
// The implementation of fixed address translator plugin is fed the internal IP address from the system.peers table,
// and it will always return same fixed ip based on what advertised-hostname is resolved to. That IP address,
// from client's perspective, might be, for example, an IP address of a load balancer which is reachable from client.
// As the IP address of all nodes are some, the difference between the nodes can be achieved by running them on
// a different port for each node.
// see also https://github.com/gocql/gocql/pull/1635
func (plugin *FixedAddressTranslatorPlugin) GetTranslator(cfg *config.Cassandra) (gocql.AddressTranslator, error) {
if cfg.AddressTranslator == nil {
return nil, errors.New("there is no addressTranslator configuration in cassandra configuration")
}
opts := cfg.AddressTranslator.Options
if opts == nil {
return nil, errors.New("there are no options for translator plugin")
}
advertisedHostname, found := opts[advertisedHostnameKey]
if !found || len(advertisedHostname) == 0 {
return nil, errors.New("detected no advertised-hostname key or empty value for translator plugin options")
}
var resolvedIp net.IP = nil
ips, _ := net.LookupIP(advertisedHostname)
for _, ip := range ips {
if ipv4 := ip.To4(); ipv4 != nil {
resolvedIp = ipv4
break
}
}
if resolvedIp == nil {View on GitHub (pinned to bde624efd1)
Solutions
- Add an options map under addressTranslator containing the required keys (advertised-hostname, server-address)
- Fix YAML indentation so options is nested under addressTranslator
- When building config in Go, initialize AddressTranslator.Options with the required entries
Example fix
// before
addressTranslator: {}
// after
addressTranslator:
options:
server-address: "127.0.0.1"
advertised-hostname: "cassandra-0"
Defensive patterns
Strategy: validation
Validate before calling
if cfg.AddressTranslator == nil || cfg.AddressTranslator.Options == nil {
return errors.New("addressTranslator requires a non-empty options map")
} Prevention
- Include both options keys (server-address, advertised-hostname) in templates
- Beware YAML indentation: options must be nested under addressTranslator
- Initialize Options map when constructing config.AddressTranslator programmatically
When it happens
Trigger: Calling GetTranslator with cfg.AddressTranslator non-nil but cfg.AddressTranslator.Options == nil, e.g. YAML containing `addressTranslator:` with no `options:` sub-map.
Common situations: YAML with `addressTranslator:` key but nothing under it (indentation mistakes nesting options elsewhere); programmatic config constructing config.AddressTranslator{} without Options; config stripping empty maps.
Related errors
- there is no addressTranslator configuration in cassandra con
- detected no advertised-hostname key or empty value for trans
- only one of keyData or keyFile properties should be specifie
- only one of caData or caFile properties should be specified
- translator_plugin: invalid translator plugin requested
AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01).
Data as JSON: /api/errors/9ef64457a189f28e.
Report an issue: GitHub.