Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 36 additions & 3 deletions cmd/bootstrap/async_replication.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,18 @@ func bootstrapAsyncReplication(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserOperator)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserOperator, operatorPass, podIp, mysql.DefaultAdminPort)
params := database.DBParams{
User: apiv1alpha1.UserOperator,
Pass: operatorPass,
Host: podIp,
}
readTimeout, err := getReadTimeout()
if err != nil {
return errors.Wrap(err, "get read timeout")
}
params.ReadTimeout = readTimeout

db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to database")
}
Expand Down Expand Up @@ -199,7 +210,18 @@ func getTopology(ctx context.Context, fqdn string, peers sets.Set[string]) (stri
}

for _, peer := range sets.List(peers) {
db, err := database.NewDatabase(ctx, apiv1alpha1.UserOperator, operatorPass, peer, mysql.DefaultAdminPort)
params := database.DBParams{
User: apiv1alpha1.UserOperator,
Pass: operatorPass,
Host: peer,
}
readTimeout, err := getReadTimeout()
if err != nil {
return "", nil, errors.Wrap(err, "get read timeout")
}
params.ReadTimeout = readTimeout

db, err := database.NewDatabase(ctx, params)
if err != nil {
return "", nil, errors.Wrapf(err, "connect to %s", peer)
}
Expand Down Expand Up @@ -254,7 +276,18 @@ func selectDonor(ctx context.Context, fqdn, primary string, replicas []string) (
}

for _, replica := range replicas {
db, err := database.NewDatabase(ctx, apiv1alpha1.UserOperator, operatorPass, replica, mysql.DefaultAdminPort)
params := database.DBParams{
User: apiv1alpha1.UserOperator,
Pass: operatorPass,
Host: replica,
}
readTimeout, err := getReadTimeout()
if err != nil {
return "", errors.Wrap(err, "get read timeout")
}
params.ReadTimeout = readTimeout

db, err := database.NewDatabase(ctx, params)
if err != nil {
continue
}
Expand Down
18 changes: 18 additions & 0 deletions cmd/bootstrap/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"net"
"os"
"path/filepath"
"strconv"
"strings"
"time"

Expand All @@ -15,6 +16,7 @@ import (
apiv1alpha1 "github.com/percona/percona-server-mysql-operator/api/v1alpha1"
"github.com/percona/percona-server-mysql-operator/pkg/k8s"
"github.com/percona/percona-server-mysql-operator/pkg/mysql"
"github.com/percona/percona-server-mysql-operator/pkg/naming"
)

func getFQDN(svcName string) (string, error) {
Expand All @@ -31,6 +33,22 @@ func getFQDN(svcName string) (string, error) {
return fmt.Sprintf("%s.%s.%s", hostname, svcName, namespace), nil
}

func getReadTimeout() (uint32, error) {
s, ok := os.LookupEnv(naming.EnvBootstrapReadTimeout)
if !ok {
return 0, nil
}
readTimeout, err := strconv.Atoi(s)
if err != nil {
return 0, errors.Wrap(err, "failed to parse BOOTSTRAP_READ_TIMEOUT")
}
if readTimeout < 0 {
return 0, errors.New("BOOTSTRAP_READ_TIMEOUT should be a positive value")
}

return uint32(readTimeout), nil
}

func getSecret(username apiv1alpha1.SystemUser) (string, error) {
path := filepath.Join(mysql.CredsMountPath, string(username))
sBytes, err := os.ReadFile(path)
Expand Down
38 changes: 32 additions & 6 deletions cmd/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

apiv1alpha1 "github.com/percona/percona-server-mysql-operator/api/v1alpha1"
"github.com/percona/percona-server-mysql-operator/pkg/db"
defs "github.com/percona/percona-server-mysql-operator/pkg/mysql"
)

const defaultChannelName = ""
Expand All @@ -22,23 +23,48 @@ type DB struct {
db *sql.DB
}

func NewDatabase(ctx context.Context, user apiv1alpha1.SystemUser, pass, host string, port int32) (*DB, error) {
type DBParams struct {
User apiv1alpha1.SystemUser
Pass string
Host string
Port int32

ReadTimeout uint32 // in seconds
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we could incorporate the seconds property to the name of the variable e.g. ReadTimeoutSeconds. This will make it more clear throughout the codebase without having to rely on the comment to clarify it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}

func (p *DBParams) setDefaults() {
if p.Port == 0 {
p.Port = defs.DefaultAdminPort
}

if p.ReadTimeout == 0 {
p.ReadTimeout = 10
}
}

func (p *DBParams) DSN() string {
p.setDefaults()

config := mysql.NewConfig()

config.User = string(user)
config.Passwd = pass
config.User = string(p.User)
config.Passwd = p.Pass
config.Net = "tcp"
config.Addr = fmt.Sprintf("%s:%d", host, port)
config.Addr = fmt.Sprintf("%s:%d", p.Host, p.Port)
config.DBName = "performance_schema"
config.Params = map[string]string{
"interpolateParams": "true",
"timeout": "10s",
"readTimeout": "10s",
"readTimeout": fmt.Sprintf("%ds", p.ReadTimeout),
"writeTimeout": "10s",
"tls": "preferred",
}

db, err := sql.Open("mysql", config.FormatDSN())
return config.FormatDSN()
}

func NewDatabase(ctx context.Context, params DBParams) (*DB, error) {
db, err := sql.Open("mysql", params.DSN())
if err != nil {
return nil, errors.Wrap(err, "connect to MySQL")
}
Expand Down
36 changes: 31 additions & 5 deletions cmd/healthcheck/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/pkg/errors"

apiv1alpha1 "github.com/percona/percona-server-mysql-operator/api/v1alpha1"
"github.com/percona/percona-server-mysql-operator/cmd/db"
database "github.com/percona/percona-server-mysql-operator/cmd/db"
mysqldb "github.com/percona/percona-server-mysql-operator/pkg/db"
"github.com/percona/percona-server-mysql-operator/pkg/k8s"
Expand Down Expand Up @@ -82,7 +83,12 @@ func checkReadinessAsync(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserMonitor)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserMonitor, monitorPass, podIP, mysql.DefaultAdminPort)
params := db.DBParams{
User: apiv1alpha1.UserMonitor,
Pass: monitorPass,
Host: podIP,
}
db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to db")
}
Expand Down Expand Up @@ -117,7 +123,12 @@ func checkReadinessGR(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserMonitor)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserMonitor, monitorPass, podIP, mysql.DefaultAdminPort)
params := db.DBParams{
User: apiv1alpha1.UserMonitor,
Pass: monitorPass,
Host: podIP,
}
db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to db")
}
Expand Down Expand Up @@ -151,7 +162,12 @@ func checkLivenessAsync(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserMonitor)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserMonitor, monitorPass, podIP, mysql.DefaultAdminPort)
params := db.DBParams{
User: apiv1alpha1.UserMonitor,
Pass: monitorPass,
Host: podIP,
}
db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to db")
}
Expand All @@ -171,7 +187,12 @@ func checkLivenessGR(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserMonitor)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserMonitor, monitorPass, podIP, mysql.DefaultAdminPort)
params := db.DBParams{
User: apiv1alpha1.UserMonitor,
Pass: monitorPass,
Host: podIP,
}
db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to db")
}
Expand Down Expand Up @@ -202,7 +223,12 @@ func checkReplication(ctx context.Context) error {
return errors.Wrapf(err, "get %s password", apiv1alpha1.UserMonitor)
}

db, err := database.NewDatabase(ctx, apiv1alpha1.UserMonitor, monitorPass, podIP, mysql.DefaultAdminPort)
params := db.DBParams{
User: apiv1alpha1.UserMonitor,
Pass: monitorPass,
Host: podIP,
}
db, err := database.NewDatabase(ctx, params)
if err != nil {
return errors.Wrap(err, "connect to db")
}
Expand Down
3 changes: 3 additions & 0 deletions deploy/cr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ spec:

size: 3

# env:
# - name: BOOTSTRAP_READ_TIMEOUT
# value: "600"
resources:
requests:
memory: 1G
Expand Down
5 changes: 5 additions & 0 deletions pkg/naming/env.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package naming

const (
EnvBootstrapReadTimeout = "BOOTSTRAP_READ_TIMEOUT"
)
Loading