| Index: go/src/infra/gae/libs/gae/filters/featureBreaker/tq.go
|
| diff --git a/go/src/infra/gae/libs/gae/filters/featureBreaker/tq.go b/go/src/infra/gae/libs/gae/filters/featureBreaker/tq.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..34e4f80599e2d1e1b9d75bd326caba54b594506d
|
| --- /dev/null
|
| +++ b/go/src/infra/gae/libs/gae/filters/featureBreaker/tq.go
|
| @@ -0,0 +1,91 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package featureBreaker
|
| +
|
| +import (
|
| + "golang.org/x/net/context"
|
| +
|
| + "infra/gae/libs/gae"
|
| +)
|
| +
|
| +type tqState struct {
|
| + *state
|
| +
|
| + tq gae.TaskQueue
|
| +}
|
| +
|
| +var _ gae.TaskQueue = (*tqState)(nil)
|
| +
|
| +func (t *tqState) Add(task *gae.TQTask, queueName string) (ret *gae.TQTask, err error) {
|
| + err = t.run(func() (err error) {
|
| + ret, err = t.tq.Add(task, queueName)
|
| + return
|
| + })
|
| + return
|
| +}
|
| +
|
| +func (t *tqState) Delete(task *gae.TQTask, queueName string) error {
|
| + return t.run(func() error {
|
| + return t.tq.Delete(task, queueName)
|
| + })
|
| +}
|
| +
|
| +func (t *tqState) AddMulti(tasks []*gae.TQTask, queueName string) (ret []*gae.TQTask, err error) {
|
| + err = t.run(func() (err error) {
|
| + ret, err = t.tq.AddMulti(tasks, queueName)
|
| + return
|
| + })
|
| + return
|
| +}
|
| +
|
| +func (t *tqState) DeleteMulti(tasks []*gae.TQTask, queueName string) error {
|
| + return t.run(func() error {
|
| + return t.tq.DeleteMulti(tasks, queueName)
|
| + })
|
| +}
|
| +
|
| +func (t *tqState) Lease(maxTasks int, queueName string, leaseTime int) (ret []*gae.TQTask, err error) {
|
| + err = t.run(func() (err error) {
|
| + ret, err = t.tq.Lease(maxTasks, queueName, leaseTime)
|
| + return
|
| + })
|
| + return
|
| +}
|
| +
|
| +func (t *tqState) LeaseByTag(maxTasks int, queueName string, leaseTime int, tag string) (ret []*gae.TQTask, err error) {
|
| + err = t.run(func() (err error) {
|
| + ret, err = t.tq.LeaseByTag(maxTasks, queueName, leaseTime, tag)
|
| + return
|
| + })
|
| + return
|
| +}
|
| +
|
| +func (t *tqState) ModifyLease(task *gae.TQTask, queueName string, leaseTime int) error {
|
| + return t.run(func() error {
|
| + return t.tq.ModifyLease(task, queueName, leaseTime)
|
| + })
|
| +}
|
| +
|
| +func (t *tqState) Purge(queueName string) error {
|
| + return t.run(func() error {
|
| + return t.tq.Purge(queueName)
|
| + })
|
| +}
|
| +
|
| +func (t *tqState) QueueStats(queueNames []string) (ret []gae.TQStatistics, err error) {
|
| + err = t.run(func() (err error) {
|
| + ret, err = t.tq.QueueStats(queueNames)
|
| + return
|
| + })
|
| + return
|
| +}
|
| +
|
| +// FilterTQ installs a counter TaskQueue filter in the context.
|
| +func FilterTQ(c context.Context, defaultError error) (context.Context, FeatureBreaker) {
|
| + state := newState(defaultError)
|
| + return gae.AddTQFilters(c, func(ic context.Context, tq gae.TaskQueue) gae.TaskQueue {
|
| + return &tqState{state, tq}
|
| + }), state
|
| +}
|
|
|