1// Copyright (C) 2021 Storj Labs, Inc. 2// See LICENSE for copying information. 3 4package audit 5 6import ( 7 "context" 8 9 "github.com/zeebo/errs" 10 11 "storj.io/common/errs2" 12 "storj.io/common/rpc" 13 "storj.io/common/rpc/rpcstatus" 14 "storj.io/storj/satellite/metabase" 15) 16 17// PieceAudit is piece audit status. 18type PieceAudit int 19 20const ( 21 // PieceAuditUnknown is unknown piece audit. 22 PieceAuditUnknown PieceAudit = iota 23 // PieceAuditFailure is failed piece audit. 24 PieceAuditFailure 25 // PieceAuditOffline is offline node piece audit. 26 PieceAuditOffline 27 // PieceAuditContained is online but unresponsive node piece audit. 28 PieceAuditContained 29 // PieceAuditSuccess is successful piece audit. 30 PieceAuditSuccess 31) 32 33// Pieces contains pieces structured by piece audit. 34type Pieces struct { 35 Successful metabase.Pieces 36 Failed metabase.Pieces 37 Offline metabase.Pieces 38 Contained metabase.Pieces 39 Unknown metabase.Pieces 40} 41 42// PieceAuditFromErr returns piece audit based on error. 43func PieceAuditFromErr(err error) PieceAudit { 44 if err == nil { 45 return PieceAuditSuccess 46 } 47 48 if rpc.Error.Has(err) { 49 switch { 50 case errs.Is(err, context.DeadlineExceeded), errs2.IsRPC(err, rpcstatus.Unknown): 51 return PieceAuditOffline 52 default: 53 // TODO: is this path not reachable? 54 return PieceAuditUnknown 55 } 56 } 57 58 switch { 59 case errs2.IsRPC(err, rpcstatus.NotFound): 60 return PieceAuditFailure 61 case errs2.IsRPC(err, rpcstatus.DeadlineExceeded): 62 return PieceAuditContained 63 default: 64 return PieceAuditUnknown 65 } 66} 67