func keeper(cmd *cobra.Command, args []string) { capnslog.SetGlobalLogLevel(capnslog.INFO) if cfg.debug { capnslog.SetGlobalLogLevel(capnslog.DEBUG) } if cfg.dataDir == "" { log.Fatalf("data dir required") } if cfg.clusterName == "" { log.Fatalf("cluster name required") } if cfg.storeBackend == "" { log.Fatalf("store backend type required") } if err := os.MkdirAll(cfg.dataDir, 0700); err != nil { log.Fatalf("error: %v", err) } if cfg.pgConfDir != "" { if !filepath.IsAbs(cfg.pgConfDir) { log.Fatalf("pg-conf-dir must be an absolute path") } fi, err := os.Stat(cfg.pgConfDir) if err != nil { log.Fatalf("cannot stat pg-conf-dir: %v", err) } if !fi.IsDir() { log.Fatalf("pg-conf-dir is not a directory") } } // Take an exclusive lock on dataDir _, err := lock.TryExclusiveLock(cfg.dataDir, lock.Dir) if err != nil { log.Fatalf("cannot take exclusive lock on data dir %q: %v", cfg.dataDir, err) } if cfg.id != "" { if !pg.IsValidReplSlotName(cfg.id) { log.Fatalf("keeper id %q not valid. It can contain only lower-case letters, numbers and the underscore character", cfg.id) } } id, err := getIDFromFile(cfg) if err != nil { log.Fatalf("error: %v", err) } if id != "" && cfg.id != "" && id != cfg.id { log.Fatalf("saved id: %q differs from configuration id: %q", id, cfg.id) } if id == "" { id = cfg.id if cfg.id == "" { // Generate a new id if conf.Name is empty if id == "" { u := uuid.NewV4() id = fmt.Sprintf("%x", u[:4]) } log.Infof("generated id: %s", id) } if err := saveIDToFile(cfg, id); err != nil { log.Fatalf("error: %v", err) } } log.Infof("id: %s", id) stop := make(chan bool, 0) end := make(chan error, 0) sigs := make(chan os.Signal, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go sigHandler(sigs, stop) p, err := NewPostgresKeeper(id, cfg, stop, end) if err != nil { log.Fatalf("cannot create keeper: %v", err) } go p.Start() <-end }
func keeper(cmd *cobra.Command, args []string) { capnslog.SetGlobalLogLevel(capnslog.INFO) if cfg.debug { capnslog.SetGlobalLogLevel(capnslog.DEBUG) } if cfg.dataDir == "" { log.Fatalf("data dir required") } if cfg.clusterName == "" { log.Fatalf("cluster name required") } if err := os.MkdirAll(cfg.dataDir, 0700); err != nil { log.Fatalf("error: %v", err) } // Take an exclusive lock on dataDir _, err := lock.TryExclusiveLock(cfg.dataDir, lock.Dir) if err != nil { log.Fatalf("cannot take exclusive lock on data dir %q: %v", cfg.dataDir, err) } id, err := getIDFromFile(cfg) if err != nil { log.Fatalf("error: %v", err) } if id != "" && cfg.id != "" && id != cfg.id { log.Fatalf("saved id: %q differs from configuration id: %q", id, cfg.id) } if id == "" { id = cfg.id if cfg.id == "" { // Generate a new id if conf.Name is empty if id == "" { u := uuid.NewV4() id = fmt.Sprintf("%x", u[:4]) } } if err := saveIDToFile(cfg, id); err != nil { log.Fatalf("error: %v", err) } log.Infof("generated id: %s", id) } log.Infof("id: %s", id) stop := make(chan bool, 0) end := make(chan error, 0) sigs := make(chan os.Signal, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go sigHandler(sigs, stop) p, err := NewPostgresKeeper(id, cfg, stop, end) if err != nil { log.Fatalf("cannot create keeper: %v", err) } go p.Start() <-end }