nats-io/nats-server · error
expected stream does not match
Error message
expected stream does not match
What it means
errStreamMismatch: the publish's Nats-Expected-Stream header names a stream different from the one the message landed on (pre-checked in batching), or an internal mirror/source path detected a stream identity mismatch. The header value versus the actual stream name is the conflict.
Source
Thrown at server/stream.go:6377
// is delivered to a consumer and routed.
if !traceOnly {
hdr = setHeader(MsgTraceDest, MsgTraceDestDisabled, hdr)
}
// This will add the jetstream event while in the client read loop.
// Since the event will be updated in a different go routine, the
// tracing object will have a separate reference to the JS trace
// object.
mt.addJetStreamEvent(mset.name())
}
mset.queueInbound(mset.msgs, subject, reply, hdr, msg, nil, c.pa.trace)
}
var (
errLastSeqMismatch = errors.New("last sequence mismatch")
errMsgIdDuplicate = errors.New("msgid is duplicate")
errStreamClosed = errors.New("stream closed")
errInvalidMsgHandler = errors.New("undefined message handler")
errStreamMismatch = errors.New("expected stream does not match")
errMsgTTLDisabled = errors.New("message TTL disabled")
)
// processJetStreamMsg is where we try to actually process the stream msg.
// needIsolation should be false only if the caller already holds isolateMu
// across a whole atomic batch; mset.mu must NOT be held by the caller.
func (mset *stream) processJetStreamMsg(subject, reply string, hdr, msg []byte, lseq uint64, ts int64, mt *msgTrace, sourced bool, needIsolation bool) error {
return mset.processJetStreamMsgWithBatch(subject, reply, hdr, msg, lseq, ts, mt, sourced, needIsolation, nil)
}
func (mset *stream) processJetStreamMsgWithBatch(subject, reply string, hdr, msg []byte, lseq uint64, ts int64, mt *msgTrace, sourced bool, needIsolation bool, fastBatch *FastBatch) (retErr error) {
if mt != nil {
// Only the leader/standalone will have mt!=nil. On exit, send the
// message trace event.
defer func() {
mt.sendEventFromJetStream(retErr)
}()
}View on GitHub (pinned to 3a66a489d2)
Solutions
- Set Nats-Expected-Stream to the stream the publish targets
- Verify the publish subject belongs to the intended stream's subjects
- For mirror errors, check source/mirror naming and recreation history
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/stream.go:6377 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/caaab4d474129d6d.
Report an issue: GitHub.