package erasure_coding import ( "fmt" "github.com/klauspost/reedsolomon" "github.com/seaweedfs/seaweedfs/weed/storage/needle" ) // ECContext encapsulates erasure coding parameters for encoding/decoding operations type ECContext struct { DataShards int ParityShards int Collection string VolumeId needle.VolumeId } // Total returns the total number of shards (data + parity) func (ctx *ECContext) Total() int { return ctx.DataShards + ctx.ParityShards } // NewDefaultECContext creates a context with default 10+4 shard configuration func NewDefaultECContext(collection string, volumeId needle.VolumeId) *ECContext { return &ECContext{ DataShards: DataShardsCount, ParityShards: ParityShardsCount, Collection: collection, VolumeId: volumeId, } } // BackgroundECContext returns a non-nil placeholder EC context, analogous to // context.Background(): pass it to WriteEcFiles / RebuildEcFiles when the caller // has no specific layout, rather than a nil context. Its zero Total() is the // "unset" signal — WriteEcFiles resolves it to the default ratio and // RebuildEcFiles resolves it from the volume's .vif (falling back to default), // so the placeholder itself never reaches the encoder. A fresh value is returned // each call so callers cannot mutate a shared default. func BackgroundECContext() *ECContext { return &ECContext{} } // CreateEncoder creates a Reed-Solomon encoder for this context func (ctx *ECContext) CreateEncoder() (reedsolomon.Encoder, error) { return reedsolomon.New(ctx.DataShards, ctx.ParityShards) } // ToExt returns the file extension for a given shard index func (ctx *ECContext) ToExt(shardIndex int) string { return fmt.Sprintf(".ec%02d", shardIndex) } // String returns a human-readable representation of the EC configuration func (ctx *ECContext) String() string { return fmt.Sprintf("%d+%d (total: %d)", ctx.DataShards, ctx.ParityShards, ctx.Total()) }