@cryptotaxi247 / kubo / commits / f44cf0034

Add error message to event logs in path resolution

If an error occurs during an event add it to the events metadata License: MIT Signed-off-by: Forrest Weston <forrest@protocol.ai>

Forrest Weston committed Nov 15, 2017 at 12:21 UTC f44cf0034231e075cfe9e8a396a57a5bc4126460
3 files changed +19 -4
commands/http/handler.go
+1 -1
@@ -138,8 +138,8 @@ func (i internalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
138 }
139
140 ctx, cancel := context.WithCancel(node.Context())
141 - ctx = logging.ContextWithLoggable(ctx, loggables.Uuid("requestId"))
141 defer cancel()
142 + ctx = logging.ContextWithLoggable(ctx, loggables.Uuid("requestId"))
143 if cn, ok := w.(http.CloseNotifier); ok {
144 clientGone := cn.CloseNotify()
145 go func() {
core/pathresolver.go
+8 -1
@@ -10,6 +10,7 @@ import (
10
11 cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
12 node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format"
13 + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
14 )
15
16 // ErrNoNamesys is an explicit error for when an IPFS node doesn't
@@ -22,34 +23,40 @@ var ErrNoNamesys = errors.New(
23 // entries and returning the final node.
24 func Resolve(ctx context.Context, nsys namesys.NameSystem, r *path.Resolver, p path.Path) (node.Node, error) {
25 if strings.HasPrefix(p.String(), "/ipns/") {
25 - defer log.EventBegin(ctx, "resolveIpnsPath").Done()
26 + evt := log.EventBegin(ctx, "resolveIpnsPath")
27 + defer evt.Done()
28 // resolve ipns paths
29
30 // TODO(cryptix): we sould be able to query the local cache for the path
31 if nsys == nil {
32 + evt.Append(logging.LoggableMap{"error": ErrNoNamesys.Error()})
33 return nil, ErrNoNamesys
34 }
35
36 seg := p.Segments()
37
38 if len(seg) < 2 || seg[1] == "" { // just "/<protocol/>" without further segments
39 + evt.Append(logging.LoggableMap{"error": path.ErrNoComponents.Error()})
40 return nil, path.ErrNoComponents
41 }
42
43 extensions := seg[2:]
44 resolvable, err := path.FromSegments("/", seg[0], seg[1])
45 if err != nil {
46 + evt.Append(logging.LoggableMap{"error": err.Error()})
47 return nil, err
48 }
49
50 respath, err := nsys.Resolve(ctx, resolvable.String())
51 if err != nil {
52 + evt.Append(logging.LoggableMap{"error": err.Error()})
53 return nil, err
54 }
55
56 segments := append(respath.Segments(), extensions...)
57 p, err = path.FromSegments("/", segments...)
58 if err != nil {
59 + evt.Append(logging.LoggableMap{"error": err.Error()})
60 return nil, err
61 }
62 }
path/resolver.go
+10 -2
@@ -131,15 +131,19 @@ func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, names [
131 // It uses the first path component as a hash (key) of the first node, then
132 // resolves all other components walking the links, with ResolveLinks.
133 func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]node.Node, error) {
134 + evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath})
135 + defer evt.Done()
136 +
137 h, parts, err := SplitAbsPath(fpath)
138 if err != nil {
139 + evt.Append(logging.LoggableMap{"error": err.Error()})
140 return nil, err
141 }
138 - defer log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"parts": parts, "cid": h}).Done()
142
143 log.Debug("resolve dag get")
144 nd, err := s.DAG.Get(ctx, h)
145 if err != nil {
146 + evt.Append(logging.LoggableMap{"error": err.Error()})
147 return nil, err
148 }
149
@@ -155,7 +159,8 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]nod
159 // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links
160 func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []string) ([]node.Node, error) {
161
158 - defer log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}).Done()
162 + evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names})
163 + defer evt.Done()
164 result := make([]node.Node, 0, len(names)+1)
165 result = append(result, ndd)
166 nd := ndd // dup arg workaround
@@ -168,13 +173,16 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri
173
174 lnk, rest, err := s.ResolveOnce(ctx, s.DAG, nd, names)
175 if err == dag.ErrLinkNotFound {
176 + evt.Append(logging.LoggableMap{"error": err.Error()})
177 return result, ErrNoLink{Name: names[0], Node: nd.Cid()}
178 } else if err != nil {
179 + evt.Append(logging.LoggableMap{"error": err.Error()})
180 return result, err
181 }
182
183 nextnode, err := lnk.GetNode(ctx, s.DAG)
184 if err != nil {
185 + evt.Append(logging.LoggableMap{"error": err.Error()})
186 return result, err
187 }
188