func (g *Commands) playPushChanges(cl []*Change, opMap *map[Operation]sizeCounter) (err error) { if opMap == nil { result := opChangeCount(cl) opMap = &result } totalSize := int64(0) ops := *opMap for op, counter := range ops { totalSize += counter.sizeByOperation(op) } g.taskStart(totalSize) defer close(g.rem.progressChan) go func() { for n := range g.rem.progressChan { g.taskAdd(int64(n)) } }() type workPair struct { fn func(*Change) error arg *Change } n := maxProcs() sort.Sort(ByPrecedence(cl)) jobsChan := make(chan semalim.Job) go func() { defer close(jobsChan) throttle := time.Tick(time.Duration(1e9 / n)) for i, c := range cl { if c == nil { g.log.LogErrf("BUGON:: push: nil change found for change index %d\n", i) continue } fn := remoteOpToChangerTranslator(g, c) if fn == nil { g.log.LogErrf("push: cannot find operator for %v", c.Op()) continue } cjs := changeJobSt{ change: c, fn: fn, verb: "Push", throttle: throttle, } dofner := cjs.changeJober(g) jobsChan <- jobSt{id: uint64(i), do: dofner} } }() results := semalim.Run(jobsChan, uint64(n)) for result := range results { res, resErr := result.Value(), result.Err() if resErr != nil { err = reComposeError(err, fmt.Sprintf("push: %s err: %v\n", res, resErr)) } } g.taskFinish() return err }
func (g *Commands) playPullChanges(cl []*Change, exports []string, opMap *map[Operation]sizeCounter) (err error) { if opMap == nil { result := opChangeCount(cl) opMap = &result } totalSize := int64(0) ops := *opMap for _, counter := range ops { totalSize += counter.src } g.taskStart(totalSize) defer close(g.rem.progressChan) go func() { for n := range g.rem.progressChan { g.taskAdd(int64(n)) } }() // TODO: Only provide precedence ordering if all the other options are allowed sort.Sort(ByPrecedence(cl)) n := maxProcs() jobsChan := make(chan semalim.Job) go func() { defer close(jobsChan) throttle := time.Tick(time.Duration(1e9 / n)) for i, c := range cl { if c == nil { g.log.LogErrf("BUGON:: pull : nil change found for change index %d\n", i) continue } fn := localOpToChangerTranslator(g, c) conformingFn := func(c *Change) error { return fn(c, exports) } if fn == nil { g.log.LogErrf("pull: cannot find operator for %v", c.Op()) continue } cjs := changeJobSt{ change: c, fn: conformingFn, verb: "Pull", throttle: throttle, } dofner := cjs.changeJober(g) jobsChan <- jobSt{id: uint64(i), do: dofner} } }() results := semalim.Run(jobsChan, uint64(n)) for result := range results { res, err := result.Value(), result.Err() if err != nil { g.log.LogErrf("push: %s err: %v\n", res, err) } } g.taskFinish() return err }