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

  1. Add an options map under addressTranslator containing the required keys (advertised-hostname, server-address)
  2. Fix YAML indentation so options is nested under addressTranslator
  3. 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

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


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/9ef64457a189f28e. Report an issue: GitHub.