frostfs-node/pkg/local_object_storage/objectstore/schema.go
Dmitrii Stepanov 671eba46bc
[#9999] objectstore: Put
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
2025-02-27 15:58:40 +03:00

168 lines
4.8 KiB
Go

package objectstore
import (
"encoding/binary"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
"github.com/google/uuid"
)
const (
prefixInfo byte = 0
prefixBlobID byte = 1
prefixObjectIDPartBlobID byte = 2
prefixSplitInfo byte = 3
prefixParent byte = 4
prefixECParent byte = 5
prefixExpEpochToObject byte = 6
prefixObjectToExpEpoch byte = 7
prefixObjectToTombstone byte = 8
prefixTombstoneToObject byte = 9
prefixSplitIDIndex byte = 10
prefixAttributeIndex byte = 11
prefixStoredObject byte = 12
prefixRegularObject byte = 13
prefixTombstoneObject byte = 14
partHeader = 0
partPayload = 1
splitInfoTypeSplitID = 0
splitInfoTypeLastPart = 1
splitInfoTypeLinkingObject = 2
)
var (
versionKey = append([]byte{prefixInfo}, []byte("version")...)
upgradeKey = append([]byte{prefixInfo}, []byte("upgrade")...)
zeroValue = []byte{}
storedObjectValueBlob = []byte{0}
)
func blobIDKey(blobID uuid.UUID) []byte {
result := make([]byte, 17)
result[0] = prefixBlobID
copy(result[1:], blobID[:])
return result
}
func objectToBlobKey(containerID cid.ID, objectID oid.ID, partType byte, blobID uuid.UUID) []byte {
result := make([]byte, 1+32+32+1+16)
result[0] = prefixObjectIDPartBlobID
containerID.Encode(result[1:])
objectID.Encode(result[1+32:])
result[1+32+32] = partType
copy(result[1+32+32+1:], blobID[:])
return result
}
func storedObjectKey(containerID cid.ID, objectID oid.ID) []byte {
result := make([]byte, 1+32+32)
result[0] = prefixStoredObject
containerID.Encode(result[1:])
objectID.Encode(result[1+32:])
return result
}
func regularObjectKey(containerID cid.ID, objectID oid.ID) []byte {
result := make([]byte, 1+32+32)
result[0] = prefixRegularObject
containerID.Encode(result[1:])
objectID.Encode(result[1+32:])
return result
}
func tombstoneObjectKey(containerID cid.ID, objectID oid.ID) []byte {
result := make([]byte, 1+32+32)
result[0] = prefixTombstoneObject
containerID.Encode(result[1:])
objectID.Encode(result[1+32:])
return result
}
func splitInfoKey(containerID cid.ID, objectID oid.ID, splitInfoType byte) []byte {
result := make([]byte, 1+32+32+1)
result[0] = prefixSplitInfo
containerID.Encode(result[1:])
objectID.Encode(result[33:])
result[65] = splitInfoType
return result
}
func parentKey(containerID cid.ID, parentObjectID, objectID oid.ID) []byte {
result := make([]byte, 1+32+32+32)
result[0] = prefixParent
containerID.Encode(result[1:])
parentObjectID.Encode(result[33:])
objectID.Encode(result[65:])
return result
}
func ecParentKey(containerID cid.ID, ecParentObjectID, objectID oid.ID) []byte {
result := make([]byte, 1+32+32+32)
result[0] = prefixECParent
containerID.Encode(result[1:])
ecParentObjectID.Encode(result[33:])
objectID.Encode(result[65:])
return result
}
func expEpochToObjectKey(containerID cid.ID, objectID oid.ID, expEpoch uint64) []byte {
result := make([]byte, 1+8+32+32)
result[0] = prefixExpEpochToObject
binary.LittleEndian.PutUint64(result[1:], expEpoch)
containerID.Encode(result[9:])
objectID.Encode(result[41:])
return result
}
func objectToExpEpochKey(containerID cid.ID, objectID oid.ID, expEpoch uint64) []byte {
result := make([]byte, 1+32+32+8)
result[0] = prefixObjectToExpEpoch
containerID.Encode(result[1:])
objectID.Encode(result[33:])
binary.LittleEndian.PutUint64(result[65:], expEpoch)
return result
}
func objectToTombstoneKey(containerID cid.ID, objectID, tombstoneID oid.ID) []byte {
result := make([]byte, 1+32+32+32)
result[0] = prefixObjectToTombstone
containerID.Encode(result[1:])
objectID.Encode(result[33:])
tombstoneID.Encode(result[65:])
return result
}
func tombstoneToObjectKey(containerID cid.ID, objectID, tombstoneID oid.ID) []byte {
result := make([]byte, 1+32+32+32)
result[0] = prefixTombstoneToObject
containerID.Encode(result[1:])
tombstoneID.Encode(result[33:])
objectID.Encode(result[65:])
return result
}
func splitIDIndexKey(containerID cid.ID, objectID oid.ID, splitID *objectSDK.SplitID) []byte {
splitIDBytes := splitID.ToV2()
result := make([]byte, 1+len(splitIDBytes)+32+32)
result[0] = prefixSplitIDIndex
copy(result[1:], splitIDBytes)
containerID.Encode(result[1+len(splitIDBytes):])
objectID.Encode(result[1+len(splitIDBytes)+32:])
return result
}
func attributeIndexKey(containerID cid.ID, objectID oid.ID, key, value string) []byte {
result := make([]byte, 1+32+len(key)+1+len(value)+32)
result[0] = prefixAttributeIndex
containerID.Encode(result[1:])
copy(result[33:], []byte(key))
result[1+32+len(key)] = '='
copy(result[1+32+len(key)+1:], []byte(value))
objectID.Encode(result[1+32+len(key)+1+len(value):])
return result
}