Skip to content

Commit 6556b92

Browse files
committed
Ensure LoadPrevMsgMulti returns skip in LoadPrevMsg handoff, add test
Signed-off-by: Neil Twigg <neil@nats.io>
1 parent c9f1f7b commit 6556b92

2 files changed

Lines changed: 52 additions & 2 deletions

File tree

server/filestore.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8576,8 +8576,15 @@ func (fs *fileStore) LoadPrevMsgMulti(sl *gsl.SimpleSublist, start uint64, smp *
85768576
}
85778577

85788578
if sl == nil || sl.MatchesFullWildcard() {
8579-
sm, err = fs.LoadPrevMsg(start, smp)
8580-
return
8579+
if sm, err = fs.LoadPrevMsg(start, smp); err == nil {
8580+
return sm, sm.seq, nil
8581+
}
8582+
if err == ErrStoreEOF {
8583+
fs.mu.RLock()
8584+
defer fs.mu.RUnlock()
8585+
return nil, fs.state.FirstSeq, err
8586+
}
8587+
return nil, 0, err
85818588
}
85828589
fs.mu.RLock()
85838590
defer fs.mu.RUnlock()

server/store_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"os"
2121
"path/filepath"
2222
"reflect"
23+
"slices"
2324
"testing"
2425
"time"
2526

@@ -785,6 +786,48 @@ func TestStoreMsgLoadPrevMsgMulti(t *testing.T) {
785786
)
786787
}
787788

789+
func TestStoreMsgLoadPrevMsgMultiFullWildcardSkip(t *testing.T) {
790+
testAllStoreAllPermutations(
791+
t, false,
792+
StreamConfig{Name: "zzz", Subjects: []string{"foo.*"}},
793+
func(t *testing.T, fs StreamStore) {
794+
for i := range 10 {
795+
subj := fmt.Sprintf("foo.%d", i+1)
796+
_, _, err := fs.StoreMsg(subj, nil, []byte("ZZZ"), 0)
797+
require_NoError(t, err)
798+
}
799+
800+
var sm StoreMsg
801+
var state StreamState
802+
fs.FastState(&state)
803+
804+
sl := gsl.NewSimpleSublist()
805+
require_NoError(t, sl.Insert(">", struct{}{}))
806+
807+
var got []uint64
808+
for seq := state.LastSeq; ; {
809+
smp, nseq, err := fs.LoadPrevMsgMulti(sl, seq, &sm)
810+
if err == ErrStoreEOF {
811+
require_Equal(t, nseq, state.FirstSeq)
812+
break
813+
}
814+
require_NoError(t, err)
815+
require_Equal(t, smp.seq, nseq)
816+
got = append(got, nseq)
817+
if nseq == state.FirstSeq {
818+
_, nseq, err = fs.LoadPrevMsgMulti(sl, nseq-1, &sm)
819+
require_Error(t, err, ErrStoreEOF)
820+
require_Equal(t, nseq, state.FirstSeq)
821+
break
822+
}
823+
seq = nseq - 1
824+
}
825+
826+
require_True(t, slices.Equal(got, []uint64{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}))
827+
},
828+
)
829+
}
830+
788831
func TestStoreGetSeqFromTimeWithInteriorDeletesGap(t *testing.T) {
789832
testAllStoreAllPermutations(
790833
t, false,

0 commit comments

Comments
 (0)