Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node/placement: use predefined error for empty netmap #2916

Merged
merged 3 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions cmd/neofs-cli/internal/common/eacl.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
var errUnsupportedEACLFormat = errors.New("unsupported eACL format")

// ReadEACL reads extended ACL table from eaclPath.
func ReadEACL(cmd *cobra.Command, eaclPath string) *eacl.Table {
func ReadEACL(cmd *cobra.Command, eaclPath string) eacl.Table {

Check warning on line 16 in cmd/neofs-cli/internal/common/eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/internal/common/eacl.go#L16

Added line #L16 was not covered by tests
_, err := os.Stat(eaclPath) // check if `eaclPath` is an existing file
if err != nil {
ExitOnErr(cmd, "", errors.New("incorrect path to file with EACL"))
Expand All @@ -24,25 +24,25 @@
data, err := os.ReadFile(eaclPath)
ExitOnErr(cmd, "can't read file with EACL: %w", err)

table := eacl.NewTable()

if err = table.UnmarshalJSON(data); err == nil {
table, err := eacl.UnmarshalJSON(data)
if err == nil {

Check warning on line 28 in cmd/neofs-cli/internal/common/eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/internal/common/eacl.go#L27-L28

Added lines #L27 - L28 were not covered by tests
validateAndFixEACLVersion(table)
PrintVerbose(cmd, "Parsed JSON encoded EACL table")
return table
}

if err = table.Unmarshal(data); err == nil {
table, err = eacl.Unmarshal(data)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what was wrong with previous code?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Table should be created using one of the constructors.

updated docs say so

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u already have an instance

if err == nil {

Check warning on line 35 in cmd/neofs-cli/internal/common/eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/internal/common/eacl.go#L34-L35

Added lines #L34 - L35 were not covered by tests
validateAndFixEACLVersion(table)
PrintVerbose(cmd, "Parsed binary encoded EACL table")
return table
}

ExitOnErr(cmd, "", errUnsupportedEACLFormat)
return nil
return eacl.Table{}

Check warning on line 42 in cmd/neofs-cli/internal/common/eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/internal/common/eacl.go#L42

Added line #L42 was not covered by tests
}

func validateAndFixEACLVersion(table *eacl.Table) {
func validateAndFixEACLVersion(table eacl.Table) {

Check warning on line 45 in cmd/neofs-cli/internal/common/eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/internal/common/eacl.go#L45

Added line #L45 was not covered by tests
if !version.IsValid(table.Version()) {
table.SetVersion(versionSDK.Current())
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/neofs-cli/modules/acl/extended/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@
os.Exit(1)
}

tb := eacl.NewTable()
common.ExitOnErr(cmd, "unable to parse provided rules: %w", util.ParseEACLRules(tb, rules))
var tb eacl.Table
common.ExitOnErr(cmd, "unable to parse provided rules: %w", util.ParseEACLRules(&tb, rules))

Check warning on line 92 in cmd/neofs-cli/modules/acl/extended/create.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/acl/extended/create.go#L91-L92

Added lines #L91 - L92 were not covered by tests

err = util.ValidateEACLTable(tb)
common.ExitOnErr(cmd, "table validation: %w", err)
Expand Down
6 changes: 3 additions & 3 deletions cmd/neofs-cli/modules/bearer/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,11 @@

eaclPath, _ := cmd.Flags().GetString(eaclFlag)
if eaclPath != "" {
table := eaclSDK.NewTable()
raw, err := os.ReadFile(eaclPath)
common.ExitOnErr(cmd, "can't read extended ACL file: %w", err)
common.ExitOnErr(cmd, "can't parse extended ACL: %w", json.Unmarshal(raw, table))
b.SetEACLTable(*table)
table, err := eaclSDK.UnmarshalJSON(raw)
common.ExitOnErr(cmd, "can't parse extended ACL: %w", err)
b.SetEACLTable(table)

Check warning on line 115 in cmd/neofs-cli/modules/bearer/create.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/bearer/create.go#L113-L115

Added lines #L113 - L115 were not covered by tests
}

var data []byte
Expand Down
2 changes: 1 addition & 1 deletion cmd/neofs-cli/modules/container/set_eacl.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@

var setEACLPrm internalclient.SetEACLPrm
setEACLPrm.SetClient(cli)
setEACLPrm.SetTable(*eaclTable)
setEACLPrm.SetTable(eaclTable)

Check warning on line 89 in cmd/neofs-cli/modules/container/set_eacl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/container/set_eacl.go#L89

Added line #L89 was not covered by tests
setEACLPrm.SetPrivateKey(*pk)

if tok != nil {
Expand Down
71 changes: 41 additions & 30 deletions cmd/neofs-cli/modules/util/acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,8 @@
return errors.New("at least 2 arguments must be provided")
}

var action eacl.Action
if !action.DecodeString(strings.ToUpper(args[0])) {
action, ok := eacl.ActionFromString(strings.ToUpper(args[0]))
if !ok {

Check warning on line 213 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L212-L213

Added lines #L212 - L213 were not covered by tests
return errors.New("invalid action (expected 'allow' or 'deny')")
}

Expand All @@ -226,81 +226,91 @@

r.SetAction(action)

records := make([]eacl.Record, 0, len(ops))

Check warning on line 229 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L229

Added line #L229 was not covered by tests

for _, op := range ops {
r := *r
r.SetOperation(op)
tb.AddRecord(&r)
var record eacl.Record
r.CopyTo(&record)

Check warning on line 233 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L232-L233

Added lines #L232 - L233 were not covered by tests

record.SetOperation(op)
records = append(records, record)

Check warning on line 236 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L235-L236

Added lines #L235 - L236 were not covered by tests
}

tb.SetRecords(records)

Check warning on line 239 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L239

Added line #L239 was not covered by tests

return nil
}

func parseEACLRecord(args []string) (*eacl.Record, error) {
r := new(eacl.Record)
func parseEACLRecord(args []string) (eacl.Record, error) {
var filters []eacl.Filter
var targets []eacl.Target

Check warning on line 246 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L244-L246

Added lines #L244 - L246 were not covered by tests

for i := range args {
ss := strings.SplitN(args[i], ":", 2)

switch prefix := strings.ToLower(ss[0]); prefix {
case "req", "obj": // filters
if len(ss) != 2 {
return nil, fmt.Errorf("invalid filter or target: %s", args[i])
return eacl.Record{}, fmt.Errorf("invalid filter or target: %s", args[i])

Check warning on line 254 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L254

Added line #L254 was not covered by tests
}

key, value, op, err := parseKVWithOp(ss[1])
if err != nil {
return nil, fmt.Errorf("invalid filter key-value pair %s: %w", ss[1], err)
return eacl.Record{}, fmt.Errorf("invalid filter key-value pair %s: %w", ss[1], err)

Check warning on line 259 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L259

Added line #L259 was not covered by tests
}

typ := eacl.HeaderFromRequest
if ss[0] == "obj" {
typ = eacl.HeaderFromObject
}

r.AddFilter(typ, op, key, value)
filters = append(filters, eacl.ConstructFilter(typ, key, op, value))

Check warning on line 267 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L267

Added line #L267 was not covered by tests
case "others", "system", "user", "pubkey": // targets
var err error

var pubs []ecdsa.PublicKey
var pubs []*ecdsa.PublicKey

Check warning on line 271 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L271

Added line #L271 was not covered by tests
if len(ss) == 2 {
pubs, err = parseKeyList(ss[1])
if err != nil {
return nil, err
return eacl.Record{}, err

Check warning on line 275 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L275

Added line #L275 was not covered by tests
}
}

var role eacl.Role
if prefix != "pubkey" {
role, err = eaclRoleFromString(prefix)
role, err := eaclRoleFromString(prefix)

Check warning on line 280 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L280

Added line #L280 was not covered by tests
if err != nil {
return nil, err
return eacl.Record{}, err

Check warning on line 282 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L282

Added line #L282 was not covered by tests
}

targets = append(targets, eacl.NewTargetByRole(role))
continue

Check warning on line 286 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L285-L286

Added lines #L285 - L286 were not covered by tests
}

eacl.AddFormedTarget(r, role, pubs...)
var target eacl.Target
eacl.SetTargetECDSAKeys(&target, pubs...)
targets = append(targets, target)

Check warning on line 291 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L289-L291

Added lines #L289 - L291 were not covered by tests
case "address": // targets
var (
err error
accounts []user.ID
)

if len(ss) != 2 {
return nil, fmt.Errorf("invalid address: %s", args[i])
return eacl.Record{}, fmt.Errorf("invalid address: %s", args[i])

Check warning on line 299 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L299

Added line #L299 was not covered by tests
}

accounts, err = parseAccountList(ss[1])
if err != nil {
return nil, err
return eacl.Record{}, err

Check warning on line 304 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L304

Added line #L304 was not covered by tests
}

t := eacl.NewTarget()
t.SetAccounts(accounts)
eacl.AddRecordTarget(r, t)
targets = append(targets, eacl.NewTargetByAccounts(accounts))

Check warning on line 307 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L307

Added line #L307 was not covered by tests
default:
return nil, fmt.Errorf("invalid prefix: %s", ss[0])
return eacl.Record{}, fmt.Errorf("invalid prefix: %s", ss[0])

Check warning on line 309 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L309

Added line #L309 was not covered by tests
}
}

return r, nil
return eacl.ConstructRecord(eacl.ActionUnspecified, eacl.OperationUnspecified, targets, filters...), nil

Check warning on line 313 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L313

Added line #L313 was not covered by tests
}

func parseKVWithOp(s string) (string, string, eacl.Match, error) {
Expand Down Expand Up @@ -356,26 +366,26 @@

// eaclRoleFromString parses eacl.Role from string.
func eaclRoleFromString(s string) (eacl.Role, error) {
var r eacl.Role
if !r.DecodeString(strings.ToUpper(s)) {
r, ok := eacl.RoleFromString(strings.ToUpper(s))
if !ok {

Check warning on line 370 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L369-L370

Added lines #L369 - L370 were not covered by tests
return r, fmt.Errorf("unexpected role %s", s)
}

return r, nil
}

// parseKeyList parses list of hex-encoded public keys separated by comma.
func parseKeyList(s string) ([]ecdsa.PublicKey, error) {
func parseKeyList(s string) ([]*ecdsa.PublicKey, error) {

Check warning on line 378 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L378

Added line #L378 was not covered by tests
ss := strings.Split(s, ",")
pubs := make([]ecdsa.PublicKey, len(ss))
pubs := make([]*ecdsa.PublicKey, len(ss))

Check warning on line 380 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L380

Added line #L380 was not covered by tests
for i := range ss {
st := strings.TrimPrefix(ss[i], "0x")
pub, err := keys.NewPublicKeyFromString(st)
if err != nil {
return nil, fmt.Errorf("invalid public key '%s': %w", ss[i], err)
}

pubs[i] = ecdsa.PublicKey(*pub)
pubs[i] = (*ecdsa.PublicKey)(pub)

Check warning on line 388 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L388

Added line #L388 was not covered by tests
}

return pubs, nil
Expand All @@ -402,9 +412,10 @@
func eaclOperationsFromString(s string) ([]eacl.Operation, error) {
ss := strings.Split(s, ",")
ops := make([]eacl.Operation, len(ss))
var ok bool

Check warning on line 415 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L415

Added line #L415 was not covered by tests

for i := range ss {
if !ops[i].DecodeString(strings.ToUpper(ss[i])) {
if ops[i], ok = eacl.OperationFromString(strings.ToUpper(ss[i])); !ok {

Check warning on line 418 in cmd/neofs-cli/modules/util/acl.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/util/acl.go#L418

Added line #L418 was not covered by tests
return nil, fmt.Errorf("invalid operation: %s", ss[i])
}
}
Expand All @@ -414,7 +425,7 @@

// ValidateEACLTable validates eACL table:
// - eACL table must not modify [eacl.RoleSystem] access.
func ValidateEACLTable(t *eacl.Table) error {
func ValidateEACLTable(t eacl.Table) error {
var b big.Int
for _, record := range t.Records() {
for _, target := range record.Targets() {
Expand Down
6 changes: 3 additions & 3 deletions cmd/neofs-cli/modules/util/acl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,15 +90,15 @@ func TestValidateEACL(t *testing.T) {
tb := anyValidEACL()
tb.AddRecord(&r)

err := ValidateEACLTable(&tb)
err := ValidateEACLTable(tb)
require.ErrorContains(t, err, "non-empty value in absence filter")

r = eacl.Record{}
r.AddObjectAttributeFilter(eacl.MatchNotPresent, "any_key", "")
tb = anyValidEACL()
tb.AddRecord(&r)

err = ValidateEACLTable(&tb)
err = ValidateEACLTable(tb)
require.NoError(t, err)
})

Expand All @@ -124,7 +124,7 @@ func TestValidateEACL(t *testing.T) {
tb := anyValidEACL()
tb.AddRecord(&r)

err := ValidateEACLTable(&tb)
err := ValidateEACLTable(tb)
if tc.ok {
require.NoError(t, err, [2]any{m, tc})
} else {
Expand Down
4 changes: 1 addition & 3 deletions cmd/neofs-node/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"context"
"errors"
"fmt"
"strings"

lru "github.com/hashicorp/golang-lru/v2"
"github.com/nspcc-dev/neofs-api-go/v2/object"
Expand Down Expand Up @@ -750,8 +749,7 @@
return true
})
if err != nil {
// https://github.com/nspcc-dev/neofs-sdk-go/pull/615
if strings.Contains(err.Error(), "not enough nodes to SELECT from") {
if errors.Is(err, netmapsdk.ErrNotEnoughNodes) {

Check warning on line 752 in cmd/neofs-node/object.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-node/object.go#L752

Added line #L752 was not covered by tests
return false, nil
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ require (
github.com/nspcc-dev/neo-go v0.106.3
github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240305074711-35bc78d84dc4
github.com/nspcc-dev/neofs-contract v0.20.0
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240807160341-3528eb5bb1cc
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240809202351-256513c1b29b
github.com/nspcc-dev/tzhash v1.8.0
github.com/olekukonko/tablewriter v0.0.5
github.com/panjf2000/ants/v2 v2.9.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240305074711-35bc78d84dc4 h1:ar
github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240305074711-35bc78d84dc4/go.mod h1:7Tm1NKEoUVVIUlkVwFrPh7GG5+Lmta2m7EGr4oVpBd8=
github.com/nspcc-dev/neofs-contract v0.20.0 h1:ARE/3mSN+P9qi/10NBsf7QyPiYrvnxeEgYUN13vHRlo=
github.com/nspcc-dev/neofs-contract v0.20.0/go.mod h1:YxtKYE/5cMNiqwWcQWzeizbB9jizauLni+p8wXxfhsQ=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240807160341-3528eb5bb1cc h1:WjVjs1vGILIVXC0lhJGWy2ek5FfT9S0HCOite/4tsks=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240807160341-3528eb5bb1cc/go.mod h1:ewV84r1NACvoBfbKQKzRLUun+Xn5+z9JVqsuCVgv9xI=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240809202351-256513c1b29b h1:/7jXQP5pf+M0kRFC1gg5GEdTPkvotpMHxjSXIbMZaGQ=
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12.0.20240809202351-256513c1b29b/go.mod h1:ewV84r1NACvoBfbKQKzRLUun+Xn5+z9JVqsuCVgv9xI=
github.com/nspcc-dev/rfc6979 v0.2.1 h1:8wWxkamHWFmO790GsewSoKUSJjVnL1fmdRpokU/RgRM=
github.com/nspcc-dev/rfc6979 v0.2.1/go.mod h1:Tk7h5kyUWkhjyO3zUgFFhy1v2vQv3BvQEntakdtqrWc=
github.com/nspcc-dev/tzhash v1.8.0 h1:pJvzME2mZzP/h5rcy/Wb6amT9FJBFeKbJ3HEnWEeUpY=
Expand Down
6 changes: 2 additions & 4 deletions pkg/innerring/processors/container/process_eacl.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@
binTable := e.Table()

// unmarshal table
table := eacl.NewTable()

err := table.Unmarshal(binTable)
table, err := eacl.Unmarshal(binTable)

Check warning on line 37 in pkg/innerring/processors/container/process_eacl.go

View check run for this annotation

Codecov / codecov/patch

pkg/innerring/processors/container/process_eacl.go#L37

Added line #L37 was not covered by tests
if err != nil {
return fmt.Errorf("invalid binary table: %w", err)
}
Expand Down Expand Up @@ -99,7 +97,7 @@
}
}

func validateEACL(t *eacl.Table) error {
func validateEACL(t eacl.Table) error {
var b big.Int
for _, record := range t.Records() {
for _, target := range record.Targets() {
Expand Down
6 changes: 3 additions & 3 deletions pkg/innerring/processors/container/process_eacl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ func TestValidateEACL(t *testing.T) {
tb := anyValidEACL()
tb.AddRecord(&r)

err := validateEACL(&tb)
err := validateEACL(tb)
require.ErrorContains(t, err, "non-empty value in absence filter")

r = eacl.Record{}
r.AddObjectAttributeFilter(eacl.MatchNotPresent, "any_key", "")
tb = anyValidEACL()
tb.AddRecord(&r)

err = validateEACL(&tb)
err = validateEACL(tb)
require.NoError(t, err)
})

Expand All @@ -54,7 +54,7 @@ func TestValidateEACL(t *testing.T) {
tb := anyValidEACL()
tb.AddRecord(&r)

err := validateEACL(&tb)
err := validateEACL(tb)
if tc.ok {
require.NoError(t, err, [2]any{m, tc})
} else {
Expand Down
Loading
Loading