Используйте ноль контекста, но не паникуйте и не висите там. Как это возможно?

type Etcd struct {
    Next       plugin.Handler
    Fall       fall.F
    Zones      []string
    PathPrefix string
    Upstream   upstream.Upstream // Proxy for looking up names during the resolution process
    Client     etcdc.KeysAPI
    Ctx        context.Context
    Stubmap    *map[string]proxy.Proxy // list of proxies for stub resolving.

    endpoints []string // Stored here as well, to aid in testing.
}


func (e *Etcd) get(path string, recursive bool) (*etcdc.Response, error) {
    if e.Ctx == nil {
            // run here
            log.Printf("e.Ctx is nil")
    }
    // hang here but not panic.
    ctx, cancel := context.WithTimeout(e.Ctx, etcdTimeout)
    defer cancel()
    r, err := e.Client.Get(ctx, path, &etcdc.GetOptions{Sort: false, Recursive: recursive})
    if err != nil {
            return nil, err
    }
    return r, nil
}

ссылка на исходный код: https://github.com/coredns/coredns/blob/v1.0.6/plugin/etcd/etcd.go#L87

Я использовал этот пакет etcd в своем собственном проекте и инициализировал его, но не инициализировал файл Ctx, и обнаружил, что процесс зависает в этом коде:

ctx, cancel: = context.WithTimeout (e.Ctx, etcdTimeout)

как это могло случиться с e.Ctx, равным nil и context.WithTimeout() не паникует?

Любое предложение полезно.

0 ответов

Другие вопросы по тегам