From 266f616ada6ba7de6ae4f34bd450d8b1c0b9d93f Mon Sep 17 00:00:00 2001 From: Neil Twigg Date: Fri, 3 Jan 2025 15:43:33 +0000 Subject: [PATCH] Use `Nats-TTL: never` for never expires Signed-off-by: Neil Twigg --- server/jetstream_test.go | 2 +- server/stream.go | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/server/jetstream_test.go b/server/jetstream_test.go index 67a1f997d6..bb983017b4 100644 --- a/server/jetstream_test.go +++ b/server/jetstream_test.go @@ -25029,7 +25029,7 @@ func TestJetStreamMessageTTLNeverExpire(t *testing.T) { // The first message we publish is set to "never expire", therefore it // won't age out with the MaxAge policy. - msg.Header.Set("Nats-TTL", "-1") + msg.Header.Set("Nats-TTL", "never") _, err := js.PublishMsg(msg) require_NoError(t, err) diff --git a/server/stream.go b/server/stream.go index 5d56881838..511039f8a3 100644 --- a/server/stream.go +++ b/server/stream.go @@ -4215,6 +4215,9 @@ func getMessageTTL(hdr []byte) (int64, error) { return 0, nil } sttl := bytesToString(ttl) + if strings.ToLower(sttl) == "never" { + return -1, nil + } dur, err := time.ParseDuration(sttl) if err == nil { if dur < time.Second { @@ -4222,7 +4225,15 @@ func getMessageTTL(hdr []byte) (int64, error) { } return int64(dur.Seconds()), nil } - return parseInt64(ttl), nil + t := parseInt64(ttl) + if t < 0 { + // This probably means a parse failure, hence why + // we have a special case "never" for returning -1. + // Otherwise we can't know if it's a genuine TTL + // that says never expire or if it's a parse error. + return 0, NewJSMessageTTLInvalidError() + } + return t, nil } // Signal if we are clustered. Will acquire rlock.