func (qe *QueryEngine) Open(dbconfig dbconfigs.DBConfig, schemaOverrides []SchemaOverride, qrs *QueryRules) { // Wait for Close, in case it's running qe.mu.Lock() defer qe.mu.Unlock() connFactory := GenericConnectionCreator(dbconfig.MysqlParams()) start := time.Now().UnixNano() qe.cachePool.Open() qe.schemaInfo.Open(connFactory, schemaOverrides, qe.cachePool, qrs) log.Infof("Time taken to load the schema: %v ms", (time.Now().UnixNano()-start)/1e6) qe.connPool.Open(connFactory) qe.streamConnPool.Open(connFactory) qe.txPool.Open(connFactory) qe.activeTxPool.Open() qe.activePool.Open(connFactory) }
// Open must be called before sending requests to QueryEngine. func (qe *QueryEngine) Open(dbconfig *dbconfigs.DBConfig, schemaOverrides []SchemaOverride, qrs *QueryRules, mysqld *mysqlctl.Mysqld) { connFactory := dbconnpool.DBConnectionCreator(&dbconfig.ConnectionParams, mysqlStats) strictMode := false if qe.strictMode.Get() != 0 { strictMode = true } if !strictMode && dbconfig.EnableRowcache { panic(NewTabletError(FATAL, "Rowcache cannot be enabled when queryserver-config-strict-mode is false")) } if dbconfig.EnableRowcache { qe.cachePool.Open() log.Infof("rowcache is enabled") } else { // Invalidator should not be enabled if rowcache is not enabled. dbconfig.EnableInvalidator = false log.Infof("rowcache is not enabled") } start := time.Now() // schemaInfo depends on cachePool. Every table that has a rowcache // points to the cachePool. qe.schemaInfo.Open(connFactory, schemaOverrides, qe.cachePool, qrs, strictMode) log.Infof("Time taken to load the schema: %v", time.Now().Sub(start)) // Start the invalidator only after schema is loaded. // This will allow qe to find the table info // for the invalidation events that will start coming // immediately. if dbconfig.EnableInvalidator { qe.invalidator.Open(dbconfig.DbName, mysqld) } qe.connPool.Open(connFactory) qe.streamConnPool.Open(connFactory) qe.txPool.Open(connFactory) qe.activeTxPool.Open() qe.connKiller.Open(connFactory) qe.activePool.Open() }
func (sq *SqlQuery) allowQueries(dbconfig dbconfigs.DBConfig, schemaOverrides []SchemaOverride, qrs *QueryRules) { sq.statemu.Lock() v := sq.state.Get() switch v { case CONNECTING, ABORT, OPEN: sq.statemu.Unlock() log.Infof("Ignoring allowQueries request, current state: %v", v) return case INITIALIZING, SHUTTING_DOWN: panic("unreachable") } // state is NOT_SERVING or CLOSED sq.setState(CONNECTING) sq.statemu.Unlock() // Try connecting. disallowQueries can change the state to ABORT during this time. waitTime := time.Second for { c, err := mysql.Connect(dbconfig.MysqlParams()) if err == nil { c.Close() break } log.Errorf("%v", err) time.Sleep(waitTime) // Cap at 32 seconds if waitTime < 30*time.Second { waitTime = waitTime * 2 } if sq.state.Get() == ABORT { // Exclusive transition. No need to lock statemu. sq.setState(CLOSED) log.Infof("allowQueries aborting") return } } // Connection successful. Keep statemu locked. sq.statemu.Lock() defer sq.statemu.Unlock() if sq.state.Get() == ABORT { sq.setState(CLOSED) log.Infof("allowQueries aborting") return } sq.setState(INITIALIZING) defer func() { if x := recover(); x != nil { log.Errorf("%s", x.(*TabletError).Message) sq.setState(NOT_SERVING) return } sq.setState(OPEN) }() sq.qe.Open(dbconfig, schemaOverrides, qrs) sq.dbconfig = dbconfig sq.sessionId = Rand() log.Infof("Session id: %d", sq.sessionId) }