Fix bug in SqlPostStore.PermanentDeletebyUser where no error was returned when 10K posts was exceeded. Remaining posts were silently orphaned. (#29642)
Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
@@ -1065,6 +1065,7 @@ func (s *SqlPostStore) PermanentDeleteByUser(rctx request.CTX, userId string) er
|
|||||||
|
|
||||||
// Now attempt to delete all the root posts for a user. This will also
|
// Now attempt to delete all the root posts for a user. This will also
|
||||||
// delete all the comments for each post
|
// delete all the comments for each post
|
||||||
|
const maxLoops = 10
|
||||||
count := 0
|
count := 0
|
||||||
for {
|
for {
|
||||||
var ids []string
|
var ids []string
|
||||||
@@ -1083,8 +1084,8 @@ func (s *SqlPostStore) PermanentDeleteByUser(rctx request.CTX, userId string) er
|
|||||||
|
|
||||||
// This is a fail safe, give up if more than 10k messages
|
// This is a fail safe, give up if more than 10k messages
|
||||||
count++
|
count++
|
||||||
if count >= 10 {
|
if count >= maxLoops {
|
||||||
return errors.Wrapf(err, "too many Posts to delete with userId=%s", userId)
|
return store.NewErrLimitExceeded("permanently deleting posts for user", maxLoops*1000, "userId="+userId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ func TestPostStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|||||||
t.Run("Delete", func(t *testing.T) { testPostStoreDelete(t, rctx, ss) })
|
t.Run("Delete", func(t *testing.T) { testPostStoreDelete(t, rctx, ss) })
|
||||||
t.Run("PermDelete1Level", func(t *testing.T) { testPostStorePermDelete1Level(t, rctx, ss) })
|
t.Run("PermDelete1Level", func(t *testing.T) { testPostStorePermDelete1Level(t, rctx, ss) })
|
||||||
t.Run("PermDelete1Level2", func(t *testing.T) { testPostStorePermDelete1Level2(t, rctx, ss) })
|
t.Run("PermDelete1Level2", func(t *testing.T) { testPostStorePermDelete1Level2(t, rctx, ss) })
|
||||||
|
t.Run("PermDeleteLimitExceeded", func(t *testing.T) { testPostStorePermDeleteLimitExceeded(t, rctx, ss) })
|
||||||
t.Run("GetWithChildren", func(t *testing.T) { testPostStoreGetWithChildren(t, rctx, ss) })
|
t.Run("GetWithChildren", func(t *testing.T) { testPostStoreGetWithChildren(t, rctx, ss) })
|
||||||
t.Run("GetPostsWithDetails", func(t *testing.T) { testPostStoreGetPostsWithDetails(t, rctx, ss) })
|
t.Run("GetPostsWithDetails", func(t *testing.T) { testPostStoreGetPostsWithDetails(t, rctx, ss) })
|
||||||
t.Run("GetPostsBeforeAfter", func(t *testing.T) { testPostStoreGetPostsBeforeAfter(t, rctx, ss) })
|
t.Run("GetPostsBeforeAfter", func(t *testing.T) { testPostStoreGetPostsBeforeAfter(t, rctx, ss) })
|
||||||
@@ -1686,6 +1687,33 @@ func testPostStorePermDelete1Level2(t *testing.T, rctx request.CTX, ss store.Sto
|
|||||||
require.NoError(t, err, "Deleted id should have failed")
|
require.NoError(t, err, "Deleted id should have failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testPostStorePermDeleteLimitExceeded(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||||
|
const maxPosts = 10000
|
||||||
|
teamID := model.NewId()
|
||||||
|
userID := model.NewId()
|
||||||
|
channel, err := ss.Channel().Save(rctx, &model.Channel{
|
||||||
|
TeamId: teamID,
|
||||||
|
DisplayName: "10KPosts",
|
||||||
|
Name: "channel" + model.NewId(),
|
||||||
|
Type: model.ChannelTypeOpen,
|
||||||
|
}, -1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
for i := 0; i < maxPosts+100; i++ {
|
||||||
|
post := &model.Post{
|
||||||
|
ChannelId: channel.Id,
|
||||||
|
UserId: userID,
|
||||||
|
Message: NewTestID(),
|
||||||
|
}
|
||||||
|
_, err = ss.Post().Save(rctx, post)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ss.Post().PermanentDeleteByUser(rctx, userID)
|
||||||
|
var errLimitExceeded *store.ErrLimitExceeded
|
||||||
|
require.ErrorAs(t, err, &errLimitExceeded)
|
||||||
|
}
|
||||||
|
|
||||||
func testPostStoreGetWithChildren(t *testing.T, rctx request.CTX, ss store.Store) {
|
func testPostStoreGetWithChildren(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||||
teamID := model.NewId()
|
teamID := model.NewId()
|
||||||
channel1, err := ss.Channel().Save(rctx, &model.Channel{
|
channel1, err := ss.Channel().Save(rctx, &model.Channel{
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user