package maptracker import ( "encoding/json" "errors" "time" "github.com/ipfs/ipfs-cluster/config" ) const configKey = "maptracker" // Default values for this Config. const ( DefaultPinningTimeout = 60 * time.Minute DefaultUnpinningTimeout = 5 * time.Minute DefaultMaxPinQueueSize = 4096 ) // Config allows to initialize a Monitor and customize some parameters. type Config struct { config.Saver // PinningTimeout specifies how long to wait before a pinning state becomes a pin error PinningTimeout time.Duration // UnpinningTimeout specifies how long to wait before an unpinning state becomes a pin error UnpinningTimeout time.Duration // MaxPinQueueSize specifies how many pin or unpin requests we can hold in the queue // If higher, they will automatically marked with an error. MaxPinQueueSize int } type jsonConfig struct { PinningTimeout string `json:"pinning_timeout"` UnpinningTimeout string `json:"unpinning_timeout"` MaxPinQueueSize int `json:"max_pin_queue_size"` } // ConfigKey provides a human-friendly identifier for this type of Config. func (cfg *Config) ConfigKey() string { return configKey } // Default sets the fields of this Config to sensible values. func (cfg *Config) Default() error { cfg.PinningTimeout = DefaultPinningTimeout cfg.UnpinningTimeout = DefaultUnpinningTimeout cfg.MaxPinQueueSize = DefaultMaxPinQueueSize return nil } // Validate checks that the fields of this Config have working values, // at least in appearance. func (cfg *Config) Validate() error { if cfg.PinningTimeout <= 0 { return errors.New("maptracker.pinning_timeout too low") } if cfg.UnpinningTimeout <= 0 { return errors.New("maptracker.unpinning_timeout too low") } if cfg.MaxPinQueueSize <= 0 { return errors.New("maptracker.max_pin_queue_size too low") } return nil } // LoadJSON sets the fields of this Config to the values defined by the JSON // representation of it, as generated by ToJSON. func (cfg *Config) LoadJSON(raw []byte) error { jcfg := &jsonConfig{} err := json.Unmarshal(raw, jcfg) if err != nil { logger.Error("Error unmarshaling basic monitor config") return err } cfg.Default() parseDuration := func(txt string) time.Duration { d, _ := time.ParseDuration(txt) if txt != "" && d == 0 { logger.Warningf("%s is not a valid duration. Default will be used", txt) } return d } pinningTimeo := parseDuration(jcfg.PinningTimeout) unpinningTimeo := parseDuration(jcfg.UnpinningTimeout) config.SetIfNotDefault(pinningTimeo, &cfg.PinningTimeout) config.SetIfNotDefault(unpinningTimeo, &cfg.UnpinningTimeout) config.SetIfNotDefault(jcfg.MaxPinQueueSize, &cfg.MaxPinQueueSize) return cfg.Validate() } // ToJSON generates a human-friendly JSON representation of this Config. func (cfg *Config) ToJSON() ([]byte, error) { jcfg := &jsonConfig{} jcfg.PinningTimeout = cfg.PinningTimeout.String() jcfg.UnpinningTimeout = cfg.UnpinningTimeout.String() jcfg.MaxPinQueueSize = cfg.MaxPinQueueSize return config.DefaultJSONMarshal(jcfg) }