diff --git a/pkg/local_object_storage/blobstor/fstree/fstree.go b/pkg/local_object_storage/blobstor/fstree/fstree.go index 5d7094d4..d129bf98 100644 --- a/pkg/local_object_storage/blobstor/fstree/fstree.go +++ b/pkg/local_object_storage/blobstor/fstree/fstree.go @@ -71,27 +71,27 @@ func stringifyAddress(addr oid.Address) string { return addr.Object().EncodeToString() + "." + addr.Container().EncodeToString() } -func addressFromString(s string) (*oid.Address, error) { - ss := strings.SplitN(s, ".", 2) - if len(ss) != 2 { - return nil, errors.New("invalid address") +func addressFromString(s string) (oid.Address, error) { + i := strings.IndexByte(s, '.') + if i == -1 { + return oid.Address{}, errors.New("invalid address") } var obj oid.ID - if err := obj.DecodeString(ss[0]); err != nil { - return nil, err + if err := obj.DecodeString(s[:i]); err != nil { + return oid.Address{}, err } var cnr cid.ID - if err := cnr.DecodeString(ss[1]); err != nil { - return nil, err + if err := cnr.DecodeString(s[i+1:]); err != nil { + return oid.Address{}, err } var addr oid.Address addr.SetObject(obj) addr.SetContainer(cnr) - return &addr, nil + return addr, nil } // Iterate iterates over all stored objects. @@ -135,7 +135,7 @@ func (t *FSTree) iterate(depth uint64, curPath []string, prm common.IteratePrm) } if prm.LazyHandler != nil { - err = prm.LazyHandler(*addr, func() ([]byte, error) { + err = prm.LazyHandler(addr, func() ([]byte, error) { return os.ReadFile(filepath.Join(curPath...)) }) } else { @@ -147,7 +147,7 @@ func (t *FSTree) iterate(depth uint64, curPath []string, prm common.IteratePrm) if err != nil { if prm.IgnoreErrors { if prm.ErrorHandler != nil { - return prm.ErrorHandler(*addr, err) + return prm.ErrorHandler(addr, err) } continue } @@ -155,7 +155,7 @@ func (t *FSTree) iterate(depth uint64, curPath []string, prm common.IteratePrm) } err = prm.Handler(common.IterationElement{ - Address: *addr, + Address: addr, ObjectData: data, StorageID: []byte{}, }) diff --git a/pkg/local_object_storage/blobstor/fstree/fstree_test.go b/pkg/local_object_storage/blobstor/fstree/fstree_test.go index 4bfcc0a9..97fd6032 100644 --- a/pkg/local_object_storage/blobstor/fstree/fstree_test.go +++ b/pkg/local_object_storage/blobstor/fstree/fstree_test.go @@ -12,5 +12,19 @@ func TestAddressToString(t *testing.T) { s := stringifyAddress(addr) actual, err := addressFromString(s) require.NoError(t, err) - require.Equal(t, addr, *actual) + require.Equal(t, addr, actual) +} + +func Benchmark_addressFromString(b *testing.B) { + addr := oidtest.Address() + s := stringifyAddress(addr) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := addressFromString(s) + if err != nil { + b.Fatalf("benchmark error: %v", err) + } + } }