func New(zkzone *zk.ZkZone, listenAddr string, managerType string) Controller { // mysql cluster config b, err := zkzone.KatewayJobClusterConfig() if err != nil { panic(err) } var mcc = &config.ConfigMysql{} if err = mcc.From(b); err != nil { panic(err) } this := &controller{ quiting: make(chan struct{}), orchestrator: zkzone.NewOrchestrator(), mc: mysql.New(mcc), ListenAddr: listenAddr, Version: gafka.BuildId, } this.ident, err = this.generateIdent() if err != nil { panic(err) } // hostname:95f333fb-731c-9c95-c598-8d6b99a9ec7d p := strings.SplitN(this.ident, ":", 2) this.shortId = fmt.Sprintf("%s:%s", p[0], this.ident[strings.LastIndexByte(this.ident, '-')+1:]) this.setupAuditor() switch managerType { case "mysql": cf := mmysql.DefaultConfig(zkzone.Name()) cf.Refresh = time.Minute * 5 manager.Default = mmysql.New(cf) case "dummy": manager.Default = mdummy.New("") default: panic("unknown manager: " + managerType) } return this }
func New(id string) *Gateway { this := &Gateway{ id: id, shutdownCh: make(chan struct{}), quiting: make(chan struct{}), certFile: Options.CertFile, keyFile: Options.KeyFile, } this.zkzone = gzk.NewZkZone(gzk.DefaultConfig(Options.Zone, ctx.ZoneZkAddrs(Options.Zone))) if err := this.zkzone.Ping(); err != nil { panic(err) } if Options.EnableRegistry { registry.Default = zk.New(this.zkzone) } metaConf := zkmeta.DefaultConfig() metaConf.Refresh = Options.MetaRefresh meta.Default = zkmeta.New(metaConf, this.zkzone) this.accessLogger = NewAccessLogger("access_log", 100) this.svrMetrics = NewServerMetrics(Options.ReporterInterval, this) rc, err := influxdb.NewConfig(Options.InfluxServer, Options.InfluxDbName, "", "", Options.ReporterInterval) if err != nil { log.Error("telemetry: %v", err) } else { telemetry.Default = influxdb.New(metrics.DefaultRegistry, rc) } // initialize the manager store switch Options.ManagerStore { case "mysql": cf := mandb.DefaultConfig(Options.Zone) cf.Refresh = Options.ManagerRefresh manager.Default = mandb.New(cf) manager.Default.AllowSubWithUnregisteredGroup(Options.PermitUnregisteredGroup) case "dummy": manager.Default = mandummy.New(Options.DummyCluster) case "open": cf := manopen.DefaultConfig(Options.Zone) cf.Refresh = Options.ManagerRefresh manager.Default = manopen.New(cf) manager.Default.AllowSubWithUnregisteredGroup(Options.PermitUnregisteredGroup) HttpHeaderAppid = "devid" HttpHeaderPubkey = "devsecret" HttpHeaderSubkey = "devsecret" default: panic("invalid manager store:" + Options.ManagerStore) } // initialize the servers on demand if Options.DebugHttpAddr != "" { this.debugMux = http.NewServeMux() } if Options.ManHttpAddr != "" || Options.ManHttpsAddr != "" { this.manServer = newManServer(Options.ManHttpAddr, Options.ManHttpsAddr, Options.MaxClients, this) } else { panic("manager server must be present") } if Options.PubHttpAddr != "" || Options.PubHttpsAddr != "" { this.pubServer = newPubServer(Options.PubHttpAddr, Options.PubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultPubStore = storekfk.NewPubStore(Options.PubPoolCapcity, Options.PubPoolIdleTimeout, Options.UseCompress, Options.Debug, Options.DryRun) case "dummy": store.DefaultPubStore = storedummy.NewPubStore(Options.Debug) default: panic("invalid message store") } switch Options.JobStore { case "mysql": var mcc = &config.ConfigMysql{} b, err := this.zkzone.KatewayJobClusterConfig() if err != nil { panic(err) } if err = mcc.From(b); err != nil { panic(err) } jm, err := jobmysql.New(id, mcc) if err != nil { panic(fmt.Errorf("mysql job: %v", err)) } job.Default = jm case "dummy": job.Default = jobdummy.New() default: panic("invalid job store") } // always create hh so that we can turn on/off it online switch Options.HintedHandoffType { case "disk": if len(Options.HintedHandoffDir) == 0 { panic("empty hh dir") } cfg := hhdisk.DefaultConfig() cfg.Dirs = strings.Split(Options.HintedHandoffDir, ",") if err := cfg.Validate(); err != nil { panic(err) } hhdisk.DisableBufio = !Options.HintedHandoffBufio if Options.AuditPub { hhdisk.Auditor = &this.pubServer.auditor } hh.Default = hhdisk.New(cfg) case "dummy": hh.Default = hhdummy.New() default: panic("unkown hinted handoff type") } if Options.FlushHintedOffOnly { meta.Default.Start() log.Trace("meta store[%s] started", meta.Default.Name()) if err = store.DefaultPubStore.Start(); err != nil { panic(err) } log.Trace("pub store[%s] started", store.DefaultPubStore.Name()) hh.Default.FlushInflights() os.Exit(0) } } if Options.SubHttpAddr != "" || Options.SubHttpsAddr != "" { this.subServer = newSubServer(Options.SubHttpAddr, Options.SubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultSubStore = storekfk.NewSubStore(this.subServer.closedConnCh, Options.Debug) case "dummy": store.DefaultSubStore = storedummy.NewSubStore(this.subServer.closedConnCh, Options.Debug) default: panic("invalid store") } } return this }
func (this *Verify) Run(args []string) (exitCode int) { cmdFlags := flag.NewFlagSet("verify", flag.ContinueOnError) cmdFlags.Usage = func() { this.Ui.Output(this.Help()) } cmdFlags.StringVar(&this.zone, "z", ctx.ZkDefaultZone(), "") cmdFlags.StringVar(&this.cluster, "c", "bigtopic", "") cmdFlags.BoolVar(&this.confirmed, "go", false, "") cmdFlags.StringVar(&this.mode, "mode", "p", "") if err := cmdFlags.Parse(args); err != nil { return 1 } if validateArgs(this, this.Ui). require("-z"). invalid(args) { return 2 } cf := mandb.DefaultConfig(this.zone) manager.Default = mandb.New(cf) ensureZoneValid(this.zone) this.zkzone = zk.NewZkZone(zk.DefaultConfig(this.zone, ctx.ZoneZkAddrs(this.zone))) this.kafkaTopics = make(map[string]string) this.problemeticTopics = make(map[string]struct{}) this.kfkClients = make(map[string]sarama.Client) this.psubClient = make(map[string]sarama.Client) this.zkclusters = make(map[string]*zk.ZkCluster) this.zkzone.ForSortedClusters(func(zkcluster *zk.ZkCluster) { this.zkclusters[zkcluster.Name()] = zkcluster kfk, err := sarama.NewClient(zkcluster.BrokerList(), saramaConfig()) swallow(err) this.kfkClients[zkcluster.Name()] = kfk if this.cluster == zkcluster.Name() { this.psubClient[zkcluster.Name()] = kfk } topics, err := kfk.Topics() swallow(err) for _, t := range topics { if _, present := this.kafkaTopics[t]; present { this.problemeticTopics[t] = struct{}{} } this.kafkaTopics[t] = zkcluster.Name() } }) for topic, _ := range this.problemeticTopics { this.Ui.Warn(fmt.Sprintf("dup clusters found for topic: %s", topic)) } dsn, err := this.zkzone.KatewayMysqlDsn() if err != nil { this.Ui.Error(err.Error()) return 1 } this.loadFromManager(dsn) switch this.mode { case "p": this.verifyPub() case "s": this.verifySub() case "t": this.showTable() } return }
func New(id string) *Gateway { this := &Gateway{ id: id, shutdownCh: make(chan struct{}), certFile: Options.CertFile, keyFile: Options.KeyFile, clientStates: NewClientStates(), } this.zkzone = gzk.NewZkZone(gzk.DefaultConfig(Options.Zone, ctx.ZoneZkAddrs(Options.Zone))) if err := this.zkzone.Ping(); err != nil { panic(err) } if Options.EnableRegistry { registry.Default = zk.New(Options.Zone, this.id, this.InstanceInfo()) } metaConf := zkmeta.DefaultConfig() metaConf.Refresh = Options.MetaRefresh meta.Default = zkmeta.New(metaConf, this.zkzone) this.guard = newGuard(this) this.timer = timewheel.NewTimeWheel(time.Second, 120) this.accessLogger = NewAccessLogger("access_log", 100) this.svrMetrics = NewServerMetrics(Options.ReporterInterval, this) // initialize the manager store switch Options.ManagerStore { case "mysql": cf := mandb.DefaultConfig(Options.Zone) cf.Refresh = Options.ManagerRefresh manager.Default = mandb.New(cf) manager.Default.AllowSubWithUnregisteredGroup(Options.PermitUnregisteredGroup) case "dummy": manager.Default = mandummy.New() default: panic("invalid manager store") } // initialize the servers on demand if Options.ManHttpAddr != "" || Options.ManHttpsAddr != "" { this.manServer = newManServer(Options.ManHttpAddr, Options.ManHttpsAddr, Options.MaxClients, this) } if Options.PubHttpAddr != "" || Options.PubHttpsAddr != "" { this.pubServer = newPubServer(Options.PubHttpAddr, Options.PubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultPubStore = storekfk.NewPubStore(Options.PubPoolCapcity, Options.PubPoolIdleTimeout, Options.UseCompress, &this.wg, Options.Debug, Options.DryRun) case "dummy": store.DefaultPubStore = storedummy.NewPubStore(&this.wg, Options.Debug) default: panic("invalid store") } } if Options.SubHttpAddr != "" || Options.SubHttpsAddr != "" { this.subServer = newSubServer(Options.SubHttpAddr, Options.SubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultSubStore = storekfk.NewSubStore(&this.wg, this.subServer.closedConnCh, Options.Debug) case "dummy": store.DefaultSubStore = storedummy.NewSubStore(&this.wg, this.subServer.closedConnCh, Options.Debug) default: panic("invalid store") } } return this }