storj.io/uplink@v1.13.0/private/eestream/rs.go (about) 1 // Copyright (C) 2019 Storj Labs, Inc. 2 // See LICENSE for copying information. 3 4 package eestream 5 6 import ( 7 "storj.io/common/sync2/race2" 8 "storj.io/infectious" 9 ) 10 11 type rsScheme struct { 12 fc *infectious.FEC 13 erasureShareSize int 14 } 15 16 // NewRSScheme returns a Reed-Solomon-based ErasureScheme. 17 func NewRSScheme(fc *infectious.FEC, erasureShareSize int) ErasureScheme { 18 return &rsScheme{fc: fc, erasureShareSize: erasureShareSize} 19 } 20 21 func (s *rsScheme) EncodeSingle(input, output []byte, num int) (err error) { 22 return s.fc.EncodeSingle(input, output, num) 23 } 24 25 func (s *rsScheme) Encode(input []byte, output func(num int, data []byte)) ( 26 err error) { 27 return s.fc.Encode(input, func(s infectious.Share) { 28 output(s.Number, s.Data) 29 }) 30 } 31 32 func (s *rsScheme) Decode(out []byte, in []infectious.Share) ([]byte, error) { 33 for _, share := range in { 34 race2.ReadSlice(share.Data) 35 } 36 race2.WriteSlice(out) 37 return s.fc.Decode(out, in) 38 } 39 40 func (s *rsScheme) Rebuild(in []infectious.Share, out func(infectious.Share)) error { 41 for _, v := range in { 42 race2.ReadSlice(v.Data) 43 } 44 return s.fc.Rebuild(in, out) 45 } 46 47 func (s *rsScheme) ErasureShareSize() int { 48 return s.erasureShareSize 49 } 50 51 func (s *rsScheme) StripeSize() int { 52 return s.erasureShareSize * s.fc.Required() 53 } 54 55 func (s *rsScheme) TotalCount() int { 56 return s.fc.Total() 57 } 58 59 func (s *rsScheme) RequiredCount() int { 60 return s.fc.Required() 61 }