hashicorp/nomad · error

failed to open a streaming connection: %v

Error message

failed to open a streaming connection: %v

What it means

After acquiring a conn, StreamingRPC opens a yamux stream on the connection's session. If session.Open fails, the error is wrapped as 'failed to open a streaming connection: <err>'. The connection is a TCP session multiplexed via yamux; opening a new stream can fail if the underlying session died.

Source

Thrown at helper/pool/pool.go:501

			retries++
			goto START
		}
		return nil, nil, fmt.Errorf("failed to start stream: %v", err)
	}
	return conn, client, nil
}

// StreamingRPC is used to make an streaming RPC call.  Callers must
// close the connection when done.
func (p *ConnPool) StreamingRPC(region string, addr net.Addr) (net.Conn, error) {
	conn, err := p.acquire(region, addr)
	if err != nil {
		return nil, fmt.Errorf("failed to get conn: %v", err)
	}

	s, err := conn.session.Open()
	if err != nil {
		return nil, fmt.Errorf("failed to open a streaming connection: %v", err)
	}

	if _, err := s.Write([]byte{byte(RpcStreaming)}); err != nil {
		conn.Close()
		return nil, err
	}

	return s, nil
}

// RPC is used to make an RPC call to a remote host
func (p *ConnPool) RPC(region string, addr net.Addr, method string, args interface{}, reply interface{}) error {
	// Get a usable client
	conn, sc, err := p.getRPCClient(region, addr)
	if err != nil {
		return fmt.Errorf("rpc error: %w", err)
	}
	defer conn.releaseUse()

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Retry the StreamingRPC call; a fresh connection will be dialed after the dead one is cleared
  2. Check for NAT/firewall idle timeouts killing long-lived TCP sessions
  3. Verify the target agent hasn't restarted (sessions die on restart)
  4. Check server logs for connection resets around the failure time
Defensive patterns

Strategy: retry

Try / catch

conn, err := pool.StreamingRPC(region, addr)
if err != nil && strings.Contains(err.Error(), "failed to open a streaming connection") {
    // stale yamux session; retrying dials a fresh connection
    time.Sleep(100 * time.Millisecond)
    conn, err = pool.StreamingRPC(region, addr)
}
if err != nil { return err }
defer conn.Close()

Prevention

When it happens

Trigger: pool.StreamingRPC where conn.session.Open() errors — typically because the pooled TCP connection was closed/reset by the peer between acquire and open.

Common situations: Idle pooled connection silently dropped by the server or a NAT/load balancer; agent restart closing the session; yamux window exhaustion under load.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/614e3d239ebdbc7b. Report an issue: GitHub.