Skip to content

Commit

Permalink
*: Remove tree service for object operations (#1050)
Browse files Browse the repository at this point in the history
Refs #902
  • Loading branch information
roman-khimov authored Jan 30, 2025
2 parents 498f6ff + cbe53f6 commit 7141b84
Show file tree
Hide file tree
Showing 14 changed files with 762 additions and 596 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
17 changes: 10 additions & 7 deletions api/handler/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,19 @@ 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(),
}

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

tagSet, lockInfo, err := h.obj.GetObjectTaggingAndLock(r.Context(), t, extendedInfo.NodeVersion)
Expand All @@ -195,12 +204,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
63 changes: 63 additions & 0 deletions api/handler/locking.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,27 @@ 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 settings.VersioningEnabled() && p.ObjVersion.VersionID == "" {
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 head put legal hold", reqInfo, err)
return
Expand Down Expand Up @@ -231,6 +252,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 settings.VersioningEnabled() && p.ObjVersion.VersionID == "" {
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 +294,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 settings.VersioningEnabled() && p.VersionID == "" {
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
15 changes: 13 additions & 2 deletions api/layer/compound.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,27 @@ func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *ObjectV
}
}

tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo, nodeVersion)
tags, err = n.treeService.GetObjectTagging(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 {
if !lockInfo.LegalHold().IsZero() || lockInfo.Retention().IsZero() {
n.cache.PutLockInfo(owner, lockObjectKey(objVersion), lockInfo)
}
} else {
lockInfo = &data.LockInfo{}
}

return tags, lockInfo, nil
}
Loading

0 comments on commit 7141b84

Please sign in to comment.