diff options
Diffstat (limited to 'weed/storage/erasure_coding/ec_context.go')
| -rw-r--r-- | weed/storage/erasure_coding/ec_context.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/weed/storage/erasure_coding/ec_context.go b/weed/storage/erasure_coding/ec_context.go new file mode 100644 index 000000000..770fe41af --- /dev/null +++ b/weed/storage/erasure_coding/ec_context.go @@ -0,0 +1,46 @@ +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, + } +} + +// 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()) +} |
