// NewTxPool creates a new TxPool. It's not operational until it's Open'd. func NewTxPool( name string, txStatsPrefix string, capacity int, timeout time.Duration, poolTimeout time.Duration, idleTimeout time.Duration, enablePublishStats bool, qStats *QueryServiceStats) *TxPool { txStatsName := "" if enablePublishStats { txStatsName = txStatsPrefix + "Transactions" } axp := &TxPool{ pool: NewConnPool(name, capacity, idleTimeout, enablePublishStats, qStats), activePool: pools.NewNumbered(), lastID: sync2.NewAtomicInt64(time.Now().UnixNano()), timeout: sync2.NewAtomicDuration(timeout), poolTimeout: sync2.NewAtomicDuration(poolTimeout), ticks: timer.NewTimer(timeout / 10), txStats: stats.NewTimings(txStatsName), queryServiceStats: qStats, } // Careful: pool also exports name+"xxx" vars, // but we know it doesn't export Timeout. if enablePublishStats { stats.Publish(name+"Timeout", stats.DurationFunc(axp.timeout.Get)) stats.Publish(name+"PoolTimeout", stats.DurationFunc(axp.poolTimeout.Get)) } return axp }
// NewTabletServer creates an instance of TabletServer. Only one instance // of TabletServer can be created per process. func NewTabletServer(config Config) *TabletServer { tsv := &TabletServer{ config: config, QueryTimeout: sync2.NewAtomicDuration(time.Duration(config.QueryTimeout * 1e9)), BeginTimeout: sync2.NewAtomicDuration(time.Duration(config.TxPoolTimeout * 1e9)), checkMySQLThrottler: sync2.NewSemaphore(1, 0), streamHealthMap: make(map[int]chan<- *querypb.StreamHealthResponse), sessionID: Rand(), history: history.New(10), } tsv.qe = NewQueryEngine(tsv, config) tsv.invalidator = NewRowcacheInvalidator(config.StatsPrefix, tsv, tsv.qe, config.EnablePublishStats) if config.EnablePublishStats { stats.Publish(config.StatsPrefix+"TabletState", stats.IntFunc(func() int64 { tsv.mu.Lock() state := tsv.state tsv.mu.Unlock() return state })) stats.Publish(config.StatsPrefix+"QueryTimeout", stats.DurationFunc(tsv.QueryTimeout.Get)) stats.Publish(config.StatsPrefix+"BeginTimeout", stats.DurationFunc(tsv.BeginTimeout.Get)) stats.Publish(config.StatsPrefix+"TabletStateName", stats.StringFunc(tsv.GetState)) } return tsv }
// NewResourcePool creates a new ResourcePool pool. // capacity is the number of active resources in the pool: // there can be up to 'capacity' of these at a given time. // maxCap specifies the extent to which the pool can be resized // in the future through the SetCapacity function. // You cannot resize the pool beyond maxCap. // If a resource is unused beyond idleTimeout, it's discarded. // An idleTimeout of 0 means that there is no timeout. func NewResourcePool(factory Factory, capacity, maxCap int, idleTimeout time.Duration) *ResourcePool { if capacity <= 0 || maxCap <= 0 || capacity > maxCap { panic(errors.New("invalid/out of range capacity")) } rp := &ResourcePool{ resources: make(chan resourceWrapper, maxCap), factory: factory, capacity: sync2.NewAtomicInt64(int64(capacity)), idleTimeout: sync2.NewAtomicDuration(idleTimeout), } for i := 0; i < capacity; i++ { rp.resources <- resourceWrapper{} } return rp }