ginuerzh/gost · error
none node available
Error message
none node available
What it means
ErrNoneAvailable is returned by Select when the candidate node list is empty after filtering — there is no node to pick. It is the selector's canonical 'no backend available' signal, exported so callers can compare against it directly.
Source
Thrown at selector.go:18
package gost
import (
"errors"
"math/rand"
"net"
"sort"
"strconv"
"sync"
"sync/atomic"
"time"
"github.com/go-log/log"
)
var (
// ErrNoneAvailable indicates there is no node available.
ErrNoneAvailable = errors.New("none node available")
)
// NodeSelector as a mechanism to pick nodes and mark their status.
type NodeSelector interface {
Select(nodes []Node, opts ...SelectOption) (Node, error)
}
type defaultSelector struct {
}
func (s *defaultSelector) Select(nodes []Node, opts ...SelectOption) (Node, error) {
sopts := SelectOptions{}
for _, opt := range opts {
opt(&sopts)
}
for _, filter := range sopts.Filters {
nodes = filter.Filter(nodes)View on GitHub (pinned to a33fdbf4c9)
Solutions
- Check backend health/registration — ensure at least one node is up and registered
- Clear failed-node marks or wait for node status recovery/retry policy to re-admit nodes
- Add a fallback: return a default node or propagate the error to trigger another route
- Verify the request metadata isn't filtering out all nodes
Example fix
// before
node, err := selector.Select(nodes)
// after
node, err := selector.Select(nodes)
if err == selector.ErrNoneAvailable {
// no backends: fallback or surface a clear 503
return errors.New("no upstream nodes available")
} Defensive patterns
Strategy: try-catch
Validate before calling
if len(nodes) == 0 {
return errors.New("no candidate nodes registered")
} Try / catch
node, err := selector.Select(nodes)
if err == selector.ErrNoneAvailable {
// all backends down: fail fast or retry later
return errors.New("no upstream available")
} Prevention
- Monitor node registry so empty backends alert early
- Configure retry/recovery so failed nodes rejoin
- Add fallback routing when all nodes are unavailable
When it happens
Trigger: Calling NodeSelector.Select with a nil/empty nodes slice (or all nodes filtered out as dead/unreachable), e.g. selector.Select(nil) as in the test.
Common situations: All backends marked down by the selector's status tracking, an empty registry (no nodes registered), or a misconfigured route matching no nodes.
AI-assisted analysis of ginuerzh/gost@a33fdbf4c9 (2026-09-02).
Data as JSON: /api/errors/758b8ecf125ee2cc.
Report an issue: GitHub.