Merge pull request #34 from muesli/master

Make Join return an error if a reconstruction is required first
master
Klaus Post 2016-08-22 14:13:59 +02:00 committed by GitHub
commit fac1884d47
2 changed files with 20 additions and 0 deletions

View File

@ -487,12 +487,18 @@ func (r reedSolomon) Split(data []byte) ([][]byte, error) {
return dst, nil
}
// ErrReconstructRequired is returned if too few data shards are intact and a
// reconstruction is required before you can successfully join the shards.
var ErrReconstructRequired = errors.New("reconstruction required as one or more required data shards are nil")
// Join the shards and write the data segment to dst.
//
// Only the data shards are considered.
// You must supply the exact output size you want.
//
// If there are to few shards given, ErrTooFewShards will be returned.
// If the total data size is less than outSize, ErrShortData will be returned.
// If one or more required data shards are nil, ErrReconstructRequired will be returned.
func (r reedSolomon) Join(dst io.Writer, shards [][]byte, outSize int) error {
// Do we have enough shards?
if len(shards) < r.DataShards {
@ -503,7 +509,15 @@ func (r reedSolomon) Join(dst io.Writer, shards [][]byte, outSize int) error {
// Do we have enough data?
size := 0
for _, shard := range shards {
if shard == nil {
return ErrReconstructRequired
}
size += len(shard)
// Do we have enough data already?
if size >= outSize {
break
}
}
if size < outSize {
return ErrShortData

View File

@ -482,6 +482,12 @@ func TestSplitJoin(t *testing.T) {
if err != ErrShortData {
t.Errorf("expected %v, got %v", ErrShortData, err)
}
shards[0] = nil
err = enc.Join(buf, shards, len(data))
if err != ErrReconstructRequired {
t.Errorf("expected %v, got %v", ErrReconstructRequired, err)
}
}
func TestCodeSomeShards(t *testing.T) {