// NewMysqld creates a Mysqld object based on the provided configuration // and connection parameters. func NewMysqld(config *Mycnf, dba, allprivs, app, repl *sqldb.ConnParams, enablePublishStats bool) *Mysqld { noParams := sqldb.ConnParams{} if *dba == noParams { dba.UnixSocket = config.SocketFile } // create and open the connection pool for dba access dbaMysqlStatsName := "" dbaPoolName := "" if enablePublishStats { dbaMysqlStatsName = "MysqlDba" dbaPoolName = "DbaConnPool" } dbaMysqlStats := stats.NewTimings(dbaMysqlStatsName) dbaPool := dbconnpool.NewConnectionPool(dbaPoolName, *dbaPoolSize, *dbaIdleTimeout) dbaPool.Open(dbconnpool.DBConnectionCreator(dba, dbaMysqlStats)) // create and open the connection pool for allprivs access allprivsMysqlStatsName := "" if enablePublishStats { allprivsMysqlStatsName = "MysqlAllPrivs" } allprivsMysqlStats := stats.NewTimings(allprivsMysqlStatsName) // create and open the connection pool for app access appMysqlStatsName := "" appPoolName := "" if enablePublishStats { appMysqlStatsName = "MysqlApp" appPoolName = "AppConnPool" } appMysqlStats := stats.NewTimings(appMysqlStatsName) appPool := dbconnpool.NewConnectionPool(appPoolName, *appPoolSize, *appIdleTimeout) appPool.Open(dbconnpool.DBConnectionCreator(app, appMysqlStats)) return &Mysqld{ config: config, dba: dba, allprivs: allprivs, dbApp: app, dbaPool: dbaPool, appPool: appPool, replParams: repl, dbaMysqlStats: dbaMysqlStats, allprivsMysqlStats: allprivsMysqlStats, tabletDir: path.Dir(config.DataDir), } }
// Open must be called before starting to use the pool. func (cp *ConnPool) Open(appParams, dbaParams *sqldb.ConnParams) { cp.mu.Lock() defer cp.mu.Unlock() f := func() (pools.Resource, error) { return NewDBConn(cp, appParams, dbaParams, cp.queryServiceStats) } cp.connections = pools.NewResourcePool(f, cp.capacity, cp.capacity, cp.idleTimeout) cp.dbaPool.Open(dbconnpool.DBConnectionCreator(dbaParams, cp.queryServiceStats.MySQLStats)) }
// NewMysqld creates a Mysqld object based on the provided configuration // and connection parameters. // dbaName and appName are the base for stats exports, use 'Dba' and 'App', except in tests func NewMysqld(dbaName, appName string, config *Mycnf, dba, app, repl *sqldb.ConnParams) *Mysqld { if *dba == dbconfigs.DefaultDBConfigs.Dba { dba.UnixSocket = config.SocketFile } // create and open the connection pool for dba access dbaMysqlStatsName := "" dbaPoolName := "" if dbaName != "" { dbaMysqlStatsName = "Mysql" + dbaName dbaPoolName = dbaName + "ConnPool" } dbaMysqlStats := stats.NewTimings(dbaMysqlStatsName) dbaPool := dbconnpool.NewConnectionPool(dbaPoolName, *dbaPoolSize, *dbaIdleTimeout) dbaPool.Open(dbconnpool.DBConnectionCreator(dba, dbaMysqlStats)) // create and open the connection pool for app access appMysqlStatsName := "" appPoolName := "" if appName != "" { appMysqlStatsName = "Mysql" + appName appPoolName = appName + "ConnPool" } appMysqlStats := stats.NewTimings(appMysqlStatsName) appPool := dbconnpool.NewConnectionPool(appPoolName, *appPoolSize, *appIdleTimeout) appPool.Open(dbconnpool.DBConnectionCreator(app, appMysqlStats)) return &Mysqld{ config: config, dba: dba, dbApp: app, dbaPool: dbaPool, appPool: appPool, replParams: repl, dbaMysqlStats: dbaMysqlStats, TabletDir: TabletDir(config.ServerID), SnapshotDir: SnapshotDir(config.ServerID), } }
// NewMysqld creates a Mysqld object based on the provided configuration // and connection parameters. // name is the base for stats exports, use 'Dba', except in tests func NewMysqld(name string, config *Mycnf, dba, repl *mysql.ConnectionParams) *Mysqld { if *dba == dbconfigs.DefaultDBConfigs.Dba { dba.UnixSocket = config.SocketFile } // create and open the connection pool for dba access mysqlStats := stats.NewTimings("Mysql" + name) dbaPool := dbconnpool.NewConnectionPool(name+"ConnPool", *dbaPoolSize, *dbaIdleTimeout) dbaPool.Open(dbconnpool.DBConnectionCreator(dba, mysqlStats)) return &Mysqld{ config: config, dba: dba, dbaPool: dbaPool, replParams: repl, TabletDir: TabletDir(config.ServerId), SnapshotDir: SnapshotDir(config.ServerId), } }
// 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() }