// parallelRead - reads chunks in parallel from the disks specified in []readDisks. func parallelRead(volume, path string, readDisks []StorageAPI, orderedDisks []StorageAPI, enBlocks [][]byte, blockOffset int64, curChunkSize int64, bitRotVerify func(diskIndex int) bool, pool *bpool.BytePool) { // WaitGroup to synchronise the read go-routines. wg := &sync.WaitGroup{} // Read disks in parallel. for index := range readDisks { if readDisks[index] == nil { continue } wg.Add(1) // Reads chunk from readDisk[index] in routine. go func(index int) { defer wg.Done() // Verify bit rot for the file on this disk. if !bitRotVerify(index) { // So that we don't read from this disk for the next block. orderedDisks[index] = nil return } buf, err := pool.Get() if err != nil { errorIf(err, "unable to get buffer from byte pool") orderedDisks[index] = nil return } buf = buf[:curChunkSize] _, err = readDisks[index].ReadFile(volume, path, blockOffset, buf) if err != nil { orderedDisks[index] = nil return } enBlocks[index] = buf }(index) } // Waiting for first routines to finish. wg.Wait() }