49 lines
851 B
Go
49 lines
851 B
Go
package trypg
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func Available(dsn []string) (successDsn string, err error) {
|
|
if len(dsn) == 0 {
|
|
err = fmt.Errorf("dsn is not valid")
|
|
return
|
|
}
|
|
|
|
var successChan = make(chan string)
|
|
|
|
for _, d := range dsn {
|
|
go func(d string) {
|
|
var db *gorm.DB
|
|
if db, err = gorm.Open(postgres.Open(d), &gorm.Config{}); err != nil {
|
|
return
|
|
}
|
|
var status string
|
|
if err = db.Raw("SHOW transaction_read_only").Scan(&status).Error; err != nil {
|
|
return
|
|
}
|
|
if status == "off" {
|
|
successChan <- d
|
|
}
|
|
}(d)
|
|
}
|
|
|
|
select {
|
|
case successDsn = <-successChan:
|
|
case <-time.After(time.Second * 15):
|
|
logrus.Debug("all of pg point is timeout")
|
|
}
|
|
|
|
if successDsn == "" {
|
|
err = fmt.Errorf("all of pg point is timeout")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|