[#1060] writecache: compress big object if needed

Small objects use `blobstor.Put`, so no changes are required.

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2022-01-11 14:33:04 +03:00 committed by Alex Vanin
parent 0d969d7a06
commit 486d5c2e86
5 changed files with 36 additions and 12 deletions

View file

@ -110,32 +110,32 @@ func TestBlobstor_needsCompression(t *testing.T) {
b := newBlobStor(t, true, "audio/*", "*/x-mpeg", "*/mpeg", "application/x-midi")
obj := newObjectWithCt("video/mpeg")
require.False(t, b.needsCompression(obj))
require.False(t, b.NeedsCompression(obj))
obj = newObjectWithCt("audio/aiff")
require.False(t, b.needsCompression(obj))
require.False(t, b.NeedsCompression(obj))
obj = newObjectWithCt("application/x-midi")
require.False(t, b.needsCompression(obj))
require.False(t, b.NeedsCompression(obj))
obj = newObjectWithCt("text/plain")
require.True(t, b.needsCompression(obj))
require.True(t, b.NeedsCompression(obj))
obj = newObjectWithCt("")
require.True(t, b.needsCompression(obj))
require.True(t, b.NeedsCompression(obj))
})
t.Run("content-types omitted", func(t *testing.T) {
b := newBlobStor(t, true)
obj := newObjectWithCt("video/mpeg")
require.True(t, b.needsCompression(obj))
require.True(t, b.NeedsCompression(obj))
})
t.Run("compress disabled", func(t *testing.T) {
b := newBlobStor(t, false, "video/mpeg")
obj := newObjectWithCt("video/mpeg")
require.False(t, b.needsCompression(obj))
require.False(t, b.NeedsCompression(obj))
obj = newObjectWithCt("text/plain")
require.False(t, b.needsCompression(obj))
require.False(t, b.NeedsCompression(obj))
})
}

View file

@ -34,10 +34,14 @@ func (b *BlobStor) Put(prm *PutPrm) (*PutRes, error) {
return nil, fmt.Errorf("could not marshal the object: %w", err)
}
return b.PutRaw(prm.obj.Address(), data, b.needsCompression(prm.obj))
return b.PutRaw(prm.obj.Address(), data, b.NeedsCompression(prm.obj))
}
func (b *BlobStor) needsCompression(obj *object.Object) bool {
// NeedsCompression returns true if object should be compressed.
// For object to be compressed 2 conditions must hold:
// 1. Compression is enabled in settings.
// 2. Object MIME Content-Type is allowed for compression.
func (b *BlobStor) NeedsCompression(obj *object.Object) bool {
if !b.compressionEnabled || len(b.uncompressableContentTypes) == 0 {
return b.compressionEnabled
}