Skip to content

Commit

Permalink
*: Remove tree
Browse files Browse the repository at this point in the history
WIP

Signed-off-by: Evgenii Baidakov <evgenii@nspcc.io>
  • Loading branch information
smallhive committed Jan 21, 2025
1 parent e35d779 commit 8c95c7d
Show file tree
Hide file tree
Showing 11 changed files with 902 additions and 171 deletions.
7 changes: 4 additions & 3 deletions api/handler/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func TestDeleteObjectFromSuspended(t *testing.T) {
putObject(t, tc, bktName, objName)

versionID, isDeleteMarker := deleteObject(t, tc, bktName, objName, emptyVersion)
require.True(t, isDeleteMarker)
require.False(t, isDeleteMarker)
require.Equal(t, data.UnversionedObjectVersionID, versionID)
}

Expand Down Expand Up @@ -200,7 +200,7 @@ func TestDeleteMarkers(t *testing.T) {
require.Len(t, versions.DeleteMarker, 3, "invalid delete markers length")
require.Len(t, versions.Version, 0, "versions must be empty")

require.Len(t, listOIDsFromMockedNeoFS(t, tc, bktName), 0, "shouldn't be any object in neofs")
require.Len(t, listOIDsFromMockedNeoFS(t, tc, bktName), 3, "should be all delete marker object in neofs")
}

func TestDeleteObjectFromListCache(t *testing.T) {
Expand Down Expand Up @@ -237,7 +237,8 @@ func TestDeleteObjectCheckMarkerReturn(t *testing.T) {
require.Equal(t, deleteMarkerVersion, versions.DeleteMarker[0].VersionID)

deleteMarkerVersion2, isDeleteMarker2 := deleteObject(t, tc, bktName, objName, deleteMarkerVersion)
require.True(t, isDeleteMarker2)
// deleting object with non-empty version - remove object from storage (even it is a delete marker). No additional markers.
require.False(t, isDeleteMarker2)
versions = listVersions(t, tc, bktName)
require.Len(t, versions.DeleteMarker, 0)
require.Equal(t, deleteMarkerVersion, deleteMarkerVersion2)
Expand Down
18 changes: 11 additions & 7 deletions api/handler/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,20 @@ func (h *handler) GetObjectHandler(w http.ResponseWriter, r *http.Request) {
return
}

bktSettings, err := h.obj.GetBucketSettings(r.Context(), bktInfo)
if err != nil {
h.logAndSendError(w, "could not get bucket settings", reqInfo, err)
return
}

t := &layer.ObjectVersion{
BktInfo: bktInfo,
ObjectName: info.Name,
VersionID: info.VersionID(),
// VersionID: info.VersionID(),
}

if bktSettings.VersioningEnabled() {
t.VersionID = info.VersionID()
}

tagSet, lockInfo, err := h.obj.GetObjectTaggingAndLock(r.Context(), t, extendedInfo.NodeVersion)
Expand All @@ -195,12 +205,6 @@ func (h *handler) GetObjectHandler(w http.ResponseWriter, r *http.Request) {
return
}

bktSettings, err := h.obj.GetBucketSettings(r.Context(), bktInfo)
if err != nil {
h.logAndSendError(w, "could not get bucket settings", reqInfo, err)
return
}

writeHeaders(w.Header(), r.Header, extendedInfo, len(tagSet), bktSettings.Unversioned())
if params != nil {
writeRangeHeaders(w, params, info.Size)
Expand Down
64 changes: 64 additions & 0 deletions api/handler/locking.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,28 @@ func (h *handler) PutObjectLegalHoldHandler(w http.ResponseWriter, r *http.Reque
CopiesNumber: h.cfg.CopiesNumber,
}

settings, err := h.obj.GetBucketSettings(r.Context(), bktInfo)
if err != nil {
h.logAndSendError(w, "could not get bucket settings", reqInfo, err)
return
}

if p.ObjVersion.VersionID == "" && settings.VersioningEnabled() {
headObjectPrm := &layer.HeadObjectParams{
BktInfo: bktInfo,
Object: reqInfo.ObjectName,
// VersionID: reqInfo.URL.Query().Get(api.QueryVersionID),
}

ei, err := h.obj.GetExtendedObjectInfo(r.Context(), headObjectPrm)
if err != nil {
h.logAndSendError(w, "could not find object", reqInfo, err)
return
}

p.ObjVersion.VersionID = ei.ObjectInfo.VersionID()
}

if err = h.obj.PutLockInfo(r.Context(), p); err != nil {
h.logAndSendError(w, "couldn't head put legal hold", reqInfo, err)
return
Expand Down Expand Up @@ -231,6 +253,27 @@ func (h *handler) PutObjectRetentionHandler(w http.ResponseWriter, r *http.Reque
CopiesNumber: h.cfg.CopiesNumber,
}

settings, err := h.obj.GetBucketSettings(r.Context(), bktInfo)
if err != nil {
h.logAndSendError(w, "could not get bucket settings", reqInfo, err)
return
}

if p.ObjVersion.VersionID == "" && settings.VersioningEnabled() {
headObjectPrm := &layer.HeadObjectParams{
BktInfo: bktInfo,
Object: reqInfo.ObjectName,
}

ei, err := h.obj.GetExtendedObjectInfo(r.Context(), headObjectPrm)
if err != nil {
h.logAndSendError(w, "could not find object", reqInfo, err)
return
}

p.ObjVersion.VersionID = ei.ObjectInfo.VersionID()
}

if err = h.obj.PutLockInfo(r.Context(), p); err != nil {
h.logAndSendError(w, "couldn't put legal hold", reqInfo, err)
return
Expand All @@ -252,12 +295,33 @@ func (h *handler) GetObjectRetentionHandler(w http.ResponseWriter, r *http.Reque
return
}

settings, err := h.obj.GetBucketSettings(r.Context(), bktInfo)
if err != nil {
h.logAndSendError(w, "could not get bucket settings", reqInfo, err)
return
}

p := &layer.ObjectVersion{
BktInfo: bktInfo,
ObjectName: reqInfo.ObjectName,
VersionID: reqInfo.URL.Query().Get(api.QueryVersionID),
}

if p.VersionID == "" && settings.VersioningEnabled() {
headObjectPrm := &layer.HeadObjectParams{
BktInfo: bktInfo,
Object: reqInfo.ObjectName,
}

ei, err := h.obj.GetExtendedObjectInfo(r.Context(), headObjectPrm)
if err != nil {
h.logAndSendError(w, "could not find object", reqInfo, err)
return
}

p.VersionID = ei.ObjectInfo.VersionID()
}

lockInfo, err := h.obj.GetLockInfo(r.Context(), p)
if err != nil {
h.logAndSendError(w, "couldn't head lock object", reqInfo, err)
Expand Down
1 change: 0 additions & 1 deletion api/handler/object_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ func TestS3BucketListV2DelimiterPrefix(t *testing.T) {
continuationToken := validateListV2(t, tc, bktName, prefix, delim, "", 1, true, false, []string{"asdf"}, empty)
continuationToken = validateListV2(t, tc, bktName, prefix, delim, continuationToken, 1, true, false, empty, []string{"boo/"})
validateListV2(t, tc, bktName, prefix, delim, continuationToken, 1, false, true, empty, []string{"cquux/"})

continuationToken = validateListV2(t, tc, bktName, prefix, delim, "", 2, true, false, []string{"asdf"}, []string{"boo/"})
validateListV2(t, tc, bktName, prefix, delim, continuationToken, 2, false, true, empty, []string{"cquux/"})

Expand Down
13 changes: 11 additions & 2 deletions api/layer/compound.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,25 @@ func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *ObjectV
}
}

tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo, nodeVersion)
tags, _, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo, nodeVersion)
if err != nil {
if errorsStd.Is(err, ErrNodeNotFound) {
return nil, nil, s3errors.GetAPIError(s3errors.ErrNoSuchKey)
}
return nil, nil, err
}

lockInfo, err = n.getLockDataFromObjects(ctx, objVersion.BktInfo, objVersion.ObjectName, objVersion.VersionID)
if err != nil {
return nil, nil, err
}

n.cache.PutTagging(owner, objectTaggingCacheKey(objVersion), tags)
n.cache.PutLockInfo(owner, lockObjectKey(objVersion), lockInfo)
if lockInfo != nil {
n.cache.PutLockInfo(owner, lockObjectKey(objVersion), lockInfo)
} else {
lockInfo = &data.LockInfo{}
}

return tags, lockInfo, nil
}
Loading

0 comments on commit 8c95c7d

Please sign in to comment.