 Chromium Code Reviews
 Chromium Code Reviews Issue 1537883002:
  Initial distributor implementation  (Closed) 
  Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-go@master
    
  
    Issue 1537883002:
  Initial distributor implementation  (Closed) 
  Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-go@master| Index: appengine/cmd/dm/mutate/add_deps.go | 
| diff --git a/appengine/cmd/dm/mutate/add_deps.go b/appengine/cmd/dm/mutate/add_deps.go | 
| index 645f9dddf72c12eeb315d14c5f201c7b4aaaf4dd..348f6765c6558a437554229cddefba0cbbbd0da3 100644 | 
| --- a/appengine/cmd/dm/mutate/add_deps.go | 
| +++ b/appengine/cmd/dm/mutate/add_deps.go | 
| @@ -11,19 +11,19 @@ import ( | 
| "github.com/luci/luci-go/common/api/dm/service/v1" | 
| "github.com/luci/luci-go/common/bit_field" | 
| "github.com/luci/luci-go/common/grpcutil" | 
| + "github.com/luci/luci-go/common/logging" | 
| "golang.org/x/net/context" | 
| "google.golang.org/grpc/codes" | 
| ) | 
| // AddDeps transactionally stops the current execution and adds one or more | 
| -// dependencies. It assumes that, prior to execution, all Quests named by Deps | 
| -// have already been recorded globally. | 
| +// dependencies. | 
| type AddDeps struct { | 
| Auth *dm.Execution_Auth | 
| Quests []*model.Quest | 
| - // Atmpts is attempts we think are missing from the global graph. | 
| - Atmpts *dm.AttemptList | 
| + // Attempts is attempts we think are missing from the global graph. | 
| + Attempts *dm.AttemptList | 
| // Deps are fwddeps we think are missing from the auth'd attempt. | 
| Deps *dm.AttemptList | 
| @@ -31,12 +31,12 @@ type AddDeps struct { | 
| // Root implements tumble.Mutation | 
| func (a *AddDeps) Root(c context.Context) *datastore.Key { | 
| - return datastore.Get(c).KeyForObj(&model.Attempt{ID: *a.Auth.Id.AttemptID()}) | 
| + return model.AttemptKeyFromID(c, a.Auth.Id.AttemptID()) | 
| } | 
| // RollForward implements tumble.Mutation | 
| // | 
| -// This mutation is called directly, so we use return grpc errors. | 
| +// This mutation is called directly, so we return grpc errors. | 
| func (a *AddDeps) RollForward(c context.Context) (muts []tumble.Mutation, err error) { | 
| // Invalidate the execution key so that they can't make more API calls. | 
| atmpt, _, err := model.InvalidateExecution(c, a.Auth) | 
| @@ -52,9 +52,8 @@ func (a *AddDeps) RollForward(c context.Context) (muts []tumble.Mutation, err er | 
| ds := datastore.Get(c) | 
| - atmpt.AddingDepsBitmap = bf.Make(uint32(len(fwdDeps))) | 
| - atmpt.WaitingDepBitmap = bf.Make(uint32(len(fwdDeps))) | 
| - atmpt.MustModifyState(c, dm.Attempt_ADDING_DEPS) | 
| + logging.Fields{"aid": atmpt.ID, "count": len(fwdDeps)}.Infof(c, "added deps") | 
| + atmpt.DepMap = bf.Make(uint32(len(fwdDeps))) | 
| for i, fdp := range fwdDeps { | 
| fdp.BitIndex = uint32(i) | 
| @@ -70,22 +69,36 @@ func (a *AddDeps) RollForward(c context.Context) (muts []tumble.Mutation, err er | 
| return | 
| } | 
| - muts = make([]tumble.Mutation, 0, len(fwdDeps)+len(a.Atmpts.GetTo())) | 
| - for _, d := range fwdDeps { | 
| - if nums, ok := a.Atmpts.GetTo()[d.Dependee.Quest]; ok { | 
| + mergeQuestMap := map[string]*MergeQuest{} | 
| 
dnj (Google)
2016/06/09 18:00:56
nit: avoid an allocation if not needed by surround
 
iannucci
2016/06/15 00:46:01
Done
 | 
| + for _, q := range a.Quests { | 
| + mergeQuestMap[q.ID] = &MergeQuest{Quest: q} | 
| + } | 
| + | 
| + muts = make([]tumble.Mutation, 0, len(fwdDeps)+len(a.Attempts.GetTo())+len(a.Quests)) | 
| + for _, dep := range fwdDeps { | 
| + toAppend := &muts | 
| + if mq := mergeQuestMap[dep.Dependee.Quest]; mq != nil { | 
| + toAppend = &mq.AndThen | 
| + } | 
| + | 
| + if nums, ok := a.Attempts.GetTo()[dep.Dependee.Quest]; ok { | 
| for _, n := range nums.Nums { | 
| - if n == d.Dependee.Id { | 
| - muts = append(muts, &EnsureAttempt{ID: &d.Dependee}) | 
| + if n == dep.Dependee.Id { | 
| + *toAppend = append(*toAppend, &EnsureAttempt{ID: &dep.Dependee}) | 
| break | 
| } | 
| } | 
| } | 
| - muts = append(muts, &AddBackDep{ | 
| - Dep: d.Edge(), | 
| + *toAppend = append(*toAppend, &AddBackDep{ | 
| + Dep: dep.Edge(), | 
| NeedsAck: true, | 
| }) | 
| } | 
| + for _, mut := range mergeQuestMap { | 
| 
dnj (Google)
2016/06/09 18:00:56
Any chance this will ever exceed maximum datastore
 
iannucci
2016/06/15 00:46:01
Possibly, but that would require a lot to hit (~de
 | 
| + muts = append(muts, mut) | 
| + } | 
| + | 
| return | 
| } |