本文整理汇总了Golang中github.com/luci/luci-go/common/clock.Now函数的典型用法代码示例。如果您正苦于以下问题:Golang Now函数的具体用法?Golang Now怎么用?Golang Now使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Now函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: send
func (s *endpointServiceImpl) send(ctx context.Context, data []byte) error {
ctx = log.SetField(ctx, "endpointURL", s.url)
return retryCall(ctx, "endpoint.send", func() error {
startTime := clock.Now(ctx)
log.Debugf(ctx, "Pushing message to endpoint.")
req, err := http.NewRequest("POST", s.url, bytes.NewReader(data))
if err != nil {
log.Errorf(log.SetError(ctx, err), "Failed to create HTTP request.")
return err
}
req.Header.Add("content-type", protobufContentType)
req.Header.Add("user-agent", monitoringEndpointUserAgent)
resp, err := s.client.Do(req)
if err != nil {
// Treat a client error as transient.
log.Warningf(log.SetError(ctx, err), "Failed proxy client request.")
return errors.WrapTransient(err)
}
defer resp.Body.Close()
// Read the full response body. This will enable us to re-use the
// connection.
bodyData, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Errorf(log.SetError(ctx, err), "Error during endpoint connection.")
return errors.WrapTransient(err)
}
log.Fields{
"status": resp.Status,
"statusCode": resp.StatusCode,
"headers": resp.Header,
"contentLength": resp.ContentLength,
"body": string(bodyData),
"duration": clock.Now(ctx).Sub(startTime),
}.Debugf(ctx, "Received HTTP response from endpoint.")
if http.StatusOK <= resp.StatusCode && resp.StatusCode < http.StatusMultipleChoices {
log.Debugf(ctx, "Message pushed successfully.")
return nil
}
err = fmt.Errorf("http: server error (%d)", resp.StatusCode)
if resp.StatusCode >= http.StatusInternalServerError {
err = errors.WrapTransient(err)
}
log.Fields{
log.ErrorKey: err,
"status": resp.Status,
"statusCode": resp.StatusCode,
}.Warningf(ctx, "Proxy error.")
return err
})
}
示例2: Next
// Next implements the Iterator interface.
func (i *Limited) Next(ctx context.Context, _ error) time.Duration {
if i.Retries == 0 {
return Stop
}
i.Retries--
// If there is a maximum total time, enforce it.
if i.MaxTotal > 0 {
now := clock.Now(ctx)
if i.startTime.IsZero() {
i.startTime = now
}
var elapsed time.Duration
if now.After(i.startTime) {
elapsed = now.Sub(i.startTime)
}
// Remaining time is the difference between total allowed time and elapsed
// time.
remaining := i.MaxTotal - elapsed
if remaining <= 0 {
// No more time!
i.Retries = 0
return Stop
}
}
return i.Delay
}
示例3: Increment
func (m *memcacheImpl) Increment(key string, delta int64, initialValue *uint64) (uint64, error) {
now := clock.Now(m.ctx)
m.data.lock.Lock()
defer m.data.lock.Unlock()
cur := uint64(0)
if initialValue == nil {
curItm, err := m.data.retrieveLocked(now, key)
if err != nil {
return 0, err
}
if len(curItm.value) != 8 {
return 0, errors.New("memcache Increment: got invalid current value")
}
cur = binary.LittleEndian.Uint64(curItm.value)
} else {
cur = *initialValue
}
if delta < 0 {
if uint64(-delta) > cur {
cur = 0
} else {
cur -= uint64(-delta)
}
} else {
cur += uint64(delta)
}
newval := make([]byte, 8)
binary.LittleEndian.PutUint64(newval, cur)
m.data.setItemLocked(now, m.NewItem(key).SetValue(newval))
return cur, nil
}
示例4: pullAckMessages
// pullAckMessages pulls a set of messages from the configured Subscription.
// If no messages are available, errNoMessages will be returned.
//
// handler is a method that returns true if there was a transient failure,
// indicating that the messages shouldn't be ACK'd.
func (p *pubsubClient) pullAckMessages(ctx context.Context, handler func([]*pubsub.Message)) error {
var err error
var msgs []*pubsub.Message
ackCount := 0
// Report the duration of a Pull/ACK cycle.
startTime := clock.Now(ctx)
defer func() {
duration := clock.Now(ctx).Sub(startTime)
log.Fields{
"count": len(msgs),
"ackCount": ackCount,
"duration": duration,
}.Infof(ctx, "Pull/ACK cycle complete.")
}()
err = retryCall(ctx, "Pull()", func() error {
var err error
msgs, err = p.service.Pull(p.subscription, p.batchSize)
return p.wrapTransient(err)
})
log.Fields{
log.ErrorKey: err,
"duration": clock.Now(ctx).Sub(startTime),
"count": len(msgs),
}.Debugf(ctx, "Pull() complete.")
if err != nil {
return err
}
if len(msgs) == 0 {
return errNoMessages
}
defer func() {
ackCount, err = p.ackMessages(ctx, msgs)
if err != nil {
log.Warningf(log.SetError(ctx, err), "Failed to ACK messages!")
}
}()
handler(msgs)
return nil
}
示例5: SetMulti
func (m *memcacheImpl) SetMulti(items []mc.Item, cb mc.RawCB) error {
now := clock.Now(m.ctx)
doCBs(items, cb, func(itm mc.Item) error {
m.data.lock.Lock()
defer m.data.lock.Unlock()
m.data.setItemLocked(now, itm)
return nil
})
return nil
}
示例6: AddMulti
func (m *memcacheImpl) AddMulti(items []mc.Item, cb mc.RawCB) error {
now := clock.Now(m.ctx)
doCBs(items, cb, func(itm mc.Item) error {
m.data.lock.Lock()
defer m.data.lock.Unlock()
if !m.data.hasItemLocked(now, itm.Key()) {
m.data.setItemLocked(now, itm)
return nil
}
return mc.ErrNotStored
})
return nil
}
示例7: LogCall
func (l *boundCloudLogger) LogCall(level log.Level, calldepth int, f string, args []interface{}) {
if len(f) == 0 || !log.IsLogging(l.ctx, level) {
return
}
l.logger.logC <- &logEntry{
timestamp: clock.Now(l.ctx),
level: level,
fmt: f,
args: args,
fields: log.GetFields(l.ctx),
}
}
示例8: prepTask
func (t *taskQueueData) prepTask(c context.Context, ns string, task *tq.Task, queueName string) (*tq.Task, error) {
toSched := task.Duplicate()
if toSched.Path == "" {
toSched.Path = "/_ah/queue/" + queueName
}
if toSched.ETA.IsZero() {
toSched.ETA = clock.Now(c).Add(toSched.Delay)
} else if toSched.Delay != 0 {
panic("taskqueue: both Delay and ETA are set")
}
toSched.Delay = 0
switch toSched.Method {
// Methods that can have payloads.
case "":
toSched.Method = "POST"
fallthrough
case "POST", "PUT", "PULL":
break
// Methods that can not have payloads.
case "GET", "HEAD", "DELETE":
toSched.Payload = nil
default:
return nil, fmt.Errorf("taskqueue: bad method %q", toSched.Method)
}
if _, ok := toSched.Header[currentNamespace]; !ok {
if ns != "" {
if toSched.Header == nil {
toSched.Header = http.Header{}
}
toSched.Header[currentNamespace] = []string{ns}
}
}
// TODO(riannucci): implement DefaultNamespace
if toSched.Name == "" {
toSched.Name = mkName(c, "", t.named[queueName])
} else {
if !validTaskName.MatchString(toSched.Name) {
return nil, errors.New("INVALID_TASK_NAME")
}
}
return toSched, nil
}
示例9: ackMessages
// ackMessages ACKs the supplied messages. If a message is nil, it will be
// ignored.
func (p *pubsubClient) ackMessages(ctx context.Context, messages []*pubsub.Message) (int, error) {
messageIds := make([]string, 0, len(messages))
skipped := 0
for _, msg := range messages {
if msg != nil {
messageIds = append(messageIds, msg.AckID)
} else {
skipped++
}
}
if len(messageIds) == 0 {
return 0, nil
}
startTime := clock.Now(ctx)
ctx = log.SetFields(ctx, log.Fields{
"count": len(messageIds),
"skipped": skipped,
})
err := retryCall(ctx, "Ack()", func() error {
return p.wrapTransient(p.service.Ack(p.subscription, messageIds))
})
duration := clock.Now(ctx).Sub(startTime)
if err != nil {
log.Fields{
log.ErrorKey: err,
"duration": duration,
}.Errorf(ctx, "Failed to ACK messages.")
return 0, err
}
log.Fields{
"duration": duration,
}.Debugf(ctx, "Successfully ACK messages.")
return len(messageIds), nil
}
示例10: CompareAndSwapMulti
func (m *memcacheImpl) CompareAndSwapMulti(items []mc.Item, cb mc.RawCB) error {
now := clock.Now(m.ctx)
doCBs(items, cb, func(itm mc.Item) error {
m.data.lock.Lock()
defer m.data.lock.Unlock()
if cur, err := m.data.retrieveLocked(now, itm.Key()); err == nil {
casid := uint64(0)
if mi, ok := itm.(*mcItem); ok && mi != nil {
casid = mi.CasID
}
if cur.casID == casid {
m.data.setItemLocked(now, itm)
} else {
return mc.ErrCASConflict
}
return nil
}
return mc.ErrNotStored
})
return nil
}
示例11: LogCall
func (l *boundCloudLogger) LogCall(level logging.Level, calldepth int, f string, args []interface{}) {
if len(f) == 0 {
return
}
text := fmt.Sprintf(f, args...)
fields := logging.GetFields(l.ctx)
if len(fields) > 0 {
text = text + " " + fields.FieldString(true)
}
// Add logging fields to labels.
entry := cloudlogging.Entry{
Timestamp: clock.Now(l.ctx),
Severity: l.getSeverity(level),
Labels: make(map[string]string, len(fields)),
TextPayload: text,
}
// Populate Labels.
for k, v := range fields {
val := ""
if l.FieldConverter != nil {
val = l.FieldConverter(v)
} else {
val = fmt.Sprintf("%v", v)
}
entry.Labels[k] = val
}
// Generate an InsertID, if we're configured with a base.
if l.InsertIDBase != "" {
entry.InsertID = l.generateInsertID()
}
l.client.PushEntries([]*cloudlogging.Entry{&entry})
}
示例12: DeleteMulti
func (m *memcacheImpl) DeleteMulti(keys []string, cb mc.RawCB) error {
now := clock.Now(m.ctx)
errs := make([]error, len(keys))
for i, k := range keys {
errs[i] = func() error {
m.data.lock.Lock()
defer m.data.lock.Unlock()
_, err := m.data.retrieveLocked(now, k)
if err != nil {
return err
}
m.data.delItemLocked(k)
return nil
}()
}
for _, e := range errs {
cb(e)
}
return nil
}
示例13: GetMulti
func (m *memcacheImpl) GetMulti(keys []string, cb mc.RawItemCB) error {
now := clock.Now(m.ctx)
itms := make([]mc.Item, len(keys))
errs := make([]error, len(keys))
for i, k := range keys {
itms[i], errs[i] = func() (mc.Item, error) {
m.data.lock.RLock()
defer m.data.lock.RUnlock()
val, err := m.data.retrieveLocked(now, k)
if err != nil {
return nil, err
}
return val.toUserItem(k), nil
}()
}
for i, itm := range itms {
cb(itm, errs[i])
}
return nil
}
示例14: IsGloballyEnabled
// IsGloballyEnabled checks to see if this filter is enabled globally.
//
// This checks InstanceEnabledStatic, as well as polls the datastore entity
// /dscache,1 (a GlobalConfig instance)
// Once every GlobalEnabledCheckInterval.
//
// For correctness, any error encountered returns true. If this assumed false,
// then Put operations might incorrectly invalidate the cache.
func IsGloballyEnabled(c context.Context) bool {
if !InstanceEnabledStatic {
return false
}
now := clock.Now(c)
globalEnabledLock.RLock()
nextCheck := globalEnabledNextCheck
enabledVal := globalEnabled
globalEnabledLock.RUnlock()
if now.Before(nextCheck) {
return enabledVal
}
globalEnabledLock.Lock()
defer globalEnabledLock.Unlock()
// just in case we raced
if now.Before(globalEnabledNextCheck) {
return globalEnabled
}
// always go to the default namespace
c, err := info.Get(c).Namespace("")
if err != nil {
return true
}
cfg := &GlobalConfig{Enable: true}
if err := datastore.Get(c).Get(cfg); err != nil && err != datastore.ErrNoSuchEntity {
return true
}
globalEnabled = cfg.Enable
globalEnabledNextCheck = now.Add(GlobalEnabledCheckInterval)
return globalEnabled
}
示例15: Get
// Get gets a *"math/rand".Rand from the context. If one hasn't been
// set, this creates a new Rand object with a Source initialized from the
// current time clock.Now(c).UnixNano().
func Get(c context.Context) *rand.Rand {
if f, ok := c.Value(mathRandKey).(Factory); ok && f != nil {
return f(c)
}
return rand.New(rand.NewSource(clock.Now(c).UnixNano()))
}