func lease(w http.ResponseWriter, req *http.Request, ctx httputil.Context) (e *httputil.Error) { b, r, err := tracker.LeasePair(ctx) if err != nil { e = httputil.Errorf(err, "error leasing pair") return } fmt.Fprintf(w, "%+v\n%+v\n", b, r) return }
func dispatchWorkItem(ctx httputil.Context, work entities.Work) (err error) { //lease a builder and runner builder, runner, err := tracker.LeasePair(ctx) if err != nil { return } log.Printf("Got:\nBuilder: %+v\nRunner: %+v", builder, runner) //create an attempt a := entities.WorkAttempt{ When: time.Now(), Builder: builder.URL, Runner: runner.URL, ID: bson.NewObjectId(), } //push the new attempt at the start of the array log := append([]entities.WorkAttempt{a}, work.AttemptLog...) //transactionally acquire ownership of the document ops := []txn.Op{{ C: "Work", Id: work.ID, Assert: bson.M{ "revision": work.Revision, }, Update: bson.M{ "$inc": bson.M{"revision": 1}, "$set": bson.M{ "attemptlog": log, "status": entities.WorkStatusProcessing, }, }, }} err = ctx.R.Run(ops, bson.NewObjectId(), nil) if err == txn.ErrAborted { ctx.Infof("Lost the race dispatching a work item") err = nil return } if err != nil { return } //build the task task := &rpc.BuilderTask{ Work: work.Work, Key: work.ID.Hex(), ID: a.ID.Hex(), WorkRev: work.Revision + 1, Runner: runner.URL, Response: httputil.Absolute(router.Lookup("Response")), } //send the task off to the builder queue cl := client.New(builder.URL, http.DefaultClient, client.JsonCodec) err = cl.Call("BuilderQueue.Push", task, new(rpc.None)) return }