Skip to content

Commit 2566383

Browse files
committed
shard: do not try to resync API 2.18+ objects using payload
Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
1 parent f19d87b commit 2566383

File tree

2 files changed

+47
-40
lines changed

2 files changed

+47
-40
lines changed

pkg/local_object_storage/shard/control.go

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
"github.com/nspcc-dev/neofs-node/pkg/core/object"
8+
"github.com/nspcc-dev/neofs-node/pkg/core/version"
89
meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
910
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/shard/mode"
1011
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
@@ -191,54 +192,56 @@ func (s *Shard) resyncObjectHandler(addr oid.Address, data []byte) error {
191192
return nil
192193
}
193194

194-
// nolint: exhaustive
195-
switch obj.Type() {
196-
case objectSDK.TypeTombstone:
197-
tombstone := objectSDK.NewTombstone()
198-
exp, err := object.Expiration(*obj)
199-
if err != nil && !errors.Is(err, object.ErrNoExpiration) {
200-
return fmt.Errorf("tombstone's expiration: %w", err)
201-
}
195+
if !version.SysObjTargetShouldBeInHeader(obj.Version()) {
196+
// nolint: exhaustive
197+
switch obj.Type() {
198+
case objectSDK.TypeTombstone:
199+
tombstone := objectSDK.NewTombstone()
200+
exp, err := object.Expiration(*obj)
201+
if err != nil && !errors.Is(err, object.ErrNoExpiration) {
202+
return fmt.Errorf("tombstone's expiration: %w", err)
203+
}
202204

203-
if err := tombstone.Unmarshal(obj.Payload()); err != nil {
204-
return fmt.Errorf("could not unmarshal tombstone content: %w", err)
205-
}
205+
if err := tombstone.Unmarshal(obj.Payload()); err != nil {
206+
return fmt.Errorf("could not unmarshal tombstone content: %w", err)
207+
}
206208

207-
tombAddr := object.AddressOf(obj)
208-
memberIDs := tombstone.Members()
209-
tombMembers := make([]oid.Address, 0, len(memberIDs))
209+
tombAddr := object.AddressOf(obj)
210+
memberIDs := tombstone.Members()
211+
tombMembers := make([]oid.Address, 0, len(memberIDs))
210212

211-
for i := range memberIDs {
212-
a := tombAddr
213-
a.SetObject(memberIDs[i])
213+
for i := range memberIDs {
214+
a := tombAddr
215+
a.SetObject(memberIDs[i])
214216

215-
tombMembers = append(tombMembers, a)
216-
}
217+
tombMembers = append(tombMembers, a)
218+
}
217219

218-
_, _, err = s.metaBase.Inhume(tombAddr, exp, false, tombMembers...)
219-
if err != nil {
220-
if errors.Is(err, apistatus.ErrObjectLocked) {
221-
// if we are trying to inhume locked object, likely we are doing
222-
// something wrong and it should not stop resynchronisation
223-
s.log.Warn("inhuming locked objects",
224-
zap.Stringer("TS_address", tombAddr),
225-
zap.Stringers("targets", memberIDs))
226-
return nil
220+
_, _, err = s.metaBase.Inhume(tombAddr, exp, false, tombMembers...)
221+
if err != nil {
222+
if errors.Is(err, apistatus.ErrObjectLocked) {
223+
// if we are trying to inhume locked object, likely we are doing
224+
// something wrong and it should not stop resynchronisation
225+
s.log.Warn("inhuming locked objects",
226+
zap.Stringer("TS_address", tombAddr),
227+
zap.Stringers("targets", memberIDs))
228+
return nil
229+
}
230+
return fmt.Errorf("could not inhume [%s] objects: %w", oidsToString(memberIDs), err)
231+
}
232+
case objectSDK.TypeLock:
233+
var lock objectSDK.Lock
234+
if err := lock.Unmarshal(obj.Payload()); err != nil {
235+
return fmt.Errorf("could not unmarshal lock content: %w", err)
227236
}
228-
return fmt.Errorf("could not inhume [%s] objects: %w", oidsToString(memberIDs), err)
229-
}
230-
case objectSDK.TypeLock:
231-
var lock objectSDK.Lock
232-
if err := lock.Unmarshal(obj.Payload()); err != nil {
233-
return fmt.Errorf("could not unmarshal lock content: %w", err)
234-
}
235237

236-
locked := make([]oid.ID, lock.NumberOfMembers())
237-
lock.ReadMembers(locked)
238+
locked := make([]oid.ID, lock.NumberOfMembers())
239+
lock.ReadMembers(locked)
238240

239-
err := s.metaBase.Lock(obj.GetContainerID(), obj.GetID(), locked)
240-
if err != nil {
241-
return fmt.Errorf("could not lock [%s] objects: %w", oidsToString(locked), err)
241+
err := s.metaBase.Lock(obj.GetContainerID(), obj.GetID(), locked)
242+
if err != nil {
243+
return fmt.Errorf("could not lock [%s] objects: %w", oidsToString(locked), err)
244+
}
242245
}
243246
}
244247

pkg/local_object_storage/shard/control_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
1919
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
2020
objecttest "github.com/nspcc-dev/neofs-sdk-go/object/test"
21+
"github.com/nspcc-dev/neofs-sdk-go/version"
2122
"github.com/stretchr/testify/require"
2223
"go.uber.org/zap/zaptest"
2324
)
@@ -150,6 +151,7 @@ func TestResyncMetabase(t *testing.T) {
150151
require.NoError(t, sh.Init())
151152

152153
const objNum = 10
154+
oldVersion := version.New(2, 17)
153155

154156
mObjs := make(map[string]objAddr)
155157
locked := make([]oid.ID, 1, 2)
@@ -183,6 +185,7 @@ func TestResyncMetabase(t *testing.T) {
183185

184186
tombObj := objecttest.Object()
185187
tombObj.SetType(objectSDK.TypeTombstone)
188+
tombObj.SetVersion(&oldVersion)
186189

187190
tombstone := objecttest.Tombstone()
188191

@@ -215,6 +218,7 @@ func TestResyncMetabase(t *testing.T) {
215218
lock.WriteMembers(locked)
216219

217220
lockObj := objecttest.Object()
221+
lockObj.SetVersion(&oldVersion)
218222
lockObj.SetContainerID(cnrLocked)
219223
lockObj.WriteLock(lock)
220224

0 commit comments

Comments
 (0)