func NewQueryEngine(config Config) *QueryEngine { var err error qe := &QueryEngine{} qe.engine, err = kvengine.NewEngine(config.EngineName) if err != nil { panic(NewTabletErrorDB(FATAL, err)) } qe.connPool = NewConnectionPool("ConnPool", config.PoolSize, time.Duration(config.IdleTimeout*1e9)) qe.schemaInfo = NewSchemaInfo(config.QueryCacheSize, time.Duration(config.IdleTimeout*1e9)) qe.consolidator = NewConsolidator() qe.maxResultSize = sync2.AtomicInt64(config.MaxResultSize) qe.streamBufferSize = sync2.AtomicInt64(config.StreamBufferSize) stats.Publish("MaxResultSize", stats.IntFunc(qe.maxResultSize.Get)) stats.Publish("StreamBufferSize", stats.IntFunc(qe.streamBufferSize.Get)) queryStats = stats.NewTimings("Queries") QPSRates = stats.NewRates("QPS", queryStats, 15, 60*time.Second) waitStats = stats.NewTimings("Waits") errorStats = stats.NewCounters("Errors") resultStats = stats.NewHistogram("Results", resultBuckets) return qe }
// NewResourcePool creates a new ResourcePool pool. // capacity is the initial capacity of the pool. // maxCap is the maximum capacity. // 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(fmt.Errorf("Invalid/out of range capacity")) } rp := &ResourcePool{ resources: make(chan resourceWrapper, maxCap), factory: factory, capacity: sync2.AtomicInt64(capacity), idleTimeout: sync2.AtomicDuration(idleTimeout), } for i := 0; i < capacity; i++ { rp.resources <- resourceWrapper{} } return rp }