[MM-32281] SqlRoleStore/GetByName: add context to allow read from master (#17176)

* role_store/GetByName: add context

* propagate context in the app layer

* propagate context in the app layer

* add missing import

Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2021-04-21 18:01:02 +03:00
коммит произвёл GitHub
родитель 9eceeaa8db
Коммит 28ff4dc8d0
37 изменённых файлов: 225 добавлений и 198 удалений

Просмотреть файл

@@ -44,7 +44,7 @@ func getMockStore() *mocks.Store {
mockRolesStore := mocks.RoleStore{}
mockRolesStore.On("Save", &fakeRole).Return(&model.Role{}, nil)
mockRolesStore.On("Delete", "123").Return(&fakeRole, nil)
mockRolesStore.On("GetByName", "role-name").Return(&fakeRole, nil)
mockRolesStore.On("GetByName", context.Background(), "role-name").Return(&fakeRole, nil)
mockRolesStore.On("GetByNames", []string{"role-name"}).Return([]*model.Role{&fakeRole}, nil)
mockRolesStore.On("PermanentDeleteAll").Return(nil)
mockStore.On("Role").Return(&mockRolesStore)

Просмотреть файл

@@ -4,6 +4,7 @@
package localcachelayer
import (
"context"
"sort"
"strings"
@@ -40,13 +41,13 @@ func (s LocalCacheRoleStore) Save(role *model.Role) (*model.Role, error) {
return s.RoleStore.Save(role)
}
func (s LocalCacheRoleStore) GetByName(name string) (*model.Role, error) {
func (s LocalCacheRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
var role *model.Role
if err := s.rootStore.doStandardReadCache(s.rootStore.roleCache, name, &role); err == nil {
return role, nil
}
role, err := s.RoleStore.GetByName(name)
role, err := s.RoleStore.GetByName(ctx, name)
if err != nil {
return nil, err
}

Просмотреть файл

@@ -4,6 +4,7 @@
package localcachelayer
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
@@ -27,13 +28,13 @@ func TestRoleStoreCache(t *testing.T) {
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
require.NoError(t, err)
role, err := cachedStore.Role().GetByName("role-name")
role, err := cachedStore.Role().GetByName(context.Background(), "role-name")
require.NoError(t, err)
assert.Equal(t, role, &fakeRole)
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
require.NoError(t, err)
assert.Equal(t, role, &fakeRole)
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
})
@@ -43,10 +44,10 @@ func TestRoleStoreCache(t *testing.T) {
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
require.NoError(t, err)
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
cachedStore.Role().Save(&fakeRole)
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
})
@@ -56,10 +57,10 @@ func TestRoleStoreCache(t *testing.T) {
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
require.NoError(t, err)
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
cachedStore.Role().Delete("123")
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
})
@@ -69,10 +70,10 @@ func TestRoleStoreCache(t *testing.T) {
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
require.NoError(t, err)
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
cachedStore.Role().PermanentDeleteAll()
cachedStore.Role().GetByName("role-name")
cachedStore.Role().GetByName(context.Background(), "role-name")
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
})
}

Просмотреть файл

@@ -6559,7 +6559,7 @@ func (s *OpenTracingLayerRoleStore) GetAll() ([]*model.Role, error) {
return result, err
}
func (s *OpenTracingLayerRoleStore) GetByName(name string) (*model.Role, error) {
func (s *OpenTracingLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
origCtx := s.Root.Store.Context()
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "RoleStore.GetByName")
s.Root.Store.SetContext(newCtx)
@@ -6568,7 +6568,7 @@ func (s *OpenTracingLayerRoleStore) GetByName(name string) (*model.Role, error)
}()
defer span.Finish()
result, err := s.RoleStore.GetByName(name)
result, err := s.RoleStore.GetByName(ctx, name)
if err != nil {
span.LogFields(spanlog.Error(err))
ext.Error.Set(span, true)

Просмотреть файл

@@ -7110,11 +7110,11 @@ func (s *RetryLayerRoleStore) GetAll() ([]*model.Role, error) {
}
func (s *RetryLayerRoleStore) GetByName(name string) (*model.Role, error) {
func (s *RetryLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
tries := 0
for {
result, err := s.RoleStore.GetByName(name)
result, err := s.RoleStore.GetByName(ctx, name)
if err == nil {
return result, nil
}

Просмотреть файл

@@ -4,6 +4,7 @@
package sqlstore
import (
"context"
"database/sql"
"fmt"
"strings"
@@ -175,10 +176,9 @@ func (s *SqlRoleStore) GetAll() ([]*model.Role, error) {
return roles, nil
}
func (s *SqlRoleStore) GetByName(name string) (*model.Role, error) {
func (s *SqlRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
var dbRole Role
if err := s.GetReplica().SelectOne(&dbRole, "SELECT * from Roles WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
if err := s.DBFromContext(ctx).SelectOne(&dbRole, "SELECT * from Roles WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("Role", fmt.Sprintf("name=%s", name))
}

Просмотреть файл

@@ -269,7 +269,7 @@ func (s *SqlSchemeStore) GetByName(schemeName string) (*model.Scheme, error) {
func (s *SqlSchemeStore) Delete(schemeId string) (*model.Scheme, error) {
// Get the scheme
var scheme model.Scheme
if err := s.GetReplica().SelectOne(&scheme, "SELECT * from Schemes WHERE Id = :Id", map[string]interface{}{"Id": schemeId}); err != nil {
if err := s.GetMaster().SelectOne(&scheme, "SELECT * from Schemes WHERE Id = :Id", map[string]interface{}{"Id": schemeId}); err != nil {
if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("Scheme", fmt.Sprintf("schemeId=%s", schemeId))
}

Просмотреть файл

@@ -686,7 +686,7 @@ type RoleStore interface {
Save(role *model.Role) (*model.Role, error)
Get(roleID string) (*model.Role, error)
GetAll() ([]*model.Role, error)
GetByName(name string) (*model.Role, error)
GetByName(ctx context.Context, name string) (*model.Role, error)
GetByNames(names []string) ([]*model.Role, error)
Delete(roleID string) (*model.Role, error)
PermanentDeleteAll() error

Просмотреть файл

@@ -5,6 +5,8 @@
package mocks
import (
context "context"
model "github.com/mattermost/mattermost-server/v5/model"
mock "github.com/stretchr/testify/mock"
)
@@ -152,13 +154,13 @@ func (_m *RoleStore) GetAll() ([]*model.Role, error) {
return r0, r1
}
// GetByName provides a mock function with given fields: name
func (_m *RoleStore) GetByName(name string) (*model.Role, error) {
ret := _m.Called(name)
// GetByName provides a mock function with given fields: ctx, name
func (_m *RoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
ret := _m.Called(ctx, name)
var r0 *model.Role
if rf, ok := ret.Get(0).(func(string) *model.Role); ok {
r0 = rf(name)
if rf, ok := ret.Get(0).(func(context.Context, string) *model.Role); ok {
r0 = rf(ctx, name)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.Role)
@@ -166,8 +168,8 @@ func (_m *RoleStore) GetByName(name string) (*model.Role, error) {
}
var r1 error
if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(name)
if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
r1 = rf(ctx, name)
} else {
r1 = ret.Error(1)
}

Просмотреть файл

@@ -4,6 +4,7 @@
package storetest
import (
"context"
"fmt"
"testing"
@@ -191,7 +192,7 @@ func testRoleStoreGetByName(t *testing.T, ss store.Store) {
assert.Len(t, d1.Id, 26)
// Get a valid role
d2, err := ss.Role().GetByName(d1.Name)
d2, err := ss.Role().GetByName(context.Background(), d1.Name)
assert.NoError(t, err)
assert.Equal(t, d1.Id, d2.Id)
assert.Equal(t, r1.Name, d2.Name)
@@ -201,7 +202,7 @@ func testRoleStoreGetByName(t *testing.T, ss store.Store) {
assert.Equal(t, r1.SchemeManaged, d2.SchemeManaged)
// Get an invalid role
_, err = ss.Role().GetByName(model.NewId())
_, err = ss.Role().GetByName(context.Background(), model.NewId())
assert.Error(t, err)
}
@@ -309,7 +310,7 @@ func testRoleStoreDelete(t *testing.T, ss store.Store) {
assert.NoError(t, err)
assert.NotZero(t, d2.DeleteAt)
d3, err := ss.Role().GetByName(d1.Name)
d3, err := ss.Role().GetByName(context.Background(), d1.Name)
assert.NoError(t, err)
assert.NotZero(t, d3.DeleteAt)
@@ -559,13 +560,13 @@ func testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t *t
require.NoError(t, nErr)
defer ss.Channel().Delete(channel.Id, 0)
channelSchemeUserRole, err := ss.Role().GetByName(channelScheme.DefaultChannelUserRole)
channelSchemeUserRole, err := ss.Role().GetByName(context.Background(), channelScheme.DefaultChannelUserRole)
require.NoError(t, err)
channelSchemeUserRole.Permissions = []string{}
_, err = ss.Role().Save(channelSchemeUserRole)
require.NoError(t, err)
teamSchemeUserRole, err := ss.Role().GetByName(teamScheme.DefaultChannelUserRole)
teamSchemeUserRole, err := ss.Role().GetByName(context.Background(), teamScheme.DefaultChannelUserRole)
require.NoError(t, err)
teamSchemeUserRole.Permissions = []string{model.PERMISSION_UPLOAD_FILE.Id}
_, err = ss.Role().Save(teamSchemeUserRole)

Просмотреть файл

@@ -4,6 +4,7 @@
package storetest
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
@@ -108,32 +109,32 @@ func testSchemeStoreSave(t *testing.T, ss store.Store) {
assert.Len(t, d1.DefaultChannelGuestRole, 26)
// Check the default roles were created correctly.
role1, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
assert.NoError(t, err)
assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
assert.True(t, role1.SchemeManaged)
role2, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
assert.NoError(t, err)
assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
assert.True(t, role2.SchemeManaged)
role3, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
assert.NoError(t, err)
assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
assert.True(t, role3.SchemeManaged)
role4, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
assert.NoError(t, err)
assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
assert.True(t, role4.SchemeManaged)
role5, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
assert.NoError(t, err)
assert.Equal(t, role5.Permissions, []string{"view_team"})
assert.True(t, role5.SchemeManaged)
role6, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
assert.NoError(t, err)
assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
assert.True(t, role6.SchemeManaged)
@@ -336,32 +337,32 @@ func testSchemeStoreDelete(t *testing.T, ss store.Store) {
assert.Len(t, d1.DefaultChannelGuestRole, 26)
// Check the default roles were created correctly.
role1, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
assert.NoError(t, err)
assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
assert.True(t, role1.SchemeManaged)
role2, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
assert.NoError(t, err)
assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
assert.True(t, role2.SchemeManaged)
role3, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
assert.NoError(t, err)
assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
assert.True(t, role3.SchemeManaged)
role4, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
assert.NoError(t, err)
assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
assert.True(t, role4.SchemeManaged)
role5, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
assert.NoError(t, err)
assert.Equal(t, role5.Permissions, []string{"view_team"})
assert.True(t, role5.SchemeManaged)
role6, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
assert.NoError(t, err)
assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
assert.True(t, role6.SchemeManaged)
@@ -372,27 +373,27 @@ func testSchemeStoreDelete(t *testing.T, ss store.Store) {
assert.NotZero(t, d2.DeleteAt)
// Check that the roles are deleted too.
role7, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
role7, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
assert.NoError(t, err)
assert.NotZero(t, role7.DeleteAt)
role8, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
role8, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
assert.NoError(t, err)
assert.NotZero(t, role8.DeleteAt)
role9, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
role9, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
assert.NoError(t, err)
assert.NotZero(t, role9.DeleteAt)
role10, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
role10, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
assert.NoError(t, err)
assert.NotZero(t, role10.DeleteAt)
role11, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
role11, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
assert.NoError(t, err)
assert.NotZero(t, role11.DeleteAt)
role12, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
role12, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
assert.NoError(t, err)
assert.NotZero(t, role12.DeleteAt)
@@ -538,10 +539,10 @@ func testCountWithoutPermission(t *testing.T, ss store.Store) {
getRoles := func(scheme *model.Scheme) (channelUser, channelGuest *model.Role) {
var err error
channelUser, err = ss.Role().GetByName(scheme.DefaultChannelUserRole)
channelUser, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelUserRole)
require.NoError(t, err)
require.NotNil(t, channelUser)
channelGuest, err = ss.Role().GetByName(scheme.DefaultChannelGuestRole)
channelGuest, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelGuestRole)
require.NoError(t, err)
require.NotNil(t, channelGuest)
return

Просмотреть файл

@@ -5929,10 +5929,10 @@ func (s *TimerLayerRoleStore) GetAll() ([]*model.Role, error) {
return result, err
}
func (s *TimerLayerRoleStore) GetByName(name string) (*model.Role, error) {
func (s *TimerLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
start := timemodule.Now()
result, err := s.RoleStore.GetByName(name)
result, err := s.RoleStore.GetByName(ctx, name)
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
if s.Root.Metrics != nil {