func NewServer(addr string, debugVarAddr string, conf *Conf) *Server { log.Infof("%+v", conf) s := &Server{ evtbus: make(chan interface{}, 100), top: topo.NewTopo(conf.productName, conf.zkAddr, conf.f), net_timeout: conf.net_timeout, counter: stats.NewCounters("router"), lastActionSeq: -1, startAt: time.Now(), addr: addr, concurrentLimiter: tokenlimiter.NewTokenLimiter(100), moper: NewMultiOperator(addr), pools: cachepool.NewCachePool(), } s.broker = conf.broker slot_num = conf.slot_num s.mu.Lock() s.pi.Id = conf.proxyId s.pi.State = models.PROXY_STATE_OFFLINE hname, err := os.Hostname() if err != nil { log.Fatal("get host name failed", err) } s.pi.Addr = hname + ":" + strings.Split(addr, ":")[1] s.pi.DebugVarAddr = hname + ":" + strings.Split(debugVarAddr, ":")[1] log.Infof("proxy_info:%+v", s.pi) s.mu.Unlock() //todo:fill more field stats.Publish("evtbus", stats.StringFunc(func() string { return strconv.Itoa(len(s.evtbus)) })) stats.Publish("startAt", stats.StringFunc(func() string { return s.startAt.String() })) s.RegisterAndWait() _, err = s.top.WatchChildren(models.GetWatchActionPath(conf.productName), s.evtbus) if err != nil { log.Fatal(errors.ErrorStack(err)) } s.FillSlots() //start event handler go s.handleTopoEvent() log.Info("proxy start ok") return s }
func makeServer(configFile string) *Server { cfg, err := config.ParseConfigFile(configFile) if err != nil { log.Error(err.Error()) return nil } log.Warningf("%#v", cfg) s := &Server{ configFile: configFile, cfg: cfg, addr: cfg.Addr, user: cfg.User, password: cfg.Password, autoSchamas: make(map[string]*tabletserver.SchemaInfo), taskQ: make(chan *execTask, 100), concurrentLimiter: tokenlimiter.NewTokenLimiter(100), counter: stats.NewCounters("stats"), rwlock: &sync.RWMutex{}, clients: make(map[uint32]*Conn), } f := func(wg *sync.WaitGroup, rs []interface{}, i int, co *mysql.SqlConn, sql string, args []interface{}) { r, err := co.Execute(sql, args...) if err != nil { log.Warning(err) rs[i] = err } else { rs[i] = r } wg.Done() } for i := 0; i < 100; i++ { go func() { for task := range s.taskQ { f(task.wg, task.rs, task.idx, task.co, task.sql, task.args) } }() } return s }