geektutu/7days-golang · error

err.Error()

Error message

err.Error()

What it means

Generic 500 handler in HTTPPool.ServeHTTP: group.Get(key) failed (getter error, peer fetch failure, single-flight error), and the raw error text is written as the response body. It fires for any cache-retrieval error during a peer HTTP request.

Source

Thrown at gee-cache/day6-single-flight/geecache/http.go:66

	// /<basepath>/<groupname>/<key> required
	parts := strings.SplitN(r.URL.Path[len(p.basePath):], "/", 2)
	if len(parts) != 2 {
		http.Error(w, "bad request", http.StatusBadRequest)
		return
	}

	groupName := parts[0]
	key := parts[1]

	group := GetGroup(groupName)
	if group == nil {
		http.Error(w, "no such group: "+groupName, http.StatusNotFound)
		return
	}

	view, err := group.Get(key)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/octet-stream")
	w.Write(view.ByteSlice())
}

// Set updates the pool's list of peers.
func (p *HTTPPool) Set(peers ...string) {
	p.mu.Lock()
	defer p.mu.Unlock()
	p.peers = consistenthash.New(defaultReplicas, nil)
	p.peers.Add(peers...)
	p.httpGetters = make(map[string]*httpGetter, len(peers))
	for _, peer := range peers {
		p.httpGetters[peer] = &httpGetter{baseURL: peer + p.basePath}
	}
}

View on GitHub (pinned to cf36443821)

Solutions

  1. Log the full error server-side to find the root cause (getter panic, network to peers, timeout).
  2. Retry the request; transient peer failures under single-flight usually resolve on a second attempt.
  3. Map known errors (e.g. key not found) to more precise status codes than 500.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at gee-cache/day6-single-flight/geecache/http.go:66 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of geektutu/7days-golang@cf36443821 (2026-09-03). Data as JSON: /api/errors/c9651554f982659b. Report an issue: GitHub.