[#1369] audit: Upgrade SDK package
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
875f0e79a2
commit
7a57d7b076
9 changed files with 61 additions and 61 deletions
2
go.mod
2
go.mod
|
@ -19,7 +19,7 @@ require (
|
||||||
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220321144137-d5a9af5860af // indirect
|
github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220321144137-d5a9af5860af // indirect
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.12.1
|
github.com/nspcc-dev/neofs-api-go/v2 v2.12.1
|
||||||
github.com/nspcc-dev/neofs-contract v0.14.2
|
github.com/nspcc-dev/neofs-contract v0.14.2
|
||||||
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.3.0.20220316141620-a55ffa47966a
|
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.3.0.20220412151250-3e75660802ae
|
||||||
github.com/nspcc-dev/tzhash v1.5.2
|
github.com/nspcc-dev/tzhash v1.5.2
|
||||||
github.com/panjf2000/ants/v2 v2.4.0
|
github.com/panjf2000/ants/v2 v2.4.0
|
||||||
github.com/paulmach/orb v0.2.2
|
github.com/paulmach/orb v0.2.2
|
||||||
|
|
BIN
go.sum
BIN
go.sum
Binary file not shown.
|
@ -174,7 +174,7 @@ func (ap *Processor) StartAuditHandler() event.Handler {
|
||||||
|
|
||||||
func (r *epochAuditReporter) WriteReport(rep *audit.Report) error {
|
func (r *epochAuditReporter) WriteReport(rep *audit.Report) error {
|
||||||
res := rep.Result()
|
res := rep.Result()
|
||||||
res.SetAuditEpoch(r.epoch)
|
res.ForEpoch(r.epoch)
|
||||||
|
|
||||||
return r.rep.WriteReport(rep)
|
return r.rep.WriteReport(rep)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/audit"
|
"github.com/nspcc-dev/neofs-sdk-go/audit"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
||||||
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
|
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
|
||||||
|
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/owner"
|
"github.com/nspcc-dev/neofs-sdk-go/owner"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
@ -108,7 +109,7 @@ func (c *Calculator) Calculate(p *CalculatePrm) {
|
||||||
func (c *Calculator) processResult(ctx *singleResultCtx) {
|
func (c *Calculator) processResult(ctx *singleResultCtx) {
|
||||||
ctx.log = ctx.log.With(
|
ctx.log = ctx.log.With(
|
||||||
zap.Stringer("cid", ctx.containerID()),
|
zap.Stringer("cid", ctx.containerID()),
|
||||||
zap.Uint64("audit epoch", ctx.auditResult.AuditEpoch()),
|
zap.Uint64("audit epoch", ctx.auditResult.Epoch()),
|
||||||
)
|
)
|
||||||
|
|
||||||
ctx.log.Debug("reading information about the container")
|
ctx.log.Debug("reading information about the container")
|
||||||
|
@ -147,7 +148,7 @@ func (c *Calculator) processResult(ctx *singleResultCtx) {
|
||||||
func (c *Calculator) readContainerInfo(ctx *singleResultCtx) bool {
|
func (c *Calculator) readContainerInfo(ctx *singleResultCtx) bool {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
ctx.cnrInfo, err = c.prm.ContainerStorage.ContainerInfo(ctx.auditResult.ContainerID())
|
ctx.cnrInfo, err = c.prm.ContainerStorage.ContainerInfo(ctx.auditResult.Container())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.log.Error("could not get container info",
|
ctx.log.Error("could not get container info",
|
||||||
zap.String("error", err.Error()),
|
zap.String("error", err.Error()),
|
||||||
|
@ -178,21 +179,26 @@ func (c *Calculator) buildPlacement(ctx *singleResultCtx) bool {
|
||||||
func (c *Calculator) collectPassNodes(ctx *singleResultCtx) bool {
|
func (c *Calculator) collectPassNodes(ctx *singleResultCtx) bool {
|
||||||
ctx.passNodes = make(map[string]common.NodeInfo)
|
ctx.passNodes = make(map[string]common.NodeInfo)
|
||||||
|
|
||||||
loop:
|
|
||||||
for _, cnrNode := range ctx.cnrNodes {
|
for _, cnrNode := range ctx.cnrNodes {
|
||||||
for _, passNode := range ctx.auditResult.PassNodes() {
|
// TODO(@cthulhu-rider): neofs-sdk-go#241 use dedicated method
|
||||||
|
ctx.auditResult.IteratePassedStorageNodes(func(passNode []byte) bool {
|
||||||
if !bytes.Equal(cnrNode.PublicKey(), passNode) {
|
if !bytes.Equal(cnrNode.PublicKey(), passNode) {
|
||||||
continue
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, failNode := range ctx.auditResult.FailNodes() {
|
failed := false
|
||||||
if bytes.Equal(cnrNode.PublicKey(), failNode) {
|
|
||||||
continue loop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
ctx.auditResult.IterateFailedStorageNodes(func(failNode []byte) bool {
|
||||||
|
failed = bytes.Equal(cnrNode.PublicKey(), failNode)
|
||||||
|
return !failed
|
||||||
|
})
|
||||||
|
|
||||||
|
if !failed {
|
||||||
ctx.passNodes[hex.EncodeToString(passNode)] = cnrNode
|
ctx.passNodes[hex.EncodeToString(passNode)] = cnrNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
empty := len(ctx.passNodes) == 0
|
empty := len(ctx.passNodes) == 0
|
||||||
|
@ -204,32 +210,34 @@ loop:
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Calculator) sumSGSizes(ctx *singleResultCtx) bool {
|
func (c *Calculator) sumSGSizes(ctx *singleResultCtx) bool {
|
||||||
passedSG := ctx.auditResult.PassSG()
|
|
||||||
|
|
||||||
if len(passedSG) == 0 {
|
|
||||||
ctx.log.Debug("empty list of passed SG")
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
sumPassSGSize := uint64(0)
|
sumPassSGSize := uint64(0)
|
||||||
|
fail := false
|
||||||
|
|
||||||
addr := addressSDK.NewAddress()
|
addr := addressSDK.NewAddress()
|
||||||
addr.SetContainerID(ctx.containerID())
|
addr.SetContainerID(ctx.containerID())
|
||||||
|
|
||||||
passSG := ctx.auditResult.PassSG()
|
ctx.auditResult.IteratePassedStorageGroups(func(id oid.ID) bool {
|
||||||
for i := range passSG {
|
addr.SetObjectID(&id)
|
||||||
addr.SetObjectID(&passSG[i])
|
|
||||||
|
|
||||||
sgInfo, err := c.prm.SGStorage.SGInfo(addr)
|
sgInfo, err := c.prm.SGStorage.SGInfo(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.log.Error("could not get SG info",
|
ctx.log.Error("could not get SG info",
|
||||||
zap.String("id", passSG[i].String()),
|
zap.String("id", id.String()),
|
||||||
|
zap.String("error", err.Error()),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fail = true
|
||||||
|
|
||||||
return false // we also can continue and calculate at least some part
|
return false // we also can continue and calculate at least some part
|
||||||
}
|
}
|
||||||
|
|
||||||
sumPassSGSize += sgInfo.Size()
|
sumPassSGSize += sgInfo.Size()
|
||||||
|
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
if fail {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if sumPassSGSize == 0 {
|
if sumPassSGSize == 0 {
|
||||||
|
@ -279,11 +287,11 @@ func (c *Calculator) fillTransferTable(ctx *singleResultCtx) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// add txs to pay inner ring node for audit result
|
// add txs to pay inner ring node for audit result
|
||||||
auditIR, err := ownerFromKey(ctx.auditResult.PublicKey())
|
auditIR, err := ownerFromKey(ctx.auditResult.AuditorKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.log.Error("could not parse public key of the inner ring node",
|
ctx.log.Error("could not parse public key of the inner ring node",
|
||||||
zap.String("error", err.Error()),
|
zap.String("error", err.Error()),
|
||||||
zap.String("key", hex.EncodeToString(ctx.auditResult.PublicKey())),
|
zap.String("key", hex.EncodeToString(ctx.auditResult.AuditorKey())),
|
||||||
)
|
)
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
@ -300,7 +308,7 @@ func (c *Calculator) fillTransferTable(ctx *singleResultCtx) bool {
|
||||||
|
|
||||||
func (c *singleResultCtx) containerID() *cid.ID {
|
func (c *singleResultCtx) containerID() *cid.ID {
|
||||||
if c.cid == nil {
|
if c.cid == nil {
|
||||||
c.cid = c.auditResult.ContainerID()
|
c.cid = c.auditResult.Container()
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.cid
|
return c.cid
|
||||||
|
@ -308,7 +316,7 @@ func (c *singleResultCtx) containerID() *cid.ID {
|
||||||
|
|
||||||
func (c *singleResultCtx) auditEpoch() uint64 {
|
func (c *singleResultCtx) auditEpoch() uint64 {
|
||||||
if c.eAudit == 0 {
|
if c.eAudit == 0 {
|
||||||
c.eAudit = c.auditResult.AuditEpoch()
|
c.eAudit = c.auditResult.Epoch()
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.eAudit
|
return c.eAudit
|
||||||
|
|
|
@ -149,7 +149,7 @@ func (s *Server) VoteForSidechainValidator(prm governance.VoteValidatorPrm) erro
|
||||||
// and sends it to Audit contract.
|
// and sends it to Audit contract.
|
||||||
func (s *Server) WriteReport(r *audit.Report) error {
|
func (s *Server) WriteReport(r *audit.Report) error {
|
||||||
res := r.Result()
|
res := r.Result()
|
||||||
res.SetPublicKey(s.pubKey)
|
res.SetAuditorKey(s.pubKey)
|
||||||
|
|
||||||
prm := auditClient.PutPrm{}
|
prm := auditClient.PutPrm{}
|
||||||
prm.SetResult(res)
|
prm.SetResult(res)
|
||||||
|
|
|
@ -25,10 +25,10 @@ func (c *Client) GetAuditResult(id ResultID) (*auditAPI.Result, error) {
|
||||||
return nil, fmt.Errorf("could not get byte array from stack item (%s): %w", getResultMethod, err)
|
return nil, fmt.Errorf("could not get byte array from stack item (%s): %w", getResultMethod, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
auditRes := auditAPI.NewResult()
|
var auditRes auditAPI.Result
|
||||||
if err := auditRes.Unmarshal(value); err != nil {
|
if err := auditRes.Unmarshal(value); err != nil {
|
||||||
return nil, fmt.Errorf("could not unmarshal audit result structure: %w", err)
|
return nil, fmt.Errorf("could not unmarshal audit result structure: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return auditRes, nil
|
return &auditRes, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,17 +30,12 @@ func (p *PutPrm) SetResult(result *auditAPI.Result) {
|
||||||
//
|
//
|
||||||
// Returns encountered error that caused the saving to interrupt.
|
// Returns encountered error that caused the saving to interrupt.
|
||||||
func (c *Client) PutAuditResult(p PutPrm) error {
|
func (c *Client) PutAuditResult(p PutPrm) error {
|
||||||
rawResult, err := p.result.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not marshal audit result: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
prm := client.InvokePrm{}
|
prm := client.InvokePrm{}
|
||||||
prm.SetMethod(putResultMethod)
|
prm.SetMethod(putResultMethod)
|
||||||
prm.SetArgs(rawResult)
|
prm.SetArgs(p.result.Marshal())
|
||||||
prm.InvokePrmOptional = p.InvokePrmOptional
|
prm.InvokePrmOptional = p.InvokePrmOptional
|
||||||
|
|
||||||
err = c.client.Invoke(prm)
|
err := c.client.Invoke(prm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not invoke method (%s): %w", putResultMethod, err)
|
return fmt.Errorf("could not invoke method (%s): %w", putResultMethod, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,13 +34,13 @@ func TestAuditResults(t *testing.T) {
|
||||||
|
|
||||||
id := cidtest.ID()
|
id := cidtest.ID()
|
||||||
|
|
||||||
auditRes := auditAPI.NewResult()
|
var auditRes auditAPI.Result
|
||||||
auditRes.SetAuditEpoch(epoch)
|
auditRes.ForEpoch(epoch)
|
||||||
auditRes.SetPublicKey(key.PublicKey().Bytes())
|
auditRes.SetAuditorKey(key.PublicKey().Bytes())
|
||||||
auditRes.SetContainerID(id)
|
auditRes.ForContainer(*id)
|
||||||
|
|
||||||
prm := PutPrm{}
|
prm := PutPrm{}
|
||||||
prm.SetResult(auditRes)
|
prm.SetResult(&auditRes)
|
||||||
|
|
||||||
require.NoError(t, auditClientWrapper.PutAuditResult(prm))
|
require.NoError(t, auditClientWrapper.PutAuditResult(prm))
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
// Report tracks the progress of auditing container data.
|
// Report tracks the progress of auditing container data.
|
||||||
type Report struct {
|
type Report struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
res *audit.Result
|
res audit.Result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reporter is an interface of the entity that records
|
// Reporter is an interface of the entity that records
|
||||||
|
@ -22,13 +22,10 @@ type Reporter interface {
|
||||||
|
|
||||||
// NewReport creates and returns blank Report instance.
|
// NewReport creates and returns blank Report instance.
|
||||||
func NewReport(cid *cid.ID) *Report {
|
func NewReport(cid *cid.ID) *Report {
|
||||||
rep := &Report{
|
var rep Report
|
||||||
res: audit.NewResult(),
|
rep.res.ForContainer(*cid)
|
||||||
}
|
|
||||||
|
|
||||||
rep.res.SetContainerID(cid)
|
return &rep
|
||||||
|
|
||||||
return rep
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result forms the structure of the data audit result.
|
// Result forms the structure of the data audit result.
|
||||||
|
@ -36,7 +33,7 @@ func (r *Report) Result() *audit.Result {
|
||||||
r.mu.RLock()
|
r.mu.RLock()
|
||||||
defer r.mu.RUnlock()
|
defer r.mu.RUnlock()
|
||||||
|
|
||||||
return r.res
|
return &r.res
|
||||||
}
|
}
|
||||||
|
|
||||||
// Complete completes audit report.
|
// Complete completes audit report.
|
||||||
|
@ -44,7 +41,7 @@ func (r *Report) Complete() {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetComplete(true)
|
r.res.Complete()
|
||||||
}
|
}
|
||||||
|
|
||||||
// PassedPoR updates list of passed storage groups.
|
// PassedPoR updates list of passed storage groups.
|
||||||
|
@ -52,7 +49,7 @@ func (r *Report) PassedPoR(sg *oidSDK.ID) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetPassSG(append(r.res.PassSG(), *sg))
|
r.res.SubmitPassedStorageGroup(*sg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailedPoR updates list of failed storage groups.
|
// FailedPoR updates list of failed storage groups.
|
||||||
|
@ -60,7 +57,7 @@ func (r *Report) FailedPoR(sg *oidSDK.ID) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetFailSG(append(r.res.FailSG(), *sg))
|
r.res.SubmitFailedStorageGroup(*sg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPlacementCounters sets counters of compliance with placement.
|
// SetPlacementCounters sets counters of compliance with placement.
|
||||||
|
@ -68,9 +65,9 @@ func (r *Report) SetPlacementCounters(hit, miss, fail uint32) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetHit(hit)
|
r.res.SetHits(hit)
|
||||||
r.res.SetMiss(miss)
|
r.res.SetMisses(miss)
|
||||||
r.res.SetFail(fail)
|
r.res.SetFailures(fail)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPDPResults sets lists of nodes according to their PDP results.
|
// SetPDPResults sets lists of nodes according to their PDP results.
|
||||||
|
@ -78,8 +75,8 @@ func (r *Report) SetPDPResults(passed, failed [][]byte) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetPassNodes(passed)
|
r.res.SubmitPassedStorageNodes(passed)
|
||||||
r.res.SetFailNodes(failed)
|
r.res.SubmitFailedStorageNodes(failed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPoRCounters sets amounts of head requests and retries at PoR audit stage.
|
// SetPoRCounters sets amounts of head requests and retries at PoR audit stage.
|
||||||
|
@ -87,6 +84,6 @@ func (r *Report) SetPoRCounters(requests, retries uint32) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
r.res.SetRequests(requests)
|
r.res.SetRequestsPoR(requests)
|
||||||
r.res.SetRetries(retries)
|
r.res.SetRetriesPoR(retries)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue