Chromium Code Reviews| Index: service/taskqueue/interface.go | 
| diff --git a/service/taskqueue/interface.go b/service/taskqueue/interface.go | 
| index c6d9a95000575144720b92f34bdf1051793433a7..ae78f2fa3cb1e08359f8f6b910b084063298e7e7 100644 | 
| --- a/service/taskqueue/interface.go | 
| +++ b/service/taskqueue/interface.go | 
| @@ -4,38 +4,109 @@ | 
| package taskqueue | 
| -// Interface is the full interface to the Task Queue service. | 
| -type Interface interface { | 
| 
 
dnj
2016/09/01 15:25:41
Interface now gone, *Multi collapsed into vararg.
 
 | 
| - Add(task *Task, queueName string) error | 
| - Delete(task *Task, queueName string) error | 
| - | 
| - AddMulti(tasks []*Task, queueName string) error | 
| - DeleteMulti(tasks []*Task, queueName string) error | 
| - | 
| - // NOTE(riannucci): No support for pull taskqueues. We're not planning on | 
| - // making pull-queue clients which RUN in appengine (e.g. they'd all be | 
| - // external REST consumers). If someone needs this, it will need to be added | 
| - // here and in RawInterface. The theory is that a good lease API might look | 
| - // like: | 
| - // | 
| - // func Lease(queueName, tag string, batchSize int, duration time.Time, cb func(*Task, error<-)) | 
| - // | 
| - // Which blocks and calls cb for each task obtained. Lease would then do all | 
| - // necessary backoff negotiation with the backend. The callback could execute | 
| - // synchronously (stuffing an error into the chan or panicing if it fails), or | 
| - // asynchronously (dispatching a goroutine which will then populate the error | 
| - // channel if needed). If it operates asynchronously, it has the option of | 
| - // processing multiple work items at a time. | 
| - // | 
| - // Lease would also take care of calling ModifyLease as necessary to ensure | 
| - // that each call to cb would have 'duration' amount of time to work on the | 
| - // task, as well as releasing as many leased tasks as it can on a failure. | 
| - | 
| - Purge(queueName string) error | 
| - | 
| - Stats(queueNames ...string) ([]Statistics, error) | 
| - | 
| - Testable() Testable | 
| - | 
| - Raw() RawInterface | 
| +import ( | 
| + "github.com/luci/luci-go/common/errors" | 
| + | 
| + "golang.org/x/net/context" | 
| +) | 
| + | 
| +// Add adds the specified task(s) to the specified task queue. | 
| +// | 
| +// If only one task is provided its error will be returned directly. If more | 
| +// than one task is provided, an errors.MultiError will be returned in the | 
| +// event of an error, with a given error index corresponding to the error | 
| +// encountered when processing the task at that index. | 
| +func Add(c context.Context, queueName string, tasks ...*Task) error { | 
| + lme := errors.NewLazyMultiError(len(tasks)) | 
| + i := 0 | 
| + err := Raw(c).AddMulti(tasks, queueName, func(t *Task, err error) { | 
| + if !lme.Assign(i, err) { | 
| + *tasks[i] = *t | 
| + } | 
| + i++ | 
| + }) | 
| + if err == nil { | 
| + err = lme.Get() | 
| + if len(tasks) == 1 { | 
| + err = errors.SingleError(err) | 
| + } | 
| + } | 
| + return err | 
| +} | 
| + | 
| +// Delete deletes a task from the task queue. | 
| +// | 
| +// If only one task is provided its error will be returned directly. If more | 
| +// than one task is provided, an errors.MultiError will be returned in the | 
| +// event of an error, with a given error index corresponding to the error | 
| +// encountered when processing the task at that index. | 
| +func Delete(c context.Context, queueName string, tasks ...*Task) error { | 
| + lme := errors.NewLazyMultiError(len(tasks)) | 
| + i := 0 | 
| + err := Raw(c).DeleteMulti(tasks, queueName, func(err error) { | 
| + lme.Assign(i, err) | 
| + i++ | 
| + }) | 
| + if err == nil { | 
| + err = lme.Get() | 
| + if len(tasks) == 1 { | 
| + err = errors.SingleError(err) | 
| + } | 
| + } | 
| + return err | 
| +} | 
| + | 
| +// NOTE(riannucci): No support for pull taskqueues. We're not planning on | 
| +// making pull-queue clients which RUN in appengine (e.g. they'd all be | 
| +// external REST consumers). If someone needs this, it will need to be added | 
| +// here and in RawInterface. The theory is that a good lease API might look | 
| +// like: | 
| +// | 
| +// func Lease(queueName, tag string, batchSize int, duration time.Time, cb func(*Task, error<-)) | 
| +// | 
| +// Which blocks and calls cb for each task obtained. Lease would then do all | 
| +// necessary backoff negotiation with the backend. The callback could execute | 
| +// synchronously (stuffing an error into the chan or panicing if it fails), or | 
| +// asynchronously (dispatching a goroutine which will then populate the error | 
| +// channel if needed). If it operates asynchronously, it has the option of | 
| +// processing multiple work items at a time. | 
| +// | 
| +// Lease would also take care of calling ModifyLease as necessary to ensure | 
| +// that each call to cb would have 'duration' amount of time to work on the | 
| +// task, as well as releasing as many leased tasks as it can on a failure. | 
| + | 
| +// Purge purges all tasks form the named queue. | 
| +func Purge(c context.Context, queueName string) error { | 
| + return Raw(c).Purge(queueName) | 
| +} | 
| + | 
| +// Stats returns Statistics instances for each of the named task queues. | 
| +// | 
| +// If only one task is provided its error will be returned directly. If more | 
| +// than one task is provided, an errors.MultiError will be returned in the | 
| +// event of an error, with a given error index corresponding to the error | 
| +// encountered when processing the task at that index. | 
| +func Stats(c context.Context, queueNames ...string) ([]Statistics, error) { | 
| + ret := make([]Statistics, len(queueNames)) | 
| + lme := errors.NewLazyMultiError(len(queueNames)) | 
| + i := 0 | 
| + err := Raw(c).Stats(queueNames, func(s *Statistics, err error) { | 
| + if !lme.Assign(i, err) { | 
| + ret[i] = *s | 
| + } | 
| + i++ | 
| + }) | 
| + if err == nil { | 
| + err = lme.Get() | 
| + if len(queueNames) == 1 { | 
| + err = errors.SingleError(err) | 
| + } | 
| + } | 
| + return ret, err | 
| +} | 
| + | 
| +// GetTestable returns a Testable for the current task queue service in c, or | 
| +// nil if it does not offer one. | 
| +func GetTestable(c context.Context) Testable { | 
| + return Raw(c).GetTestable() | 
| } |