diff --git a/embed/config_test.go b/embed/config_test.go index 741944d47..c5db04bcb 100644 --- a/embed/config_test.go +++ b/embed/config_test.go @@ -157,3 +157,13 @@ func TestAutoCompactionModeInvalid(t *testing.T) { t.Errorf("expected non-nil error, got %v", err) } } + +func TestAutoCompactionModeParse(t *testing.T) { + dur, err := parseCompactionRetention("revision", "1") + if err != nil { + t.Error(err) + } + if dur != 1 { + t.Fatalf("AutoCompactionRetention expected 1, got %d", dur) + } +} diff --git a/embed/etcd.go b/embed/etcd.go index c1a94bc45..0d21639f7 100644 --- a/embed/etcd.go +++ b/embed/etcd.go @@ -134,22 +134,13 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { } } - var ( - autoCompactionRetention time.Duration - h int - ) // AutoCompactionRetention defaults to "0" if not set. if len(cfg.AutoCompactionRetention) == 0 { cfg.AutoCompactionRetention = "0" } - h, err = strconv.Atoi(cfg.AutoCompactionRetention) - if err == nil { - autoCompactionRetention = time.Duration(int64(h)) * time.Hour - } else { - autoCompactionRetention, err = time.ParseDuration(cfg.AutoCompactionRetention) - if err != nil { - return nil, fmt.Errorf("error parsing AutoCompactionRetention: %v", err) - } + autoCompactionRetention, err := parseCompactionRetention(cfg.AutoCompactionMode, cfg.AutoCompactionRetention) + if err != nil { + return e, err } srvcfg := etcdserver.ServerConfig{ @@ -562,3 +553,22 @@ func (e *Etcd) errHandler(err error) { case e.errc <- err: } } + +func parseCompactionRetention(mode, retention string) (ret time.Duration, err error) { + h, err := strconv.Atoi(retention) + if err == nil { + switch mode { + case CompactorModeRevision: + ret = time.Duration(int64(h)) + case CompactorModePeriodic: + ret = time.Duration(int64(h)) * time.Hour + } + } else { + // periodic compaction + ret, err = time.ParseDuration(retention) + if err != nil { + return 0, fmt.Errorf("error parsing CompactionRetention: %v", err) + } + } + return ret, nil +}