[MM-44489] Cloud limits: enforcing files (#20703)
* Update last accessible file time * Filter fileInfos * Set inaccessible header * Fix lint issue * Fix lint issue * Fix i18n * add nil check * Fix merge conflicts * Add helper functions to clear out inaccessible files content * Remove content for inaccessible files * Fix typo * wip * Remove InaccessibleContent field, instead use Archived * Add store tests * Add tests * Add separate funcs to ignore cloud limits * Use separate query for MySql * Use GetReplicaX Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/mattermost/mattermost-server/v6/model"
|
||||
"github.com/mattermost/mattermost-server/v6/store"
|
||||
"github.com/mattermost/mattermost-server/v6/utils"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -30,6 +31,7 @@ func TestFileInfoStore(t *testing.T, ss store.Store) {
|
||||
t.Run("GetFilesBatchForIndexing", func(t *testing.T) { testFileInfoStoreGetFilesBatchForIndexing(t, ss) })
|
||||
t.Run("CountAll", func(t *testing.T) { testFileInfoStoreCountAll(t, ss) })
|
||||
t.Run("GetStorageUsage", func(t *testing.T) { testFileInfoGetStorageUsage(t, ss) })
|
||||
t.Run("GetUptoNSizeFileTime", func(t *testing.T) { testGetUptoNSizeFileTime(t, ss) })
|
||||
}
|
||||
|
||||
func testFileInfoSaveGet(t *testing.T, ss store.Store) {
|
||||
@@ -772,3 +774,71 @@ func testFileInfoGetStorageUsage(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(30), usage)
|
||||
}
|
||||
|
||||
func testGetUptoNSizeFileTime(t *testing.T, ss store.Store) {
|
||||
_, err := ss.FileInfo().GetUptoNSizeFileTime(0)
|
||||
assert.Error(t, err)
|
||||
_, err = ss.FileInfo().GetUptoNSizeFileTime(-1)
|
||||
assert.Error(t, err)
|
||||
|
||||
_, err = ss.FileInfo().PermanentDeleteBatch(model.GetMillis(), 100000)
|
||||
require.NoError(t, err)
|
||||
|
||||
diff := int64(10000)
|
||||
now := utils.MillisFromTime(time.Now()) + diff
|
||||
|
||||
f1, err := ss.FileInfo().Save(&model.FileInfo{
|
||||
PostId: model.NewId(),
|
||||
CreatorId: model.NewId(),
|
||||
Size: 10,
|
||||
Path: "file1.txt",
|
||||
CreateAt: now,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
now = now + diff
|
||||
f2, err := ss.FileInfo().Save(&model.FileInfo{
|
||||
PostId: model.NewId(),
|
||||
CreatorId: model.NewId(),
|
||||
Size: 10,
|
||||
Path: "file2.txt",
|
||||
CreateAt: now,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
now = now + diff
|
||||
f3, err := ss.FileInfo().Save(&model.FileInfo{
|
||||
PostId: model.NewId(),
|
||||
CreatorId: model.NewId(),
|
||||
Size: 10,
|
||||
Path: "file3.txt",
|
||||
CreateAt: now,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
now = now + diff
|
||||
_, err = ss.FileInfo().Save(&model.FileInfo{
|
||||
PostId: model.NewId(),
|
||||
CreatorId: model.NewId(),
|
||||
Size: 10,
|
||||
Path: "file4.txt",
|
||||
CreateAt: now,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
createAt, err := ss.FileInfo().GetUptoNSizeFileTime(20)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, f3.CreateAt, createAt)
|
||||
|
||||
_, err = ss.FileInfo().GetUptoNSizeFileTime(5)
|
||||
assert.Error(t, err)
|
||||
assert.IsType(t, &store.ErrNotFound{}, err)
|
||||
|
||||
createAt, err = ss.FileInfo().GetUptoNSizeFileTime(1000)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, f1.CreateAt, createAt)
|
||||
|
||||
_, err = ss.FileInfo().DeleteForPost(f3.PostId)
|
||||
require.NoError(t, err)
|
||||
|
||||
createAt, err = ss.FileInfo().GetUptoNSizeFileTime(20)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, f2.CreateAt, createAt)
|
||||
}
|
||||
|
||||
@@ -257,6 +257,27 @@ func (_m *FileInfoStore) GetStorageUsage(allowFromCache bool, includeDeleted boo
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetUptoNSizeFileTime provides a mock function with given fields: n
|
||||
func (_m *FileInfoStore) GetUptoNSizeFileTime(n int64) (int64, error) {
|
||||
ret := _m.Called(n)
|
||||
|
||||
var r0 int64
|
||||
if rf, ok := ret.Get(0).(func(int64) int64); ok {
|
||||
r0 = rf(n)
|
||||
} else {
|
||||
r0 = ret.Get(0).(int64)
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(int64) error); ok {
|
||||
r1 = rf(n)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetWithOptions provides a mock function with given fields: page, perPage, opt
|
||||
func (_m *FileInfoStore) GetWithOptions(page int, perPage int, opt *model.GetFileInfosOptions) ([]*model.FileInfo, error) {
|
||||
ret := _m.Called(page, perPage, opt)
|
||||
|
||||
Ссылка в новой задаче
Block a user