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) }
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) }