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 = domainView on GitHub (pinned to 3a66a489d2)
Solutions
- Guard the call: only invoke EnableJetStream if s.JetStreamEnabled() is false
- Remove duplicate enable paths — prefer configuring jetstream{} in server config over manual calls
- 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
- Choose one enable path (config file OR code) — never both
- Check JetStreamEnabled() before any programmatic enable
- Skip re-enable in reload handlers
- In tests, create a fresh Server object per case instead of re-enabling
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
- system account not setup
- JetStream cluster requires cluster name
- JetStream cluster requires configured routes or solicited le
- system limit reached
- storage directory is not a directory
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/4d8d37301f5dfa34.
Report an issue: GitHub.