func (this *Mirror) Main() (exitCode int) { this.quit = make(chan struct{}) signal.RegisterHandler(func(sig os.Signal) { log.Info("received signal: %s", strings.ToUpper(sig.String())) log.Info("quiting...") this.once.Do(func() { close(this.quit) }) }, syscall.SIGINT, syscall.SIGTERM) limit := (1 << 20) * this.BandwidthLimit / 8 if this.BandwidthLimit > 0 { this.bandwidthRateLimiter = ratelimiter.NewLeakyBucket(limit*10, time.Second*10) } log.Info("starting [email protected]%s", gafka.BuildId) // pprof debugAddr := ":10009" go http.ListenAndServe(debugAddr, nil) log.Info("pprof ready on %s", debugAddr) z1 := zk.NewZkZone(zk.DefaultConfig(this.Z1, ctx.ZoneZkAddrs(this.Z1))) z2 := zk.NewZkZone(zk.DefaultConfig(this.Z2, ctx.ZoneZkAddrs(this.Z2))) c1 := z1.NewCluster(this.C1) c2 := z2.NewCluster(this.C2) this.runMirror(c1, c2, limit) log.Info("bye [email protected]%s, %s", gafka.BuildId, time.Since(this.startedAt)) log.Close() return }
func (this *Mirror) Run(args []string) (exitCode int) { cmdFlags := flag.NewFlagSet("mirror", flag.ContinueOnError) cmdFlags.Usage = func() { this.Ui.Output(this.Help()) } cmdFlags.StringVar(&this.zone1, "z1", "", "") cmdFlags.StringVar(&this.zone2, "z2", "", "") cmdFlags.StringVar(&this.cluster1, "c1", "", "") cmdFlags.StringVar(&this.cluster2, "c2", "", "") cmdFlags.StringVar(&this.excludes, "excluded", "", "") cmdFlags.BoolVar(&this.debug, "debug", false, "") cmdFlags.StringVar(&this.compress, "compress", "", "") cmdFlags.Int64Var(&this.bandwidthLimit, "net", 100, "") cmdFlags.BoolVar(&this.autoCommit, "commit", true, "") cmdFlags.Int64Var(&this.progressStep, "step", 5000, "") if err := cmdFlags.Parse(args); err != nil { return 1 } if validateArgs(this, this.Ui). require("-z1", "-z2", "-c1", "-c2"). invalid(args) { return 2 } this.topicsExcluded = make(map[string]struct{}) for _, e := range strings.Split(this.excludes, ",") { this.topicsExcluded[e] = struct{}{} } log.SetOutput(os.Stdout) this.quit = make(chan struct{}) limit := (1 << 20) * this.bandwidthLimit / 8 this.bandwidthRateLimiter = ratelimiter.NewLeakyBucket(limit, time.Second) log.Printf("[%s]%s -> [%s]%s with bandwidth %sbps", this.zone1, this.cluster1, this.zone2, this.cluster2, gofmt.Comma(int64(limit*8))) signal.RegisterSignalsHandler(func(sig os.Signal) { log.Printf("received signal: %s", strings.ToUpper(sig.String())) log.Println("quiting...") this.once.Do(func() { close(this.quit) }) }, syscall.SIGINT, syscall.SIGTERM) z1 := zk.NewZkZone(zk.DefaultConfig(this.zone1, ctx.ZoneZkAddrs(this.zone1))) z2 := zk.NewZkZone(zk.DefaultConfig(this.zone2, ctx.ZoneZkAddrs(this.zone2))) c1 := z1.NewCluster(this.cluster1) c2 := z2.NewCluster(this.cluster2) this.makeMirror(c1, c2) return }
func NewTFunServer(engine *Engine, preforkMode bool, processor thrift.TProcessor, serverTransport thrift.TServerTransport, transportFactory thrift.TTransportFactory, protocolFactory thrift.TProtocolFactory) *TFunServer { this := &TFunServer{ quit: make(chan bool), stats: newEngineStats(), errors: make(map[string]int32, 1<<10), leakyBucket: ratelimiter.NewLeakyBucket( uint16(config.Engine.Rpc.HostMaxCallPerMinute), time.Minute), processorFactory: thrift.NewTProcessorFactory(processor), serverTransport: serverTransport, // TServerSocket inputTransportFactory: transportFactory, // TBufferedTransportFactory outputTransportFactory: transportFactory, // TBufferedTransportFactory inputProtocolFactory: protocolFactory, // TBinaryProtocolFactory outputProtocolFactory: protocolFactory, // TBinaryProtocolFactory } this.dispatcher = newRpcDispatcher(preforkMode, config.Engine.Rpc.MaxOutstandingSessions, this.handleSession) return this }