forked from TrueCloudLab/frostfs-node
[#1323] metabase: Add expiration epoch buckets
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
2542d4f5df
commit
7bf20c9f1f
11 changed files with 181 additions and 170 deletions
|
@ -1,9 +1,10 @@
|
|||
package meta
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/sha256"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||
|
@ -23,6 +24,7 @@ var (
|
|||
toMoveItBucketName = []byte{toMoveItPrefix}
|
||||
containerVolumeBucketName = []byte{containerVolumePrefix}
|
||||
containerCounterBucketName = []byte{containerCountersPrefix}
|
||||
expEpochToObjectBucketName = []byte{expirationEpochToObjectPrefix}
|
||||
|
||||
zeroValue = []byte{0xFF}
|
||||
|
||||
|
@ -124,6 +126,16 @@ const (
|
|||
// Key: container ID + type
|
||||
// Value: Object id
|
||||
ecInfoPrefix
|
||||
|
||||
// expirationEpochToObjectPrefix is used for storing relation between expiration epoch and object id.
|
||||
// Key: expiration epoch + object address
|
||||
// Value: zero
|
||||
expirationEpochToObjectPrefix
|
||||
|
||||
// objectToExpirationEpochPrefix is used for storing relation between expiration epoch and object id.
|
||||
// Key: object address
|
||||
// Value: expiration epoch
|
||||
objectToExpirationEpochPrefix
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -131,6 +143,7 @@ const (
|
|||
bucketKeySize = 1 + cidSize
|
||||
objectKeySize = sha256.Size
|
||||
addressKeySize = cidSize + objectKeySize
|
||||
epochSize = 8
|
||||
)
|
||||
|
||||
func bucketName(cnr cid.ID, prefix byte, key []byte) []byte {
|
||||
|
@ -161,15 +174,6 @@ func attributeBucketName(cnr cid.ID, attributeKey string, key []byte) []byte {
|
|||
return append(key[:bucketKeySize], attributeKey...)
|
||||
}
|
||||
|
||||
// returns <CID> from attributeBucketName result, nil otherwise.
|
||||
func cidFromAttributeBucket(val []byte, attributeKey string) []byte {
|
||||
if len(val) < bucketKeySize || val[0] != userAttributePrefix || !bytes.Equal(val[bucketKeySize:], []byte(attributeKey)) {
|
||||
return nil
|
||||
}
|
||||
|
||||
return val[1:bucketKeySize]
|
||||
}
|
||||
|
||||
// rootBucketName returns <CID>_root.
|
||||
func rootBucketName(cnr cid.ID, key []byte) []byte {
|
||||
return bucketName(cnr, rootPrefix, key)
|
||||
|
@ -190,6 +194,35 @@ func ecInfoBucketName(cnr cid.ID, key []byte) []byte {
|
|||
return bucketName(cnr, ecInfoPrefix, key)
|
||||
}
|
||||
|
||||
// objectToExpirationEpochBucketName returns objectToExpirationEpochPrefix_<CID>.
|
||||
func objectToExpirationEpochBucketName(cnr cid.ID, key []byte) []byte {
|
||||
return bucketName(cnr, objectToExpirationEpochPrefix, key)
|
||||
}
|
||||
|
||||
func expirationEpochKey(epoch uint64, cnr cid.ID, obj oid.ID) []byte {
|
||||
result := make([]byte, epochSize+addressKeySize)
|
||||
binary.BigEndian.PutUint64(result, epoch)
|
||||
cnr.Encode(result[epochSize:])
|
||||
obj.Encode(result[epochSize+cidSize:])
|
||||
return result
|
||||
}
|
||||
|
||||
func parseExpirationEpochKey(key []byte) (uint64, cid.ID, oid.ID, error) {
|
||||
if len(key) != epochSize+addressKeySize {
|
||||
return 0, cid.ID{}, oid.ID{}, fmt.Errorf("unexpected expiration epoch to object key length: %d", len(key))
|
||||
}
|
||||
epoch := binary.BigEndian.Uint64(key)
|
||||
var cnr cid.ID
|
||||
if err := cnr.Decode(key[epochSize : epochSize+cidSize]); err != nil {
|
||||
return 0, cid.ID{}, oid.ID{}, fmt.Errorf("failed to decode expiration epoch to object key (container ID): %w", err)
|
||||
}
|
||||
var obj oid.ID
|
||||
if err := obj.Decode(key[epochSize+cidSize:]); err != nil {
|
||||
return 0, cid.ID{}, oid.ID{}, fmt.Errorf("failed to decode expiration epoch to object key (object ID): %w", err)
|
||||
}
|
||||
return epoch, cnr, obj, nil
|
||||
}
|
||||
|
||||
// addressKey returns key for K-V tables when key is a whole address.
|
||||
func addressKey(addr oid.Address, key []byte) []byte {
|
||||
addr.Container().Encode(key)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue