func (s *Server) register() { if _, err := s.topo.CreateProxyInfo(&s.info); err != nil { log.PanicErrorf(err, "create proxy node failed") } if _, err := s.topo.CreateProxyFenceNode(&s.info); err != nil && err != zk.ErrNodeExists { log.PanicErrorf(err, "create fence node failed") } log.Warn("********** Attention **********") log.Warn("You should use `kill {pid}` rather than `kill -9 {pid}` to stop me,") log.Warn("or the node resisted on zk will not be cleaned when I'm quiting and you must remove it manually") log.Warn("*******************************") }
func (t *MigrateTask) rollbackPremigrate() { if s, err := models.GetSlot(t.zkConn, t.productName, t.SlotId); err == nil && (s.State.Status == models.SLOT_STATUS_PRE_MIGRATE || s.State.Status == models.SLOT_STATUS_MIGRATE) { s.State.Status = models.SLOT_STATUS_ONLINE err = s.Update(t.zkConn) if err != nil { log.Warn("rollback premigrate failed", err) } else { log.Infof("rollback slot %d from premigrate to online\n", s.Id) } } }
func createDashboardNode() error { // make sure root dir is exists rootDir := fmt.Sprintf("/zk/codis/db_%s", globalEnv.ProductName()) zkhelper.CreateRecursive(safeZkConn, rootDir, "", 0, zkhelper.DefaultDirACLs()) zkPath := fmt.Sprintf("%s/dashboard", rootDir) // make sure we're the only one dashboard if exists, _, _ := safeZkConn.Exists(zkPath); exists { data, _, _ := safeZkConn.Get(zkPath) return errors.New("dashboard already exists: " + string(data)) } content := fmt.Sprintf(`{"addr": "%v", "pid": %v}`, globalEnv.DashboardAddr(), os.Getpid()) pathCreated, err := safeZkConn.Create(zkPath, []byte(content), 0, zkhelper.DefaultFileACLs()) createdDashboardNode = true log.Infof("dashboard node created: %v, %s", pathCreated, string(content)) log.Warn("********** Attention **********") log.Warn("You should use `kill {pid}` rather than `kill -9 {pid}` to stop me,") log.Warn("or the node resisted on zk will not be cleaned when I'm quiting and you must remove it manually") log.Warn("*******************************") return errors.Trace(err) }
func LoadConf(configFile string) (*Config, error) { c := cfg.NewCfg(configFile) if err := c.Load(); err != nil { log.PanicErrorf(err, "load config '%s' failed", configFile) } conf := &Config{} conf.productName, _ = c.ReadString("product", "test") if len(conf.productName) == 0 { log.Panicf("invalid config: product entry is missing in %s", configFile) } conf.dashboardAddr, _ = c.ReadString("dashboard_addr", "") if conf.dashboardAddr == "" { log.Panicf("invalid config: dashboard_addr is missing in %s", configFile) } conf.zkAddr, _ = c.ReadString("zk", "") if len(conf.zkAddr) == 0 { log.Panicf("invalid config: need zk entry is missing in %s", configFile) } conf.zkAddr = strings.TrimSpace(conf.zkAddr) conf.passwd, _ = c.ReadString("password", "") conf.proxyId, _ = c.ReadString("proxy_id", "") if len(conf.proxyId) == 0 { log.Panicf("invalid config: need proxy_id entry is missing in %s", configFile) } conf.proto, _ = c.ReadString("proto", "tcp") conf.provider, _ = c.ReadString("coordinator", "zookeeper") loadConfInt := func(entry string, defval int) int { v, _ := c.ReadInt(entry, defval) if v < 0 { log.Panicf("invalid config: read %s = %d", entry, v) } return v } conf.pingPeriod = loadConfInt("backend_ping_period", 5) conf.maxTimeout = loadConfInt("session_max_timeout", 1800) conf.maxBufSize = loadConfInt("session_max_bufsize", 131072) conf.maxPipeline = loadConfInt("session_max_pipeline", 1024) conf.zkSessionTimeout = loadConfInt("zk_session_timeout", 30000) if conf.zkSessionTimeout <= 100 { conf.zkSessionTimeout *= 1000 log.Warn("zkSessionTimeout is to small, it is ms not second") } return conf, nil }
func WaitForReceiverWithTimeout(zkConn zkhelper.Conn, productName string, actionZkPath string, proxies []ProxyInfo, timeoutInMs int) error { if len(proxies) == 0 { return nil } times := 0 proxyIds := make(map[string]bool) for _, p := range proxies { proxyIds[p.Id] = true } // check every 500ms for times < timeoutInMs/500 { if times >= 6 && (times*500)%1000 == 0 { log.Warnf("abnormal waiting time for receivers: %s %v", actionZkPath, proxyIds) } // get confirm ids nodes, _, err := zkConn.Children(actionZkPath) if err != nil { return errors.Trace(err) } for _, node := range nodes { id := path.Base(node) delete(proxyIds, id) } if len(proxyIds) == 0 { return nil } times++ time.Sleep(500 * time.Millisecond) } log.Warn("proxies didn't responed: ", proxyIds) // set offline proxies /* for id, _ := range proxyIds { log.Errorf("mark proxy %s to PROXY_STATE_MARK_OFFLINE", id) if err := SetProxyStatus(zkConn, productName, id, PROXY_STATE_MARK_OFFLINE); err != nil { return errors.Trace(err) } } */ return ErrReceiverTimeout }