[#335] Improve determining AccessBox latest version

Signed-off-by: Anoke <rustamgta1011@gmail.com>
poc/new-pilorama
Rustam Akberov 2024-05-24 21:31:11 +03:00 committed by Alexey Vanin
parent e25dc90c20
commit 58850f590e
3 changed files with 31 additions and 10 deletions

View File

@ -76,7 +76,7 @@ func (x *AuthmateFrostFS) GetCredsObject(ctx context.Context, addr oid.Address)
credObjID := addr.Object() credObjID := addr.Object()
if last := versions.GetLast(); last != nil { if last := versions.GetLast(); last != nil {
credObjID = last.OjbID credObjID = last.ObjID
} }
res, err := x.frostFS.ReadObject(ctx, layer.PrmObjectRead{ res, err := x.frostFS.ReadObject(ctx, layer.PrmObjectRead{
@ -107,7 +107,7 @@ func (x *AuthmateFrostFS) CreateObject(ctx context.Context, prm tokens.PrmObject
} }
if versions.GetLast() == nil { if versions.GetLast() == nil {
versions.AppendVersion(&crdt.ObjectVersion{OjbID: addr.Object()}) versions.AppendVersion(&crdt.ObjectVersion{ObjID: addr.Object()})
} }
for key, val := range versions.GetCRDTHeaders() { for key, val := range versions.GetCRDTHeaders() {

View File

@ -20,13 +20,13 @@ type ObjectVersions struct {
} }
type ObjectVersion struct { type ObjectVersion struct {
OjbID oid.ID ObjID oid.ID
Headers map[string]string Headers map[string]string
CreationEpoch uint64 CreationEpoch uint64
} }
func (o *ObjectVersion) VersionID() string { func (o *ObjectVersion) VersionID() string {
return o.OjbID.EncodeToString() return o.ObjID.EncodeToString()
} }
func NewObjectVersions(name string) *ObjectVersions { func NewObjectVersions(name string) *ObjectVersions {
@ -42,7 +42,7 @@ func NewObjectVersion(obj *object.Object) *ObjectVersion {
} }
return &ObjectVersion{ return &ObjectVersion{
OjbID: objID, ObjID: objID,
Headers: headers, Headers: headers,
CreationEpoch: obj.CreationEpoch(), CreationEpoch: obj.CreationEpoch(),
} }
@ -108,8 +108,15 @@ func (v *ObjectVersions) getAddHeader() string {
} }
func less(ov1, ov2 *ObjectVersion) bool { func less(ov1, ov2 *ObjectVersion) bool {
versionID1, versionID2 := ov1.VersionID(), ov2.VersionID()
if strings.Contains(ov1.Headers[versionsAddAttr], versionID2) {
return false
}
if strings.Contains(ov2.Headers[versionsAddAttr], versionID1) {
return true
}
if ov1.CreationEpoch == ov2.CreationEpoch { if ov1.CreationEpoch == ov2.CreationEpoch {
return ov1.VersionID() < ov2.VersionID() return versionID1 < versionID2
} }
return ov1.CreationEpoch < ov2.CreationEpoch return ov1.CreationEpoch < ov2.CreationEpoch
} }

View File

@ -20,10 +20,10 @@ func TestObjectVersionsSort(t *testing.T) {
t.Run("sort by oids", func(t *testing.T) { t.Run("sort by oids", func(t *testing.T) {
versions := NewObjectVersions("test") versions := NewObjectVersions("test")
versions.AppendVersion(&ObjectVersion{CreationEpoch: 3, OjbID: getTestOID(2)}) versions.AppendVersion(&ObjectVersion{CreationEpoch: 3, ObjID: getTestOID(2)})
versions.AppendVersion(&ObjectVersion{CreationEpoch: 3, OjbID: getTestOID(1)}) versions.AppendVersion(&ObjectVersion{CreationEpoch: 3, ObjID: getTestOID(1)})
versions.AppendVersion(&ObjectVersion{CreationEpoch: 1, OjbID: getTestOID(3)}) versions.AppendVersion(&ObjectVersion{CreationEpoch: 1, ObjID: getTestOID(3)})
versions.AppendVersion(&ObjectVersion{CreationEpoch: 2, OjbID: getTestOID(4)}) versions.AppendVersion(&ObjectVersion{CreationEpoch: 2, ObjID: getTestOID(4)})
last := versions.GetLast() last := versions.GetLast()
require.Equal(t, uint64(3), last.CreationEpoch) require.Equal(t, uint64(3), last.CreationEpoch)
@ -36,3 +36,17 @@ func getTestOID(val byte) oid.ID {
res.SetSHA256([32]byte{val}) res.SetSHA256([32]byte{val})
return res return res
} }
func TestObjectVersionsSort1(t *testing.T) {
t.Run("sort by headers", func(t *testing.T) {
versions := NewObjectVersions("test")
versions.AppendVersion(&ObjectVersion{Headers: versions.GetCRDTHeaders(), ObjID: getTestOID(2)})
versions.AppendVersion(&ObjectVersion{Headers: versions.GetCRDTHeaders(), ObjID: getTestOID(3)})
versions.AppendVersion(&ObjectVersion{Headers: versions.GetCRDTHeaders(), ObjID: getTestOID(4)})
versions.AppendVersion(&ObjectVersion{Headers: versions.GetCRDTHeaders(), ObjID: getTestOID(1)})
last := versions.GetLast()
require.Equal(t, uint64(0), last.CreationEpoch)
require.Equal(t, getTestOID(1).String(), last.VersionID())
})
}