forked from TrueCloudLab/frostfs-node
168 lines
4.8 KiB
Go
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
|
|
}
|