func createTasks(ds appwrap.Datastore, jobKey *datastore.Key, taskKeys []*datastore.Key, tasks []JobTask, newStage JobStage) error { now := time.Now() firstId := taskKeys[0].IntID() for i := range tasks { tasks[i].StartTime = now tasks[i].Job = jobKey if taskKeys[i].IntID() < firstId { firstId = taskKeys[i].IntID() } } putSize := 64 i := 0 for i < len(tasks) { if err := backoff.Retry(func() error { last := i + putSize if last > len(tasks) { last = len(tasks) } if _, err := ds.PutMulti(taskKeys[i:last], tasks[i:last]); err != nil { if putSize > 5 { putSize /= 2 } return err } i = last return nil }, mrBackOff()); err != nil { return err } } return runInTransaction(ds, func(ds appwrap.Datastore) error { var job JobInfo if err := ds.Get(jobKey, &job); err != nil { return err } job.TaskCount = len(tasks) job.FirstTaskId = firstId job.Stage = newStage _, err := ds.Put(jobKey, &job) return err }) }