nats-io/nats-server · error

jetstream already enabled

Error message

jetstream already enabled

What it means

EnableJetStream returns this when JetStream support is already active on the server. JetStream is a singleton per server; calling EnableJetStream (or enabling via config) twice would double-initialize streams, stores, and internal subscriptions, so it is rejected.

Source

Thrown at server/jetstream.go:209

	usageApi   uint64
	usageErr   uint64
	updatesPub string
	updatesSub *subscription
	lupdate    time.Time
	utimer     *time.Timer
}

// Track general usage for this account.
type jsaUsage struct {
	mem   int64
	store int64
}

// EnableJetStream will enable JetStream support on this server with the given configuration.
// A nil configuration will dynamically choose the limits and temporary file storage directory.
func (s *Server) EnableJetStream(config *JetStreamConfig) error {
	if s.JetStreamEnabled() {
		return fmt.Errorf("jetstream already enabled")
	}

	s.Noticef("Starting JetStream")
	start := time.Now()
	defer func() {
		s.Noticef("Took %s to start JetStream", time.Since(start))
	}()

	if config == nil || config.MaxMemory <= 0 || config.MaxStore <= 0 {
		var storeDir, domain, uniqueTag string
		var maxStore, maxMem int64
		if config != nil {
			storeDir, domain, uniqueTag = config.StoreDir, config.Domain, config.UniqueTag
			maxStore, maxMem = config.MaxStore, config.MaxMemory
		}
		config = s.dynJetStreamConfig(storeDir, maxStore, maxMem)
		if domain != _EMPTY_ {
			config.Domain = domain

View on GitHub (pinned to 3a66a489d2)

Solutions

  1. Guard the call: only invoke EnableJetStream if s.JetStreamEnabled() is false
  2. Remove duplicate enable paths — prefer configuring jetstream{} in server config over manual calls
  3. On reload/restart paths, skip re-enabling if already enabled

Example fix

// before
if err := srv.EnableJetStream(cfg); err != nil { log.Fatal(err) }
// after
if !srv.JetStreamEnabled() {
    if err := srv.EnableJetStream(cfg); err != nil { log.Fatal(err) }
}
Defensive patterns

Strategy: validation

Validate before calling

if !srv.JetStreamEnabled() {
    if err := srv.EnableJetStream(cfg); err != nil { /* handle */ }
}

Prevention

When it happens

Trigger: Calling s.EnableJetStream(cfg) on a server that already has JetStream enabled — either from a previous explicit call or because the server was started with the jetstream config option set.

Common situations: Calling EnableJetStream both in config and programmatically; re-running enable logic during a config reload; test harness reusing a server object.

Related errors


AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02). Data as JSON: /api/errors/4d8d37301f5dfa34. Report an issue: GitHub.