[#281] service/audit: Make report structure threadsafe

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2020-12-24 14:22:55 +03:00 committed by Alex Vanin
parent 44d9f95137
commit 8e72abaab7

View file

@ -1,6 +1,8 @@
package audit package audit
import ( import (
"sync"
"github.com/nspcc-dev/neofs-api-go/pkg/audit" "github.com/nspcc-dev/neofs-api-go/pkg/audit"
"github.com/nspcc-dev/neofs-api-go/pkg/container" "github.com/nspcc-dev/neofs-api-go/pkg/container"
"github.com/nspcc-dev/neofs-api-go/pkg/object" "github.com/nspcc-dev/neofs-api-go/pkg/object"
@ -8,6 +10,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
res *audit.Result res *audit.Result
} }
@ -30,26 +33,41 @@ func NewReport(cid *container.ID) *Report {
// Result forms the structure of the data audit result. // Result forms the structure of the data audit result.
func (r *Report) Result() *audit.Result { func (r *Report) Result() *audit.Result {
r.mu.RLock()
defer r.mu.RUnlock()
return r.res return r.res
} }
// Complete completes audit report. // Complete completes audit report.
func (r *Report) Complete() { func (r *Report) Complete() {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetComplete(true) r.res.SetComplete(true)
} }
// PassedPoR updates list of passed storage groups. // PassedPoR updates list of passed storage groups.
func (r *Report) PassedPoR(sg *object.ID) { func (r *Report) PassedPoR(sg *object.ID) {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetPassSG(append(r.res.PassSG(), sg)) r.res.SetPassSG(append(r.res.PassSG(), sg))
} }
// FailedPoR updates list of failed storage groups. // FailedPoR updates list of failed storage groups.
func (r *Report) FailedPoR(sg *object.ID) { func (r *Report) FailedPoR(sg *object.ID) {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetFailSG(append(r.res.FailSG(), sg)) r.res.SetFailSG(append(r.res.FailSG(), sg))
} }
// SetPlacementCounters sets counters of compliance with placement. // SetPlacementCounters sets counters of compliance with placement.
func (r *Report) SetPlacementCounters(hit, miss, fail uint32) { func (r *Report) SetPlacementCounters(hit, miss, fail uint32) {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetHit(hit) r.res.SetHit(hit)
r.res.SetMiss(miss) r.res.SetMiss(miss)
r.res.SetFail(fail) r.res.SetFail(fail)
@ -57,12 +75,18 @@ func (r *Report) SetPlacementCounters(hit, miss, fail uint32) {
// SetPDPResults sets lists of nodes according to their PDP results. // SetPDPResults sets lists of nodes according to their PDP results.
func (r *Report) SetPDPResults(passed, failed [][]byte) { func (r *Report) SetPDPResults(passed, failed [][]byte) {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetPassNodes(passed) r.res.SetPassNodes(passed)
r.res.SetFailNodes(failed) r.res.SetFailNodes(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.
func (r *Report) SetPoRCounters(requests, retries uint32) { func (r *Report) SetPoRCounters(requests, retries uint32) {
r.mu.Lock()
defer r.mu.Unlock()
r.res.SetRequests(requests) r.res.SetRequests(requests)
r.res.SetRetries(retries) r.res.SetRetries(retries)
} }