{"record":{"id":"4d8d37301f5dfa34","repo":"nats-io/nats-server","slug":"jetstream-already-enabled","errorCode":null,"errorMessage":"jetstream already enabled","messagePattern":"jetstream already enabled","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/jetstream.go","lineNumber":209,"sourceCode":"\tusageApi   uint64\n\tusageErr   uint64\n\tupdatesPub string\n\tupdatesSub *subscription\n\tlupdate    time.Time\n\tutimer     *time.Timer\n}\n\n// Track general usage for this account.\ntype jsaUsage struct {\n\tmem   int64\n\tstore int64\n}\n\n// EnableJetStream will enable JetStream support on this server with the given configuration.\n// A nil configuration will dynamically choose the limits and temporary file storage directory.\nfunc (s *Server) EnableJetStream(config *JetStreamConfig) error {\n\tif s.JetStreamEnabled() {\n\t\treturn fmt.Errorf(\"jetstream already enabled\")\n\t}\n\n\ts.Noticef(\"Starting JetStream\")\n\tstart := time.Now()\n\tdefer func() {\n\t\ts.Noticef(\"Took %s to start JetStream\", time.Since(start))\n\t}()\n\n\tif config == nil || config.MaxMemory <= 0 || config.MaxStore <= 0 {\n\t\tvar storeDir, domain, uniqueTag string\n\t\tvar maxStore, maxMem int64\n\t\tif config != nil {\n\t\t\tstoreDir, domain, uniqueTag = config.StoreDir, config.Domain, config.UniqueTag\n\t\t\tmaxStore, maxMem = config.MaxStore, config.MaxMemory\n\t\t}\n\t\tconfig = s.dynJetStreamConfig(storeDir, maxStore, maxMem)\n\t\tif domain != _EMPTY_ {\n\t\t\tconfig.Domain = domain","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/jetstream.go#L191-L227","documentation":"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.","triggerScenarios":"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.","commonSituations":"Calling EnableJetStream both in config and programmatically; re-running enable logic during a config reload; test harness reusing a server object.","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"],"exampleFix":"// before\nif err := srv.EnableJetStream(cfg); err != nil { log.Fatal(err) }\n// after\nif !srv.JetStreamEnabled() {\n    if err := srv.EnableJetStream(cfg); err != nil { log.Fatal(err) }\n}","handlingStrategy":"validation","validationCode":"if !srv.JetStreamEnabled() {\n    if err := srv.EnableJetStream(cfg); err != nil { /* handle */ }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["jetstream","configuration","double-initialization"],"backgroundTag":"jetstream-already-enabled","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}