mdbx: fix compression

This commit is contained in:
Victor Shyba 2025-05-24 02:31:18 -03:00
parent f3251c0504
commit 13bbfd9fd7

View File

@ -14,17 +14,12 @@ import (
"source.quilibrium.com/quilibrium/monorepo/node/config"
)
// Compression header to identify compressed values
var compressionHeader = []byte{0x1F, 0x8B}
// compressValue compresses a byte slice using zlib compression
// It adds a header to identify the value as compressed
func compressValue(value []byte) ([]byte, error) {
// Don't compress small values or nil values
if len(value) < 20 {
if value == nil {
return value, nil
}
var b bytes.Buffer
w, err := zlib.NewWriterLevel(&b, zlib.BestCompression)
@ -39,37 +34,19 @@ func compressValue(value []byte) ([]byte, error) {
if err := w.Close(); err != nil {
return nil, err
}
// Add compression header to the compressed data
compressed := append(compressionHeader, b.Bytes()...)
// Only use compression if it actually reduces the size
if len(compressed) < len(value) {
return compressed, nil
}
// If compression doesn't help, return the original value
return value, nil
return b.Bytes(), nil
}
// decompressValue decompresses a byte slice if it was compressed
// It checks for the compression header to determine if decompression is needed
func decompressValue(value []byte) ([]byte, error) {
// Handle nil or empty values
if value == nil || len(value) < len(compressionHeader) {
if value == nil {
return value, nil
}
// Check if the value has our compression header
if !bytes.Equal(value[:len(compressionHeader)], compressionHeader) {
return value, nil // Not compressed, return as is
}
// Remove the header before decompression
compressedData := value[len(compressionHeader):]
// Create a zlib reader
r, err := zlib.NewReader(bytes.NewReader(compressedData))
r, err := zlib.NewReader(bytes.NewReader(value))
if err != nil {
return nil, err
}
@ -449,6 +426,11 @@ func (i *MDBXIterator) First() bool {
i.valid = false
return false
}
v, err = decompressValue(v)
if err != nil {
i.valid = false
return false
}
i.key = k
i.value = v
@ -472,6 +454,11 @@ func (i *MDBXIterator) Next() bool {
i.valid = false
return false
}
v, err = decompressValue(v)
if err != nil {
i.valid = false
return false
}
i.key = k
i.value = v
@ -494,6 +481,11 @@ func (i *MDBXIterator) Prev() bool {
i.valid = false
return false
}
v, err = decompressValue(v)
if err != nil {
i.valid = false
return false
}
i.key = k
i.value = v
@ -555,6 +547,11 @@ func (i *MDBXIterator) SeekLT(target []byte) bool {
i.valid = false
return false
}
v, err = decompressValue(v)
if err != nil {
i.valid = false
return false
}
i.key = k
i.value = v
@ -587,6 +584,11 @@ func (i *MDBXIterator) Last() bool {
}
}
}
v, err = decompressValue(v)
if err != nil {
i.valid = false
return false
}
if err != nil {
i.valid = false
@ -708,8 +710,10 @@ func (m *MDBXBatch) NewIter(lowerBound []byte, upperBound []byte) (Iterator, err
func (m *MDBXBatch) Set(key []byte, value []byte) error {
keyCopy := make([]byte, len(key))
copy(keyCopy, key)
valueCopy := make([]byte, len(value))
copy(valueCopy, value)
valueCopy, err := compressValue(value)
if err != nil {
return err
}
m.operations = append(m.operations, BatchOperation{opcode: Set, operand1: keyCopy, operand2: valueCopy})
return nil
}