diff --git a/main.go b/main.go index f49d76b0..8852843e 100644 --- a/main.go +++ b/main.go @@ -49,6 +49,7 @@ Logging Options: JetStream Options: -js, --jetstream Enable JetStream functionality. + -sd, --store_dir Set the storage directory. Authorization Options: --user User required for connections diff --git a/server/jetstream.go b/server/jetstream.go index 1d39c3d6..f61a958f 100644 --- a/server/jetstream.go +++ b/server/jetstream.go @@ -113,7 +113,7 @@ const ( JetStreamCreateObservable = "$JS.OBSERVABLE.CREATE" jsCreateObservableExport = "$JS.*.OBSERVABLE.CREATE" - // JetStreamMsgSets is the endpoint to list all message sets for this account. + // JetStreamObservables is the endpoint to list all observables for the message set. // Will return json list of string on success and -ERR on failure. JetStreamObservables = "$JS.OBSERVABLES" jsObservablesExport = "$JS.*.OBSERVABLES" @@ -200,9 +200,13 @@ func (s *Server) EnableJetStream(config *JetStreamConfig) error { return fmt.Errorf("jetstream already enabled") } s.Noticef("Starting JetStream") - if config == nil { - s.Debugf("JetStream creating dynamic configuration - 75%% system memory, %s disk", FriendlyBytes(JetStreamMaxStoreDefault)) - config = s.dynJetStreamConfig() + if config == nil || config.MaxMemory <= 0 || config.MaxStore <= 0 { + var storeDir string + s.Debugf("JetStream creating dynamic configuration - 75%% of system memory, %s disk", FriendlyBytes(JetStreamMaxStoreDefault)) + if config != nil { + storeDir = config.StoreDir + } + config = s.dynJetStreamConfig(storeDir) } // Copy, don't change callers. cfg := *config @@ -1122,9 +1126,13 @@ const ( ) // Dynamically create a config with a tmp based directory (repeatable) and 75% of system memory. -func (s *Server) dynJetStreamConfig() *JetStreamConfig { +func (s *Server) dynJetStreamConfig(storeDir string) *JetStreamConfig { jsc := &JetStreamConfig{} - jsc.StoreDir = filepath.Join(os.TempDir(), JetStreamStoreDir) + if storeDir != "" { + jsc.StoreDir = filepath.Join(storeDir, JetStreamStoreDir) + } else { + jsc.StoreDir = filepath.Join(os.TempDir(), JetStreamStoreDir) + } jsc.MaxStore = JetStreamMaxStoreDefault // Estimate to 75% of total memory if we can determine system memory. if sysMem := sysmem.Memory(); sysMem > 0 { diff --git a/server/opts.go b/server/opts.go index 39dc716c..c61fa046 100644 --- a/server/opts.go +++ b/server/opts.go @@ -184,6 +184,7 @@ type Options struct { Gateway GatewayOpts `json:"gateway,omitempty"` LeafNode LeafNodeOpts `json:"leaf,omitempty"` JetStream bool `json:"jetstream"` + StoreDir string `json:"-"` ProfPort int `json:"-"` PidFile string `json:"-"` PortsFileDir string `json:"-"` @@ -3149,6 +3150,8 @@ func ConfigureOptions(fs *flag.FlagSet, args []string, printVersion, printHelp, fs.IntVar(&opts.MaxTracedMsgLen, "max_traced_msg_len", 0, "Maximum printable length for traced messages. 0 for unlimited.") fs.BoolVar(&opts.JetStream, "js", false, "Enable JetStream.") fs.BoolVar(&opts.JetStream, "jetstream", false, "Enable JetStream.") + fs.StringVar(&opts.StoreDir, "sd", "", "Storage directory.") + fs.StringVar(&opts.StoreDir, "store_dir", "", "Storage directory.") // The flags definition above set "default" values to some of the options. // Calling Parse() here will override the default options with any value diff --git a/server/server.go b/server/server.go index 5787c3bf..b154d3c8 100644 --- a/server/server.go +++ b/server/server.go @@ -1258,7 +1258,11 @@ func (s *Server) Start() { // the system account setup above. JetStream will create its // own system account if one is not present. if opts.JetStream { - if err := s.EnableJetStream(nil); err != nil { + var cfg *JetStreamConfig + if opts.StoreDir != "" { + cfg = &JetStreamConfig{StoreDir: opts.StoreDir} + } + if err := s.EnableJetStream(cfg); err != nil { s.Fatalf("Can't start jetstream: %v", err) return }