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

  1. Check backend health/registration — ensure at least one node is up and registered
  2. Clear failed-node marks or wait for node status recovery/retry policy to re-admit nodes
  3. Add a fallback: return a default node or propagate the error to trigger another route
  4. 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

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.