vendor: update reedsolomon package with new perm improvements. (#1422)

This commit is contained in:
Harshavardhana 2016-04-29 14:59:03 -07:00
parent 4e34e03dd4
commit a9935f886c
3 changed files with 25 additions and 31 deletions

View File

@ -178,10 +178,7 @@ func (m matrix) SwapRows(r1, r2 int) error {
// IsSquare will return true if the matrix is square
// and nil if the matrix is square
func (m matrix) IsSquare() bool {
if len(m) != len(m[0]) {
return false
}
return true
return len(m) == len(m[0])
}
// errSingular is returned if the matrix is singular and cannot be inversed

View File

@ -189,7 +189,7 @@ func (r reedSolomon) Verify(shards [][]byte) (bool, error) {
// number of matrix rows used, is determined by
// outputCount, which is the number of outputs to compute.
func (r reedSolomon) codeSomeShards(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
if runtime.GOMAXPROCS(0) > 1 && len(inputs[0]) > splitSize {
if runtime.GOMAXPROCS(0) > 1 && len(inputs[0]) > minSplitSize {
r.codeSomeShardsP(matrixRows, inputs, outputs, outputCount, byteCount)
return
}
@ -205,24 +205,24 @@ func (r reedSolomon) codeSomeShards(matrixRows, inputs, outputs [][]byte, output
}
}
// How many bytes per goroutine.
const splitSize = 512
const (
minSplitSize = 512 // min split size per goroutine
maxGoroutines = 50 // max goroutines number for encoding & decoding
)
// Perform the same as codeSomeShards, but split the workload into
// several goroutines.
func (r reedSolomon) codeSomeShardsP(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
var wg sync.WaitGroup
left := byteCount
do := byteCount / maxGoroutines
if do < minSplitSize {
do = minSplitSize
}
start := 0
for {
do := left
if do > splitSize {
do = splitSize
for start < byteCount {
if start+do > byteCount {
do = byteCount - start
}
if do == 0 {
break
}
left -= do
wg.Add(1)
go func(start, stop int) {
for c := 0; c < r.DataShards; c++ {
@ -246,22 +246,19 @@ func (r reedSolomon) codeSomeShardsP(matrixRows, inputs, outputs [][]byte, outpu
// except this will check values and return
// as soon as a difference is found.
func (r reedSolomon) checkSomeShards(matrixRows, inputs, toCheck [][]byte, outputCount, byteCount int) bool {
var wg sync.WaitGroup
left := byteCount
start := 0
same := true
var mu sync.RWMutex // For above
for {
do := left
if do > splitSize {
do = splitSize
var wg sync.WaitGroup
do := byteCount / maxGoroutines
if do < minSplitSize {
do = minSplitSize
}
if do == 0 {
break
start := 0
for start < byteCount {
if start+do > byteCount {
do = byteCount - start
}
left -= do
wg.Add(1)
go func(start, do int) {
defer wg.Done()
@ -283,7 +280,7 @@ func (r reedSolomon) checkSomeShards(matrixRows, inputs, toCheck [][]byte, outpu
}
for i, calc := range outputs {
if bytes.Compare(calc, toCheck[i][start:start+do]) != 0 {
if !bytes.Equal(calc, toCheck[i][start:start+do]) {
mu.Lock()
same = false
mu.Unlock()

4
vendor/vendor.json vendored
View File

@ -64,8 +64,8 @@
},
{
"path": "github.com/klauspost/reedsolomon",
"revision": "d1fe8adc280ef4cd7883943f15a1b5b085a5cced",
"revisionTime": "2016-01-11T14:44:57+01:00"
"revision": "0b630aea2793158b43d0e18f2f50280bfb27c4b4",
"revisionTime": "2016-04-29T14:00:48-07:00"
},
{
"path": "github.com/mattn/go-colorable",