本文整理汇总了Golang中context.Context.Deadline方法的典型用法代码示例。如果您正苦于以下问题:Golang Context.Deadline方法的具体用法?Golang Context.Deadline怎么用?Golang Context.Deadline使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类context.Context
的用法示例。
在下文中一共展示了Context.Deadline方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: Ping
// Ping will check to see if the server is up with an optional timeout on waiting for leader.
// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred.
func (c *HTTPClient) Ping(ctx context.Context) (time.Duration, string, error) {
now := time.Now()
u := c.url()
u.Path = "ping"
if ctx != nil {
if dl, ok := ctx.Deadline(); ok {
v := url.Values{}
v.Set("wait_for_leader", fmt.Sprintf("%.0fs", time.Now().Sub(dl).Seconds()))
u.RawQuery = v.Encode()
}
}
req, err := http.NewRequest("GET", u.String(), nil)
if err != nil {
return 0, "", err
}
if ctx != nil {
req = req.WithContext(ctx)
}
resp, err := c.do(req, nil, http.StatusNoContent)
if err != nil {
return 0, "", err
}
version := resp.Header.Get("X-Influxdb-Version")
return time.Since(now), version, nil
}
示例2: exchange
// exchange sends a query on the connection and hopes for a response.
func exchange(ctx context.Context, server, name string, qtype uint16) (*dnsMsg, error) {
d := testHookDNSDialer()
out := dnsMsg{
dnsMsgHdr: dnsMsgHdr{
recursion_desired: true,
},
question: []dnsQuestion{
{name, qtype, dnsClassINET},
},
}
for _, network := range []string{"udp", "tcp"} {
c, err := d.dialDNS(ctx, network, server)
if err != nil {
return nil, err
}
defer c.Close()
if d, ok := ctx.Deadline(); ok && !d.IsZero() {
c.SetDeadline(d)
}
out.id = uint16(rand.Int()) ^ uint16(time.Now().UnixNano())
in, err := c.dnsRoundTrip(&out)
if err != nil {
return nil, mapErr(err)
}
if in.truncated { // see RFC 5966
continue
}
return in, nil
}
return nil, errors.New("no answer from DNS server")
}
示例3: msgToStream
func msgToStream(ctx context.Context, s inet.Stream, msg bsmsg.BitSwapMessage) error {
deadline := time.Now().Add(sendMessageTimeout)
if dl, ok := ctx.Deadline(); ok {
deadline = dl
}
if err := s.SetWriteDeadline(deadline); err != nil {
log.Warningf("error setting deadline: %s", err)
}
switch s.Protocol() {
case ProtocolBitswap:
if err := msg.ToNetV1(s); err != nil {
log.Debugf("error: %s", err)
return err
}
case ProtocolBitswapOne, ProtocolBitswapNoVers:
if err := msg.ToNetV0(s); err != nil {
log.Debugf("error: %s", err)
return err
}
default:
return fmt.Errorf("unrecognized protocol on remote: %s", s.Protocol())
}
if err := s.SetWriteDeadline(time.Time{}); err != nil {
log.Warningf("error resetting deadline: %s", err)
}
return nil
}
示例4: MountLabel
// MountLabel performs a mount with the label and target being absolute paths
func (t *BaseOperations) MountLabel(ctx context.Context, label, target string) error {
defer trace.End(trace.Begin(fmt.Sprintf("Mounting %s on %s", label, target)))
if err := os.MkdirAll(target, 0600); err != nil {
return fmt.Errorf("unable to create mount point %s: %s", target, err)
}
// convert the label to a filesystem path
label = "/dev/disk/by-label/" + label
// do..while ! timedout
var timeout bool
for timeout = false; !timeout; {
_, err := os.Stat(label)
if err == nil || !os.IsNotExist(err) {
break
}
deadline, ok := ctx.Deadline()
timeout = ok && time.Now().After(deadline)
}
if timeout {
detail := fmt.Sprintf("timed out waiting for %s to appear", label)
return errors.New(detail)
}
if err := Sys.Syscall.Mount(label, target, "ext4", syscall.MS_NOATIME, ""); err != nil {
detail := fmt.Sprintf("mounting %s on %s failed: %s", label, target, err)
return errors.New(detail)
}
return nil
}
示例5: Connect
// Connect to a Venue console.
func (v *VNC) Connect(ctx context.Context) error {
if v.conn != nil {
return fmt.Errorf("already connected")
}
// TODO(kward:20161122) Add check for a reasonably sufficient deadline.
deadline, ok := ctx.Deadline()
if !ok {
return fmt.Errorf("context missing deadline")
}
log.Println("Connecting to VENUE VNC server...")
addr := fmt.Sprintf("%s:%d", v.opts.host, v.opts.port)
nc, err := net.DialTimeout("tcp", addr, time.Since(deadline))
if err != nil {
return err
}
log.Println("Establishing session...")
v.cfg = vnclib.NewClientConfig(v.opts.passwd)
conn, err := vnclib.Connect(ctx, nc, v.cfg)
if err != nil {
return err
}
v.conn = conn
// Initialize a framebuffer for updates.
v.fb = NewFramebuffer(int(v.conn.FramebufferWidth()), int(v.conn.FramebufferHeight()))
// Setup channel to listen to server messages.
v.cfg.ServerMessageCh = make(chan vnclib.ServerMessage)
return nil
}
示例6: WaitForTimeoutRaw
// WaitForTimeoutRaw waits after the context deadline then returns the context
// error. yarpc should interpret this as an handler timeout, which in turns
// should be forwarded to the yarpc client as a remote handler timeout.
func WaitForTimeoutRaw(ctx context.Context, reqMeta yarpc.ReqMeta, body []byte) ([]byte, yarpc.ResMeta, error) {
if _, ok := ctx.Deadline(); !ok {
return nil, nil, fmt.Errorf("no deadline set in context")
}
select {
case <-ctx.Done():
return nil, nil, ctx.Err()
}
}
示例7: deadline
// deadline returns the earliest of:
// - now+Timeout
// - d.Deadline
// - the context's deadline
// Or zero, if none of Timeout, Deadline, or context's deadline is set.
func (d *Dialer) deadline(ctx context.Context, now time.Time) (earliest time.Time) {
if d.Timeout != 0 { // including negative, for historical reasons
earliest = now.Add(d.Timeout)
}
if d, ok := ctx.Deadline(); ok {
earliest = minNonzeroTime(earliest, d)
}
return minNonzeroTime(earliest, d.Deadline)
}
示例8: callHandler
func (h handler) callHandler(ctx context.Context, call inboundCall, start time.Time) error {
_, ok := ctx.Deadline()
if !ok {
return tchannel.ErrTimeoutRequired
}
treq := &transport.Request{
Caller: call.CallerName(),
Service: call.ServiceName(),
Encoding: transport.Encoding(call.Format()),
Procedure: call.MethodString(),
}
ctx, headers, err := readRequestHeaders(ctx, call.Format(), call.Arg2Reader)
if err != nil {
return encoding.RequestHeadersDecodeError(treq, err)
}
treq.Headers = headers
if tcall, ok := call.(tchannelCall); ok {
tracer := h.deps.Tracer()
ctx = tchannel.ExtractInboundSpan(ctx, tcall.InboundCall, headers.Items(), tracer)
}
body, err := call.Arg3Reader()
if err != nil {
return err
}
defer body.Close()
treq.Body = body
rw := newResponseWriter(treq, call)
defer rw.Close() // TODO(abg): log if this errors
treq, err = request.Validate(ctx, treq)
if err != nil {
return err
}
spec, err := h.Registry.GetHandlerSpec(treq.Service, treq.Procedure)
if err != nil {
return err
}
switch spec.Type() {
case transport.Unary:
treq, err = request.ValidateUnary(ctx, treq)
if err == nil {
err = internal.SafelyCallUnaryHandler(ctx, spec.Unary(), start, treq, rw)
}
default:
err = errors.UnsupportedTypeError{Transport: "TChannel", Type: string(spec.Type())}
}
return err
}
示例9: handleTread
func (s *Session) handleTread(cx context.Context, msg styxproto.Tread, file file) bool {
var n int
var err error
if file.rwc == nil {
s.conn.clearTag(msg.Tag())
s.conn.Rerror(msg.Tag(), "file %s is not open for reading", file.name)
s.conn.Flush()
return true
}
go func() {
// TODO(droyo) allocations could hurt here, come up with a better
// way to do this (after measuring the impact, of course). The tricky bit
// here is inherent to the 9P protocol; rather than using sentinel values,
// each message is prefixed with its length. While this is generally a Good
// Thing, this means we can't write directly to the connection, because
// we don't know how much we are going to write until it's too late.
buf := make([]byte, int(msg.Count()))
if t, ok := cx.Deadline(); ok {
styxfile.SetDeadline(file.rwc, t)
}
done := make(chan struct{})
go func() {
n, err = file.rwc.ReadAt(buf, msg.Offset())
close(done)
}()
select {
case <-cx.Done():
// NOTE(droyo) deciding what to do here is somewhat
// difficult. Many (but not all) Read/Write calls in Go can
// be interrupted by calling Close. Obviously, calling Close
// on a file will disrupt any current and future reads on the
// same fid. However, that is preferrable to leaking goroutines.
file.rwc.Close()
s.conn.clearTag(msg.Tag())
return
case <-done:
}
s.conn.clearTag(msg.Tag())
if n > 0 {
s.conn.Rread(msg.Tag(), buf[:n])
} else if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
s.conn.Rerror(msg.Tag(), "%v", err)
} else {
s.conn.Rread(msg.Tag(), buf[:n])
}
s.conn.Flush()
}()
return true
}
示例10: ValidateUnary
// ValidateUnary validates a unary request. This should be used after a successful v.Validate()
func (v *Validator) ValidateUnary(ctx context.Context) (*transport.Request, error) {
if v.errTTL != nil {
return nil, v.errTTL
}
_, hasDeadline := ctx.Deadline()
if !hasDeadline {
return nil, missingParametersError{Parameters: []string{"TTL"}}
}
return v.Request, nil
}
示例11: backchannel
func backchannel(ctx context.Context, conn net.Conn) error {
defer trace.End(trace.Begin("establish tether backchannel"))
// HACK: currently RawConn dosn't implement timeout so throttle the spinning
// it does implement the Timeout methods so the intermediary code can be written
// to support it, but they are stub implementation in rawconn impl.
// This needs to tick *faster* than the ticker in connection.go on the
// portlayer side. The PL sends the first syn and if this isn't waiting,
// alignment will take a few rounds (or it may never happen).
ticker := time.NewTicker(10 * time.Millisecond)
defer ticker.Stop()
// We run this in a separate goroutine because HandshakeServer
// calls a Read on rawconn which is a blocking call which causes
// the caller to block as well so this is the only way to cancel.
// Calling Close() will unblock us and on the next tick we will
// return ctx.Err()
go func() {
select {
case <-ctx.Done():
conn.Close()
}
}()
for {
select {
case <-ticker.C:
if ctx.Err() != nil {
return ctx.Err()
}
deadline, ok := ctx.Deadline()
if ok {
conn.SetReadDeadline(deadline)
}
err := serial.HandshakeServer(conn)
if err == nil {
conn.SetReadDeadline(time.Time{})
return nil
}
switch et := err.(type) {
case *serial.HandshakeError:
log.Debugf("HandshakeServer: %v", et)
default:
log.Errorf("HandshakeServer: %v", err)
}
}
}
}
示例12: tryOneName
// Do a lookup for a single name, which must be rooted
// (otherwise answer will not find the answers).
func tryOneName(ctx context.Context, cfg *dnsConfig, name string, qtype uint16) (string, []dnsRR, error) {
if len(cfg.servers) == 0 {
return "", nil, &DNSError{Err: "no DNS servers", Name: name}
}
deadline := time.Now().Add(cfg.timeout)
if old, ok := ctx.Deadline(); !ok || deadline.Before(old) {
var cancel context.CancelFunc
ctx, cancel = context.WithDeadline(ctx, deadline)
defer cancel()
}
var lastErr error
for i := 0; i < cfg.attempts; i++ {
for _, server := range cfg.servers {
msg, err := exchange(ctx, server, name, qtype)
if err != nil {
lastErr = &DNSError{
Err: err.Error(),
Name: name,
Server: server,
}
if nerr, ok := err.(Error); ok && nerr.Timeout() {
lastErr.(*DNSError).IsTimeout = true
}
continue
}
// libresolv continues to the next server when it receives
// an invalid referral response. See golang.org/issue/15434.
if msg.rcode == dnsRcodeSuccess && !msg.authoritative && !msg.recursion_available && len(msg.answer) == 0 && len(msg.extra) == 0 {
lastErr = &DNSError{Err: "lame referral", Name: name, Server: server}
continue
}
cname, rrs, err := answer(name, server, msg, qtype)
// If answer errored for rcodes dnsRcodeSuccess or dnsRcodeNameError,
// it means the response in msg was not useful and trying another
// server probably won't help. Return now in those cases.
// TODO: indicate this in a more obvious way, such as a field on DNSError?
if err == nil || msg.rcode == dnsRcodeSuccess || msg.rcode == dnsRcodeNameError {
return cname, rrs, err
}
lastErr = err
}
}
return "", nil, lastErr
}
示例13: Find
// Find items from the mongo collection matching the provided lookup
func (m *Handler) Find(ctx context.Context, lookup *resource.Lookup, page, perPage int) (*resource.ItemList, error) {
q, err := getQuery(lookup)
if err != nil {
return nil, err
}
s := getSort(lookup)
c, err := m.c(ctx)
if err != nil {
return nil, err
}
defer m.close(c)
var mItem mongoItem
query := c.Find(q).Sort(s...)
if perPage >= 0 {
query.Skip((page - 1) * perPage).Limit(perPage)
}
// Apply context deadline if any
if dl, ok := ctx.Deadline(); ok {
dur := dl.Sub(time.Now())
if dur < 0 {
dur = 0
}
query.SetMaxTime(dur)
}
// Perform request
iter := query.Iter()
// Total is set to -1 because we have no easy way with Mongodb to to compute this value
// without performing two requests.
list := &resource.ItemList{Page: page, Total: -1, Items: []*resource.Item{}}
for iter.Next(&mItem) {
// Check if context is still ok before to continue
if err = ctx.Err(); err != nil {
// TODO bench this as net/context is using mutex under the hood
iter.Close()
return nil, err
}
list.Items = append(list.Items, newItem(&mItem))
}
if err := iter.Close(); err != nil {
return nil, err
}
return list, err
}
示例14: c
// C returns the mongo collection managed by this storage handler
// from a Copy() of the mgo session.
func (m *Handler) c(ctx context.Context) (*mgo.Collection, error) {
if err := ctx.Err(); err != nil {
return nil, err
}
// With mgo, session.Copy() pulls a connection from the connection pool
s := m.session.Copy()
// Ensure safe mode is enabled in order to get errors
s.EnsureSafe(&mgo.Safe{})
// Set a timeout to match the context deadline if any
if deadline, ok := ctx.Deadline(); ok {
timeout := deadline.Sub(time.Now())
if timeout <= 0 {
timeout = 0
}
s.SetSocketTimeout(timeout)
s.SetSyncTimeout(timeout)
}
return s.DB(m.dbName).C(m.colName), nil
}
示例15: dialSerial
// dialSerial connects to a list of addresses in sequence, returning
// either the first successful connection, or the first error.
func dialSerial(ctx context.Context, dp *dialParam, ras addrList) (Conn, error) {
var firstErr error // The error from the first address is most relevant.
for i, ra := range ras {
select {
case <-ctx.Done():
return nil, &OpError{Op: "dial", Net: dp.network, Source: dp.LocalAddr, Addr: ra, Err: mapErr(ctx.Err())}
default:
}
deadline, _ := ctx.Deadline()
partialDeadline, err := partialDeadline(time.Now(), deadline, len(ras)-i)
if err != nil {
// Ran out of time.
if firstErr == nil {
firstErr = &OpError{Op: "dial", Net: dp.network, Source: dp.LocalAddr, Addr: ra, Err: err}
}
break
}
dialCtx := ctx
if partialDeadline.Before(deadline) {
var cancel context.CancelFunc
dialCtx, cancel = context.WithDeadline(ctx, partialDeadline)
defer cancel()
}
c, err := dialSingle(dialCtx, dp, ra)
if err == nil {
return c, nil
}
if firstErr == nil {
firstErr = err
}
}
if firstErr == nil {
firstErr = &OpError{Op: "dial", Net: dp.network, Source: nil, Addr: nil, Err: errMissingAddress}
}
return nil, firstErr
}