Revert read replica POC (#93551)
* Revert "chore: add replDB to team service (#91799)" This reverts commitc6ae2d7999. * Revert "experiment: use read replica for Get and Find Dashboards (#91706)" This reverts commit54177ca619. * Revert "QuotaService: refactor to use ReplDB for Get queries (#91333)" This reverts commit299c142f6a. * Revert "refactor replCfg to look more like plugins/plugin config (#91142)" This reverts commitac0b4bb34d. * Revert "chore (replstore): fix registration with multiple sql drivers, again (#90990)" This reverts commitdaedb358dd. * Revert "Chore (sqlstore): add validation and testing for repl config (#90683)" This reverts commitaf19f039b6. * Revert "ReplStore: Add support for round robin load balancing between multiple read replicas (#90530)" This reverts commit27b52b1507. * Revert "DashboardStore: Use ReplDB and get dashboard quotas from the ReadReplica (#90235)" This reverts commit8a6107cd35. * Revert "accesscontrol service read replica (#89963)" This reverts commit77a4869fca. * Revert "Fix: add mapping for the new mysqlRepl driver (#89551)" This reverts commitab5a079bcc. * Revert "fix: sql instrumentation dual registration error (#89508)" This reverts commitd988f5c3b0. * Revert "Experimental Feature Toggle: databaseReadReplica (#89232)" This reverts commit50244ed4a1.
This commit is contained in:
@@ -31,7 +31,7 @@ type store interface {
|
||||
}
|
||||
|
||||
type xormStore struct {
|
||||
db db.ReplDB
|
||||
db db.DB
|
||||
cfg *setting.Cfg
|
||||
deletes []string
|
||||
}
|
||||
@@ -84,7 +84,7 @@ func (ss *xormStore) Create(name, email string, orgID int64) (team.Team, error)
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
}
|
||||
err := ss.db.DB().WithTransactionalDbSession(context.Background(), func(sess *db.Session) error {
|
||||
err := ss.db.WithTransactionalDbSession(context.Background(), func(sess *db.Session) error {
|
||||
if isNameTaken, err := isTeamNameTaken(orgID, name, 0, sess); err != nil {
|
||||
return err
|
||||
} else if isNameTaken {
|
||||
@@ -98,7 +98,7 @@ func (ss *xormStore) Create(name, email string, orgID int64) (team.Team, error)
|
||||
}
|
||||
|
||||
func (ss *xormStore) Update(ctx context.Context, cmd *team.UpdateTeamCommand) error {
|
||||
return ss.db.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
return ss.db.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
if isNameTaken, err := isTeamNameTaken(cmd.OrgID, cmd.Name, cmd.ID, sess); err != nil {
|
||||
return err
|
||||
} else if isNameTaken {
|
||||
@@ -129,7 +129,7 @@ func (ss *xormStore) Update(ctx context.Context, cmd *team.UpdateTeamCommand) er
|
||||
|
||||
// DeleteTeam will delete a team, its member and any permissions connected to the team
|
||||
func (ss *xormStore) Delete(ctx context.Context, cmd *team.DeleteTeamCommand) error {
|
||||
return ss.db.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
return ss.db.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
if _, err := teamExists(cmd.OrgID, cmd.ID, sess); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -180,7 +180,7 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) (
|
||||
queryResult := team.SearchTeamQueryResult{
|
||||
Teams: make([]*team.TeamDTO, 0),
|
||||
}
|
||||
err := ss.db.ReadReplica().WithDbSession(ctx, func(sess *db.Session) error {
|
||||
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
|
||||
queryWithWildcards := "%" + query.Query + "%"
|
||||
|
||||
var sql bytes.Buffer
|
||||
@@ -191,12 +191,12 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) (
|
||||
params = append(params, user)
|
||||
}
|
||||
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db.ReadReplica(), filteredUsers))
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db, filteredUsers))
|
||||
sql.WriteString(` WHERE team.org_id = ?`)
|
||||
params = append(params, query.OrgID)
|
||||
|
||||
if query.Query != "" {
|
||||
sql.WriteString(` and team.name ` + ss.db.ReadReplica().GetDialect().LikeStr() + ` ?`)
|
||||
sql.WriteString(` and team.name ` + ss.db.GetDialect().LikeStr() + ` ?`)
|
||||
params = append(params, queryWithWildcards)
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) (
|
||||
|
||||
if query.Limit != 0 {
|
||||
offset := query.Limit * (query.Page - 1)
|
||||
sql.WriteString(ss.db.ReadReplica().GetDialect().LimitOffset(int64(query.Limit), int64(offset)))
|
||||
sql.WriteString(ss.db.GetDialect().LimitOffset(int64(query.Limit), int64(offset)))
|
||||
}
|
||||
|
||||
if err := sess.SQL(sql.String(), params...).Find(&queryResult.Teams); err != nil {
|
||||
@@ -245,7 +245,7 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) (
|
||||
countSess.Where("team.org_id=?", query.OrgID)
|
||||
|
||||
if query.Query != "" {
|
||||
countSess.Where(`name `+ss.db.ReadReplica().GetDialect().LikeStr()+` ?`, queryWithWildcards)
|
||||
countSess.Where(`name `+ss.db.GetDialect().LikeStr()+` ?`, queryWithWildcards)
|
||||
}
|
||||
|
||||
if query.Name != "" {
|
||||
@@ -268,12 +268,12 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) (
|
||||
|
||||
func (ss *xormStore) GetByID(ctx context.Context, query *team.GetTeamByIDQuery) (*team.TeamDTO, error) {
|
||||
var queryResult *team.TeamDTO
|
||||
err := ss.db.ReadReplica().WithDbSession(ctx, func(sess *db.Session) error {
|
||||
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
|
||||
var sql bytes.Buffer
|
||||
params := make([]any, 0)
|
||||
|
||||
filteredUsers := getFilteredUsers(query.SignedInUser, query.HiddenUsers)
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db.ReadReplica(), filteredUsers))
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db, filteredUsers))
|
||||
for _, user := range filteredUsers {
|
||||
params = append(params, user)
|
||||
}
|
||||
@@ -304,12 +304,12 @@ func (ss *xormStore) GetByID(ctx context.Context, query *team.GetTeamByIDQuery)
|
||||
// GetTeamsByUser is used by the Guardian when checking a users' permissions
|
||||
func (ss *xormStore) GetByUser(ctx context.Context, query *team.GetTeamsByUserQuery) ([]*team.TeamDTO, error) {
|
||||
queryResult := make([]*team.TeamDTO, 0)
|
||||
err := ss.db.ReadReplica().WithDbSession(ctx, func(sess *db.Session) error {
|
||||
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
|
||||
var sql bytes.Buffer
|
||||
var params []any
|
||||
params = append(params, query.OrgID, query.UserID)
|
||||
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db.ReadReplica(), []string{}))
|
||||
sql.WriteString(getTeamSelectSQLBase(ss.db, []string{}))
|
||||
sql.WriteString(` INNER JOIN team_member on team.id = team_member.team_id`)
|
||||
sql.WriteString(` WHERE team.org_id = ? and team_member.user_id = ?`)
|
||||
|
||||
@@ -333,7 +333,7 @@ func (ss *xormStore) GetByUser(ctx context.Context, query *team.GetTeamsByUserQu
|
||||
func (ss *xormStore) GetIDsByUser(ctx context.Context, query *team.GetTeamIDsByUserQuery) ([]int64, error) {
|
||||
queryResult := make([]int64, 0)
|
||||
|
||||
err := ss.db.ReadReplica().WithDbSession(ctx, func(sess *db.Session) error {
|
||||
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
|
||||
return sess.SQL(`SELECT tm.team_id
|
||||
FROM team_member as tm
|
||||
WHERE tm.user_id=? AND tm.org_id=?;`, query.UserID, query.OrgID).Find(&queryResult)
|
||||
@@ -363,7 +363,7 @@ func getTeamMember(sess *db.Session, orgId int64, teamId int64, userId int64) (t
|
||||
func (ss *xormStore) IsMember(orgId int64, teamId int64, userId int64) (bool, error) {
|
||||
var isMember bool
|
||||
|
||||
err := ss.db.ReadReplica().WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
err := ss.db.WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
var err error
|
||||
isMember, err = isTeamMember(sess, orgId, teamId, userId)
|
||||
return err
|
||||
@@ -460,7 +460,7 @@ func removeTeamMember(sess *db.Session, cmd *team.RemoveTeamMemberCommand) error
|
||||
// RemoveUsersMemberships removes all the team membership entries for the given user.
|
||||
// Only used when removing a user from a Grafana instance.
|
||||
func (ss *xormStore) RemoveUsersMemberships(ctx context.Context, userID int64) error {
|
||||
return ss.db.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
return ss.db.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||
var rawSQL = "DELETE FROM team_member WHERE user_id = ?"
|
||||
_, err := sess.Exec(rawSQL, userID)
|
||||
return err
|
||||
@@ -488,7 +488,7 @@ func (ss *xormStore) GetMembers(ctx context.Context, query *team.GetTeamMembersQ
|
||||
// With accesscontrol we filter out users based on the SignedInUser's permissions
|
||||
// Note we assume that checking SignedInUser is allowed to see team members for this team has already been performed
|
||||
// If the signed in user is not set no member will be returned
|
||||
sqlID := fmt.Sprintf("%s.%s", ss.db.ReadReplica().GetDialect().Quote("user"), ss.db.ReadReplica().GetDialect().Quote("id"))
|
||||
sqlID := fmt.Sprintf("%s.%s", ss.db.GetDialect().Quote("user"), ss.db.GetDialect().Quote("id"))
|
||||
*acFilter, err = ac.Filter(query.SignedInUser, sqlID, "users:id:", ac.ActionOrgUsersRead)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -500,16 +500,15 @@ func (ss *xormStore) GetMembers(ctx context.Context, query *team.GetTeamMembersQ
|
||||
// getTeamMembers return a list of members for the specified team
|
||||
func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMembersQuery, acUserFilter *ac.SQLFilter) ([]*team.TeamMemberDTO, error) {
|
||||
queryResult := make([]*team.TeamMemberDTO, 0)
|
||||
err := ss.db.ReadReplica().WithDbSession(ctx, func(dbSess *db.Session) error {
|
||||
dialect := ss.db.ReadReplica().GetDialect()
|
||||
err := ss.db.WithDbSession(ctx, func(dbSess *db.Session) error {
|
||||
sess := dbSess.Table("team_member")
|
||||
sess.Join("INNER", dialect.Quote("user"),
|
||||
fmt.Sprintf("team_member.user_id=%s.%s", dialect.Quote("user"), dialect.Quote("id")),
|
||||
sess.Join("INNER", ss.db.GetDialect().Quote("user"),
|
||||
fmt.Sprintf("team_member.user_id=%s.%s", ss.db.GetDialect().Quote("user"), ss.db.GetDialect().Quote("id")),
|
||||
)
|
||||
sess.Join("INNER", "team", "team.id=team_member.team_id")
|
||||
|
||||
// explicitly check for serviceaccounts
|
||||
sess.Where(fmt.Sprintf("%s.is_service_account=?", dialect.Quote("user")), dialect.BooleanStr(false))
|
||||
sess.Where(fmt.Sprintf("%s.is_service_account=?", ss.db.GetDialect().Quote("user")), ss.db.GetDialect().BooleanStr(false))
|
||||
|
||||
if acUserFilter != nil {
|
||||
sess.Where(acUserFilter.Where, acUserFilter.Args...)
|
||||
@@ -521,7 +520,7 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb
|
||||
FROM user_auth
|
||||
WHERE user_auth.user_id = team_member.user_id
|
||||
ORDER BY user_auth.created DESC ` +
|
||||
dialect.Limit(1) + ")"
|
||||
ss.db.GetDialect().Limit(1) + ")"
|
||||
sess.Join("LEFT", "user_auth", authJoinCondition)
|
||||
|
||||
if query.OrgID != 0 {
|
||||
@@ -537,7 +536,7 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb
|
||||
sess.Where("team_member.user_id=?", query.UserID)
|
||||
}
|
||||
if query.External {
|
||||
sess.Where("team_member.external=?", dialect.BooleanStr(true))
|
||||
sess.Where("team_member.external=?", ss.db.GetDialect().BooleanStr(true))
|
||||
}
|
||||
sess.Cols(
|
||||
"team_member.org_id",
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/org/orgimpl"
|
||||
"github.com/grafana/grafana/pkg/services/quota/quotaimpl"
|
||||
"github.com/grafana/grafana/pkg/services/serviceaccounts"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
|
||||
"github.com/grafana/grafana/pkg/services/team"
|
||||
"github.com/grafana/grafana/pkg/services/team/sortopts"
|
||||
@@ -35,7 +34,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
t.Skip("skipping integration test")
|
||||
}
|
||||
t.Run("Testing Team commands and queries", func(t *testing.T) {
|
||||
sqlStore, cfg := db.InitTestReplDBWithCfg(t)
|
||||
sqlStore, cfg := db.InitTestDBWithCfg(t)
|
||||
teamSvc, err := ProvideService(sqlStore, cfg, tracing.InitializeTracerForTest())
|
||||
require.NoError(t, err)
|
||||
testUser := &user.SignedInUser{
|
||||
@@ -48,7 +47,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
quotaService := quotaimpl.ProvideService(sqlstore.FakeReplStoreFromStore(sqlStore.SQLStore), cfg)
|
||||
quotaService := quotaimpl.ProvideService(sqlStore, cfg)
|
||||
orgSvc, err := orgimpl.ProvideService(sqlStore, cfg, quotaService)
|
||||
require.NoError(t, err)
|
||||
userSvc, err := userimpl.ProvideService(
|
||||
@@ -148,7 +147,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should return latest auth module for users when getting team members", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
setup()
|
||||
userId := userIds[1]
|
||||
|
||||
@@ -199,7 +198,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should default to member permission level when updating a user with invalid permission level", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
setup()
|
||||
userID := userIds[0]
|
||||
|
||||
@@ -313,7 +312,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should be able to return all teams a user is member of", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
setup()
|
||||
groupId := team2.ID
|
||||
err = sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
@@ -374,7 +373,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("A user should be able to remove the admin permission if there are other admins", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
setup()
|
||||
|
||||
err = sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
@@ -393,7 +392,7 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should not return hidden users in team member count", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
setup()
|
||||
signedInUser := &user.SignedInUser{
|
||||
Login: "loginuser0",
|
||||
@@ -434,8 +433,8 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("Should be able to exclude service accounts from teamembers", func(t *testing.T) {
|
||||
sqlStore = db.InitTestReplDB(t)
|
||||
quotaService := quotaimpl.ProvideService(sqlstore.FakeReplStoreFromStore(sqlStore.SQLStore), cfg)
|
||||
sqlStore = db.InitTestDB(t)
|
||||
quotaService := quotaimpl.ProvideService(sqlStore, cfg)
|
||||
orgSvc, err := orgimpl.ProvideService(sqlStore, cfg, quotaService)
|
||||
require.NoError(t, err)
|
||||
userSvc, err := userimpl.ProvideService(
|
||||
@@ -529,7 +528,7 @@ func TestIntegrationSQLStore_SearchTeams(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
store, cfg := db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{})
|
||||
store, cfg := db.InitTestDBWithCfg(t, db.InitTestDBOpt{})
|
||||
teamSvc, err := ProvideService(store, cfg, tracing.InitializeTracerForTest())
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -566,18 +565,18 @@ func TestIntegrationSQLStore_GetTeamMembers_ACFilter(t *testing.T) {
|
||||
userIds := make([]int64, 4)
|
||||
|
||||
// Seed 2 teams with 2 members
|
||||
setup := func(store db.ReplDB, cfg *setting.Cfg) {
|
||||
setup := func(store db.DB, cfg *setting.Cfg) {
|
||||
teamSvc, err := ProvideService(store, cfg, tracing.InitializeTracerForTest())
|
||||
require.NoError(t, err)
|
||||
team1, errCreateTeam := teamSvc.CreateTeam(context.Background(), "group1 name", "test1@example.org", testOrgID)
|
||||
require.NoError(t, errCreateTeam)
|
||||
team2, errCreateTeam := teamSvc.CreateTeam(context.Background(), "group2 name", "test2@example.org", testOrgID)
|
||||
require.NoError(t, errCreateTeam)
|
||||
quotaService := quotaimpl.ProvideService(db.FakeReplDBFromDB(store.DB()), cfg)
|
||||
orgSvc, err := orgimpl.ProvideService(store.DB(), cfg, quotaService)
|
||||
quotaService := quotaimpl.ProvideService(store, cfg)
|
||||
orgSvc, err := orgimpl.ProvideService(store, cfg, quotaService)
|
||||
require.NoError(t, err)
|
||||
userSvc, err := userimpl.ProvideService(
|
||||
store.DB(), orgSvc, cfg, teamSvc, nil, tracing.InitializeTracerForTest(),
|
||||
store, orgSvc, cfg, teamSvc, nil, tracing.InitializeTracerForTest(),
|
||||
quotaService, supportbundlestest.NewFakeBundleService(),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
@@ -593,7 +592,7 @@ func TestIntegrationSQLStore_GetTeamMembers_ACFilter(t *testing.T) {
|
||||
userIds[i] = user.ID
|
||||
}
|
||||
|
||||
errAddMembers := store.DB().WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
errAddMembers := store.WithDbSession(context.Background(), func(sess *db.Session) error {
|
||||
err := AddOrUpdateTeamMemberHook(sess, userIds[0], testOrgID, team1.ID, false, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -611,7 +610,7 @@ func TestIntegrationSQLStore_GetTeamMembers_ACFilter(t *testing.T) {
|
||||
require.NoError(t, errAddMembers)
|
||||
}
|
||||
|
||||
store, cfg := db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{})
|
||||
store, cfg := db.InitTestDBWithCfg(t, db.InitTestDBOpt{})
|
||||
setup(store, cfg)
|
||||
teamSvc, err := ProvideService(store, cfg, tracing.InitializeTracerForTest())
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -17,7 +17,7 @@ type Service struct {
|
||||
tracer tracing.Tracer
|
||||
}
|
||||
|
||||
func ProvideService(db db.ReplDB, cfg *setting.Cfg, tracer tracing.Tracer) (team.Service, error) {
|
||||
func ProvideService(db db.DB, cfg *setting.Cfg, tracer tracing.Tracer) (team.Service, error) {
|
||||
return &Service{
|
||||
store: &xormStore{db: db, cfg: cfg, deletes: []string{}},
|
||||
tracer: tracer,
|
||||
|
||||
Reference in New Issue
Block a user