forked from hyperledger/fabric
-
Notifications
You must be signed in to change notification settings - Fork 0
/
batch_util.go
46 lines (42 loc) · 924 Bytes
/
batch_util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package statecouchdb
import (
"sync"
)
// batch is executed in a separate goroutine.
type batch interface {
execute() error
}
// executeBatches executes each batch in a separate goroutine and returns error if
// any of the batches return error during its execution
func executeBatches(batches []batch) error {
logger.Debugf("Executing batches = %s", batches)
numBatches := len(batches)
if numBatches == 0 {
return nil
}
if numBatches == 1 {
return batches[0].execute()
}
var batchWG sync.WaitGroup
batchWG.Add(numBatches)
errsChan := make(chan error, numBatches)
defer close(errsChan)
for _, b := range batches {
go func(b batch) {
defer batchWG.Done()
if err := b.execute(); err != nil {
errsChan <- err
return
}
}(b)
}
batchWG.Wait()
if len(errsChan) > 0 {
return <-errsChan
}
return nil
}