mirror of
https://github.com/rclone/rclone.git
synced 2024-12-05 07:20:35 +08:00
70 lines
2.2 KiB
Go
70 lines
2.2 KiB
Go
|
// Copyright (C) 2019 Storj Labs, Inc.
|
||
|
// See LICENSE for copying information.
|
||
|
|
||
|
package storj
|
||
|
|
||
|
// RedundancyScheme specifies the parameters and the algorithm for redundancy
|
||
|
type RedundancyScheme struct {
|
||
|
// Algorithm determines the algorithm to be used for redundancy.
|
||
|
Algorithm RedundancyAlgorithm
|
||
|
|
||
|
// ShareSize is the size in bytes for each erasure shares.
|
||
|
ShareSize int32
|
||
|
|
||
|
// RequiredShares is the minimum number of shares required to recover a
|
||
|
// stripe, reed-solomon k.
|
||
|
RequiredShares int16
|
||
|
// RepairShares is the minimum number of safe shares that can remain
|
||
|
// before a repair is triggered.
|
||
|
RepairShares int16
|
||
|
// OptimalShares is the desired total number of shares for a segment.
|
||
|
OptimalShares int16
|
||
|
// TotalShares is the number of shares to encode. If it is larger than
|
||
|
// OptimalShares, slower uploads of the excess shares will be aborted in
|
||
|
// order to improve performance.
|
||
|
TotalShares int16
|
||
|
}
|
||
|
|
||
|
// IsZero returns true if no field in the struct is set to non-zero value
|
||
|
func (scheme RedundancyScheme) IsZero() bool {
|
||
|
return scheme == (RedundancyScheme{})
|
||
|
}
|
||
|
|
||
|
// StripeSize is the number of bytes for a stripe.
|
||
|
// Stripes are erasure encoded and split into n shares, where we need k to
|
||
|
// reconstruct the stripe. Therefore a stripe size is the erasure share size
|
||
|
// times the required shares, k.
|
||
|
func (scheme RedundancyScheme) StripeSize() int32 {
|
||
|
return scheme.ShareSize * int32(scheme.RequiredShares)
|
||
|
}
|
||
|
|
||
|
// DownloadNodes calculates the number of nodes needed to download in the
|
||
|
// presence of node failure based on t = k + (n-o)k/o.
|
||
|
func (scheme RedundancyScheme) DownloadNodes() int32 {
|
||
|
extra := int32(1)
|
||
|
|
||
|
if scheme.OptimalShares > 0 {
|
||
|
extra = int32(((scheme.TotalShares - scheme.OptimalShares) * scheme.RequiredShares) / scheme.OptimalShares)
|
||
|
if extra == 0 {
|
||
|
// ensure there is at least one extra node, so we can have error detection/correction
|
||
|
extra = 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
needed := int32(scheme.RequiredShares) + extra
|
||
|
|
||
|
if needed > int32(scheme.TotalShares) {
|
||
|
needed = int32(scheme.TotalShares)
|
||
|
}
|
||
|
return needed
|
||
|
}
|
||
|
|
||
|
// RedundancyAlgorithm is the algorithm used for redundancy
|
||
|
type RedundancyAlgorithm byte
|
||
|
|
||
|
// List of supported redundancy algorithms
|
||
|
const (
|
||
|
InvalidRedundancyAlgorithm = RedundancyAlgorithm(iota)
|
||
|
ReedSolomon
|
||
|
)
|